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

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 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?

No había visto. Posiblemente duplicado: electronics.stackexchange.com/questions/9860/…
No olvide comparar sus opciones con el costo de comprar un microcontrolador ligeramente más pequeño. También preste atención a los límites de corriente total y por puerto.
Cuando comencé a trabajar con micros hace un tiempo, esta es una pregunta que deseaba que hubiera sido fácil de encontrar con respuestas claras. Logré aprender sobre charlieplexing e implementarlo con éxito, pero quería recrear la pregunta aquí con la excelente calidad de las respuestas de la comunidad SE.
@joeforker Tiene razón, el costo de un micro con más pines fue bastante mínimo, considerando que mi proyecto fue único. En un momento pensé en usar un micro con aproximadamente 20 pines IO para realizar el trabajo, pero uno de mis objetivos era una huella de placa de circuito muy pequeña. Además, ¡impresionante adjetivo pinnier !
@mjh: Quería publicar una pregunta redactada de esta manera porque en algún momento la habría encontrado inmensamente útil. La pregunta a la que hace referencia es específica de un Arduino, aunque ciertamente el principio es idéntico.

Respuestas (6)

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

La más sencilla es la multiplexación estándar de visualización de filas/columnas. Con esta técnica, puedes conducir ( norte / 2 ) 2 LED con norte pines E/S. Matemáticamente, el ciclo de trabajo es:

1 metro i norte i metro tu metro ( 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 / norte cuando se necesita encender una línea diagonal (o todas las filas son diferentes). Solo tiene garantizado un ciclo de trabajo del 100% cuando enciende cada LED o un LED (o cero LED, pero eso realmente no cuenta mucho).

Ligeramente más complejo es Charlieplexing . Con esta técnica, puedes conducir norte 2 norte LED con norte pines E/S. Solo norte 1 Los LED se pueden encender simultáneamente con esta técnica. Matemáticamente, el ciclo de trabajo es:

1 conjuntos mínimos simultáneos

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 ha sido probado, 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á investigar esto más a fondo). Este es un cálculo mucho más complejo tanto intelectualmente y computacionalmente que el cálculo equivalente para la multiplexación estándar. Efectivamente, se obtiene un ciclo de trabajo de 1 / norte 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 tiene garantizado un ciclo de trabajo del 100 % cuando enciende 1 LED.

El último método que mencionaré es utilizar un registro de desplazamiento o un expansor de E/S. Con dos pines (ya sea la interfaz de reloj/datos sin procesar, I2C o SPI unidireccional), puede controlar una cantidad 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.

+1 por explicar un poco sobre el aspecto del ciclo de trabajo. En la segunda oración sobre Charlieplexing, ¿quiso decir "controlar n ^ 2-n LED con n pines IO?
Charlieplexing se puede hacer de manera muy similar a la multiplexación, si simplemente se omite una luz de cada fila. En realidad, puede ser posible "recuperar" esa luz agregando un diodo, aunque a menos que los controladores de columna sean salidas de corriente constante, puede ser difícil hacer que coincida con el brillo de los demás.

Usando Charlieplexing puedes conducir directamente norte × ( norte 1 ) LED de norte patas.

Ejemplo:

Seis LED 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

Esquema de Charlieplexing con 3 pines de salida

Gracias por el conjunto de datos del pin de salida, así como por un esquema útil.
Otra forma de dibujar el esquema es como una cuadrícula NxN, pero solo con columnas y reemplazando la diagonal principal con cortos de fila-columna.
significa que no puedo encenderlos todos a la vez? ¿Eso significa que si quiero encenderlos todos a la vez, tengo que hacer time-plexing lo suficiente como para engañar a los ojos?
@MaNyYaCk Sí. Estás bien.

Sin multiplexación (accionamiento directo), está limitado a 6 LED.

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

Con expansores de E/S o registros de desplazamiento, puede controlar una cantidad prácticamente ilimitada de LED.
Ejemplo: Expansor de E/S I2C de 8 bits MCP23008

¿Puede explicar qué serían los expansores de E/S?
Un expansor de E/S es un chip externo que contiene pines y registros de E/S. Puede usar un bus de comunicación estándar como I2C o SPI para comunicarse con ellos.
+1 Puede manejar muchos LED con TLC594 de TI ( focus.ti.com/lit/ds/symlink/tlc5940.pdf ), pero puede ser excesivo para muchos trabajos. search.digikey.com/scripts/DkSearch/…
Gracias. Debería diseñar un proyecto que haga uso de expansores de E/S para forzar mi aprendizaje de su uso.

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

Aquí hay un ejemplo de charlieplexing que he construido.

Es un simulador de haz de faro y utiliza una serie de 12 LED charlieplexed a 4 GPIO para barrer un haz de luz alrededor de un disco. Hay un video de eso aquí .

El proyecto está basado en PIC, utilizo 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 está impulsada por una interrupción que proporciona un PWM de 32 pasos a alrededor de 60 Hz. Solo se permite que se enciendan 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 entre la frecuencia de actualización de PWM y la resolución.

La codificación para usar charlieplexing es realmente bastante simple si se apega al método "clásico" de solo encender un solo LED en un momento dado a una frecuencia de actualización muy rápida. Calculo el PUERTO y el TRIS (registros específicos de la imagen) requeridos primero en papel 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 [x] de la matriz y escribirlo directamente en el PUERTO (con un poco de enmascaramiento para preservar el estado de los otros pines que no se usan en el charliplex)

Mi proyecto solo tiene 12 LED, no 15 o el máximo de 20 que permitirán los 5 GPIO, 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 de trabajo similar a su solicitud.

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

Otra opción sería utilizar los LED 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 LED separada adecuada.