来自 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)