Estoy trabajando en un proyecto de bricolaje en el hogar que necesita que se iluminen aproximadamente 150 LED a diferentes niveles de brillo. También me gustaría tener estos LED encendidos en ciertos patrones, por lo que realmente necesitan ser controlados por un microcontrolador (una matriz de LED controlable, si lo desea).
Después de algunas consideraciones, comencé a incursionar con el Ardunio ya que parece ser adecuado para la tarea en cuestión y me permite multiplexar los LED, etc.
Tengo tanto el Arduino Uno como el Arduino Mega 2560. Para las pruebas utilicé el Mega, ya que tiene 15 canales PWM, por lo que puedo ajustar el brillo de cada LED, etc. sin tener que meterme con diferentes resistores de valor y enganchar suficientes LED. para darme una buena idea de lo que está pasando.
Tenía una buena prueba de concepto en funcionamiento con LED1 encendido durante 1800 microsegundos, luego lo apagué y LED2 se encendió ... y así sucesivamente para los 15 LED. Ninguno de los LED se encendió al mismo tiempo, pero dio la persistencia del efecto de visión (todos los LED aparecen encendidos al mismo tiempo) y no consumieron una gran cantidad de corriente. Esto es lo que aspiro, en una escala mayor de ~ 150 LEDs.
Entonces, a continuación, necesitaba escalar esto. La siguiente prueba de concepto llegó en la forma de utilizar el controlador TLC5940 LED después de leer algunos artículos y blogs en línea.
Conecté el TLC5940 al Arduino Uno más pequeño y conecté 16 LED a los 16 canales de salida del chip. Ejecuté un programa de prueba (creo que se desvaneció / corrió patrones a lo largo de los LED y funcionó bien).
Luego comencé a escribir un bucle que volvería a encender el primer LED, esperar una fracción de segundo, luego apagarlo y pasar al siguiente LED.
El código funcionó hasta aproximadamente 3 LED, pero tan pronto como golpeó el 4º LED, se pudo observar un parpadeo. En el momento en que se amplió a los 16 LED, había un claro patrón visible (como una onda mexicana) en los LED.
Intenté cambiar el tiempo de retardo, reduciéndolo a 1 microsegundo, pero esto tuvo poco efecto.
Mi código era algo como esto:
#include "Tlc5940.h"
int DELVAR = 1
void setup()
{
Tlc.init(0); // initialise TLC5940 and set all channels off
}
void loop()
{
Tlc.clear();
Tlc.set(1, 4096);
Tlc.update();
delayMicroseconds(DELVAR);
Tlc.set(1, 0);
Tlc.update();
Tlc.clear();
Tlc.set(2, 4096);
Tlc.update();
delayMicroseconds(DELVAR);
Tlc.set(2, 0);
Tlc.update();
Tlc.clear();
Tlc.set(3, 4096);
Tlc.update();
delayMicroseconds(DELVAR);
Tlc.set(3, 0);
Tlc.update();
// ....and so on for all 16 channels .....
// (not optimal I know but at this point I'm still just getting my head around the logic)
}
¿Hay alguna limitación en la "velocidad" del TLC5940 o de los canales que está usando desde el Arduino?
¿Cómo puedo evitar esto para que todos los LED parezcan iluminados al mismo tiempo? ¿Tengo razón al pensar que el ciclo de trabajo del Arduino es de 16MHz? y si es así, ¿no debería teóricamente poder iluminar y apagar > ¿50,000 LEDs secuencialmente en menos de un segundo?
Descargo de responsabilidad: tengo un conocimiento electrónico muy básico de cuando estuve en la escuela hace unos 15 años, ¡así que esta es una curva de aprendizaje muy pronunciada para mí!
NOTA: * Para cualquier persona que se pregunte en qué estoy trabajando, es un mapa mundial gigante: los LED representan las principales áreas urbanas o pobladas (ciudades, etc.) tal como se ven desde el espacio durante la noche. Finalmente, me gustaría conectarlos a tiempo real para que los LED encendidos representen las áreas urbanas reales iluminadas por la noche en ese punto particular en el tiempo; aquí es donde Arduino sería muy útil.
Es un mapa artístico de cuerdas basado en uno que hice el año pasado (abajo)
Solomuchomásgrande,será8piesx4pies,progresohastaahora,losagujerosparalosLEDperforadosestánlistos: