用pyserial(opreate步进电机)向Arduino发送信息

2024-06-17 16:48:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用pySerial控制一个步进电机,它连接到一个Arduino和CNC防护罩上。在

我通过向串行接口发送字符成功地运行了电机。现在我想选择旋转的次数,但是我不能。在

我用Tkinter作为我的图形用户界面。在

下面是我的Python代码:

import serial  # Import Serial Library
from Tkinter import *
import time

usbport = 'COM3'
serial_begin_is = 9600
arduinoSerialData = serial.Serial(usbport, serial_begin_is)  # Create Serial port object called arduinoSerialData


class GUI():
    def __init__(self, root):
        # type: (object) -> object
        self.root = root
        self.root.geometry("750x600")
        self.root.title("motor")
        self.CreateWidgets()
        self.spin = 0
        self.num = 1

    def CreateWidgets(self):
        self.number_of_spins = 1.0
        self.spin_num = 0.0
        self.speed_val = StringVar()
        self.spin_num_entry = Entry(self.root, textvariable=self.spin_num)
        self.spin_num_entry.place(x=200, y=20)
        self.speed_num_chose = Label(self.root, text="enter spin numbers:")
        self.speed_num_chose.place(x=50, y=20)
        self.enter_spin_num = Button(self.root, text="enter", command=lambda: self.set())
        self.enter_spin_num.place(x=200, y=45)
        # self.speed_num_label = Label(self.root, text="spin num will be" +str(self.number_of_spins))
        # self.speed_num_label.place(x=255, y=45)
        self.speed_num_entry = Entry(self.root, textvariable=self.speed_val)
        self.speed_num_label = Label(self.root, text="spin num will be: " + str(self.number_of_spins))
        self.speed_num_label.place(x=255, y=45)
        self.run_b = Button(self.root, text="run", command=lambda: self.run(self.number_of_spins))
        self.run_b.place(x=255, y=85)
        # self.run_b.config(state=DISABLED)
        self.spin_num_B = Button(self.root, text="stop", command=lambda: self.send_stop())
        self.spin_num_B.place(x=255, y=150)
        self.quit_b = Button(self.root, text="quit", command=lambda: root.destroy())
        self.quit_b.place(x=50, y=500)

    def set(self):
        self.number_of_spins = int(self.spin_num_entry.get())
        self.speed_num_label.config(text="spin num will be: " + str(self.number_of_spins))

        self.run_b.config(state=NORMAL)
    def run(self, x):
        x = int(x)
        print x
        # for i in xrange(x):
        arduinoSerialData.write(x)
        arduinoSerialData.write(b'r')

        print "run"

    def send_stop(self):
        arduinoSerialData.write(b's')
        print "stop"


root = Tk()
GUI(root)
root.mainloop()

这是我的Arduino代码:

^{pr2}$

Tags: ofruntextselfnumberdefserialplace
1条回答
网友
1楼 · 发布于 2024-06-17 16:48:43

好吧,我已经成功地开发了马达,还增加了一些其他功能,比如改变方向和控制速度。 我所面临的一个问题是,当用户改变速度时,电机会停止并应用速度,如果速度很高,会导致电机故障(速度是步进电机步数之间的延迟时间)。 这是密码,如果有人有索洛蒂安的速度控制,我会很高兴听到和学习:)

python代码:

import serial  # Import Serial Library
from Tkinter import *
import time

usbport = 'COM3'
serial_begin_is = 38400
arduinoSerialData = serial.Serial(usbport, serial_begin_is,timeout=0.5)  # Create Serial port object called arduinoSerialData


    class GUI():
        def __init__(self, root,arduinoSerialData):
            # type: (object) -> object
            self.root = root
            self.root.geometry("750x600")
            self.root.title("motor")
            self.CreateWidgets()
            self.spin = 0
            self.num = 1
            self.arduinoSerialData=arduinoSerialData
            self.flag = True;

        def CreateWidgets(self):
            self.number_of_spins = 0
            self.speed_value = 150
            self.spin_num = StringVar()
            self.speed_val = StringVar()
            self.spin_num_entry = Entry(self.root, textvariable=self.spin_num)
            self.spin_num_entry.place(x=200, y=20)
            self.spin_num_chose = Label(self.root, text="enter spin numbers:")
            self.spin_num_chose.place(x=50, y=20)
            self.enter_spin_num = Button(self.root, text="enter", command=lambda: self.set())
            self.enter_spin_num.place(x=200, y=45)
            # self.spin_num_label = Label(self.root, text="spin num will be" +str(self.number_of_spins))
            # self.spin_num_label.place(x=255, y=45)
            self.speed_label = Label(text="speed val will be:"+str(self.speed_value))
            self.speed_label.place(x=550,y=75)
            self.speed_b = Button(self.root, text="enter", command=lambda: self.speed_set())
            self.speed_b.place(x=550, y=45)
            self.speed_num_entry = Entry(self.root, textvariable=self.speed_val)
            self.speed_num_entry.place(x=550, y=20)
            self.speed_num_chose = Label(self.root, text="enter speed value:")
            self.speed_num_chose.place(x=420, y=20)
            self.spin_num_label = Label(self.root, text="spin num will be: " + str(self.number_of_spins))
            self.spin_num_label.place(x=255, y=45)
            self.run_b = Button(self.root, text="run", command=lambda: self.run())
            self.run_b.place(x=255, y=85)
            self.run_b.config(state=DISABLED)
            self.spin_num_B = Button(self.root, text="stop&reset", command=lambda: self.send_stop())
            self.spin_num_B.place(x=255, y=150)
            self.quit_b = Button(self.root, text="quit", command=lambda: root.destroy())
            self.quit_b.place(x=50, y=500)
            self.dir_b = Button(self.root, text="change direction", command=lambda: self.dirf())
            self.dir_b.place(x=295, y=85)

        def set(self):
            self.number_of_spins = int(self.spin_num_entry.get())
            self.data = [b"s"]
            #self.arduinoSerialData.write(self.data)
            value = list(str(self.number_of_spins))
            for char in value:
                self.data.append(char.encode())
            print self.data
            self.spin_num_label.config(text="spin num will be: " + str(self.number_of_spins))
            self.run_b.config(state=NORMAL)
        def run(self):
            run_char= "r"
            self.data[0] = run_char.encode()
            print self.data
            self.arduinoSerialData.write(self.data)
            print "run"
            self.spin_num_entry.delete(0, END)

        def send_stop(self):
            stop = "s"
            self.data[0] =stop.encode()
            self.arduinoSerialData.write(self.data)
            print self.data
            self.arduinoSerialData.close()
            self.arduinoSerialData = serial.Serial(usbport, serial_begin_is)
            self.speed_label.place_forget()
            self.speed_label.config(text="speed val will be:" +str(self.speed_value))
            self.speed_label.place(x=550, y=75)
            time.sleep(0.05)

        def dirf(self):
            print "direction had been chaged "
            self.arduinoSerialData.write(b"d")
        def speed_set(self):
            self.speed_label.place_forget()
            self.speed_label.config(text="speed val will be:"+self.speed_num_entry.get())
            self.speed_label.place(x=550, y=75)
            self.speed_in_int = int(self.speed_num_entry.get())
            self.data_speed = [b"v"]
            value = list(str(self.speed_in_int))
            for char in value:
                self.data_speed.append(char.encode())
            print self.data_speed
            self.arduinoSerialData.write(self.data_speed)


    root = Tk()
    GUI(root,arduinoSerialData)
    root.mainloop()

Arduino代码:

^{pr2}$

相关问题 更多 >