【问题标题】:arduino auto servo movement signal from python来自python的arduino自动伺服运动信号
【发布时间】:2018-07-16 08:13:39
【问题描述】:

如何更改 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.....                       
  }              
}

【问题讨论】:

    标签: python arduino servo


    【解决方案1】:

    您正在寻找的是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);
      }
    }
    

    请注意,我将串行超时时间设置为 100 毫秒。这是为了防止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)
    

    【讨论】:

    • 抱歉忽略我的 if 语句。我了解您提供的代码,这很有意义,但我无法使其工作。您提到使用 Serial.ParseInt 但您没有在您提供的代码中使用它!我确实做了更简单的版本,现在正在尝试这个。我对此有点陌生
    • 你说的完全正确;我一直使用 Serial.read() 而不是 Serial.parseInt()。我现在相应地编辑了示例。
    • 舵机一直转90度然后停止移动
    • 当你使用write()时,Python串行库似乎也会用字符串写一个换行符; parseInt 可能正在读取正确的数字,然后是一个被解释为 0 的换行符(因此返回开始)。读取换行符后,我再次编辑了示例以移动伺服。另外,尝试在python脚本中休眠3秒; 1 可能不足以让伺服器移动。
    • 尝试了所有,现在它也没有移动 90 度。只是坐着不动。请注意,我确实尝试了整个随机数,并在使用时让伺服器从 0 度移动到 180 度或任何度数:for (pos = 180; pos >= 0; pos -= 1) { // 从 180 度开始到 0 度
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    相关资源
    最近更新 更多