У меня проблема. Недавно я купил доску Arduino Uno. Я попытался сделать что-то смешное, как контроль ввода с моего компьютера. Я использовал Python с pySerial, и программа следующая:
arduino = serial.Serial(portaCOM, 9600, timeout = 1)
... in loop ->
arduino.write(value)
def sliderUpdate(self, event):
pos = self.slider.GetValue()
arduino.write(pos)
time.sleep(.1)
print arduino.readline()
try:
arduino = serial.Serial(portaCOM, 9600, timeout = 1)
except:
print "Errore di connessione alla porta seriale"
Значение записи должно отправить значение моей плате через USB. Загруженная на борту программа:
const int ledPin = 11;
byte brightness;
void setup(){
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
}
void loop(){
while(Serial.available()){
brightness = Serial.read();
Serial.print(brightness);
analogWrite(ledPin, brightness); //LED doesn't refresh the brightness
delay(10);
}
}
Мой светодиод работает правильно. Я попытался с примером Fade, предоставленным Arduino, и он работает.
Я проверил, правильно ли программа передает данные. Да. Он возвращает то же, что и раньше.
Он должен получить отправленное значение и установить analaogWriter(pin, VALUE)
, но что-то не так или не работает.
Как я могу исправить эту проблему?
Решение
Код Arduino
const int ledPin = 11;
byte valoreLed;
void setup(){
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
}
void loop(){
while(Serial.available()){
valoreLed = Serial.read();
analogWrite(ledPin, valoreLed);
delay(20);
}
}
Код Python script:
pos = self.slider.GetValue()
arduino.write(chr(pos))
Спасибо всем!:)
value
в вашем примере? Попробуйте arduino.write(chr(0xFF))
, горит ли светодиод?Я подозреваю, что arduino.readline()
ждет новой строки, и код Arduino никогда не отправляет новую строку. Следовательно, код Python блокируется бесконечно после отправки первого значения.
Я вижу в ваших комментариях, что светодиод работает с первым символом, но вы не видите изменения с разными символами. Определенно убедитесь, что вы отправляете символы ASCII, которые значительно отличаются от предыдущих символов, например. отправьте ASCII 0, а затем ASCII 255.
Изменить: Поскольку вы говорите, что работает пример FadeLED, можете ли вы просто взять этот пример и добавить к нему функции последовательного порта? Например, только после получения последовательного символа исчезает. Это, по крайней мере, позволит вам убедиться, что последовательный порт и светодиоды могут сосуществовать в коде, который вы пишете. Кроме того, я предполагаю, что вы используете пример FadeLED из здесь. Если это так, убедитесь, что вы установили правильный номер контакта, поскольку ссылочный код использует контакт 9, но в вашем примере кода используется контакт 11.
Другое Редактирование:
Вы говорите, что вы правильно возвращаете символы из Arduino, но вы используете функцию pySerial ReadLine
, которая должна блокироваться до тех пор, пока не увидит новую строку, и я не вижу ничего в коде Arduino, который генерирует новую строку, которая сначала не был отправлен. Чтобы устранить количество переменных в вопросе, попробуйте использовать HyperTerminal или аналогичную программу COM-порта для отправки байтов в Arduino, а не в вашу программу Python. Например, вы можете отправлять символы пробела (ASCII 32) и "}" (ASCII 125), которые должны быть различны, чтобы создать видимую разницу в светодиоде.
"значение записи должно отправить значение на мою плату через USB"
Если это не опечатка, вы не можете использовать PySerial для доступа к USB-портам. Вместо этого есть pyUSB и, возможно, другие.
Я бы начал с определения того, на какой стороне последовательного порта есть проблема.
Прежде всего, вы можете управлять светодиодом, используя жестко закодированный цикл на Arduino. Светодиод меняет свою яркость, как ожидалось?
Как только вы уйдете с пути, вы можете заставить Arduino сделать что-то явно правильное при отправке материала вручную из терминала (например, встроенного в IDE Arduino). Это может потребовать внесения изменений в код Arduino.
После этого я тогда сосредоточусь на коде Python, убедившись, что вы разговариваете с правильным COM-портами и т.д.