来自python的arduino自动伺服运动信号



如何更改arduino中的if语句,以便将伺服移动到与python中随机化的程度相同的程度?

首先他是python代码:

import serial
import time
import random
arduinoData = serial.Serial('com4',9600)     
while True:
low = 0; high = 180
ran_number = random.randint(low, high)
print ran_number
time.sleep(1)
arduinoData.write(ran_number) 

python代码可以与其他东西配合使用。

现在的arduino代码,修复这个:

#include <Servo.h>
Servo myservo;
int data;
int pin=9;
int pos = 0;
void setup() { 
myservo.attach(9);
pinMode(pin, OUTPUT); 
digitalWrite (pin, LOW);
Serial.begin(9600);
}
void loop() {
while (Serial.available()){
data = Serial.read();
}
if statement here.....                       
}              
}

您正在寻找的是ParseInt方法。Serial.ParseInt并没有在循环中使用read来构造你的数字,而是为你做到了这一点。

正确的代码是:

#include <Servo.h>
Servo myservo;
int pin = 9;
void setup() {
myservo.attach(9);
pinMode(pin, OUTPUT);
digitalWrite(pin, LOW);
Serial.setTimeout(100);
Serial.begin(9600);
}
void loop() {
int number;
if (Serial.available()) {
number = Serial.parseInt();
myservo.write(number);
delay(0.5);
}
}

请注意,我将串行超时时间设置为100ms。这是为了防止parseInt在决定它已经读取了整个int之前等待太久;否则,当接收到一个值(比如42(时,它等待大约1秒,等待一些其他数字。

Python脚本也有一两个问题。首先,你应该在建立连接后等待一段时间,因为每次打开串行时,Arduino都会重置,所以它不会读取前几个值。您还可以在准备好时从Arduino打印一些字符串(例如,作为setup函数的最后一条指令(,并在具有readLine的Python脚本中等待它,从而获得更干净的解决方案。

其次,arduinoData.write以字节数组作为输入,而您传递一个int。您需要以字节为单位对此类int进行编码,首先用str将其转换为字符串,然后用encode对其进行编码。

我有以下程序在运行:

import serial
import time
import random
arduinoData = serial.Serial('/dev/ttyUSB0',9600)  
# Let Arduino some time to reset
time.sleep(2)
while True:
low = 0; high = 180
ran_number = random.randint(low, high)
print(ran_number)
arduinoData.write(str(ran_number).encode())
time.sleep(1)