Последовательная связь между python и arduino

Я работаю над роботом отслеживания объектов. Я использую python и OpenCV для обнаружения объекта и отправки соответствующих данных в arduino, который управляет двумя сервомоторами. Данные, которые должны быть отправлены в arduino, - это углы сервомоторов в диапазоне 0-180. Я использую примеры кодов, чтобы понять, как python и arduino взаимодействуют с помощью последовательной шины.Когда я отправляю одну цифру, arduino получает ее и работает по назначению, но когда я отправляю более одной цифры, ничего не происходит. Это код arduino:

#include <Servo.h>
int data;
Servo myservo;  // создать серво объект для управления серво
// на большинстве плат можно создать двенадцать
int pos = 0;    // переменная для сохранения положения серво

void setup() { 
  Serial.begin(9600); //initialize serial COM at 9600 baudrate
  pinMode(LED_BUILTIN, OUTPUT); //make the LED pin (13) as output
  digitalWrite (LED_BUILTIN, LOW);
  myservo.attach(9);
  Serial.println("Привет!, я Arduino");
}

void loop() {
while (Serial.available()){
 //to receive more than one character 
 char buffer[] = {' ',' ',' ',' ',' ',' ',' '}; // Receive up to 7 bytes
 while (!Serial.available()); // Ждать символов
 Serial.readBytesUntil('n', buffer, 7);
 data = atoi(buffer);

}
myservo.write(data);
}

И вот код python:

import serial
import time  # Требуется для использования функций задержки

arduinoSerialData = serial.Serial('com14', 9600)  # Create Serial port 
object called arduinoSerialData
time.sleep(2)  # подождите 2 секунды для установления связи
established

print arduinoSerialData.readline()  # прочитайте последовательные данные и распечатайте их как line
print ("Enter 1 to turn ON LED and 0 to turn OFF LED")

while 1:  # Do this forever

    var = raw_input()  # get input from user
    print "you entered", var  # print the intput for confirmation

    arduinoSerialData.write(var)

, 👍1

Обсуждение

единственный отладочный код, который у вас есть, это Serial.println("Привет!, я Arduino"); .... поместите больше кода отладки, чтобы определить, что получено, @jsotola


1 ответ


1

Если функция последовательной записи python отправляет байт, вы должны прочитать его в Arduino с помощью Serial.read().

void loop() {
  if (Serial.available()){
    byte data = Serial.read();
    myservo.write(data);
  }
}

Если python отправляет число в виде текста, вы можете прочитать его с помощью parseInt().

void loop() {
  if (Serial.available()){
    int data = Serial.parseInt();
    myservo.write(data);
  }
}

Функция parseInt является одной из блокирующих функций и по умолчанию будет ждать следующего символа в течение одной секунды после получения последней отправленной цифры. Но номер отправляется сразу с python, поэтому задержки между цифрами невелики. Установить в setup() Последовательный.setTimeout(10);

,

Мне нужно постоянно обновлять угол наклона сервопривода. В этом что-то не так?, @Mohammad Nur

Я не знаю. Я никогда не управлял сервоприводами., @Juraj

Как arduino сохраняет полученные данные? в каком типе данных?, @Mohammad Nur

Я отредактировал ответ, @Juraj

пожалуйста, проверьте этот пост: https://arduinoprosto.ru/q/55986/delay-in-serial-communication-between-python-and-arduino, @Mohammad Nur

прочитайте последний абзац этого ответа, @Juraj

Помимо времени ожидания, parseInt также возвращает недопустимые символы для целого числа. Если вы отправите номер в виде строки, задержки быть не должно. Вам просто нужно очистить оставшиеся символы из буфера, потому что parseInt не использует их., @gre_gor

но здесь это машина к машине. и, возможно, ручной ввод с последовательного монитора для тестирования., @Juraj