我对Python和Arduino都很陌生。如果您需要更多信息,请告诉我。
我想做什么: 我想用arduino控制一些伺服系统。我想在PC上的GUI(后来的RPi)中更改Servos的角度,并通过串行通信将它们发送到Arduino
我的Arduino代码如下:
#include <Servo.h>
int angle;
int pinServo1 = 5;
Servo servo1;
int min = 0.547;
int max = 2.47;
void setup()
{
Serial.begin(9600);
pinMode(pinServo1,OUTPUT);
servo1.attach(pinServo1,min,max);
}
void loop()
{
if(Serial.available() > 0)
{
Serial.read();
angle = Serial.parseInt();
servo1.write(angle);
}
}
到目前为止没有错误。
问题似乎是我的Python代码:
import serial
import time
arduino = serial.Serial(8,9600)
while 1:
print ("Enter new angle:")
string = input()
angle = str(string)
arduino.write(angle)
time.sleep(2)
print ("Transmission successful!")
我收到了这个错误:
Enter new angle:
90
Traceback (most recent call last):
File "C:/Users/yoogibubu/Desktop/STUDIUM/BACHELORARBEIT/GUI/send.py", line 10, in <module>
arduino.write(angle)
File "C:\Program Files (x86)\PYTHON\lib\site-packages\serial\serialwin32.py", line 283, in write
data = to_bytes(data)
File "C:\Program Files (x86)\PYTHON\lib\site-packages\serial\serialutil.py", line 76, in to_bytes
b.append(item) # this one handles int and str for our emulation and ints for Python 3.x
TypeError: an integer is required
>>>
如果我尝试将输入解析为整数,我会收到另一个错误:
TypeError: 'int' object is not iterable
有人可以告诉我有什么问题吗?提前谢谢!
答案 0 :(得分:0)
serial.write需要一个字节数组数据类型参数。对于发送字符串,必须首先将它们转换为字节数组,尤其是在Python3.x中,因为字符串是使用Unicode存储的,这使得更简单的字符数组更加精细。
尝试以下方法:
arduino.write(angle.encode())
答案 1 :(得分:0)
您应该可以直接写下loop()
:
void loop()
{
if(Serial.available() > 0)
{
angle = Serial.read();
servo1.write(angle);
}
}
但问题出在servo1.attach()
。对于我们中的最小和最大脉冲,您的伺服min
和max
应该是int
值(而不是ms)。这用于映射阅读结果。
你可能想要这样的东西:
#include <Servo.h>
int angle;
int pinServo1 = 5;
Servo servo1;
int min = 547; //in us - BTW 1000 would be safer but servo has less range
int max = 2470; //in us - BTW 2000 would be safer
void setup()
{
Serial.begin(9600);
pinMode(pinServo1, OUTPUT);
servo1.attach(pinServo1, min, max);
}
void loop()
{
if(Serial.available() > 0)
{
angle = Serial.read();
servo1.write(angle);
}
}