来自 python 的 arduino 自动伺服运动信号
arduino auto servo movement signal from python
我如何更改 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
函数的最后一条指令)并在 Python 脚本中使用 [=16= 等待它].
其次,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)
我如何更改 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
函数的最后一条指令)并在 Python 脚本中使用 [=16= 等待它].
其次,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)