Почему связь между Arduino и Raspberry Pi через последовательный порт настолько медленная? - PullRequest
0 голосов
/ 10 июля 2019

Я пытаюсь отправить некоторые данные из raspberry pi в arduino через последовательное соединение, но скорость кажется слишком низкой.Все, что я пытаюсь сделать, это включить и выключить свет на плате Arduino, и сигнал для переключения света отправляется через последовательное соединение.

Свет включается и выключается через некоторый промежуток времени, какпоказано в коде ниже.Когда задержка больше 1, она работает нормально, свет включается и выключается, но когда я изменяю задержку на значение меньше 1, свет вообще не мигает.Я попытался изменить скорость передачи, но это не помогает.Скорость передачи на обеих платах одинакова.Код ниже находится на Raspberry Pi.

import serial
import time

serial_light = serial.Serial('/dev/ttyACM0', 250000)

delay = float (2)

while(1):
    inp = "60"
    print ("On\n")
    serial_light.write(inp.encode())
    time.sleep(float (delay))
    inp = "61"
    print ("Off\n")
    serial_light.write(inp.encode())
    time.sleep(float (delay))

// Код Arduino

int light = 13;

void setup()
{
    Serial.begin(250000);
    pinMode(light, OUTPUT);
}

void loop()
{
    int in = 0;
    while(Serial.available() == 0);
    in = Serial.parseInt();

    if(in == 60)
    {
        digitalWrite(light, HIGH);
    }
    else if(in == 61)
    {
        digitalWrite(light, LOW);
    }
}

Еще раз, он работает для значений задержки> = 1, но не между 0 и 1.

1 Ответ

1 голос
/ 10 июля 2019

Я предпочитаю использовать String или int, а не String of int для типа команд.

Вам просто нужно создать цикл с желаемой задержкой в ​​вашем скрипте Python для отправки действий включения / выключения,затем на стороне Arduino просто получите команду и примите соответствующие меры.

Python-скрипт:

import serial
import time

delay = 2
serial_light = serial.Serial('/dev/ttyACM0', 9600)
serial_light.open()
# flush serial for unprocessed data
serial_light.flushInput()
while(1):
    print("On")
    serial_light.write(b"on")
    time.sleep(delay)
    print("Off")
    serial_light.write(b"off")
    time.sleep(delay)

Arduino-код:

int light = 13;

void setup()
{
    Serial.begin(9600);
    pinMode(light, OUTPUT);
}

void loop()
{
    // check if we have input command
    if (Serial.available())
    {
        // read input
        String command = Serial.readString();
        if (command == "on")
        {
            digitalWrite(light, HIGH);
        }
        else if (command == "off")
        {
            digitalWrite(light, LOW);
        }
    }
}
...