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

时间:2018-07-16 08:13:39

标签: python arduino servo

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

1 个答案:

答案 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)