Проблема с Arduino и pySerial - PullRequest
       19

Проблема с Arduino и pySerial

1 голос
/ 01 декабря 2010

У меня проблема.Недавно я купил плату 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:

pos = self.slider.GetValue()
arduino.write(chr(pos))

Спасибо всем !!:)

Ответы [ 5 ]

2 голосов
/ 01 декабря 2010
  1. Прежде всего, убедитесь, что ваш светодиод правильно подключен.Анод (более длинный контакт) к порту PWM 11 и катод (более короткий контакт) к земле, также вам может понадобиться добавить резистор между катодом и землей в зависимости от светодиода.
  2. Убедитесь, что вы пишете в правильный портот python (с которым в вашей ОС связан кабель FTDI).
  3. Если вы не используете кабель FTDI с разъемом USB, убедитесь, что все контакты подключены к правильным входам.
  4. Какое значение value в вашем примере?Попробуйте arduino.write(chr(0xFF)), светодиод не горит?
1 голос
/ 01 декабря 2010

Я подозреваю, что arduino.readline() ждет новой строки, и ваш код Arduino никогда не отправляет новую строку. Следовательно, код Python блокируется на неопределенный срок после отправки первого значения.

1 голос
/ 01 декабря 2010

Я вижу в ваших комментариях, что светодиод работает с первым символом, но вы не видите изменений с другими символами.Обязательно убедитесь, что вы отправляете символы ASCII, которые значительно отличаются от предыдущих символов, например, отправляете ASCII 0, а затем ASCII 255.

Edit: так как вы говорите, что пример FadeLED работает, вы можете просто взять этопример и добавить к нему функциональность последовательного порта?Например, исчезать только после получения серийного символа.Это, по крайней мере, даст вам уверенность в том, что последовательный порт и светодиоды могут сосуществовать в написанном вами коде.Кроме того, я предполагаю, что вы используете пример FadeLED из здесь .Если это так, убедитесь, что вы установили правильный номер контакта, так как в качестве кода ссылки используется контакт 9, а в примере кода используется контакт 11.

Другое правка: вы говорите, что правильно получаете символы из Arduino, но вы используете функцию pySerial ReadLine, которая должна блокироваться, пока не увидит новую строку, и я не вижу ничего в коде Arduino, который генерировал бы новую строку, которая не была отправлена ​​ему первой.Чтобы исключить количество переменных в вопросе, попробуйте использовать HyperTerminal или аналогичную программу COM-порта для отправки байтов в Arduino, а не в программу Python.Например, вы можете отправить пробельные символы (ASCII 32) и символы '}' (ASCII 125), которые должны быть достаточно разными, чтобы создать видимую разницу в индикаторе.

0 голосов
/ 01 декабря 2010

Я бы начал с определения того, какая сторона последовательного порта таит в себе проблему.

Прежде всего, вы можете управлять светодиодом, используя жестко закодированный шлейф на Arduino.Меняет ли светодиод яркость, как ожидалось?

Если это не так, можете ли вы заставить Arduino делать что-то визуально правильное, отправляя данные вручную из терминального приложения (например, встроенного в Arduino IDE).Это может потребовать внесения изменений в код Arduino.

Как только он заработает, я сосредоточусь на коде Python, убедившись, что вы говорите с правильным COM-портом и т. Д.

0 голосов
/ 01 декабря 2010

"значение записи должно отправить значение на мою плату через USB"

Если это не опечатка, вы не можете использовать PySerial для доступа к USB-портам. Вместо этого есть pyUSB и, вероятно, другие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...