Control de 500 LED con PWM

Estoy considerando emprender un proyecto que implicaría abordar individualmente 500 LED, de manera óptima con soporte PWM para cada uno.

Estoy planeando usar un Arduino ya que ya tengo uno, pero estoy abierto a sugerencias si alguien piensa que una plataforma diferente sería una mejor combinación.

Habría que emplear registros de turnos. ¿Cuál es un buen registro de desplazamiento para usar en esta situación? Si PWM hace que este proyecto sea mucho más caro, puedo prescindir de él. Quiero tratar de gastar menos de $100. Compraría al por mayor 500 LED en eBay.

¿Cuál es su opinión sobre la mejor manera de controlar una cantidad tan grande de LED? Además, ¿cómo haría para proporcionar el poder? Agradecería cualquier ayuda. Tengo bastante experiencia con la electrónica, nunca he hecho nada a una escala tan grande.

Respuestas (15)

Soy el autor de la biblioteca ShiftPWM y acabo de actualizar la documentación para incluir esquemas y mucha más información general para LED normales, tiras de LED y LED de alta potencia.

Probablemente ya comenzó su proyecto, pero dado que esta página recibe muchos visitantes, me gustaría brindarle una respuesta detallada.

Si desea controlar 500 LED con ShiftPWM, puede obtener alrededor de 64 niveles de brillo por LED a 60 Hz. Usaría 64 registros de desplazamiento. Los controladores PWM de hardware dedicados le darán más niveles de brillo, pero serán un poco más caros. Creo que la principal ventaja de mi biblioteca es la facilidad de uso, porque incluye funciones RGB y HSV y muchos ejemplos.

Personalmente, elegiría el TLC5916 de TLC5917 en lugar de los registros de desplazamiento normales, porque tienen un controlador LED de corriente constante incorporado. Esto le ahorrará mucho trabajo de soldadura, porque no necesita resistencias.

En mi sitio web ( http://www.elcojacobs.com/shiftpwm ) tengo más información sobre cómo conectar los LED y cómo manejar los cables de señal largos con el Arduino a altas velocidades.

Si usted tiene más preguntas, por favor pregunte.

¿Has mirado mi respuesta a continuación? Aunque la técnica que describo usa hardware adicional, probablemente se podría usar el mismo enfoque para mejorar enormemente la velocidad de su biblioteca. No he programado el Arduino, por lo que no estoy familiarizado con los tiempos de sus instrucciones, pero en la forma más simple, puede reducir la carga de su CPU a lo que sea necesario para simplemente explotar los bits del SPI (si actualmente está en 5 ciclos por bit y su SPI toma 16 ciclos por byte, eso sería una aceleración de 2.5x). Incluso podrías hacer algunas cosas más sofisticadas mientras sigues corriendo a esa velocidad.
Por ejemplo, suponga que desea tener ocho niveles de brillo que representen el máximo, 1/2, 1/4, 1/8, 1/16, 1/32, 1/64 y 1/128. Si el Arduino puede realizar una operación "Y" u "O" en un valor obtenido de un puntero e incrementar ese puntero en menos de cuatro ciclos, probablemente podría usar tres bits por píxel para almacenar su información de brillo y aún lograr una velocidad de transferencia de 16 ciclos por 8 LEDs.
El cálculo de los valores de PWM se superpone a la salida SPI en mi biblioteca. Ejecuto el SPI a 4 MHz y los cálculos tardan un poco más que la salida SPI. Se necesitan 43 ciclos de reloj por byte, por lo que cada 8 salidas. Esto es lo suficientemente rápido para la mayoría de las configuraciones. Puede obtener más velocidad utilizando la modulación de código de bits, donde tiene 8 períodos de actualización, cada período siguiente tiene la mitad de la duración del anterior. He escrito una versión BCM, pero es más sensible al momento en que actualiza la configuración de brillo. Puede causar parpadeo cuando está desalineado. Sin embargo, probablemente lo usaré en la versión de matriz.
BCM tiene la ventaja de su enfoque de que puede hacer uso de la sincronización 1/2,1/4..., pero aún toma solo un pin por LED. Si tiene experiencia en informática, puede que le resulte interesante cómo se calculan los bytes SPI. Recibo el ciclo de trabajo de la memoria (2 relojes) y hago una comparación (1 reloj). El resultado de la comparación se almacena en el acarreo, por lo que puedo cambiarlo al byte con un acarreo de rotación (1 reloj). Hacerlo 8 veces pone todos los resultados de la comparación en un byte que está listo para enviar al SPI.

Solo copia :-)

http://www.evilmadscientist.com/article.php/peggy2

