Viabilidad de controlar una matriz LED regulable

Tengo una pregunta para principiantes: me gustaría crear una matriz de LED personalizada (al menos 7x7; de un solo color), donde cada fila de LED se puede atenuar por separado o, idealmente, incluso cada LED. Todo debe ser controlado por un Arduino o algún otro microcontrolador.

Tengo amplios conocimientos de programación, sin embargo, mis conocimientos de electrónica se limitan a esos kits de Thames-and-Kosmos con los que solía "jugar" cuando era niño, es decir, puedo interpretar diagramas de circuitos simples, pero eso es todo. Por ahora, solo me gustaría saber si lo siguiente es factible, cuáles serían aproximadamente los requisitos de hardware y si un novato como yo podría hacer esto. ¿Existe incluso una solución de hardware lista para usar?

Muchas gracias por sus respuestas y paciencia con un principiante.

andreas

PD: Mi pregunta publicada inicialmente contiene requisitos incorrectos (LED de dos colores), por lo que publiqué esta pregunta bastante similar. Una de las respuestas allí enlaza con un hilo relacionado que realmente no ayuda a responder mis preguntas.

¿Cuántos niveles de brillo discretos quieres? ¿Por qué?
Un nivel por fila. Es para un proyecto científico en un laboratorio biológico.
un nivel por fila es maravilloso . Vea la adición al final de la respuesta.

Respuestas (2)

Visualización multiplexada de filas/columnas: una forma muy tradicional y bastante directa de hacer esto es controlar sus LED en una pantalla (normalmente con puertos de 8 bits) de hasta 8 x 8 filas y columnas. Luego puede generar datos para los 8 LED en una columna y habilitar la columna correspondiente, o datos de salida para una fila y luego habilitar el controlador de fila correspondiente. Se necesitan 8 escrituras de columnas o filas sucesivas para recorrer los 64 LED. Esto debe hacerse lo suficientemente rápido para evitar un parpadeo visible. Puede PWM este arreglo encendiendo los LED seleccionados solo en algunas ocasiones o puede variar el período de tiempo que cada LED está encendido cuando una fila o columna está habilitada. Ambos tienen sus pros y sus contras y desafíos.

El siguiente diagrama muestra una pantalla multiplexada de 7 segmentos. Aquí se puede pensar en una sola pantalla como los 7 (u 8) bits de datos para una fila y el transistor sobre cada pantalla es su habilitación de fila. Como se muestra, esto es 4 x 7, pero la extensión a 7x7 u 8x8 es solo cuestión de agregar componentes. Como se muestra aquí, todos los segmentos de una sola pantalla son controlados directamente por el microcontrolador, aquí un ATmega16, pero es posible que la capacidad actual de su dispositivo no lo permita. El uso de un circuito integrado de búfer, como un circuito integrado de controlador de colector abierto de 8 canales ULN2803, proporcionará hasta 500 mA de corriente de accionamiento total. La entrada ULN2803 está optimizada para niveles de accionamiento de 5 voltios, pero la página 2 de la hoja de datos anterior enumera 5 miembros de la familia con varios arreglos de accionamiento.

ingrese la descripción de la imagen aquí

Si el arreglo anterior requiere más potencia de procesamiento de la que está satisfecho, puede usar controladores con una funcionalidad superior, a costa de los costos.

Puede lograr toda la tarea con 2 circuitos integrados utilizando 2 x MM5450 capaces de controlar 35 LED cada uno. Los LED están apagados o encendidos con brillos preestablecidos, por lo que nuevamente tendría que controlar el PWM encendiendo y apagando de manera controlada. Puede escribir una matriz de 70 LED en menos de un milisegundo con un reloj de 100 kHz, por lo que si apunta a una frecuencia de actualización de 50 Hz para todos los LED en un cuadro con el brillo seleccionado, esto permitiría unos 20 niveles de brillo. Llevar el reloj a su máximo de 500 kHz permitiría unos 100 niveles de brillo.

El MM5450 permite controlar 35 LED desde un solo paquete. Por lo general, se requieren 3 pines para la transmisión, pero se puede usar 1 pin con un poco de lógica de pegamento.

  • Controlador de 35 LED MM5450 . Hoja de datos Este es mi favorito desde hace mucho tiempo. Una vez que uses uno de estos, te echarán a perder. En términos de rentabilidad y simplicidad de manejo, poco más se compara. Disponible en Digikey por 4,39 USD/1 en DIP40 y también disponible en PLCC 44$3.78/1. Chainable con un poco de trabajo. En teoría, requiere 3 líneas para controlarlo, pero los demasiado entusiastas pueden hacerlo con 1 línea y algunos retrasos de RC. Funciona :-). Dicen: Los datos se transfieren en serie a través de 2 señales; Reloj y datos seriales. La transferencia de datos sin el inconveniente adicional de una señal de carga externa se logra utilizando un formato de un "1" inicial seguido de los 35 bits de datos permitidos. Estos 35 bits de datos se bloquean después de que se haya transferido el 36. Este esquema proporciona una transmisión directa no multiplexada a la pantalla LED. Los caracteres que se muestran actualmente (por lo tanto, la salida de datos) cambian solo si los bits de datos en serie difieren de los transferidos previamente. Tenga en cuenta el error tipográfico de cortar y pegar en la página 5 de la hoja de datos. Cómo conducir con un pin de salida - ver al final.

