En este post vamos a aprender a conectar y programar una tira led WS2812B con Arduino.
Así vamos a conseguir diferentes efectos de luces y colores en la tira led.
Mediante un botón vamos a poder saltar de efecto en efecto o lo que es lo mismo, de programa en programa.
Veremos programas para efectos de luces sencillos y otros para efectos más complejos.
Para ello:
- Puedes repasar cómo montar un botón mediante el montaje PULL-UP en este post dedicado a ello.
- Estudiaremos en detalle la tira led WS2812B (neopixel).
- Veremos el montaje o esquema del circuito.
- Aprenderemos la programación de diferentes secuencias de luces.
LA TIRA LED WS2812B:
Es una tira formada por una sucesión de leds (Led5050) que tiene la característica de que podemos modificar el color de cada led de manera independiente.
Dicho modelo es del tipo “individual addressable” esto significa que podemos acceder a cada led de forma individual gracias al integrado que lleva cada led.
Los datos se envían en serie ya que los leds están conectados en cadena, de tal forma que cada led almacena el dato que lleva su dirección y hace de transmisor para el led siguiente. Esto permite dividir o sumar más leds y el resultado seguirá funcionando. Esta transmisión no será perceptible al ojo humano ya que se realiza a altas velocidades (400 Hz).
Cada led tiene incorporado un pequeño circuito integrado. Dicho integrado es capaz de almacenar 3 bytes (8 bits por byte). Cada byte corresponderá a un color RGB por lo que cada color puede tener 28= 256 niveles y por tanto el led podrá dar un total de 2563 colores.
El modelo de tira led WS2812B también llamado NeoPixel y tiene las siguientes características:
Longitud | 1 m |
Densidad de leds | 60 leds/m |
Ingress Protectión (IP) | IP30* |
Conexionado de la tira led WS2812B:
La tira led se conecta a través de tres cables que corresponden a:
Negativo | GND |
Din | Pin digital de la placa (la conectaremos al pin 6) |
Positivo | +5V |
¿Podemos alimentar la tira led directamente desde la placa compatible con arduino?
Veamos, el caso más desfavorable es que todos los leds de la tira estén iluminando en blanco intenso. Esto requeriría un consumo de unos 60 mA por cada led. (Cada led de la tira está formado por tres pequeños leds que consumen 20mA cada uno, esto es: 20+20+20=60 mA).
En nuestro caso para los 60 led de que consta nuestra tira supondrían:
lo que es inasumible para una placa compatible Arduino porque recordemos que cada pin puede dar un máximo de 40 mA (valor recomendado 20 mA) con la resticción de que como máximo el conjunto de todas las salidas debe ser menor de 300 mA (siempre que no superen 150 mA por puerto).
Por lo tanto, NO PODEMOS ALIMENTAR LA TIRA LED DIRECTAMENTE DESDE LA PLACA.
Entonces debemos alimentar por un lado la tira led y por otro independiente la placa.
Lo ideal es alimentarla con una fuente de alimentación de 5V y 2A para alimentar la tira led. Pero ¿es suficiente con la potencia que nos suministra esta fuente?
Veamos: la potencia máxima que nos puede dar la fuente será:
Si sabemos que por lo general, la corriente real para un diseño colorido es aproximadamente 1/3 a 1/2 de la corriente máxima, esto corresponderá a unos valores de potencia de:
Por tanto, la fuente de alimentación cumple con la condición de potencia.
Respecto a la placa compatible con Arduino, no podemos alimentarla desde la fuente de alimentación de 5V porque lo deberíamos hacer mediante el pin de 5V y si por un descuido o desconocimiento intentáramos alimentar el proyecto por el usb o el conector DC de la placa (y no mediante la fuente) podríamos romper la placa ya que esta intentaría suministrar intensidad por el pin de 5V hacia la tira led y como hemos dicho, la tira led requiere mucho más potencia de la que la placa puede dar.
Por tanto debemos utilizar un conector DC para alimentar la tira mediante la fuente de alimentación y una pila de 9V para alimentar la placa de manera independiente a la tira led.
Destacar que la tierra (GND) de la placa ha de ser común a la de la tira led.
También habrá que montar una resistencia de 470 Ohm entre el pin de salida digital y el Din de la tira led, esto evitará posibles daños en los primeros leds.
Por último, para reducir riesgo de quemado de la WS2812B se recomienda añadir un condensador de 1000uF entre 5V y GND.
MONTAJE O ESQUEMA DEL CIRCUITO:
Para hacerlo más fácil vamos a verlo por partes:
- Primero mostraremos el esquema para el montaje del botón (PULL-UP).
- Segundo mostraremos el esquema para montar la tira led WS2812B (Neopixel).
- Tercero y último mostraremos los dos anteriores juntos, es decir el montaje final.
Esquema para el montaje del botón PULL-UP:
Utilizamos dos placas protoboard mini porque queremos hacer accesible el botón desde fuera de una caja donde guardamos todo el montaje. (Puedes ver nuestro Kit Control de tira led).
Si simplemente vas a hacer el montaje a modo de práctica puedes montarlo sobre una única placa protoboard más grande.
Como se indica en el post dedicado a cómo usar o conectar un pulsador con Arduino que mencionamos al principio de este post, es posible conectar el pulsador sin la resistencia de 4k7 ohms activando la resistencia PULL-UP interna de Arduino con el comando pinMode(pin, INPUT_PULLUP); pero en este caso hemos decidido realizar el montaje con dicha resistencia ya que hay espacio suficiente y también para que sirva como práctica.
Esquema para el montaje o conexión de la tira led WS2812B (Neopixel):
Como puedes observar montamos sobre una fila todos los negativos (cables de color negro):
- Del conector de alimentación.
- De la tira WS2812B (Neopixel).
- El negativo del condesador.
- El negativo de la placa compatible con Arduino.
(Recordar que hay que hacer el negativo común).
Y sobre otra fila todos los positivos (cables de color rojo):
- Del conector de alimentación.
- De la tira WS2812B (Neopixel).
Después también hay que tener en cuenta que hemos de conectar una resistencia de 470 Ohm entre el pin de salida digital y el Din de la tira led.
Esquema final de todo el conjunto:
PROGRAMACIÓN TIRA LED WS2812B (Neopixel):
A continuación vamos a estudiar cómo programar diferentes programas de luces para la tira led WS2812B (neopixel) que serán activados de forma secuencial con el botón.
Podrás comprobar que este es el proyecto más complicado hasta la fecha que hemos realizado en cuanto a programación.
A poco que sepas de programación no te será complicado entenderlo y te resultará un reto asumible para así dar un paso más en el aprendizaje de programación.
Si realmente es la primera vez que intentas programar te aconsejamos que visites otras entradas al blog mucho más sencillas.
Lo primero es añadir la librería Adafruit_NeoPixel.h para la tira led.
Esto nos permitirá hacer funcionar la tira led WS2812B correctamente.
¿Cómo las instalamos? Vamos a
Herramientas > Administar bibliotecas
Aparecerá el gestor de Librerías. Escribimos en la búsqueda “Adafruit Neo Pixel”. La buscamos y la instalamos.
Ahora sí, vamos con el programa:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
/* InputMakers * En este proyecto CONTROL DE TIRA LED de InputMakers controlamos la tira led (NeoPixel) mediante un pulsador. * Tenemos programadas diferentes secuencias que van cambiando al pulsar el botón. * Necesitas pulsar una vez más el botón para empezar la secuencia. */ #include <Adafruit_NeoPixel.h> // Incluimos la librería Adafruit NeoPixel. Esto se hace para poder ejecutar los comandos pertenecientes a esta librería necesarios para poder gobernar la tira led Neo Pixel. #define BUTTON_PIN 2 // Pin 2 conectado al botón. (Montaje pull-up). #define PIXEL_PIN 6 // Pin 6 conectado a la tira led. Digital IO pin connected to the NeoPixels. #define PIXEL_COUNT 60 // Número de leds (pixels) de la tira led Neo Pixel. // Para el comando Adafruit_NeoPixel nos encontramos con las siguientes instrucciones, de la página de Adafruit: // Parameter 1 = number of pixels in strip // Parameter 2 = pin number (most are valid) // Parameter 3 = pixel type flags, add together as needed: // NEO_RGB Pixels are wired for RGB bitstream // NEO_GRB Pixels are wired for GRB bitstream, correct for neopixel stick // NEO_KHZ400 400 KHz bitstream (e.g. FLORA pixels) // NEO_KHZ800 800 KHz bitstream (e.g. High Density LED strip), correct for neopixel stick // Port tanto seleccionamos para el tercer parámetro las opciones NEO_GRB + NEOKHZ800 ya que son válidas para neopixel stick. Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800); bool oldState = HIGH; // definimos la variable de estado oldState de tipo booleana y la inicializamos a HIGH. int showType = 0; // definimos la variable entera showType. void setup() { pinMode(BUTTON_PIN, INPUT); // Definimos el pin asociado a BUTTON_PIN como entrada. strip.begin(); // con begin inicializamos la tira led. strip.show(); // con show actualizamos toda la tira de una sola vez. } void loop() { // Obtenemos el nuevo estado (newState) o estado actual del botón. bool newState = digitalRead(BUTTON_PIN); // Comprobamos si el estado ha cambiado de high a low (botón presionado). if (newState == LOW && oldState == HIGH) { // delay corto para evitar falsas pulsaciones o rebotes en el pulsador. delay(20); // Comprobamos que el botón esté aún en low después del delay. (Después de posibles rebotes). newState = digitalRead(BUTTON_PIN); // Aumentamos en uno el valor de la variable showType y llamamos a la función startShow con el valor de showType. if (newState == LOW) { showType++; // al llegar a 8 reiniciamos la variable a 0. if (showType > 8) showType=0; startShow(showType); } } // OldState pasa a valer newState para iniciar otra vez el loop. oldState = newState; } // con la función startShow vamos llamado a las diferentes escenas de la tira led al pulsar el botón. void startShow(int i) { switch(i){ case 0: colorWipe(strip.Color(0, 0, 0), 50); // Apagada break; case 1: theaterChase(strip.Color(127, 127, 127), 50); // Blanco break; case 2: theaterChase(strip.Color(127, 0, 0), 50); // Rojo break; case 3: theaterChase(strip.Color( 0, 0, 127), 50); // Azul break; case 4: colorWipe(strip.Color(255, 0, 0), 50); // Rojo break; case 5: colorWipe(strip.Color(0, 255, 0), 50); // Verde break; case 6: colorWipe(strip.Color(0, 0, 255), 50); // Azul break; } } // Enciende los pixels uno tras otro con el color recibido. // c de color indica el color que irá rellenando la tira y wait son los milisegundos de un encendido a otro. // uint32_t o uint8_t significa que c o wait son variables del tipo números enteros sin signo u (unsigned) de 32 u 8 bits. Se hace para indicar unívocamente el número de bits empleados para almacenar la variable. void colorWipe(uint32_t c, uint8_t wait) { for(uint16_t i=0; i<strip.numPixels(); i++) { // Bucle for recorre todos los pixels de la tira con la variable i. strip.setPixelColor(i, c); // i es el pixel actual para cada iteración y c el color. strip.show(); // Actualizamos la tira. delay(wait); // Esperamos un tiempo wait de una iteración a otra. } } // Reproduce unas luces tipo teatro que van moviéndose en persecución hasta quedar fijas. // c de color indica el color que irá rellenando la tira y wait son los milisegundos de un encendido a otro. void theaterChase(uint32_t c, uint8_t wait) { for (int j=0; j<10; j++) { // Realiza 10 ciclos de persecución. for (int q=0; q < 3; q++) { for (int i=0; i < strip.numPixels(); i=i+3) { strip.setPixelColor(i+q, c); // Enciende cada tercer pixel. } strip.show(); delay(wait); for (int i=0; i < strip.numPixels(); i=i+3) { strip.setPixelColor(i+q, 0); // Apaga cada tercer pixel. } } } } |
Esperamos que te haya gustado este post y que hayas disfrutado descifrando la programación :))
En nuestra página encontraréis el proyecto del “CONTROL DE TIRA LED” en el que encontrarás más programas de luces y con el que podrás ampliar tus conocimientos sobre programación.
¡También puedes intentar programar la tira led con tu color favorito modificando el código!
IMPORTANTE: OFRECEMOS GRANDES DESCUENTOS PARA CENTROS EDUCATIVOS! SI ERES UN CENTRO EDUCATIVO PIDE PRESUPUESTO PERSONALIZADO AQUÍ
[product_page id=”246″]
Comparte si te ha gustado 🙂
Saludos del equipo de InputMakers y ¡Sigue siempre aprendiendo!