Crea tu propia réplica de las luces de los coches de policía que se utilizan en la mayor parte de América. Podrás saber lo que pasa en el techo de una patrulla cuando el sheriff presiona el botón.
Desde luego esto se puede reproducir con la tira LED WS2812 y una placa Arduino. Aquí te mostramos cómo hacerlo.
Materiales
Elementos y componentes
Arduino UNO
Tabla protoboard
Cable o jumpers
1 resistencia de 470 Ohm (o aproximada)
WS2812 LED-Strip (8 LEDs son suficientes)
1 condensador 1000µF
Software, aplicaciones y servicios online
Arduino IDE
Diagrama del circuito
El circuito consiste en un Arduino UNO. El pin 6 digital está conectado al pin DI (Data In) de la tira LED a través de una resistencia de 470 Ohm.
La tierra GND de la cinta led está conectada a la tierra GND del Arduino.
Solamente se usan 8 LEDs en este ejemplo. Por lo tanto, los 5V+ de la tira de LED también se pueden conectar directamente a los 5V+ de la placa Arduino.
Opcionalmente, se puede utilizar una fuente de alimentación externa, por ejemplo, una batería, un powerbank o una fuente de alimentación.
Esto es especialmente recomendado si se están usando muchos LEDs de una tira WS2812.
Código
El programa Arduino requiere la librería Adafruit NeoPixel. Ésta debe ser instalada en el software de Arduino.
Para ello, dirígete a «Programa / Incluir Librería / Administrar Bibliotecas» en el IDE de Arduino e introduce NeoPixel en el campo de búsqueda. Instala la librería Adafruit NeoPixel en su versión más reciente.
- El programa utiliza un arreglo multidimensional para mostrar la animación.
- El parpadeo de los LEDs no es otra cosa que una animación en 8 píxeles.
Este arreglo almacena los valores de color (RGB) para 8 píxeles para cada fase de animación.
frame [Fase de animación] [Número de LED] [Color]
En esta práctica se utilizaron 19 fases de animación. Cada fase de animación también tiene una duración de animación, es decir, un valor que determina cuánto tiempo debe mostrarse dicha fase de animación.
Esto es importante porque, por ejemplo, el parpadeo blanco de los LEDs sólo debe ocurrir durante un tiempo muy corto, mientras que el parpadeo alterno rojo-azul debe demorar más tiempo.
Se probaron las fases de animación y las duraciones de la animación hasta que el resultado fuera lo más cercano a unas luces de policía.
Volviendo al código, en el bucle o loop se llama primero el método police1. Luego, se muestra la fase de animación actual en los LEDs y se espera la duración de la animación.
Entonces el contador de la animación FrameCurrent se incrementa en 1 (++). Ahora, se comprueba si el contador de animación es mayor que la fase máxima de animación (frameMax). Si este es el caso, el contador de la animación se reinicia a 0 y la animación comienza de nuevo.
#include <Adafruit_NeoPixel.h>
#define LED_PIN 6
#define LED_COUNT 8
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
const int frameMax = 19;
int frames[frameMax][8][3] = {
{{0, 0, 255 }, {0, 0, 255 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {255, 0, 0 }, {255, 0, 0 }},
{{0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {255, 0, 0 }, {255, 0, 0 }},
{{0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }},
{{0, 0, 255 }, {0, 0, 255 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }},
{{0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {255, 0, 0 }, {255, 0, 0 }},
{{0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }},
{{0, 0, 255 }, {0, 0, 255 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }},
{{0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {255, 0, 0 }, {255, 0, 0 }},
{{0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {255, 255, 255}, {255, 255, 255}, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }},
{{0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }},
{{0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {255, 255, 255}, {255, 255, 255}, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }},
{{0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }},
{{0, 0, 0 }, {255, 0, 0 }, {255, 0, 0 }, {255, 0, 0 }, {255, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }},
{{0, 0, 0 }, {255, 0, 0 }, {255, 0, 0}, {0, 0, 0 }, {255, 0, 0 }, {0, 0, 0 }, {255, 0, 0 }, {255, 0, 0 }},
{{0, 0, 255 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {255, 0, 0 }},
{{255, 255, 255},{255, 255, 255},{255, 255, 255},{255, 255, 255},{255, 255, 255},{255, 255, 255},{255, 255, 255},{255, 255, 255}},
{{0, 0, 255 }, {0, 0, 255 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }},
{{0, 0, 0 },{0, 0, 0 },{255, 255, 255},{255, 255, 255},{255, 255, 255},{255, 255, 255},{0, 0, 0 },{0, 0, 0 }},
{{0, 0, 0}, {0, 0, 0 }, {255, 0, 0}, {255, 0, 0 }, {255, 0, 0 }, {255, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }}
};
int durations[frameMax] = {1000, 100, 100, 50, 50, 10, 50, 50, 50,40,50,40,100,100,100,20,40,20,100};
int frameCurrent = 0;
void setup() {
strip.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)
strip.show(); // Turn OFF all pixels ASAP
strip.setBrightness(50); // Set BRIGHTNESS to about 1/5 (max = 255)
}
void loop() {
police1(strip.Color(255, 0, 0), durations[frameCurrent]);
frameCurrent++;
if (frameCurrent >= frameMax) frameCurrent = 0;
}
void police1(uint32_t color, int wait) {
for (int i = 0; i < 8; i++) { // For each pixel in strip...
strip.setPixelColor(i, strip.Color(frames[frameCurrent][i][0],frames[frameCurrent][i][1],frames[frameCurrent][i][2])); // Set pixel's color (in RAM)
strip.show(); // Update strip to match
}
delay(wait); // Pause for a moment
}
Puedes ajustar, extender o acortar la animación.
Únicamente tienes que añadir más fases de animación en los fotogramas de la matriz, añadir más duración a la matriz y ajustar el frameMax variable.
Submit your review | |