22 de julio de 2013

Arduino: Cambiar color de una LED RGB por puerto serie desde python (1/3)

Esta vez, la idea es tener una LED RGB en nuestra Arduino y cambiar el color de la misma enviando los valores correspondientes rojo, verde y azul por el puerto serie. Probablemente no tengáis puerto serie en vuestro PC, pero eso no es problema ya que, aunque conectamos la Arduino por USB, en realidad el acceso es por puerto serie.

Antes de ponernos manos a la obra, veamos el resultado final:



Empezaremos programando nuestra Arduino. Lo primero es hacer las conexiones de los componentes. Debería quedar así:

Base del diseño de esta imagen hecha con Fritzing

Una vez conectado todo, vamos con el código:

// recibo por puerto serie unos colores indicados por un programa
// en python y enciendo el color correspondiente en una LED RGB

#define PINROJO 11
#define PINVERDE 10
#define PINAZUL 9

void setup() 
{  
  // cambio el modo de los pines a salida
  pinMode(PINROJO, OUTPUT);
  pinMode(PINVERDE, OUTPUT);
  pinMode(PINAZUL, OUTPUT);
  // inicializo el puerto serie
  Serial.begin(9600); 
}

void loop() 
{
  // si tenemos conectado el puerto serie...
  while(Serial.available() > 0) 
    {
     // buscamos el siguiente entero correcto en la cadena de datos
     int rojo = Serial.parseInt();
     // otra vez
     int verde = Serial.parseInt();
     // y otra
     int azul = Serial.parseInt();

     // buscamos el fin de línea
     if (Serial.read() == '\n') {
       // adaptamos los valores a 0 a 255
       rojo = constrain(rojo, 0, 255);
       verde = constrain(verde, 0, 255);
       azul = constrain(azul, 0, 255);   

       // encendemos los distintos colores de la LED
       analogWrite(PINROJO, rojo);
       analogWrite(PINVERDE, verde);
       analogWrite(PINAZUL, azul);
 
       // Mostramos los 3 numeros en hexadecimal en el monitor serial
       Serial.print(rojo, HEX);
       Serial.print(" ");
       Serial.print(verde, HEX);
       Serial.print(" ");
       Serial.println(azul, HEX);
     }
   }
}



Como vemos, no es muy complicado. La última parte, la de mostrar en hexadecimal el color, es simplemente para comprobar que se ha recibido bien.

Aquí tenéis el archivo .ino: archivo.

Ahora que ya hemos programado nuestra Arduino, vamos a probar si funciona.

Con el IDE abierto, abrimos el Monitor Serial:


El monitor serial se encuentra arriba a la derecha, como podemos ver en la imagen anterior. También debemos cambiar abajo el modo a Nueva Línea si no lo tenemos ya así.

Para comprobar que funciona correctamente, escribiremos en la parte superior los valores RGB (rojo, verde, azul) que queramos, siempre que sean números de 0 a 255 y lo hagamos separados por comas. Por ejemplo, 255,0,0 para el color rojo:


Una vez escrito, pulsaremos la tecla Enter (o pulsaremos el botón Enviar). Vemos como nuestra Arduino ha respondido con el color en hexadecimal, así que sabemos que el dato ha sido recibido y hemos llegado a la última parte del código.


Pero, ¿ha funcionado? Miramos hacia nuestra LED RGB y vemos que el resultado ha sido el correcto:


En la siguiente entrega veremos cómo diseñar el programa con Qt Designer y, en la posterior, cómo programarlo en python.

Un saludo.