Control de 500 LED con PWM

26

Estoy considerando asumir 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 opción.

Los registros de desplazamiento tendrían que ser empleados. ¿Qué es un buen registro de turno para usar en esta situación? Si PWM hace que este proyecto sea mucho más costoso, puedo hacerlo sin él. Quiero intentar gastar menos de $ 100. Compraría 500 LEDs a granel 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 en electrónica, nunca he hecho nada a una escala tan grande.

littlebirdceo
fuente

Respuestas:

14

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 haya comenzado su proyecto, pero como esta página recibe muchos visitantes, todavía me gustaría proporcionar una respuesta detallada.

Si desea controlar 500 LED con ShiftPWM, puede obtener unos 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, ya que incluye funciones RGB y HSV y muchos ejemplos.

Yo 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á mucha soldadura, ya que 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 la conducción de los cables de señal largos con el Arduino a altas velocidades.

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

ElcoJacobs
fuente
¿Has mirado mi respuesta a continuación? Aunque la técnica que describo utiliza hardware adicional, el mismo enfoque probablemente podría usarse para mejorar enormemente la velocidad de su biblioteca. No he programado el Arduino, por lo que no estoy familiarizado con sus tiempos de instrucción, pero en la forma más simple, podría 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ía hacer algunas cosas más sofisticadas mientras sigue corriendo a esa velocidad.
supercat
Por ejemplo, suponga que desea tener ocho niveles de brillo que representen full-on, 1/2, 1/4, 1/8, 1/16, 1/32, 1/64 y 1/128. Si el Arduino puede realizar una operación "AND" u "OR" 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 así alcanzar una velocidad de transferencia de 16 ciclos por 8 LED.
supercat
Calcular los valores PWM se superpone a la salida SPI en mi biblioteca. Ejecuto el SPI a 4MHz y los cálculos tardan un poco más que la salida del SPI. Toma 43 ciclos de reloj por byte, por lo tanto, por 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 próximo período 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.
ElcoJacobs
BCM tiene la ventaja de su enfoque de que puede hacer uso de la sincronización 1 / 2,1 / 4 ... pero aún requiere 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 carry, por lo que puedo cambiarlo al byte con un rotate over carry (1 reloj). Hacerlo 8 veces pone todos los resultados de comparación en un byte que está listo para enviar al SPI.
ElcoJacobs
13

Solo copia :-)

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

Hoy vamos a lanzar una actualización de nuestro proyecto de panel LED Peggy de código abierto. 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 variedad de ubicaciones de LED de 25 x 25. Peggy está diseñado para eliminar la molestia, la complejidad y el desorden de jugar con LED. Es un tablero de emisión de luz versátil y potente que le permite controlar de manera eficiente cientos de LED en la configuración que desee, sin 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.

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

¿En qué diseño quieres los LED? Puede ahorrar mucho trabajo si compra algunas matrices LED, puede obtener matrices LED 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 esta cantidad de LED, pero puede exprimir de 2 a 4 niveles de brillo. Tendría que ejecutar los números y ver qué es posible.

Allegro crea algunos prácticos registros de cambio de sumidero de corriente constante diseñados específicamente para controlar matrices de LED, de modo que no necesite las resistencias adicionales, que también simplificarán 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 necesitará usar transistores. Puede obtenerlos en matrices en un solo IC , lo que también ahorra algo de trabajo.

davr
fuente
todos muy buenos puntos!
Jason S
5

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 servo control que me puede dar pulsos de entre 600us y 2.4ms. Utiliza los CD74HCT238E (demultiplexores de 3-8 líneas) para generar 64 canales a partir de 8 pines de E / S en un ATMega168 y es controlable a través de comandos seriales simples. Supongo que podría encadenar varias versiones de una versión modificada de este controlador en una línea en serie 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 del ensamblaje y los esquemas y detalles del proceso de diseño.

Len Holgate
fuente
5

Echa un vistazo a los circuitos integrados de "controlador LED" en el ratón / digikey. TI, por ejemplo, hace 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 serie para que la salida en serie de uno se alimente en 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 actual constante con control PWM en escala de grises de 12 bits. Puedo recomendar ese IC en particular, ya que ayudé a diseñar una pantalla de 80x16 con él.

David Brenner
fuente
4

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 utilizando ese hardware con bastante facilidad


fuente
4

Si no desea demasiados bits de control PWM para cada LED, y desea evitar tener que 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 . Conecte las salidas de todos los N chips juntos, y conecte las habilitaciones a algunos circuitos que solo permitirán uno a la vez con la sincronización adecuada. Organice de manera que el primer chip se habilite la mitad del tiempo, el segundo se habilitará la mitad del resto, etc.

