Здравейте и благодаря предварително за отделеното време,
Опитвам се да контролирам поредица от релета, свързани с моя Arduino чрез скрипт на python, използвайки pySerial и Tkinter. Проблемът е, че въпреки че знам, че кодът ми се свързва с моето Arduino (чувам същото трептене на релета, което получавам, когато качвам код с помощта на софтуера Arduino), не мога да накарам релетата да отговорят на команди, изпратени от моя Tkinter GUI. Ето моят код на python:
ser = Serial(port=3, timeout=1, writeTimeout=1, baudrate=9600) # ensure non-blocking
class Application(Frame):
print("Arduino Dish Control Ready")
def __init__(self, parent): # create constructor
Frame.__init__(self, parent) # define parent
self.parent = parent # save reference of parent widget
self.initUI() # delegate creation of the initUI() method
def initUI(self):
self.parent.title("Dish Control") # title of window
Style().configure("TButton", padding=(0, 5, 0, 5), font='serif 10')
self.columnconfigure(0, pad=4)
self.columnconfigure(1, pad=4)
self.columnconfigure(2, pad=4)
self.columnconfigure(3, pad=4)
self.columnconfigure(4, pad=4)
self.rowconfigure(0, pad=3)
self.rowconfigure(1, pad=3)
self.rowconfigure(2, pad=3)
self.rowconfigure(3, pad=3)
def UP(): # define the UP command.
ser.write(str(32)) # convert "32" to ASCII and send it via serial port (USB) to arduino.
print ser.write(str(64))
# sleep(0.1)
up = Button(self, text="Up", command=UP) # create button UP and set the command.
up.grid(row=0, column=1) # define position of UP button.
self.pack()
И ето съответния код на Arduino:
void loop(){
if(Serial.available() > 0){
Serial.begin(9600);
int inByte = Serial.read(); //read the incoming data
Serial.print("I received: ");
Serial.println(inByte, DEC);
if(Serial.read() == 32){//If the serial reads 32...
digitalWrite(8, LOW); //Motor Select Low
digitalWrite(9, LOW);
digitalWrite(10, LOW); //Motor 1 Low
digitalWrite(11, LOW);
digitalWrite(12, LOW); // Motor 2 Low
digitalWrite(13, LOW);
digitalWrite(6, HIGH); //Motor Power High
digitalWrite(7, HIGH);
}
}
}
Съжалявам, че включих толкова много, но не съм сигурен къде е грешката ми.
РЕДАКТИРАНЕ: Беше поискано да включа проследяването за грешката, дадена, когато просто включа ser.write(32) вместо ser.write(str(32)) в кода на Python:
Traceback (most recent call last):
File "C:\Python27\lib\lib-tk\Tkinter.py", line 1536, in __call__
return self.func(*args)
File "C:/Users/Radio Astro 4/PycharmProjects/untitled/DishControl.py", line 46, in UP
ser.write(32) # convert "1" to ASCII and send it via serial port (USB) to arduino.
File "C:\Python27\lib\site-packages\serial\serialwin32.py", line 283, in write
data = to_bytes(data)
File "C:\Python27\lib\site-packages\serial\serialutil.py", line 75, in to_bytes
for item in seq:
TypeError: 'int' object is not iterable