Hoy lanzamos una actualización de nuestro proyecto de tablero perforado LED de código abierto "Peggy". La versión 2 de Peggy ha sido rediseñada desde cero. Y se ve... casi exactamente igual. Sin embargo, los cambios bajo el capó son sustanciales y creemos que es una gran mejora en muchos sentidos.

En primer lugar, Peggy 2.0 sigue haciendo lo mismo: proporciona energía eficiente a una matriz de 25 x 25 ubicaciones de LED. Peggy está diseñado para eliminar parte del aguijón, la complejidad y el desorden de jugar con LED. Es un tablero de clavijas emisor de luz versátil y potente que le permite manejar de manera eficiente cientos de LED en cualquier configuración que desee, sin siquiera calcular una sola resistencia de carga. Puede instalar desde uno hasta 625 LED, y Peggy los encenderá por usted.


Peggy 2.0 ahora también es compatible con Arduino: admite la programación a través de un cable USB-TTL, utilizando el popular entorno de software Arduino.

Maravilloso enlace! Marcado. No estaba planeando trabajar en un proyecto como este, pero tengo que hacerlo ahora que vi ese pequeño video :-)
@NicolaeSurdu No roto. Lo abrí justo ahora.
Si bien esto puede responder teóricamente a la pregunta, sería preferible incluir las partes esenciales de la respuesta aquí y proporcionar el enlace como referencia.

¿En qué diseño quieres los LED? Puede ahorrar mucho trabajo si compra algunas matrices de LED, puede obtener matrices de LED de 8x8 de un solo color (64 LED) por un dólar o dos .

No obtendrá PWM real con un AVR y registros de desplazamiento en tantos LED, pero puede exprimir de 2 a 4 niveles de brillo. Tendrías que hacer números y ver qué es posible.

Allegro fabrica algunos registros de desplazamiento de sumidero de corriente constante útiles diseñados específicamente para controlar conjuntos de LED, de modo que no necesite resistencias adicionales, lo que también simplificará las cosas. Es posible que no pueda controlar los LED directamente desde la salida AVR si no puede proporcionar suficiente energía, por lo que deberá usar transistores. Puede obtenerlos en matrices en un solo IC , lo que también ahorra algo de trabajo.

todos muy buenos puntos!

No tengo idea del rango de PWM que necesita para un LED, pero he estado trabajando en un controlador PWM de 64 canales para una aplicación de servocontrol que me puede dar pulsos de entre 600us y 2.4ms. Utiliza CD74HCT238E (demultiplexores de 3 a 8 líneas) para generar 64 canales a partir de 8 pines de E/S en un ATMega168 y se puede controlar a través de simples comandos en serie. Supongo que podría encadenar varias versiones de una versión modificada de este controlador en una línea serial y abordar los 500 LED... Probablemente podría usar la versión ATTiny2313 del controlador ya que sus requisitos de firmware serían más simples.

Mi blog contiene la fuente de ensamblaje y los esquemas y detalles del proceso de diseño.

Echa un vistazo a los circuitos integrados de "controlador LED" en mouser/digikey. TI, por ejemplo, fabrica un montón de controladores con una variedad de interfaces (I2C, SPI) que sin duda satisfarán sus necesidades. La mayoría de estos controladores están diseñados para conectarse en cadena, de modo que la salida en serie de uno se alimenta a la entrada en serie de otro.

Por ejemplo, algo como el TLC5940 ofrece control PWM de 16 canales. Entonces, básicamente es un registro de desplazamiento de 16 bits de corriente constante con control PWM de escala de grises de 12 bits. Puedo recomendar ese IC en particular, ya que ayudé a diseñar una pantalla de 80x16 con él.

Mondomatrix fabrica algunas placas de controlador LED direccionables en serie (rs-485) y se basa en la plataforma Arduino: http://www.displayduino.com/ Es posible que pueda armar un sistema usando ese hardware con bastante facilidad

Si no quiere demasiados bits de control PWM para cada LED, y quiere evitar tener un procesador con 500 LED en cada ciclo PWM, puede controlar 8 LED con N bits de brillo usando N 74HC595 o chips equivalentes. . Cablee las salidas de todos los N chips juntos y conecte las habilitaciones a algún circuito que solo habilitará una a la vez con la sincronización adecuada. Haga arreglos para que el primer chip esté habilitado la mitad del tiempo, el segundo esté habilitado la mitad del resto, etc.

Cualquier recarga de los registros de desplazamiento debe sincronizarse con la tasa de PWM, para minimizar los efectos de aliasing (por ejemplo, si un nivel de brillo cambiaba rápidamente entre 0111 y 1000, el punto en el ciclo de PWM cuando ocurrió el cambio podría cambiar momentáneamente el brillo aparente). ).

