Отправьте несколько значений 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);
  }
}

, 👍1


2 ответа


Лучший ответ:

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]);
  }
}
,

Вы не проверяете, есть ли в Serial.available() 3 доступных значения. Так что он будет заполнен -1, если их нет. Проверьте, сколько байтов находится в буфере приема., @baldengineer


0
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