¿Cómo puedo controlar muchos LED con solo unos pocos pines en mi micro?

10

Estoy usando un Atmel ATtiny13 que tiene una E / S de 6 pines. Me gustaría controlar unos 15 LED, pero no estoy seguro de cómo conectar todo. Sin la multiplexación de ningún tipo, parece que solo podría controlar 6 LED a la vez. ¿Estoy limitado a solo 6 LED debido al tamaño del microcontrolador?

    
pregunta JYelton

6 respuestas

18

Hay varios métodos que se pueden usar para controlar una gran cantidad de LED desde unos pocos pines IO.

El más simple es el multiplexado de visualización de fila / columna estándar. Con esta técnica, puede conducir \ $ (n / 2) ^ 2 \ $ LED con \ $ n \ $ IO pins. Matemáticamente, el ciclo de trabajo es:

$$ \ frac {1} {mínimo (\ text {patrones de fila únicos, patrones de columna únicos})} $$

Esto significa que esta técnica tiene un ciclo de trabajo del 100% cuando todos los LED están encendidos (o todas las filas o todas las columnas son idénticas) y un ciclo de trabajo de \ $ 1 / n \ $ cuando se necesita iluminar una línea diagonal ( o todas las filas son diferentes). Solo se le garantiza un ciclo de trabajo del 100% cuando se encienden todos los LED o un LED (o cero LED, pero eso realmente no cuenta mucho).

Un poco más complejo es Charlieplexing . Con esta técnica, puede conducir \ $ n ^ 2 - n \ $ LED con \ $ n \ $ IO pins. Solo \ $ n - 1 \ $ LEDs pueden encenderse simultáneamente con esta técnica. Matemáticamente, el ciclo de trabajo es:

$$ \ frac {1} {\ text {conjuntos simultáneos mínimos}} $$

donde un conjunto simultáneo es un grupo único de LED que tiene un ánodo común o un cátodo común. (Esto no se ha demostrado, es justo a lo que llegué después de reflexionar sobre el problema por un minuto. Si el ciclo de trabajo es importante para usted, querrá verlo más a fondo). Este es un cálculo mucho más complejo tanto intelectualmente y computacionalmente que el cálculo equivalente para multiplexación estándar. Efectivamente, obtiene un ciclo de trabajo de \ $ 1 / n \ $ cuando todos los LED están encendidos pero algunos (solo algunos) patrones de n-1 o menos LED pueden tener un ciclo de trabajo del 100%. Solo se le garantiza un ciclo de trabajo del 100% cuando se enciende 1 LED.

El último método que mencionaré es usar un registro de cambios o IO expansor. Con dos pines (ya sea la interfaz de reloj / datos sin procesar, I2C o SPI unidireccional), puede controlar un número arbitrariamente grande de LED. El ciclo de trabajo para cualquier patrón es del 100%, pero la tasa de actualización es inversamente proporcional al número de LED. Este es el método más costoso. Para 15 LED, probablemente será más barato simplemente actualizar a un micro con tantos pines IO.

    
respondido por el Kevin Vermeer
10

Usando Charlieplexing puede conducir directamente \ $ n \ times (n-1) \ $ LEDs desde \ $ n \ $ pins.

Ejemplo:

Seis LED's en 3 pines:

PINS        LEDS
0 1 2   1 2 3 4 5 6
0 0 0   0 0 0 0 0 0
0 1 Z   1 0 0 0 0 0
1 0 Z   0 1 0 0 0 0
Z 0 1   0 0 1 0 0 0
Z 1 0   0 0 0 1 0 0
0 Z 1   0 0 0 0 1 0
1 Z 0   0 0 0 0 0 1
0 0 1   0 0 1 0 1 0
0 1 0   1 0 0 1 0 0
0 1 1   1 0 0 0 1 0
1 0 0   0 1 0 0 0 1
1 0 1   0 1 1 0 0 0
1 1 0   0 0 0 1 0 1
1 1 1   0 0 0 0 0 0

    
respondido por el Daniel Grillo
8

Sin la multiplexación (accionamiento directo), tiene un límite de 6 LED.

Con charlieplexing puede controlar n * (n-1) LEDs desde n pines.

Con los expansores de E / S o los registros de desplazamiento, puede controlar un número prácticamente ilimitado de LED.
Ejemplo: MCP23008 Expansor de E / S I2C de 8 bits

    
respondido por el mjh2007
4

Como sugirió @ mjh2007 con un expansor I2C. Pero hay específicamente para los LED de conducción lo que evitará la necesidad de resistencias externas limitadoras de corriente.

    
respondido por el Brian Carlton
2

Aquí hay un ejemplo de charlieplexing que he construido.

Es un simulador de haz de luz de faro y utiliza una serie de 12 LED que se combinan con 4 GPIO para barrer un haz de luz alrededor de un disco. Hay un video aquí .

El proyecto está basado en PIC, uso un PIC12f683 que también es un uP de 8 pines y podría considerarse comparable a los AVR de 8 pines.

La intensidad del LED se debe a una interrupción que proporciona un PWM de 32 pasos a unos 60Hz. Solo se permite encender dos LED a la vez, lo que da un 50% de trabajo para cada LED, ya que eso era todo lo que necesitaba. También ofrece una buena compensación de la frecuencia de actualización de PWM frente a la resolución.

La codificación para usar charlieplexing es bastante simple si se apega al método "clásico" de encender solo un único LED en un momento dado con una frecuencia de actualización muy rápida. Primero trabajo en papel el PORT y el TRIS requeridos (registros específicos de imagen) y luego almaceno los resultados en una matriz estática. Para encender el LED x, el PIC solo tiene que buscar el valor en el índice de la matriz [x] y escribirlos directamente en el PUERTO (con un poco de enmascaramiento para preservar el estado de los otros pines que no se utilizan en el charliplex)

Mi proyecto solo tiene 12 LED, no 15 o el máximo 20, el 5 GPIO permitirá, ya que quería mantener un GPIO de repuesto para el desarrollo futuro.

De todos modos ... pensé que podría ser útil tener un ejemplo funcional similar a su solicitud.

El código fuente completo y los esquemas están disponibles en mi blog.

    
respondido por el Matt Casey
0

Otra opción sería usar los LED de Neopixel. Tienen un IC de control incorporado y solo necesita un pin para controlar tantos LED como desee. Por supuesto, entonces necesitará una fuente de alimentación de LED separada adecuada.

    
respondido por el needfulthing

Lea otras preguntas en las etiquetas