El Multiplexado de LEDs con Arduino

0
16077

El multiplexado de LEDs representa una solución ingeniosa para controlar un gran número de luces usando los limitados puertos de un Arduino básico. Esta técnica es clave en la creación de matrices de LEDs y en numerosos proyectos que involucran el manejo sincronizado de una amplia gama de dispositivos electrónicos.

En ocasiones, nos encontramos con la necesidad de utilizar una cantidad significativa de LEDs simultáneamente con Arduino, pero nos topamos con la limitación de puertos disponibles en nuestra placa. Por ejemplo, consideremos el desafío de conectar 25 LEDs a un Arduino UNO, el cual dispone de 14 puertos digitales y 6 analógicos. Es importante recordar que, de los 13 puertos de entrada/salida, solo podemos utilizar aquellos del 2 al 13, dejando libres los puertos 0 y 1 por estar usualmente conectados en paralelo al puerto serie como RX/TX.

Sin título-1

Esto nos deja con 12 puertos disponibles y los 6 puertos analógicos que bien pueden ser configurados como salidas digitales utilizando pinMode (el puerto A0 vendría siendo el 14, el A1 el 15… en el Arduino Nano, que posee 7 puertos analógicos, ni el A6 ni el A7 se pueden configurar como salidas digitales).

Entonces… ¿como encendemos 25 LEDs con 18 salidas? Pues resulta que para encender 25 LEDs basta con solamente 10 pines y con 15 pines se podrían encender hasta 125 LEDs. Pero, ¿cómo? Esto es posible a través de una técnica llamada multiplexado, la cual voy a proceder a explicar a continuación.

El multiplexado de LEDs

A mi en lo personalmente gusta mucho utilizar el simulador LiveWire para circuitos sencillos. Voy a armar el siguiente circuito en el simulador:

Sin título-4

Este es un circuito con 25 LEDs y conmutado por 10 interruptores. ¿Funcionará?

 

Antes de empezar a explicar por qué disminuyó la intensidad de los LEDs al encenderse todos de forma simultánea analicemos lo principal: hemos controlado 25 LEDs con solo 10 interruptores. Si reemplazamos esos 10 interruptores por pines de Arduino, tendremos a nuestro Arduino manejando los 25 LEDs.

Basta con seleccionar una fila y una columna para encender determinado LED. Al seleccionar todas las filas y una columna, tendremos todos los LED de una columna encendidos. Si seleccionamos todas las filas y las columnas, nuestros 25 LEDs se iluminarán. Sin embargo, como vimos en la simulación, se disminuye mucho la luminosidad del LED. ¿A qué se debe esto?

Nótese que cuando encendí toda una hilera de LEDs de forma vertical no perdí luminosidad, todos estaban encendidos a plena potencia. Pero de forma horizontal no sucede lo mismo.

En el diagrama se han colocado 5 resistencias de 220Ω, lo cual permite que pase un máximo de 22 miliamperios, esto suponiendo que la caída de tensión a través del LED es nula (lo que no es cierto).

Un LED necesita para su funcionamiento un máximo de 30 miliAmperios (normalmente), a partir de los cuales existe el riesgo de que se funda. Los 22 miliAmperios son más que suficiente para un solo LED, pero no para 5. Osea que cuando haya 5 LEDs en una hilera exigiendo sus 150 miliAmperios (corriente máxima), la resistencia no permitirá que se entregue esa corriente y los LEDs tendrán que repartirse lo poco que la resistencia permite que pase desde la fuente.

Entonces, ¿para qué coloqué esa resistencia ahí? ¿Será que la Universidad me está volviendo loco? Pues loco está el que no la coloca, ya que si no se hace de esta forma se provocaría un corto circuito y dependiendo de lo buenos que seamos para hacer mal las cosas, podremos fundir uno o todos los LEDs. Sucede que esta resistencia es la que limita la corriente que viene desde la fuente y al retirarla le estamos dando paso a que la fuente entregue el máximo de carga, lo que es el equivalente a un corto.

