Hello,
I want to control my stepper motor RPM using a scale/slider widget in tkinter (Python). But while sending the data the data is received late
i.e. I move the slider from x-->y stop there and then move from y-->z stop there. My motor rotates at :
x RPM when my slider stops at y
y RPM when my slider stops at z
.
.
and so on
Python code :
from tkinter import *
import time
import serial
y=serial.Serial(port='COM3', baudrate=115200, timeout=0.1)
win=Tk()
win.geometry('550x500')
win.title('Stepper Control')
def speed(val):
a= val+';'
encodedMessage=a.encode()
y.write(encodedMessage)
print(encodedMessage)
data=y.readline()
print (data)
x=StringVar()
slider=Scale(win,variable=DoubleVar(), from_=-200, to=200, orient=HORIZONTAL, command=speed)
slider.place(relx=0.15,rely=0.07,relwidth=0.7)
win.mainloop()
Arduino code :
String StepRPMstr;
String StepRPM;
int RPM;
float pulserate;
float delaytime;
long int delayint;
long int delayint1;
void setup() {
Serial.begin(115200);
pinMode(3,OUTPUT);
pinMode(5,OUTPUT);
}
void loop() {
if(Serial.available()>0) {
StepRPMstr=Serial.readString();
Serial.setTimeout(10);
Serial.println(StepRPMstr);
RPM =StepRPMstr.toInt();
pulserate=(800/60)*RPM;
delaytime=(1000000/pulserate)*0.5;
delayint = (long int)delaytime;
delayint1 = abs(delayint);
//Serial.println(delaytime);
//Serial.println(delayint1);
}
if(RPM>0) {
digitalWrite(3,HIGH);
for(int x=0; x<800; x++) {
digitalWrite(5,HIGH);
delayMicroseconds(delayint);
digitalWrite(5,LOW);
delayMicroseconds(delayint);
//Serial.println('G');
}
}
if(RPM<0) {
digitalWrite(3,LOW);
for(int x=0; x<800; x++) {
digitalWrite(5,HIGH);
delayMicroseconds(delayint1);
digitalWrite(5,LOW);
delayMicroseconds(delayint1);
}
}
}