Obtener una gran cantidad de (~ 100) señales de salida digital de Arduino

Me gustaría poder controlar alrededor de 100 LED independientes usando un Arduino. El problema es que el Arduino no tiene suficientes pines que puedan configurarse para esto. ¿Cuál sería una forma de solucionar este problema? ¿Hay algún chip que pueda demuxar una señal más compleja del Arduino que luego podría controlar los LED? ¿O hay otra solución?

¿Cuáles son sus requisitos de frecuencia de actualización? ¿Cuánto consumo de corriente por LED?
frecuencia de actualización de alrededor de 1 segundo. pensando en 8ma por LED. Sería alimentado por un adaptador externo, no por Arduino
Hay muchas soluciones de demultiplexación. Pero considere la complejidad de su tarea; ¿El algoritmo que necesita para generar los datos se ajustará a las limitaciones del mcu de Arduino? Algunas tareas encajarán, otras no encajarán o solo encajarán mediante la creación de diseños que pueden ser muy satisfactorios de crear, pero que pueden dificultar el mantenimiento del código.

Respuestas (1)

En primer lugar, un Arduino no puede controlar directamente 100 LED, ya que la corriente combinada que el dispositivo debe generar o absorber superará con creces tanto al microcontrolador como al regulador de voltaje en la placa Arduino. Sin embargo, un Arduino Shield personalizado con su propia fuente de alimentación y regulación podría cumplir con los requisitos.

Hay varios enfoques fáciles, el enfoque más simple se detalla a continuación:


El TLC5940 maneja 16 LED por IC, controlado por entrada en serie a través de una pequeña variante de una interfaz SPI. Se pueden conectar en cascada hasta 40 dispositivos TLC5940, pero 7 de ellos serán suficientes para controlar los 100 LED en cuestión.

Hay al menos un par de bibliotecas Arduino ( 1 , 2 ) para el TLC5940.

Frecuencias de reloj sugeridas para enviar desde Arduino y frecuencia de actualización correspondiente:

  • 1 MHz GSClk usando código en este hilo .
  • 330 KHz SCLK (reloj de datos en serie)
  • Por lo tanto, frecuencia de actualización de datos LED 244 Hz

Esto se basa en las fórmulas de la hoja de datos:

f(GSCLK) = 4096 * f(actualizar)
f(SCLK) = 193 * f(actualizar) * n
donde:
f(GSCLK): frecuencia mínima necesaria para GSCLK
f(SCLK): frecuencia mínima necesaria para SCLK y SIN
f( actualización): tasa de actualización de todo el sistema en cascada
n: número en cascada de dispositivos TLC5940

El TLC5940 es un sumidero de corriente constante , por lo que los ánodos de los LED estarían vinculados a un voltaje un par de voltios mayor que el LED Vf, o alrededor de 7 voltios, lo que sea menor, alimentado independientemente de los pines de alimentación de Arduino. Esta fuente de voltaje debe ser capaz de suministrar 100 * (cualquiera que sea la corriente a la que ejecute los LED), pero puede ser una fuente no regulada.

Los cátodos LED van a las líneas de transmisión de los circuitos integrados TLC5940 respectivos.

El TLC5940 en sí mismo consume hasta Icc = 60 mA por dispositivo durante la escritura de datos, por lo que alimentar 7 de ellos desde el Arduino no funcionará, requerirá que se proporcione un Vcc independiente regulado de 3.3 a 5 voltios, idealmente el mismo valor que el Vcc del Arduino que se está utilizando, y los rastros de tierra deben conectarse de nuevo a la tierra de Arduino, por supuesto. Operar las partes del TLC a un voltaje diferente al del Arduino generaría la necesidad de una conversión de nivel de la señal en serie, por lo tanto, es mejor evitarlo.

Varios videos de YouTube demuestran el uso de Arduino con circuitos integrados TLC5940 en cascada.


Si bien estos circuitos integrados se diseñaron para controlar pantallas LED numéricas de 7 segmentos, proporcionan un control de LED individual, por lo que se pueden usar para hasta 64 LED por circuito integrado. Dos de ellos se pueden conectar en cascada para controlar los 100 LED necesarios. La página 13 de la hoja de datos muestra una configuración en cascada.