OK OK ya sabemos que es necesaria la resistencia, pero ¿por qué no colocamos una de un valor más bajo? Si se necesitan 150 miliAmperios para 5 LEDs, con una resistencia de 30Ω y los 5 voltios de la fuente tenemos 150 mA. Esto es correcto pero solamente es válido para cuando están los 5 LEDs encendido, lo cual no será necesario siempre. Tendremos 5 hermosos LEDs emitiendo luz de forma simultánea, pero al apagar 4 tendremos 150 miliAmperios a través de una pieza que soporta solamente una quinta parte de dicha corriente. ¿Qué problema no? Si usamos una resistencia de 220 encenderemos bien un LED pero cuando hayan 5 encendidos cada uno de ellos solo tendrá una quinta parte de la corriente total que se necesita. Si colocamos una resistencia más baja, cuando tengamos un solo LED encendido se fundirá. ¿Qué hacemos?

Pues el ojo humano es impresionante, tanto por las cualidades que nos permiten ver nuestro entorno como aquellas que nos engañan. A continuación les mostraré un ejemplo sencillo se cómo nuestra vista nos traiciona. He tenido que utilizar Proteus en esta ocasión y nisiquiera con Proteus he logrado simular el efecto deseado, pero lo importante es el concepto que les quiero compartir. He armado un circuito sencillo que enciende una fila de LEDs de forma ordenada. En el primer instante tenemos 10000 (osea encendido-apagado-apagado-apagado-apagado), luego 01000, 00100, 00010, 00001, 10000 y así sucesivamente. Quiero que se observe bien el efecto que causa el aumento en la frecuencia en el encendido de los LEDs.

Como vemos no podemos percibir los 5 LEDs encendidos a la vez por tratarse de una simulación, pero se entiende el concepto. Encendemos los 5 LEDs de forma muy rápida y creemos que los 5 están encendidos. Es el mismo efecto que nos permite ver películas, donde los 30 fotogramas por segundo nos hace sentir que las imágenes se mueven pero no es más que una secuencia perfecta de imágenes.

Multiplexado para más de 5 voltios con Arduino

A veces vamos a necesitar más de 5 voltios o corrientes mayores a las que Arduino es capaz de entregar (normalmente 40 mA). En estos casos, es necesario el uso de transistores BJT, tanto NPN como PNP. En Panama Hitek ya hemos escrito antes sobre transistores BJT:

El transistor nos permite, entre muchas otras cosas, conmutar cargas que operan a voltajes mayores al que Arduino es capaz de entregar. En el siguiente diagrama se muestra esta capacidad:

multiplexado de leds

 

En el diagrama de la izquierda se muestra que los interruptores están abiertos y no se produce el encendido del LED. Como no hay corriente a través del circuito, no hay caídas de voltaje y por eso los Test Point marcan 11.98 voltios. Debemos recordar que esto es un simulador y que en la vida real debemos tener aproximadamente los 12 voltios de la fuente en los 3 puntos.

En el diagrama de la derecha tenemos los interruptores cerrados, por lo que se produce un flujo de corriente desde la base del transistor PNP (el de arriba) y hacia la base del transistor NPN (el de abajo). Esto provoca que los transistores se saturen, es decir, empiecen a funcionar y a conducir corriente desde el emisor hacia el colector (PNP) y desde el colector hacia el emisor (NPN). Al observar las caídas de voltaje en los tres puntos donde hay un Test Point, el transistor PNP no provoca una caída de votaje entre la fuente y la resistencia de 330. El transistor inferior (NPN) es sólo el que interrumpe la corriente desde el cátodo del LED hacia tierra. Dicho esto, al utilizar transistores configurados de esta forma nuestro circuito funciona de forma análoga a uno con 2 interruptores, como se muestra en el siguiente diagrama:

multiplexado de leds

Lo importante del uso de los transistores para nuestros propósitos es que el LED del diagrama está siendo alimentado por una fuente de 12 voltios, mientras que el control, osea lo que activa los transistores es una fuente de 5 voltios, tal como el Arduino. Para que el Arduino pueda encender el LED del diagrama se deben hacer las siguientes conexiones:

multiplexado de leds

Sabiendo esto, podemos reemplazar los interruptores por transistores en nuestro diagrama con 25 LEDs.

multiplexado de leds