Cualquier recarga de los registros de desplazamiento debe sincronizarse con la velocidad PWM, para minimizar los efectos de alias (por ejemplo, si un nivel de brillo cambia rápidamente entre 0111 y 1000, el punto en el ciclo 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 una intervención continua de la CPU.

Super gato
fuente
3

Esto no responde directamente a la pregunta, pero otro aspecto que debe tener en cuenta es la posible variabilidad del brillo entre los LED en su lote de 500. Eso es particularmente importante si estos LED están montados 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 del 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 para clasificar conjuntos de leds en varias categorías de brillo
  2. Monté cada segmento usando LED en 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.
Ricardo
fuente
1
Punto válido, pero no responde la pregunta.
Matt Young
1
@MattYoung De acuerdo. La pregunta es ampliamente respondida por todas las otras respuestas. Solo quería complementar esas respuestas, abordando un problema secundario que puede afectar el diseño del OP.
Ricardo
1

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

León

Leon Heller
fuente
1

Los chips de controlador dedicados con interfaces seriales probablemente serán la mejor ruta. Tratar con registros de desplazamiento individuales probablemente significará un circuito muy complejo. Al menos Maxim y TI hacen algunos. No recuerdo si alguno tiene un modelo particularmente adecuado para eso.

Todavía necesitará mucho hardware.

En cuanto a la alimentación, la programación y los buses, la hoja de datos para cada controlador probablemente tendrá la mayoría de la información que necesitará.

revs XTL
fuente
1

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

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

Uno usaría diferentes combinaciones de IORWF y ANDWF, dependiendo del valor del comparand. Tenga en cuenta que usando 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 las llamadas a la rutina de cambio de pantalla, o al hacer que la rutina de actualización de píxeles determine si el el próximo turno generará un "1" o un "0" para el píxel, y configurará o borrará todos los bits del píxel (la operación que haga que haga lo que sea que vaya a hacer de todos modos) y luego escriba los bits cuyo valor debería ser opuesto Tenga en cuenta también que se pueden lograr escalas de brillo no lineales arbitrarias variando el tiempo de las actualizaciones de la pantalla o usando algunos valores de comparandos más de una vez en un ciclo PWM.

Super gato
fuente
1

Los FPGA o CPLD pueden ser buenos para tales tareas, ya que ofrecen muchos pines de E / S. Ir por el más simple y más barato. Si uno no es suficiente, use un par.

Carl
fuente
¿Puede darnos algunos detalles más acerca de por qué esta es una buena opción, ahora lo sé, pero sé cuáles son las opciones y cuáles son las tecnologías sugeridas que enumera, el Cartel original (OP) probablemente no tiene tal un fondo.
Kortuk
No estoy seguro de que sea la mejor opción, pero quería que se mencionara por 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. Todavía hay muchas maneras de evitar esto usando microcontroladores, pero uno o un par de CPLD / FPGA baratos podrían dar fácilmente esos pines de salida.
Carl
1

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. Además, probablemente pueda implementar todo usando 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 encajan en un rectángulo de 21 x 24. Si tuviera 24 canales PWM y 21 GPIO, entonces podría hacerlo funcionar. ¿Adivina qué? El PSoC tiene más que eso.

Puede configurar 24 canales PWM fácilmente en un PSoC y configurar otros 21 pines para formar parte de un registro de desplazamiento. Luego, configure algunos canales DMA para bombear bytes desde la memoria a las salidas PWM, y se está riendo. 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.

Rocketmagnet
fuente
Esto es una exageración total para conducir LED. Hay controladores LED dedicados, baratos y prediseñados diseñados para encadenar grandes cantidades como esta que se utilizan para pantallas gigantes todo el tiempo. No es necesario reinventar todo eso y por un mayor costo.
nemik
@nemik - En realidad, el costo total de las fichas (del costoso Farnell) es de solo £ 6.80.
Rocketmagnet
0

Hacer uso de economías de escala. Los sitios chinos como Aliexpress venden hilos LED basados ​​en WS2811 por ~ $ 15 por 50 LED. Son individualmente direccionables, brillantes, generalmente impermeables y tienen PWM para brillo. No hay registros de soldadura o 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 enviar 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 cada 50 LED más o menos para obtener el mejor rendimiento.

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

nemik
fuente
1
$ 15 por 50 LED? Entonces, ¿para 500 LED, esto llega a $ 150? ¿Y tiene el descaro de decirme que mi solución es cara? -1
Rocketmagnet
Además, puede proporcionar un enlace a esto. WS801 no funciona bien en Google, y tampoco aparece en una búsqueda de Aliexpress
Rocketmagnet
Lo siento, quise decir WS2811, como estos aliexpress.com/store/product/… o, sin atenuación PWM, estos aliexpress.com/store/product/…
nemik
Una señal en serie para manejar 50 LED con atenuación PWM. Gracias, esto es exactamente lo que busco. Pero un registro de desplazamiento estándar proporciona un pin de "enganche" para copiar datos almacenados en búfer a las salidas después de que se transmite la trama completa. 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 marco.
nialsh