Последовательная связь между 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)
@Mohammad Nur, 👍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
- Последовательная связь Arduino с Python: отправка массива
- Сброс последовательного порта Arduino в последовательном мониторе и Python
- Почему нужно использовать latin-1 вместо utf-8 при использовании python с arduino?
- серийные данные портятся
- Как игнорировать значения мусора при последовательной связи между Arduino и Python
- В чем разница, когда ардуино был отключен от сети, и когда последовательный порт был закрыт?
- Отладка различного поведения последовательного приема/отправки между Uno и Mega
- Как исправить UnicodeDecodeError при использовании Serial.println
единственный отладочный код, который у вас есть, это
Serial.println("Привет!, я Arduino");
.... поместите больше кода отладки, чтобы определить, что получено, @jsotola