В последнее время пытаюсь сделать своего рода «управление светом» на Arduino. Я использую Raspberry Pi для отправки управляющего сообщения через последовательный порт (USB-кабель). Вот код Arduino:
int redled = 12;
int whiteled = 48;
void setup()
{
Serial.begin(9600);
pinMode(redled,OUTPUT);
pinMode(whiteled,OUTPUT);
}
void loop()
{
if(Serial.available())
{
char cmd = Serial.read();
switch(cmd)
{
case'r':
digitalWrite(redled,HIGH);
delay(2000);
digitalWrite(redled,LOW);
break;
case'w':
digitalWrite(whiteled,HIGH);
delay(2000);
digitalWrite(whiteled,LOW);
break;
}
}
else
{
Serial.println("hello pi");
delay(1000);
}
}
После этого я использовал pySerial из интерпретатора Python для управления контактами, и все работало нормально. Вот часть вывода интерпретатора:
Python 2.7.3 (default, Mar 18 2014, 05:13:23)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import serial
>>> ser = serial.Serial('/dev/ttyACM0',9600)
>>> x = ser.read(10)
>>> print 'x = ',x
x = hellhello
>>> ser.write('w') #white led turn on and off
1
>>> ser.close()
>>>
Все работало нормально, светодиоды включались и выключались, поэтому я решил написать простой скрипт Python, чтобы сделать то же самое:
import serial
import time
ser = serial.Serial('/dev/ttyACM0',9600)
x = ser.read(10)
print 'x = ',x
time.sleep(2)
ser.write('w')
ser.close()
Ниже приведены команда выполнения и результат:
pi@raspberrypi ~ $ python serialtest.py
x = helello pi
Появилась только строка от Ардуино, а светодиод вообще не загорелся. Похоже, все должно быть в порядке, поэтому я не знаю, в чем может быть проблема. Я уже искал некоторые статьи и добавлял «time.sleep (2)» перед «ser.write ()», но он все равно не работал. Буду признателен за любую помощь, заранее большое спасибо!
ОБНОВЛЕНИЕ: я заставил контроллер отправлять мне данные, которые он получал, и похоже, что он ничего не получает, когда я запускаю скрипт, но получает все, когда я отправляю данные из интерпретатора. Код кода Arduino теперь выглядит так:
int redled = 12;
int whiteled = 48;
void setup()
{
Serial.begin(9600);
pinMode(redled,OUTPUT);
pinMode(whiteled,OUTPUT);
}
void loop()
{
if(Serial.available())
{
char cmd = Serial.read();
switch(cmd)
{
case'r':
digitalWrite(redled,HIGH);
delay(2000);
digitalWrite(redled,LOW);
Serial.println("Cmd received");
break;
case'w':
digitalWrite(whiteled,HIGH);
delay(2000);
digitalWrite(whiteled,LOW);
Serial.println("Cmd received");
break;
}
}
}
ser.write('w')
? Вы также можете попробовать очистить порт с помощьюser.flush()
послеser.write('w')
. - person mhawke   schedule 28.01.2015