Я пытаюсь подсчитать число оборотов двигателя в Arduino с помощью IRsensor и использовать Python для построения моего графического интерфейса, где он должен отображать значение оборотов, которое дает arduino, и вводить значение, которое изменяет скорость этого двигателя. Моя первая проблема заключается в том, что графический интерфейс не открывается, я всегда получаю одну и ту же ошибку:
could not open port 'COM3': PermissionError(13, 'Access is denied.', None, 5)
, а другая проблема - как показывать значение из RPM в графическом интерфейсе Python. Другими словами, мне нужно продолжать читать и отправлять значения из python в arduino, но я довольно новичок в python, поэтому я не могу этого сделать.
Arduino
float rev = 0;
unsigned int rpm;
int oldtime = 0;
int time;
int rpmd = 0;
int PWM = 6;
int spd = 0;
void isr() //interrupt service routine
{
rev++;
}
void setup()
{
Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(2), isr, FALLING);
pinMode(PWM, OUTPUT);
//Serial.println("Send a value between 1 and 255");
}
void loop()
{
if (Serial.available() > 1) {
spd = Serial.parseInt();
//Serial.print("Set Speed to: ");
//Serial.println(spd);
analogWrite(PWM, spd);
// Serial.println("done!");
}
delay(1000);
detachInterrupt(digitalPinToInterrupt(2)); //detaches the interrupt
time = millis() - oldtime; //finds the time
rpm = (rev / time) * 60000; //calculates rpm
oldtime = millis(); //saves the current time
rev = 0;
Serial.println(rpm);
attachInterrupt(digitalPinToInterrupt(2), isr, FALLING);
}
Python
import numpy as np
from scipy import signal as sp
from tkinter import *
import matplotlib
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
from matplotlib import pyplot as plt
import serial
import time
# RAIZ
R = Tk()
R.title('Arduino-Python')
R.configure(background='grey63', padx=10, pady=10)
# R.state('zoomed')
# LABELS O ETIQUETAS
L1 = Label(R, text="Valor RPM Deseado (10k MAX)")
L1.configure(background = 'white',width=25)
L1.grid(row=0, column=0, padx=(100, 100), pady=(100, 100),)
L2 = Label(R, text="RPM")
L2.configure(background = 'white',width=17)
L2.grid(row=1, column=0, padx=(100, 100), pady=(100, 100),)
L3 = Label(R, text="?")
L3.configure(background = 'grey63',width=17)
L3.grid(row=1, column=1, padx=(100, 100), pady=(100, 100),)
# CAJAS DE TEXTO
EF = Entry(R)
EF.configure(background = 'white',width=25)
EF.grid(row=0, column=1, padx=(100, 100), pady=(100, 100))
EF.config(width=10)
E2 = Entry(R)
E2.configure(background = 'white',width=25)
E2.grid(row=0, column=1, padx=(100, 100), pady=(100, 100))
E2.config(width=10)
def Comm():
global EF
arduino = serial.Serial('COM3', 9600)
#L3.config(text= ":D")
arduino.write(str(EF))
arduino.close()
# BOTON ACEPTAR
btn = Button(R, text="Set Speed", command=Comm, width=25)
#btn = Button(R, text="Set Speed", command=R.destroy, width=25)
btn.grid(row=0, column=3, padx=(100, 100), pady=(100, 100))
arduino = serial.Serial('COM3', 9600)
rawString = arduino.readline().decode("utf-8").strip('\n').strip('\r')
# print(rawString)
L3.config(text= rawString)
R.after(0, Comm)
R.mainloop()