Read ASCII String

Este programa utiliza la función Serial.parseInt () para localizar valores separados por un carácter no alfanumérico. A menudo la gente usa una coma para indicar diferentes fragmentos de información (este formato se conoce comúnmente como valores separados por comas o CSV), pero otros caracteres como un espacio o un período funcionarán también. Los valores se analizan como números enteros y se utilizan para determinar el color de un LED RGB. Vamos a usar el monitor serie del Software Arduino (IDE) para enviar cadenas como "5,220,70" a la placa para cambiar el color de la luz.

Hardware Requerido

  • Placa Arduino o Genuino
  • LED RGB de ánodo común
  • 3 Resistencias de 220 ohm
  • Hilo para cableado
  • Protoboard
Circuito


Esquema



Se necesitan cuatro cables para hacer que el circuito anterior. Un cable conecta el terminal másl largo del LED RGB a 5 V. Este terminal es el terminal más largo que es el segundo de la izquierda.

Coloque el LED RGB en protoboard. Compruebe la hoja de datos de su LED para verificar los terminales, pero deben ser R, V +, G y B. El cable de +5 V por lo tanto debe conectarlo a ese segundo terminal, como se indica en el esquema de conexión anterior.

Con los cables restantes, conecte el cátodo rojo al pin 3, el cátodo verde al pin 5, y el cátodo azul al pin 6 en serie con las resistencias.

Los LEDs RGB comparten el ánodo común para la alimentación. En lugar de apagar un pin a nivel HIGH para iluminar el LED, es necesario encender los pines a nivel LOW, para crear una diferencia de tensión a través del diodo. Por lo tanto el envío de 255 a través de analogWrite () apaga el LED, mientras que un valor de 0 lo lleva a su máximo brillo. En el siguiente código, vamos a utilizar un poco de matemáticas en el programa, para que pueda enviar los valores que se corresponden con el brillo esperado. En esencia, en lugar de utilizar analogWrite (pin, brillo), se le llama analogWrite (pin, 255-brillo).

Código

Primero debemos configurar algunas variables globales para los terminales que conectan el LED. Esto hará que sea más fácil diferenciar cuál es el rojo, el verde y el azul en la parte principal del programa:

const int redPin = 3;
const int greenPin = 5;
const int bluePin = 6;
Serial.begin(9600);

También en el setup, tendremos que configurar los pines como salidas:

pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
while (Serial.available() > 0) {
int red = Serial.parseInt();
int green = Serial.parseInt();
int blue = Serial.parseInt();
if (Serial.read() == '\n') {

Usando constrain(), podemos mantener los valores en un rango aceptable para el control PWM. De esta manera, si el valor está fuera del rango de lo PWM puede enviar, se limita a un número válido. Restando este valor de 255 formateamos el valor a usar con un LED de ánodo común. Como se ha explicado anteriormente, estos LEDs se iluminan cuando hay una diferencia de tensión entre el ánodo y el pin conectado de la placa:
red = 255 - constrain(red, 0, 255);
green = 255 - constrain(green, 0, 255);
blue = 255 - constrain(blue, 0, 255);


Ahora que hemos formateado los valores de PWM, se utiliza analogWrite()) para cambiar el color del LED. Debido a que se resta el valor de 255 en el paso anterior:
analogWrite(redPin, red);
analogWrite(greenPin, green);
analogWrite(bluePin, blue);


Enviamos el valor de cada LED al monitor serie en una cadena como valores HEX:
Serial.print(red, HEX);
Serial.print(green, HEX);
Serial.println(blue, HEX);


Por último, cerramos las llaves de la sentencia if, while, y el bucle principal:
    }
  }
}

Una vez que hayamos programado la placa, abrimos el monitor del puerto serie del software de Arduino (IDE). Nos aseguramos de que hayamos elegido para enviar cada carácter en una nueva línea cuando enviamos un mensaje. Introducimos valores entre 0-255 para los LED en el siguiente formato: Rojo, Verde, Azul. Una vez que hayamos enviado los valores de la placa, el LED correspondiente se convertirá en el color especificado y recibirá de nuevo los valores HEX en el monitor serie.
/*
Leyendo una cadena serie ASCII-codificada.
Este programa demuestra la función Serial parseInt()
Se busca una cadena ASCII de valores separados por comas.
Se les analiza en int, y se les utiliza para desvanecer un LED RGB.
Circuito:  LED RGB de cátodo común cableados asi :
 * Ánodo Rojo: pin digital 3
 * Anodo Verde: pin digital 5
 * Anodo Azul: pin digital 6
 * Catodos : GND

 creado el 13 de Aril de 2012
 por Tom Igoe
 
 modificado el 14 sw Marzo de 2016
 por Arturo Guadalupi

 Este codigo es de dominio publico.
 */


// pines para los LEDs:
const int  redPin  =  3;
const int greenPin = 5;
const int bluePin = 6;

void setup() {
  // inicializa el puerto serie
  Serial.begin(9600);
  // configura los pines como salidas:
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);

}

void loop() {
  // si hay alguna serie disponible, leerla:
  while (Serial.available() > 0) {

    // buscar el siguiente entero válido en la entrada serie:
    int red = Serial.parseInt();
    //
hazlo otra vez:
    int green = Serial.parseInt();
    //
hazlo otra vez:
    int blue = Serial.parseInt();

    //
buscar la nueva línea. Ese es el final de su
    // sentencia:
    if (Serial.read() == '\n') {
      //
restringir los valores de 0 - 255 e invertir
      //
si está utilizando un cátodo común LED, sólo tiene que utilizar "constrain(color, 0, 255);"
      red = 255 - constrain(red, 0, 255);
      green = 255 - constrain(green, 0, 255);
      blue = 255 - constrain(blue, 0, 255);

      //
desvanecen los LED de color rojo, verde y azul:
      analogWrite(redPin, red);
      analogWrite(greenPin, green);
      analogWrite(bluePin, blue);

      //
imprime los tres números en una cadena hexadecimal como:
      Serial.print(red, HEX);
      Serial.print(green, HEX);
      Serial.println(blue, HEX);
    }
  }
}



No hay comentarios:

Publicar un comentario