Una alternativa más moderna pero no mucho más capaz es el controlador LED de corriente constante de 16 canales TLC59282 de 16 canales El TLC59282 de Texas Instruments es un controlador disipador de corriente constante de 16 canales. Hoja de datos aquí.Cada canal se puede controlar individualmente a través de un protocolo de comunicaciones en serie simple que es compatible con niveles lógicos CMOS de 3,3 V o 5 V, según el VCC operativo. Una vez que se carga el búfer de datos en serie, un flanco ascendente en LATCH transfiere los datos a las salidas LEDx. El pin EN BLANCO se puede usar para apagar todas las salidas OUTn durante el encendido y el bloqueo de datos de salida para evitar visualizaciones de imágenes no deseadas durante estos momentos. El valor de corriente constante de los 16 canales se establece mediante una sola resistencia externa. Se pueden conectar en cascada varios TLC59282 para controlar LED adicionales desde el mismo procesador.

Software basado en procesador PWM:

Puede, pero algunos procesadores con una gran cantidad de E/S pero con una capacidad lo suficientemente baja como para tener un precio modesto. La implementación de PWM de software multicanal es fácil. En realidad. (Puedo proporcionar detalles si lo desea). Sería factible tener software PWM en cada pin de E/S. Necesitarías dos. Puede hablar con esto a través de un enlace en serie con una velocidad modesta o incluirlo como parte de su sistema general. Comunicaciones: dos bytes asíncronos. El byte 1 tiene configurado msbit y hasta 128 direcciones. Byte dos mas msbit claro y hasta 128 niveles de brillo.

Esta pieza PIC 18F86J72 de $7,64/1 tiene 51 pines de E/S, pero es posible que el paquete TQFP de 80 pines no le convenga.

Este PIC 16F887 por $2.80/1 tiene 35 E/S, la mayoría o todas estarán bien como salidas estándar y se pueden usar para el software PWM. La multiplexación modesta permitiría controlar más LED.


Si se requiere el mismo nivel de brillo para todos los LED en una fila (como dice Andreas), entonces el problema se vuelve un poco más fácil.

Configure los datos de la fila y luego

  • (1) Encienda la fila para el período seleccionado correspondiente al brillo y recorra todas las filas. Repita "con la suficiente frecuencia" para que no parpadee. o

  • (2) Muestre las filas escasamente para variar el brillo. por ejemplo, si desea pasos de ~ 1%, el ciclo total es de 100 fotogramas de todas las filas PERO, por ejemplo, para un brillo del 30%, muestra esa fila 30/100 del tiempo.
    Esto se puede hacer, por ejemplo, manteniendo un registro de brillo por fila. Un contador de fotogramas se establece en 1 y todas las filas se muestran en orden (excepto las filas donde el brillo = 0, consulte a continuación). A continuación, se incrementa el contador de fotogramas y se repite un ciclo de hileras. Si el registro de brillo para la fila N es mayor o igual que el contador de cuadros, entonces muestre los datos de la fila, si no, no muestre los datos de la fila PERO asegúrese de que el ciclo de "apagado" tome el mismo tiempo que un ciclo de encendido (isócrono). Cuando el contador de fotogramas alcance el valor máximo (por ejemplo, 100), reinícielo y comience de nuevo.

La rapidez con la que se debe multiplexar una pantalla es "con la suficiente frecuencia" ha sido objeto de mucha discusión aquí y en otros lugares, pero solo un poco por encima de la tasa de POV (persistencia de la visión) no es lo suficientemente rápido si se deben eliminar todos los artefactos de LED multiplex. Una tasa de 100 fotogramas completos por segundo es probablemente segura y más alta no hace daño.

Digamos 100 cuadros por segundo y 100 niveles de brillo por fila, necesita 100 x 100 = 10,000 pantallas completas por segundo = 100 US / conjunto de pantalla. Con 8 filas, debe generar una fila en 100/8 ~= 12 uS. No es difícil incluso con controladores modernos de precio modesto. es decir, en el escenario 2, debe mostrar 8 filas cada 100 uS, por lo que cada 100/8 ~= 12 uS debe examinar el contador de brillo de una fila para decidir si se mostrará o no. Si se va a mostrar, imprímalo. Si no se va a mostrar, emite todos los 0.

Se agregó un comentario basado en el procesador al final.
Oh, vaya. Qué respuesta tan completa. ¡Muchas gracias! Supongo que tendré que leer mucho ahora...

La modulación del ciclo de trabajo del software por pin es en realidad mucho más fácil de lo que mucha gente cree si el interés de uno es el ciclo de trabajo en lugar del ancho de pulso.

Para manejar ocho bits a la vez con control de brillo de 4 bits, se podría usar el siguiente código. Suponga que el lsb (bit 0) de los ocho niveles de brillo está en bright0, el bit 1 de los ocho niveles de brillo está en bright1, etc. brillante0..brillante3. La variable tickcount es simplemente un carácter sin firmar que cuenta cada interrupción; podría ser compartida con otros propósitos.

  contador de tictac++;
  si (conteo y 1)
    PUERTO_SALIDA = brillante3;
  si no (conteo de ticks y 2)
    PUERTO_SALIDA = brillante2;
  si no (conteo de ticks y 4)
    PUERTO_SALIDA = brillante1;
  si no (conteo de ticks y 8)
    PUERTO_SALIDA = brillante0;
  demás
    PUERTO_SALIDA = brillanteX;

El código podría extenderse fácilmente a cualquier número de bits de brillo o cualquier número de pines de E/S. Una advertencia a tener en cuenta es que cambiar el brillo* cuando el recuento de ticks no es cero puede causar una interrupción momentánea en el brillo de la pantalla de medio conteo. No hay problema si el brillo no se cambia con demasiada frecuencia, pero si uno cambia el brillo 16 veces en 16 tics, uno podría terminar con un brillo 8 valores más alto o más bajo de lo esperado (por ejemplo, si el brillo alterna entre 7 y 8, la pantalla podría termine estando encendido durante 0 de 16 o 15 de 16 ciclos). El remedio más simple es cambiar el brillo solo una vez cada 16 cuentas.