我该如何更改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.....
}
}
答案 0 :(得分:0)
您正在寻找的是ParseInt方法。 read
无需为循环使用Serial.ParseInt
来构造您的电话号码,而是完全为您服务。
正确的代码是:
#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
函数的最后一条指令)并在Python脚本中使用readLine
等待它,来获得更清洁的解决方案。 >
第二,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)