Si bien tener que usar múltiples salidas 74HC595 para cada LED puede ser molesto, este enfoque es probablemente el más simple que podría mantener diferentes niveles de brillo sin la intervención continua de la CPU.

Esto no responde directamente a la pregunta, pero otro aspecto que debe considerar es la posible variabilidad de brillo entre los LED en su lote 500. Esto es particularmente importante si estos LED se montan uno cerca del otro, como en una matriz o en pantallas de 7 segmentos. Consulte esta respuesta para obtener más detalles sobre cómo abordar este problema, en particular, utilizando la corrección de puntos para compensar las variaciones en el brillo de los LED.

Experimenté este problema cuando obtuve 200 LED rojos de 1 mm para un conjunto de pantallas grandes de 7 segmentos que estaba construyendo. Mi solución barata para resolver el problema implicaba lo siguiente:

  1. Construí un probador de LED en una placa de prueba para clasificar conjuntos de LED en varias categorías de brillo
  2. Monté cada segmento usando LED de la misma categoría (en mi diseño, cada segmento constaba de 5 LED montados en serie)
  3. Compensé la diferencia en el brillo de cada segmento usando diferentes resistencias limitadoras de corriente. Por ejemplo, para un segmento con LED más brillantes, usaría una resistencia de 100 ohmios, mientras que para otro segmento con LED más tenues, usaría resistencias de 120 ohmios.
Punto válido, pero no responde la pregunta.
@MattYoung De acuerdo. La pregunta es respondida en gran parte por todas las otras respuestas. Solo quería complementar esas respuestas, abordando un problema secundario que puede afectar el diseño del OP.

Sugiero usar la técnica de modulación de ángulo binario descrita en este artículo http://www.artisticlicence.com/WebSiteMaster/App%20Notes/appnote011.pdf

O consulte la biblioteca ShiftPWM http://www.elcojacobs.com/shiftpwm/

Si bien esto puede responder teóricamente a la pregunta, sería preferible incluir las partes esenciales de la respuesta aquí y proporcionar el enlace como referencia.

XMOS utiliza el Macroblock MBI5026 con sus kits de mosaicos LED. Creo que se utilizan en la mayoría de los otros sistemas profesionales.

León

Los chips de controladores dedicados con interfaces en serie probablemente sean la mejor ruta. Tratar con registros de desplazamiento individuales probablemente signifique un circuito muy complejo. Al menos Maxim y TI hacen algunos. No recuerdo si alguno tiene un modelo particularmente adecuado para tanto.

Todavía tomará una gran cantidad de hardware.

En cuanto a la potencia, la programación y los buses, la hoja de datos de cada controlador probablemente contenga la mayor parte de la información que necesitará.

Dentro del ámbito del software, si la cantidad de configuraciones de brillo distintas que uno necesita no es demasiado grande, puede ser útil almacenar los datos en formato "bit-planar" (como se describe en mi otra respuesta basada en hardware) y luego tener el las rutinas de salida utilizan operadores booleanos para actuar sobre 8 píxeles a la vez. Para obtener la máxima eficiencia, esto requerirá tener múltiples rutinas de salida separadas, utilizadas para diferentes partes del ciclo PWM; por ejemplo, si se desea utilizar valores de brillo de 4 bits, se utilizarían ocho rutinas de la forma:

  movf bit0Comp,w ; Debería ser 00 o FF dependiendo del bit 0 del comparador (FF si está claro)
  iorwf POSTINCF,w ; Bit 0 de datos; siempre use IORWF
  andwf POSTINCF,w ; Bit 1 de datos; use IORWF si el bit 1 del comparador está establecido; ANDWF si claro
  andwf POSTINCF,w ; Bit 2 de datos; Use IORWF si se establece el bit 1 del comparador; ANDWF si claro
  andwf POSTINCF,w ; Bit 2 de datos; Use IORWF si se establece el bit 1 del comparador; ANDWF si claro
  movwf SPIREG; Almacenar el byte resultante (bits establecidos si >= comparando)

Uno usaría diferentes combinaciones de IORWF y ANDWF, dependiendo del valor del comparador. Tenga en cuenta que al usar este enfoque como se ilustra, uno puede actualizar los valores de brillo de píxeles en cualquier punto del ciclo PWM sin parpadeo, siempre que los cuatro bits se escriban entre llamadas a la rutina de cambio de pantalla, o haciendo que la rutina de actualización de píxeles determine si el El siguiente turno generará un "1" o un "0" para el píxel, y establecerá o borrará todos los bits del píxel (cualquiera que sea la operación que lo haga hacer lo que iba a hacer de todos modos) y luego escribirá cualquier bit cuyo valor debería ser opuesto Tenga en cuenta también que se pueden lograr escalas de brillo no lineales arbitrarias al variar el tiempo de las actualizaciones de la pantalla o al usar algunos valores de comparación más de una vez en un ciclo de PWM.

