Pregunta

Tengo un problema. Recientemente he comprado un Arduino Uno bordo. Traté de hacer algo gracioso como controlar una entrada de mi ordenador. Solía ??Python con PySerial y el programa es el siguiente:

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"

El valor de escritura debe enviar el valor de mi tabla a pesar de USB. El programa cargado a bordo es:

 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);
     }
 }

Mi LED está funcionando correctamente. Probé con el ejemplo de fundido proporcionado por Arduino y que está funcionando ..

he comprobado si el programa está enviando correctamente los datos. Sí lo es. Devuelve el mismo envié delante.

Se debe recuperar el valor enviado y analaogWriter(pin, VALUE) conjunto, pero algo está mal o no funciona.

¿Cómo puedo solucionar este problema?

Solución

El código de 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 código de script:

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

Gracias a todos !! :)

¿Fue útil?

Solución

  1. En primer lugar, asegúrese de que el LED está conectado correctamente. Ánodo (patilla más larga) a PWM 11 Puerto y el cátodo (pin más corto) a tierra, también es posible que tenga que añadir una resistencia entre el cátodo y el suelo en función de LED.
  2. Asegúrese de que está escrito en el puerto derecha desde pitón (cable de FTDI que se asocia con en su sistema operativo).
  3. Si usted no está usando un cable FTDI con conector USB, asegúrese de que todos los pines están conectados a las entradas adecuadas.
  4. ¿Cuál es el valor de value en su ejemplo? Trate arduino.write(chr(0xFF)), no iluminado LED estancia?

Otros consejos

sospecho que espera arduino.readline() para una nueva línea, y usted Arduino código nunca envía una nueva línea. De ahí que los bloques de código Python de forma indefinida después de enviar el primer valor.

Veo en sus comentarios que el LED funciona con el primer carácter, pero no veo un cambio con los diferentes personajes. Sin duda asegurarse de que está enviando caracteres ASCII que son significativamente diferentes de los personajes anteriores, por ejemplo, enviar un archivo ASCII 0 seguido de un ASCII 255.

Editar: Puesto que usted dice las obras FadeLED ejemplo, se puede simplemente tomar ese ejemplo y añadir la funcionalidad de puerto serie a ella? Por ejemplo, sólo se desvanecen después de que se recibe un carácter de serie. Esto por lo menos conseguir que confía en que el puerto y leds en serie pueden coexistir en el código que escriba. Además, supongo que está utilizando el ejemplo de FadeLED aquí . Si es así, asegúrese de que ha establecido el número PIN correcto, ya que el uso del código de referencia de la patilla 9, pero su código de ejemplo utiliza los terminales 11.

Otra edición: Usted dice que usted recibe los caracteres nuevamente de forma correcta desde el Arduino, pero que está utilizando la función ReadLine PySerial, que debe bloquear hasta que ve una nueva línea, y no se ve nada en el código de Arduino que generaría una nueva línea todo esto fuese' t envió a él en primer lugar. Para eliminar el número de variables en la pregunta, trate de usar un programa de puerto COM similares HyperTerminal o para enviar bytes al Arduino, en lugar de su programa Python. Por ejemplo, puede enviar los caracteres de espacio (ASCII 32) y '}' caracteres (ASCII 125), que debe ser lo suficientemente diferentes como para crear una diferencia visible en el LED.

Yo comenzaría por establecer qué lado del puerto serie alberga el problema.

En primer lugar, se puede conducir el LED usando un bucle no modificable en el Arduino. ¿Cambia el LED de su brillo como se esperaba?

Una vez que está fuera del camino, que puede hacer que el Arduino hacer algo visiblemente correcta al enviar cosas manualmente desde una aplicación de terminal (por ejemplo, el construido en el IDE de Arduino). Esto puede requerir cambios en el código de Arduino.

Una vez que está trabajando, yo luego centrarse en el código Python, asegurándose de que está hablando con el puerto COM correcto, etc.

"el valor de escritura debe enviar el valor de mi tabla a través de USB"

Si esto no es un error, entonces no se puede utilizar PySerial a los puertos USB de acceso. Hay pyUSB lugar, y probablemente otros.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top