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?
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 LED con pines E/S. Matemáticamente, el ciclo de trabajo es:
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 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 LED con pines E/S. Solo Los LED se pueden encender simultáneamente con esta técnica. Matemáticamente, el ciclo de trabajo es:
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 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.
Usando Charlieplexing puedes conducir directamente LED de 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
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
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.
daniel grillo
joeforker
JYelton
JYelton
mjh2007
JYelton