Los LED tendrían que estar conectados eléctricamente como grupos de hasta 8 LED, cada uno compartiendo una línea de cátodo (cátodo común), para este diseño.

Los MAX7219/7221 son controladores de LED multiplexados, por lo que el brillo máximo de los LED será menor que para un controlador de LED estático como el de la sección anterior.

Aquí hay una útil biblioteca y guía de matriz de LED que usa el MAX7219.

Algunos videos relevantes de YouTube ( 1 , 2 ) pueden ser de su interés.


Una vez más, estos circuitos integrados se diseñaron para controlar pantallas LED numéricas de 7 segmentos y proporcionan un control de LED individual, por lo que se pueden utilizar para hasta 40/64 LED por circuito integrado. Se pueden conectar dos o tres de ellos en un bus Arduino SPI para controlar los 100 LED necesarios.

Las notas de diseño siguen siendo las mismas que en la sección anterior. Además, el brillo máximo de los LED individuales sería menor que el del diseño multiplexado directo del MAX7219.

Hay algunos videos de YouTube que pueden ser de interés.


  • Diseños de componentes discretos, registros de desplazamiento, expansores de E/S, tiras de LED cortables con controladores individuales y mucho más...

Todos estos son enfoques que se han utilizado con diferentes niveles de simplicidad y éxito. Son implementaciones más complejas que los 3 enfoques anteriores, por lo tanto, no se detallan más. Buscar en la web generaría guías útiles para estos enfoques, si es necesario.

Un factor irritante clave con tales diseños es la necesidad de resistencias de control de corriente en cada LED o cadena de LED. Los dispositivos diseñados específicamente para la conducción de LED normalmente no necesitan esto.

No tengo experiencia personal con este último conjunto de opciones, por lo que no puedo ayudar mucho.


Nota al pie: después de responder a esta pregunta, encontré una pregunta más antigua , que tiene respuestas que detallan y analizan varios de los enfoques en mi última sección. Ese hilo hace interesante "lecturas adicionales como tarea".


¿Registradores de desplazamiento económicos como el 74HC595?
Además, ¿cómo proporciona el Max5951 "control de LED individual"? Parece que solo tiene control de 7 segmentos (8 pines para 8 dígitos), ¿no?
Sí, esos también. Necesita muchas resistencias para proteger los LED, y luego el cableado es complejo en comparación con los circuitos integrados especialmente diseñados.
@ThomasE No: "El MAX6950 maneja hasta cinco dígitos de 7 segmentos o 40 LED discretos. El MAX6951 maneja hasta ocho dígitos de 7 segmentos o 64 LED discretos". Uno simplemente conecta grupos de 8 LED cada uno a una línea de cátodo, como se describe en la sección MAX7219 de mi respuesta.
Entonces, sería un control agrupado de los 8 LED, ¿no? Lo pregunto porque supuse que sí y pasé este chip cuando lo encontré antes.
Ajá - Charlieplexing. ¡No importa!
@ThomasE No, cada LED individual puede ser controlado por el MAX6950/6951; de todos modos, ese es un requisito previo para charlieplexing. De hecho, estos circuitos integrados en realidad no pueden controlar pantallas de varios dígitos (aunque la hoja de datos sugiere una solución alternativa), ya que requieren acceso individual a cada LED para el escaneo Charlieplex.
Anotado. Respuesta completa arriba, por cierto.
El TLC5940 es excesivo si no necesita cambiar el brillo de los LED, es algo caro. Aunque si desea su PWM de 12 bits, es muy bueno, hay variantes de circuitos integrados para hasta 48 LED.
@starblue Overkill v/s facilidad de implementación de bricolaje : para un esfuerzo único o de pasatiempo, ¿el TLC5940 ($ 3.78 en cantidades únicas en DigiKey) no seguiría siendo la solución más simple , debido a las bibliotecas Arduino y el soporte activo dentro de la comunidad Arduino? A menos que haya otras partes igualmente bien compatibles, como usted señaló, que los foros de Arduino adoran.
Recientemente tuve un gran éxito con 16 LED usando dos registros de desplazamiento 595 ... sin embargo, como otros han dicho, necesitará más potencia para conducir 100 (y más registros de desplazamiento si sigue esa ruta ...)