Ahora tenemos 25 LEDs alimentados a 12 voltios por una fuente externa y controlados por 10 pines de Arduino entregando 5 voltios cada uno. Sólo conectamos los pines de Arduino el terminal block CN1 y desde ahí controlamos todo el sistema. Ya sabemos que no tenemos que encender todos los LEDs de una fila sino que alternamos el encendido y el apagado a altas frecuencias para que dé la impresión de que están todos encendidos a la vez pero en realidad es uno solo.

Vamos a necesitar 10 transistores, 5 NPN y 5 PNP. Para el control de LEDs se puede usar el clásico 2n2222 y cualquier otro PNP, puede ser el 2N2905 o el 2N2907.

Pero, yo he mencionado que se pueden encender 125 LEDs con sólo 15 pines de Arduino. ¿Cómo es esto posible?.

Multiplexado de 125 LEDs con 15 pines de Arduino

Tenemos dos formas de hacerlo, ya sea con 5 transistores NPN o con 5 PNP.

Sin título-3

 

Ahora tenemos 3 transistores. Yo prefiero el diagrama donde se agrega un NPN extra. Cuando tenemos 125 LEDs podemos pensar en un cubo de LEDs de 5x5x5.

multiplexado de leds

Los tres transistores representan las 3 coordenadas X, Y y Z. Podemos hablar de filas, columnas y capas. Nuestro diagrama para un LED individual sería:

multiplexado de leds

Aparte de estos 5 transistores tenemos que agregar 5 más por cada capa que tengamos. Por ejemplo, para un 5x5x5 necesitaremos 25 transistores NPN para las filas, 5 para las columnas y 5 para las capas. A continuación les mostraré una simulación con 2 capas para que se aprecie cómo sería el funcionamiento de este circuito.

Para activar un determinado LED encendemos una fila, una columna y una capa. Una vez más necesitaremos de multiplexado en alta frecuencia para encender varios LEDs simultáneamente y lograr el efecto donde parece como si todos están encendidos.

Estas son las principales técnicas que se utilizan para el encendido de un gran volumen de LEDs con los pocos puertos que tiene el Arduino. Igual se puede utilizar con otros tipos de dispositivos, como matrices de sensores y cosas así pero todo requiere de la habilidad del diseñador de determinado sistema.

Esta no ha pretendido ser una guía sobre la construcción de un cubo de LEDs, sino una explicación ilustrativa del multiplexado de LEDs. Kiara Navarro ya ha escrito algo sobre cubos de LEDs:

Yo nunca he hecho uno porque la verdad no tengo tiempo para construirlo pero con lo que les he presentado hoy es suficiente para que ustedes comprendan como es posible controlar toda esa cantidad de luces con un pequeño Arduino Uno o algún otro modelo que no posee la cantidad de puertos que el Mega o el Due tienen.

Aquí hay una demostración del efecto de la frecuencia sobre nuestra vista:

Conclusión

En resumen, el multiplexado de LEDs emerge como una técnica esencial en el mundo de la electrónica, especialmente cuando trabajamos con placas como el Arduino. Nos permite superar las limitaciones inherentes en el número de puertos disponibles, facilitando el control de un gran volumen de LEDs con relativamente pocos pines. Al aplicar esta técnica, podemos realizar proyectos ambiciosos como matrices de LEDs, cubos de LEDs y otros sistemas de iluminación complejos, todo ello manteniendo la eficiencia y efectividad del diseño.

Este artículo no solo resalta la importancia del multiplexado para el manejo de grandes cantidades de LEDs, sino que también ilustra cómo las limitaciones percibidas de hardware como el Arduino pueden ser superadas con ingenio y conocimiento técnico. A través de ejemplos prácticos y teóricos, hemos visto que la clave para el éxito en estos proyectos radica en una comprensión profunda de la electrónica y la creatividad en el diseño de circuitos.

Espero que este artículo haya sido ilustrativo y útil para aquellos interesados en explorar las posibilidades que ofrece el multiplexado de LEDs con Arduino. Recuerden, la innovación en electrónica a menudo comienza con el desafío de superar las limitaciones de nuestro hardware, y el multiplexado es un ejemplo perfecto de cómo se puede lograr esto.