背景故事:我正在开展一项临床研究项目,我正在使用ML算法来操作伺服系统,这些伺服系统用于控制光纤放置到前列腺癌患者前列腺中进行光动力治疗的深度。当我的其他I / O设备用于其他项目时,我抓住了Arduino。
我必须将我的Arduino与Python接口,因为我需要收集一些光纤传入的光谱数据(来自患者和前列腺)。
发送和接收ASCII数据工作正常(本身),但尝试从Python前端发送数据以运行伺服失败。例如(下图),试图将伺服臂旋转45度会导致伺服机构在一个方向上颠簸,前后移动两次,然后停在其静止位置。
Python前端:
import serial
import time
import sys
def create_serial_object():
try:
serial_object = serial.Serial(
port='COM3',\
baudrate=9600,\
parity=serial.PARITY_NONE,\
stopbits=serial.STOPBITS_ONE,\
bytesize=serial.EIGHTBITS,\
timeout=1)
print("Connected to: " + serial_object.portstr)
time.sleep(2)
return serial_object
except Exception as exception:
if exception == 'SerialException':
serial_object.close()
sys.exit(exception)
ser=create_serial_object()
time.sleep(1)
if __name__ == '__main__':
try:
data=45
data=str(data).encode('ascii')
print('We are sending: ',data)
ser.write(data) # sends data to Serial.read();
time.sleep(0.2);
data=ser.readline().decode('ascii') # receives data from
Serial.println();
print('We are receiving: ',data)
ser.close()
except:
ser.close()
.ino后端:
#include <Servo.h>
Servo servo_1;
int incomingByte;
void setup() {
Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
servo_1.attach(9);
}
void loop() {
if (Serial.available() > 0) {
incomingByte = Serial.read(); // receives data from ser.write(data)
delay(500);
for (int i = 0; i <= incomingByte; i++){
servo_1.write(i);
delay(20);
}
Serial.write(incomingByte); // sends data to ser.readline();
}
}
独立运行.ino后端工作正常。伺服臂旋转45度,然后按预期快速返回停车位置。
我的猜测是.ino脚本没有正确解码传入的pyserial数据。我试过刷新输入和输出缓冲区。