Los FPGA o CPLD pueden ser buenos para tales tareas, ya que ofrecen muchos pines de E/S. Opta por lo más sencillo y económico. Si uno no es suficiente, use un par.

¿Puede darnos algunos detalles más sobre por qué esta es una buena opción? En este momento lo sé, pero sé cuáles son las opciones y cuáles son las tecnologías sugeridas que enumera, el Póster original (OP) probablemente no tiene tal un fondo.
No estoy seguro de que sea la mejor opción, pero quería que se mencionara para que estuviera completo. Si se controlan 500 LED con PWM, de una forma u otra, al final se necesitan 500 cables controlables individualmente. Es difícil encontrar un microcontrolador con tantos pines de salida. Hay muchas maneras de evitar esto usando microcontroladores, pero uno o un par de CPLD/FPGA baratos podrían proporcionar fácilmente esos pines de salida.

Es casi seguro que puede hacer esto fácilmente usando un PSoC3 o PSoC5 .

Los chips PSoC son microcontroladores que contienen hardware digital reconfigurable, un poco como un FPGA o CPLD. Esto significa que puede crear circuitos complejos para hacer cosas inusuales como conducir 500 LED con PWM. Es más, probablemente pueda implementar todo utilizando los bloques digitales reconfigurables, lo que significa que la parte de la CPU del chip solo necesita escribir los brillos LED deseados en una matriz.

504 LED caben en un rectángulo de 21 x 24. Si tuviera 24 canales PWM y 21 GPIO, entonces podría hacer que esto funcione. ¿Adivina qué? El PSoC tiene más que eso.

Puede configurar fácilmente 24 canales PWM en un PSoC y configurar otros 21 pines para que formen parte de un registro de desplazamiento. A continuación, configure algunos canales DMA para bombear bytes de la memoria a las salidas PWM y se reirá. Todo lo que la CPU necesita hacer ahora es generar los gráficos. El PSoC3 tiene un núcleo 8051 de 8 bits, mientras que el PSoC5 tiene un ARM de 32 bits. Elige tu opción. Los únicos circuitos integrados externos que necesitará son algunos ULN2803 para proporcionar la alta corriente de accionamiento para las filas. Las salidas PWM deben tener suficiente unidad de corriente para LED individuales.

Esto es una exageración total para conducir LED. Hay controladores LED prediseñados, baratos y dedicados hechos para encadenar grandes cantidades como esta que se usan para pantallas gigantes todo el tiempo. No hay necesidad de reinventar todo eso y por un costo mayor.
@nemik: en realidad, el costo total de las fichas (del costoso Farnell) es de solo £ 6.80.

Hacer uso de las economías de escala. Los sitios chinos como Aliexpress venden hilos de LED basados ​​en WS2811 por ~ $ 15 por 50 LED. Son direccionables individualmente, brillantes, generalmente a prueba de agua y tienen PWM para el brillo. Sin soldaduras ni registros de desplazamiento con los que meterse. Apuesto a que hacer todo esto usted mismo le costará más, tomará mucho más tiempo y será muy frustrante. Además, estás en Oz, por lo que el envío desde China no será demasiado costoso.

Estos están hechos para hacer pantallas LED gigantes, por lo que tienden a ser bastante baratos. Solo asegúrese de volver a inyectar energía aproximadamente cada 50 LED para obtener el mejor rendimiento.

También hay bibliotecas de Arduino para que sean fáciles de usar.

$15 por 50 LED? Entonces, por 500 LED, ¿esto equivale a $ 150? ¿Y tienes el descaro de decirme que mi solución es cara? -1
Además, por favor puede proporcionar un enlace a esto. WS801 no se busca bien en Google, y tampoco aparece en una búsqueda de Aliexpress
Lo siento, quise decir WS2811, como estos aliexpress.com/store/product/… o, sin atenuación PWM, estos aliexpress.com/store/product/…
Una señal en serie para controlar 50 LED con atenuación PWM. Gracias, esto es exactamente lo que busco. Pero un registro de desplazamiento estándar proporciona un pin de "bloqueo" para copiar datos almacenados en búfer a las salidas después de que se transmite el cuadro completo. No hay pestillo aquí, así que espero un ruido notable a altas frecuencias de actualización. Los chips admiten datos de 400 Kbps con 15 bits por píxel, por lo que la pantalla mostrará tonterías durante 1,9 milisegundos mientras se actualiza el cuadro.