Отправьте несколько значений int из Python в Arduino, используя pySerial
Я пытаюсь отправить 3 целых числа в диапазоне от 0 до 180 из Python на устройство Arduino Uno, используя pySerial (py3K). Мне удалось отправить 1 int с помощью python struct lib (не уверен, что это лучший или самый быстрый способ, но он работает).
Однако мне не удается отправить более 1, и каждый онлайн-пример останавливается на 1.
Вот упрощенный код. Задача состоит в том, чтобы отправить servo0-servo4 на Arduino и применить эти значения к соответствующим сервоприводам.
Код Python
import serial
import struct
import time
bge.arduino = serial.Serial('/dev/ttyACM0', 9600)
# let it initialize
time.sleep(2)
# send the first int in binary format
bge.arduino.write(struct.pack('>B', 45))
Код Arduino
#include <Servo.h>
Servo servo0;
Servo servo1;
Servo servo2;
void setup(){
Serial.begin(9600);
servo0.attach(3);
servo1.attach(5);
servo2.attach(6);
}
void loop(){
if(Serial.available()){
int message = Serial.read();
// управление сервоприводом
servo0.write(message);
}
}
@ZanQdo, 👍1
2 ответа
Лучший ответ:
Думаю, я отвечу на свой вопрос для всех, у кого возникла эта проблема. Что я сделал:
Питон:
# записать в arduino как необработанный двоичный файл
bge.arduino.write(struct.pack('>BBB',45,90,180))
Ардуино:
#include <Servo.h>
Servo servo0;
Servo servo1;
Servo servo2;
// создать массив
int incoming[2];
void setup(){
Serial.begin(9600);
servo0.attach(3);
servo1.attach(5);
servo2.attach(6);
}
void loop(){
while(Serial.available() >= 3){
// заполняем массив
for (int i = 0; i < 3; i++){
incoming[i] = Serial.read();
}
// используем значения
servo0.write(incoming[0]);
servo1.write(incoming[1]);
servo2.write(incoming[2]);
}
}
void loop(){
if(Serial.available() >= 3){
// заполняем массив
for (int i = 0; i < 3; i++){
incoming[i] = Serial.read();
}
// используем значения
servo0.write(incoming[0]);
servo1.write(incoming[1]);
servo2.write(incoming[2]);
}
}
Спасибо @baldenginer. Я сейчас проверяю, как вы предложили. Однако через некоторое время игры с программой она полностью запуталась, и мне пришлось перезагрузить Arduino, чтобы она снова заработала. Я подозреваю, что порядок байтов может перетасовываться?, @ZanQdo
Holly cow, я думаю, что решил проблему, заменив _if(Serial.available().._ на _while(Serial.available().._) Имеет ли это смысл для вас?, @ZanQdo
- Почему нужно использовать latin-1 вместо utf-8 при использовании python с arduino?
- В чем разница, когда ардуино был отключен от сети, и когда последовательный порт был закрыт?
- Ардуино не может правильно выводить
- Моя проблема, 51:28: ошибка: ожидаемое первичное выражение перед токеном ')' может кто-нибудь дать мне совет или направить меня к исправлению моей проблемы? Без разницы
- Программирование Arduino с использованием Python, а не C/C ++
- Печать string and integer LCD
- Почему мои часы реального времени показывают неверное время с моего ПК?
- Arduino uno + cnc Shield v3 + драйвер шагового двигателя A4988 + AccelStepper?
Вы не проверяете, есть ли в Serial.available() 3 доступных значения. Так что он будет заполнен -1, если их нет. Проверьте, сколько байтов находится в буфере приема., @baldengineer