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

问题描述 投票:1回答: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.....                       
  }              
}
python arduino servo
1个回答
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);
  }
}

请注意,我将串行超时时间设置为100毫秒。这是为了防止parseInt在决定它已读取整个int之前等待太多;否则,当收到一个值(比如42)时,它会等待大约1秒等待一些其他数字。

Python脚本也有一两个问题。首先,您应该在建立连接后稍等一下,因为每次打开串口时Arduino都会重置,因此它不会读取前几个值。您还可以通过在准备好时打印Arduino中的一些字符串(例如,作为setup函数的最后一条指令)来获得更清晰的解决方案,并在qzxswpoi的Python脚本中等待它。

其次,readLine将一个字节数组作为输入,而传递一个int。您需要以字节为单位编码此类int,首先将其转换为带有arduinoData.write的字符串,然后使用str对其进行编码。

我得到了以下程序:

encode
© www.soinside.com 2019 - 2024. All rights reserved.