уменьшение задержки на последовательной связи Raspberry Pi с Arduino - PullRequest
0 голосов
/ 17 октября 2019

В настоящее время я пытаюсь вращать двигатель на Arduino Uno через последовательную связь с моим Raspberry Pi 3. Сам мой код в настоящее время работает, однако иногда при запуске сценария python двигатель не вращается или не отображает какой-либо ответ. Из того, что я смог найти в Интернете, я чувствую, что посылаю сигналы быстрее, чем Arduino их читает, и я не могу найти способ минимизировать задержку и сделать свой моторный отклик согласованным.

Вот мой код Arduino:

#include <Stepper.h>

#define STEPS 128 

Stepper stepper(STEPS, 8, 10, 9, 11);

void setup() {
  Serial.begin(9600);
}
void loop() {
if (Serial.read() == 50) {
stepper.setSpeed(8); //  rpm
stepper.step(128); // do n steps -- corresponds to one revolution in one minute
}
else if (Serial.read() == 51) {
stepper.setSpeed(8); //  rpm
stepper.step(-128); // do n steps -- corresponds to one revolution in one minute
}
}

Вот мой код Python

import serial
import time

ser = serial.Serial('/dev/ttyACM0', 9600)

time.sleep(1)
num="3"
ser.write(bytes(num.encode()))

Также я не уверен, как Arduino читает мой ser.write,например, когда num = 2, я вижу «50» в моем последовательном мониторе, когда num = 3, «51» появляется в моем последовательном мониторе и т. д.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 17 октября 2019

Небольшие фрагменты данных могут находиться в буфере вывода перед отправкой. Попробуйте использовать Serial.flush () после записи, чтобы ОС знала, что вы хотите, чтобы данные отправлялись как можно скорее.

0 голосов
/ 17 октября 2019

Последовательная связь всегда выполняется в байтах. Поэтому все, что вы отправляете через интерфейс, будет получено в виде последовательности байтов. Поскольку вы закодировали свое «3» как UTF-8, оно будет отправлено как 0x33 (51). Ваше «2» равно 0x32 (50) соответственно.

Увеличение скорости передачи данных, как указано в комментарии, не поможет вам, поскольку только увеличит скорость передачи / получения данных. Без измерения вы не заметите разницу между отправкой одного байта с 9600 или 115200 бод.

Пока оба устройства работают на одной и той же скорости передачи, и вы не превышаете максимальную скорость передачи данных любого устройства (где-тооколо 2 миллионов бод для Arduino Uno) вы не можете отправить на быстрый. (с учетом подходящего кабеля и расстояния)

Вы можете столкнуться с проблемами из-за слишком длинных кабелей, но это несколько метров для 9600 бод, даже в шумной промышленной среде.

Обычно вы ждете, когда будут доступны данныев буфере приема до того, как вы прочитаете.

void loop() {
  // send data only when you receive data:
  if (Serial.available() > 0) {
    // read the incoming byte:
    incomingByte = Serial.read();

    // say what you got:
    Serial.print("I received: ");
    Serial.println(incomingByte, DEC);
  }
}

Возможно, это не приведет к некоторой задержке. Я не могу сказать наверняка, поскольку вы не указали длину наблюдаемой задержки.

Если Arduino уже работает, когда вы выполняете свой код Python, я не вижу никаких других проблем с вашим кодом. Если он загружается во время отправки, вы можете наблюдать некоторую задержку из-за загрузчика Arduino. Некоторое время он будет ждать возможных обновлений прошивки, прежде чем запустит фактический код приложения.

...