2 votos

Viabilidad del control de una matriz LED regulable

Tengo una pregunta para principiantes: Me gustaría crear una matriz de LEDs personalizada (por lo menos 7x7; de un solo color), donde cada fila de LEDs puede ser atenuada por separado o, idealmente, incluso cada LED. El conjunto 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 y 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 sólo me gustaría saber si lo siguiente es factible, cuáles serían los requisitos de hardware a grandes rasgos y si un novato como yo sería capaz de hacerlo. ¿Hay alguna solución de hardware disponible?

Muchas gracias por vuestras respuestas y paciencia con un principiante.

Andreas

PD: Mi pregunta publicada inicialmente contiene requisitos erróneos (LED de dos colores) que es por lo que he publicado esta pregunta bastante similar. Una de las respuestas allí enlaces a un hilo relacionado lo que no ayuda a responder a mis preguntas.

5voto

aryeh Puntos 1594

Visualización multiplexada fila/columna: Una forma muy tradicional y bastante directa de hacer esto es conducir sus LEDs en un (típicamente con puertos de 8 bits) hasta 8 x 8 fila y columna.Usted puede entonces los datos de salida para los 8 LEDs en una columna y habilitar la columna correspondiente, o los datos de salida para una fila y luego habilitar el conductor fila correspondiente. Se necesitan 8 escrituras de columnas o filas sucesivas para recorrer los 64 LEDs. Esto debe hacerse lo suficientemente rápido para evitar el parpadeo visible. Se puede hacer un PWM de esta disposición encendiendo los LEDs seleccionados sólo en algunas ocasiones o se puede variar el periodo de tiempo que cada LED está encendido cuando se activa una fila o columna. Ambos tienen sus pros y sus contras y desafíos.

El siguiente diagrama de muestra una pantalla multiplexada de 7 segmentos. Aquí una sola pantalla puede ser considerada 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 sólo una cuestión de añadir componentes. Como se muestra aquí todos los segmentos de una sola pantalla son manejados directamente por el microcontrolador - aquí un ATmega16 - pero la capacidad actual de su dispositivo puede no permitir esto. Usando un IC de búfer como un ULN2803 Conductor de colector abierto de 8 canales IC proporcionará hasta 500 mA de corriente total de accionamiento. La entrada del 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 diversas disposiciones de accionamiento.

enter image description here

Si la disposición anterior requiere más potencia de procesamiento de la que le satisface, puede utilizar controladores con una funcionalidad superior, a costa del coste.

Se puede lograr la misma tarea con 2 ICs usando 2 x MM5450 capaces de manejar 35 LEDs cada uno. Los LEDs están apagados o encendidos con brillos preestablecidos, por lo que de nuevo tendrías que controlar el PWMing encendiendo y apagando de forma controlada. Puedes escribir una matriz de 70 LEDs en menos de un milisegundo con un reloj de 100 kHz, así que si apuntas a una tasa de actualización de 50 Hz para todos los LEDs en un marco en el brillo seleccionado, esto permitiría unos 20 niveles de brillo. Llevando el reloj a su máximo de 500 kHz permitiría unos 100 niveles de brillo.

El MM5450 permite controlar 35 LEDs desde un solo paquete. Normalmente se requieren 3 pines para el accionamiento, pero se puede utilizar 1 pin con un poco de lógica de pegado.

  • Controlador de LEDs MM5450 35 . Ficha técnica Este es mi favorito desde hace mucho tiempo. Una vez que utilices uno de estos estarás mimado. En términos de rentabilidad y simplicidad de la unidad poco más se compara. En stock en Digikey por 4,39 $/1 en DIP40, y también en stock en PLCC 44 $3.78/1. Encadenable con un poco de trabajo. Nocionalmente requiere 3 líneas para controlarlo pero los excesivamente entusiasmados pueden hacerlo con 1 línea y unos cuantos retrasos RC. Funciona :-). Dicen: Los datos se transfieren en serie a través de 2 señales; reloj y datos datos en serie. Transferencia de datos sin el inconveniente añadido de de una señal de carga externa se logra utilizando un formato de un "1" inicial seguido de los 35 bits de datos permitidos permitidos. Estos 35 bits de datos se bloquean después de que se haya transferido el 36º. se haya transferido. Este esquema proporciona una señal no multiplexada, no multiplexado y directo a la pantalla LED. Los caracteres que se muestran (por lo tanto, la salida de datos) sólo cambia si los bits de datos bits de datos en serie difieren de los transferidos previamente. Observe el error de corte y pegado 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 la de 16 canales TLC59282 Controlador de LED de corriente constante de 16 canales El TLC59282 de Texas Instruments es un controlador de disipación de corriente constante de 16 canales. Ficha técnica aquí. Cada canal puede ser controlado individualmente a través de un sencillo protocolo de comunicaciones en serie que es compatible con niveles lógicos CMOS de 3,3 V o 5 V, dependiendo de la VCC de funcionamiento. Una vez cargado el buffer de datos serie, un flanco ascendente en LATCH transfiere los datos a las salidas LEDx. El pin BLANK se puede utilizar para apagar todas las salidas OUTn durante el encendido y el enclavamiento de los datos de salida para evitar la visualización de imágenes no deseadas durante estos momentos. El valor de corriente constante de los 16 canales se ajusta mediante una única resistencia externa. Se pueden conectar en cascada varios TLC59282 para controlar más LEDs desde el mismo procesador.

