Страница 1 из 1

Arduino and Raspberry Pi 3

СообщениеДобавлено: 14 ноя 2016, 19:03
molosh
Подключил Arduino Nano к Raspberry Pi 3.

Написал программу для ардуино(C++):

Код: Выделить всё
byte x = 0;

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

void recieveDataUSB()
{
while(Serial.available()==1)
{
x = Serial.parseInt();
Serial.print(«Arduino[5] Recieved FromRaspberry(USB)=»);
Serial.println(x);
}
}

void loop() {
recieveDataUSB();
if (x==15){
digitalWrite(13, HIGH);
delay(500);
digitalWrite(13, LOW);
delay(500);
}


Написал программу для малины (Python):

Код: Выделить всё
import serial
ser = serial.Serial('/dev/ttyUSB0', 9600)
ser.write('15')
print('SENDING')
ser.close()

Работаю в Raspbian.
Проблема следующая.
Если запустить программу на Python, то число (в нашем случае 15) не считывается ардуиной.
Если в среде Arduino IDE открыть монитор COM-порта, затем(не закрывая окно монитора COM-порта) запустить программу, написанную на питоне, то число считывается, и лампочка мигает.

Вопрос. Как обеспечить передачу по USB так, чтобы не приходилось вручную открывать этот монитор COM и число нормально считывалось в arduino? Помогите, пожалуйста.

Re: Arduino and Raspberry Pi 3

СообщениеДобавлено: 15 ноя 2016, 17:34
admin
Возможно, проблема в строчке
Код: Выделить всё
Serial.available()==1

available() - Возвращает количество байт, доступных для чтения.
Попробуйте заменить на
Код: Выделить всё
Serial.available() > 0

Re: Arduino and Raspberry Pi 3

СообщениеДобавлено: 15 ноя 2016, 19:11
molosh
Пробовал. Не помогло. =(

Re: Arduino and Raspberry Pi 3

СообщениеДобавлено: 16 ноя 2016, 13:47
admin
Проверил. Всё дело в перезагрузке контроллера при открытии последовательного соединения.
Вот так всё работает:
Код: Выделить всё
import serial, time

ser = serial.Serial('COM4', 9600)

time.sleep(3) # give a time to settle connection

print('send...')
ser.write('15')

time.sleep(2)
print('read:')
data = ser.readline()
if data:
    print(data)
   
time.sleep(5)

print('Done')
ser.close()

Re: Arduino and Raspberry Pi 3

СообщениеДобавлено: 16 ноя 2016, 22:59
molosh
Спасибо.

Всё верно. Дело в том, что необходимо вставить задержку после строки:
ser = serial.Serial('/dev/ttyUSB0', 9600)
Мне хватило задержки в 2 секунды. time.sleep(2)
Это связано с тем, что COM-порт ещё не открылся, а RPi уже отправляет туда число. В итоге до Arduino ничего не доходит.

Такой вопрос, есть ли функция для Python, которая будет проверять, открылся ли COM-порт? Тогда я бы написал код так: если COM-порт открыт, то отправить число.

Как я понял, если плата будет сильно загружена, не всегда хватит задержки 2 сек, чтобы COM-порт открылся.

Re: Arduino and Raspberry Pi 3

СообщениеДобавлено: 17 ноя 2016, 12:17
admin
molosh писал(а):Это связано с тем, что COM-порт ещё не открылся, а RPi уже отправляет туда число. В итоге до Arduino ничего не доходит.

Нет. Порт открывается, но при его открытии происходит перезагрузка контроллера и сначала запускается загрузчик (bootloader), который проверяет - не происходит ли попытка загрузить скетч в МК (при этом мигает светодиод L). И только потом, если загрузчик не видит попыток загрузки скетча - он передаёт управление ранее загруженной программе.

см. Disabling AutoReset On Serial Connection

Re: Arduino and Raspberry Pi 3

СообщениеДобавлено: 17 ноя 2016, 21:12
molosh
ага, понял спасибо.