Software PWM basado en el procesador:

Puedes encontrar algunos procesadores con un gran número de E/S pero con una capacidad lo suficientemente baja como para tener un precio modesto. Implementar PWM multicanal por software en ellos es fácil. De verdad. (Puedo dar detalles si se quiere). Tener PWM por software en cada pin de E/S sería factible. Necesitarías dos. Podrías hablar con esto a través de un enlace serial con una velocidad modesta o incluirlo como parte de tu sistema general. Comunicaciones - dos bytes asincrónicos. Byte 1 tiene msbit set y hasta 128 direcciones. Byte dos mas msbit clear y hasta 128 niveles de brillo.

Este PIC 18F86J72 $7.64/1 parte tiene 51 pines de E/S, pero el paquete TQFP de 80 pines puede no convenirle.

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


Si se requiere el mismo nivel de brillo para todos los LEDs en una fila (como dice Andreas que es el caso) entonces el problema se vuelve ligeramente más fácil.

Configurar los datos de la fila y luego

  • (1) Encienda la fila para el período seleccionado correspondiente a la luminosidad y recorra todas las filas. Repetir "con la suficiente frecuencia" para no tener parpadeos. o

  • (2) Visualizar las filas de forma dispersa para variar el brillo. Por ejemplo, si quiere pasos de ~ 1%, el ciclo total es de 100 cuadros de todas las filas, PERO para, por ejemplo, el 30% de brillo, se muestra esa fila 30/100 del tiempo.
    Esto puede hacerse, por ejemplo, manteniendo un registro de luminosidad por fila. Un contador de fotogramas se pone a 1 y todas las filas se muestran en orden (excepto las filas en las que el brillo = 0 - ver más abajo). El contador de tramas se incrementa entonces y se repite el ciclo de filas. Si el registro de luminosidad de la fila N es mayor o igual que el contador de tramas, entonces se muestran los datos de la fila, si no, no se muestran los datos de la fila PERO se asegura que el ciclo de "apagado" toma el mismo tiempo que un ciclo de encendido (isócrono). Cuando el contador de fotogramas alcanza el valor máximo (digamos 100), reinícielo y comience de nuevo.

La rapidez con la que debe multiplexarse una pantalla para que sea "suficientemente frecuente" ha sido objeto de mucho Se ha discutido aquí y en otros lugares, pero una tasa ligeramente superior a la de POV (persistencia de la visión) no es lo suficientemente rápida si se quieren eliminar todos los artefactos de multiplexación de los LED. Una tasa de 100 fotogramas enteros por segundo es probablemente segura y más alta no hace ningún daño.

Digamos que con 100 imágenes por segundo y 100 niveles de brillo por fila se necesitan 100 x 100 = 10.000 visualizaciones completas por segundo = 100 uS / conjunto de visualizaciones. Con 8 filas se necesita emitir una fila en 100/8 ~= 12 uS. No es difícil, incluso con los controladores modernos de precio modesto. Es decir, en el escenario 2 necesita mostrar 8 filas cada 100 uS, por lo que cada 100/8 ~= 12 uS necesita examinar el contador de brillo de una fila para decidir si se debe mostrar o no. Si debe ser mostrada la salida. Si no debe ser mostrado, envía todos los 0's.

0voto

Alex Andronov Puntos 178

La modulación del ciclo de trabajo por software es en realidad mucho más fácil de lo que mucha gente cree si lo que interesa es el ciclo de trabajo y no el ancho de pulso.

Para manejar ocho bits a la vez con el control de brillo de 4 bits, se podría utilizar el siguiente código. Asume 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. Cualquier luz que deba estar en "full bright" debe tener los bits apropiados en brightX así como en bright0..bright3. La variable tickcount es simplemente un char sin signo que cuenta cada interrupción; podría ser compartida con otros propósitos.

  tickcount++;
  if (tickcount & 1)
    PORT\_OUT = bright3;
  else if (tickcount & 2)
    PORT\_OUT = bright2;
  else if (tickcount & 4)
    PORT\_OUT = bright1;
  else if (tickcount & 8)
    PORT\_OUT = bright0;
  else
    PORT\_OUT = brightX;

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 tickcount no es cero puede causar una interrupción momentánea en el brillo de la pantalla de media cuenta. No es un problema si el brillo no se cambia con demasiada frecuencia, pero si uno cambia el brillo 16 veces en 16 ticks, 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 terminar estando encendida durante 0 de 16 o 15 de 16 ciclos). El remedio más sencillo es cambiar el brillo sólo una vez cada 16 cuentas.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X