En este artículo vamos a ver una técnica que nos puede resolver, en muchas ocasiones, la escasez de puertos de entrada y salida (I/O). Esta técnica se llama Charlieplexing y nos permite por ejemplo controlar una matriz de LEDs con Arduino. Ahora veremos un poco cuales son sus ventajas y como no, sus inconvenientes.
Indice de contenidos
- 1 Técnica Charlieplexing para controlar matriz de LEDs
- 2 Multiplexación ¿qué es?
- 3 Matriz de LEDs con Arduino
- 4 Cómo funciona un LED de una matriz de LEDs
- 5 Montando el circuito básico con un LED y Arduino
- 6 Montando el circuito de la Matriz de LEDs con Arduino
- 7 Funcionamiento de la matriz de LEDs con Charlieplexing
- 8 Matriz de LEDs, la programación
- 9 Resumen de la técnica Charlieplexing
Técnica Charlieplexing para controlar matriz de LEDs
La técnica del Charlieplexing fue propuesta por Charlie Allen en el año 1995 y permite controlar una matriz de LEDs con muy pocos pines I/O.
Voy a poner un ejemplo, imagínate una matriz de LEDs, donde tienes que controlar que se encienda un único LED a la vez. Si trabajamos con la versión Arduino UNO, esto sería sencillo si solo queremos controlar hasta un máximo de 14 LEDs (o 20 si utilizamos las entradas analógicas).
¿Qué ocurre si tenemos más LEDs? Tenemos dos opciones en este caso, utilizar un chip, un shift register o utilizar la técnica de Charlieplexing.
Multiplexación ¿qué es?
Antes de continuar veamos un poco que es la multiplexación. Multiplexar consiste en compartir un mismo canal para el envío de datos a diferentes receptores. Un ejemplo lo encontramos en la telefonía, ya sea móvil o fija.
En este caso no tenemos un canal para cada número de teléfono, esto sería prácticamente inviable, existe un único canal donde se transmiten todos los datos desde los emisores hasta los receptores por lo tanto, los emisores necesitan multiplexar la información y los receptores necesitan demultiplexar dicha información para redirigir al receptor al que van dirigidos los datos.
Te acuerdas de la típica operadora que aparece en las películas antiguas, la telefonista cambia los cables para pasar una llamada al receptor. Estas operadoras hacían la función de un demultiplexor. Por supuesto en la actualidad la tecnología nos permite hacer esto de manera automática.

Este tipo de multiplexación se hace en telecomunicaciones pero, en el ejemplo que estamos tratando en este artículo también se puede aplicar un tipo de multiplexación parecido.
Matriz de LEDs con Arduino
Pongámonos en situación, tenemos una matriz de LEDs que no es más que un montón de LEDs que queremos controlar. El objetivo es poder decir que LED se enciende usando el mínimo de entradas posibles. Para este cometido no vamos a inventar la rueda, ya hubo una mente privilegiada que resolvió el problema y del cual ya te he hablado, Charlie Allen.
En los pines digitales de Arduino, solo podemos tener dos estados alto (HIGH) o bajo (LOW). La técnica del Charlieplexing consiste en utilizar un tercer estado que nos permita seleccionar un LED concreto. Esto lo podemos hacer gracias a la naturaleza de los LEDs.
LED, es el acrónimo de Light-Emitting Diode (diodo emisor de luz) y por lo tanto se comporta como lo que es, un diodo.
Cómo funciona un LED de una matriz de LEDs
Veamos un poco más en profundidad como funciona un LED. La corriente siempre va en un sentido, de mayor potencial a menor potencial, eso quiere decir que si conectamos nuestro circuito a 5V y el otro extremo lo conectamos a tierra 0V, la corriente fluirá desde los 5V a los 0V. Si en nuestro circuito introducimos un LED deberemos llevar cuidado como lo insertamos y ahora veremos porqué.
Si miramos un LED detenidamente, podemos ver dos patillas. Una de ellas es más larga que la otra, a esta patilla se le llama ánodo, irá conectada a la fuente de tensión, y a la patilla más corta cátodo, irá conectada a tierra.
Un diodo es un componente eléctrico que permite la circulación de corriente a través de el en un solo sentido. Por lo tanto un LED se comportará igual, debemos saber en que sentido nos va a permitir que circule la corriente para que así pueda emitir luz. El sentido es de ánodo a cátodo como ya he comentado. Vamos a verlo con dos gráficos que ilustran cada situación.


Puedes hacer el experimento en tu casa con tu Arduino y comprobar que si lo pones al revés, no permitirá circular la corriente. Antes de hacer el experimento deja que te explique algo muy práctico y que te introduzca en la electrónica básica con la famosa Ley de Ohm y las Leyes de Kirchhoff.
Analizando la información del datasheet de un LED
Esto ya lo vimos en el artículo Introducción a la electrónica. Si miras las características técnicas de un LED común, como los que tienes en tu kit de Arduino, encontrarás los siguientes datos que pueden ser muy útiles y válidos para el 99% de los LEDs que se incluyen en los kits de Arduino.
Vamos a obtener la siguiente información, te lo pongo en inglés ya que será complicado que encuentres alguna hoja técnica en español y es mejor que te acostumbres a su significado en inglés.
Forward Voltage: entre 1.8 y 2.2
El Foward Voltaje, dependerá de cada LED y de cada fabricante, es el voltaje que va a consumir el LED cuando está encendido. Nos indica los valores recomendados para su buen funcionamiento.
Si conectamos un LED a una fuente de alimentación que nos de 5V, esto quiere decir que nuestro LED está usando 5V para iluminar, estaría fuera del rango que nos aconseja el Forward Voltage de las características técnicas. Según la Ley del Voltaje de Kirchhoff, «En un circuito los voltajes se deben equilibrar, la cantidad generada debe ser igual a la cantidad consumida», por lo tanto nuestro LED debe consumir los 5V que nos está generando nuestra placa de Arduino, por ejemplo.
Calculando la resistencia de un LED
Así que debemos hacer algo con esos 5V para que cuando llegue al LED ya no sean 5V, que sea entre los 1.8V y los 2.2V recomendados por el Forward Voltage de la hoja de características técnicas. En este momento entra en juego la Ley de Ohm. Esta ley nos dice que
(1)
Donde V es el voltaje, R la resistencia e I la intensidad o corriente. Las variantes para calcular la resistencia y la intensidad son
(2)
(3)
Lo que nos interesa ahora mismo es saber que resistencia tenemos que poner para que consuma el exceso de voltaje, así podremos trabajar con el recomendado. Por lo tanto nos vamos a centrar en la fórmula (2) . Solo nos faltaría saber que intensidad nos está dando la placa de Arduino. Este dato lo podemos ver en las características técnicas de nuestro producto, en nuestro caso el modelo Arduino UNO rev3.

Como nuestro LED va a estar conectado a un pin digital, si miramos en las características técnicas del Arduino UNO, la corriente (DC Current per I/O Pin) será de 20mA (0.02 Amperios). Este valor es el recomendado pero hay que ser conscientes de que estos pines nos pueden suministrar hasta 40mA (0.04 Amperios).
Por lo tanto, debemos calcular el voltaje que queremos que esa resistencia use, si tenemos 5V y nuestro LED va a consumir de media 2V, la resistencia debería consumir los 3V que nos sobran para que se cumpla la Ley del Voltaje de Kirchhoff. Con los datos que tenemos ya podemos aplicar la Ley de Ohm y obtener el valor de la resistencia.
Montando el circuito básico con un LED y Arduino
Con una resistencia de 150Ω estaríamos dentro del margen recomendado por el Forward Voltage de la hoja técnica. Si queremos que nuestro LED brille más, podemos cambiar el valor de esta resistencia, podríamos por ejemplo llegar hasta 3V (es lo máximo recomendado para los LEDs), lo que implica que la resistencia deberá usar menos voltaje y por lo tanto será más pequeña. Debemos ser conscientes que saliendo de los márgenes indicados podemos dañar el LED o acortar su vida útil.
Teniendo claro esto podemos seguir avanzando en nuestro objetivo, utilizar Charlieplexing para poder manejar un volumen grande de LEDs con el mínimo de entradas. Como ya había dicho, vamos a utilizar los pines digitales y vamos a incorporar un nuevo estado que nos permita multiplexar, ahora nuestros pines van a poder estar en 3 estados HIGH, LOW e INPUT.
Para poder utilizar el estado INPUT de un pin digital, hay que entender el funcionamiento de dichos pines. Un pin digital de Arduino puede estar en modo salida (OUTPUT) lo que indica que podemos poner en estado alto (HIGH), que suministra 5V, o en estado bajo (LOW), que suministra 0V.
Pero también puede estar en modo entrada (INPUT) lo que indica que podrá leer en que estado está el elemento conectado, alto (HIGH) o bajo (LOW). Esto es importante ya que dependiendo del modo (OUTPUT o INPUT) la corriente fluirá en un sentido u otro. Vamos a verlo con un gráfico.

Cuando ponemos un pin en modo INPUT, este se encuentra en estado de alta impedancia. La impedancia es una medida de resistencia en circuitos de corriente alterna, en circuitos de corriente continua podemos decir que la impedancia es la resistencia de ese circuito. Cuando hablamos de alta impedancia podemos decir que es de alta resistencia. Para que te hagas una idea, la entrada digital que esté en modo INPUT se comporta como una resistencia de más o menos . Si ahora aplicas la Ley de Ohm para calcular la intensidad que circula por esta entrada, podrás comprobar que es prácticamente despreciable, es como tener un cable desconectado, no circula intensidad.
Montando el circuito de la Matriz de LEDs con Arduino
Con todos estos conceptos claros podemos preparar el circuito. Vamos a trabajar con 6 LEDs y los controlaremos solo con 3 pines digitales. El esquema del circuito es el siguiente.

Como ves tenemos 6 LEDs y 3 pines digitales. Veamos como funcionaría este circuito trabajando a través de la programación, estableciendo los modos y estados correctos para poder encender un único LED a la vez. En este caso queremos encender el LED 1.
- Lo primero es que el PIN 3 debería estar en modo OUTPUT y en un estado HIGH.
- El PIN 2 lo pondremos en modo OUTPUT y en un estado LOW.
¿Qué pasa con el PIN 4? en principio lo tendríamos todo correcto ya que por defecto, el modo de los pines es INPUT. Al estar en este modo el PIN 4, se produce una alta impedancia, una enorme resistencia que impide que la corriente circule por esa rama y esto anula todos los componentes que se encuentren en su camino sin que, en este caso, el LED 4 se ilumine. Si ponemos el PIN 4 a en modo OUTPUT con estado LOW, podrás comprobar como en este caso el LED 4 se ilumina.
El resto de LEDs no se van a iluminar debido a que o el anodo está conectado a un estado LOW (LED 6 y 2) o el cátodo está conectado a un nivel alto y no permite circular la corriente en ese sentido (LED 3 Y 2).
Para que puedas probar y seguir la explicación, te voy a dejar el esquema de conexionado con la placa de Arduino, en cuanto lo tengas montado podemos seguir con la explicación.

Antes de entrar en la programación, lleva cuidado en conectar los cables, si hay una mala conexión no funcionará esta técnica. También ten en cuenta el valor de las resistencias, para este ejemplo he utilizado 3 de 330Ω.
Funcionamiento de la matriz de LEDs con Charlieplexing
Entremos entonces en materia de programación. Lo primero es hacernos una tabla de estados que deben estar los pines para encender los 6 LEDs.
LED | PIN 2 | PIN 3 | PIN 4 |
---|---|---|---|
1 | LOW | HIGH | INPUT |
2 | HIGH | LOW | INPUT |
3 | INPUT | LOW | HIGH |
4 | INPUT | HIGH | LOW |
5 | LOW | INPUT | HIGH |
6 | HIGH | INPUT | LOW |
Matriz de LEDs, la programación
De esta tabla podemos sacar la lógica para poder encender un único LED de los 6. Te dejo aquí el código y ahora lo veremos más detenidamente.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
/* Creado: Luis del Valle (ldelvalleh@programarfacil.com) https://programarfacil.com Ejemplo de Charlieplexing, luces del coche fantástico */ // Definimos los pines a utilizar #define PIN_A 2 #define PIN_B 3 #define PIN_C 4 void setup() { } void loop() { // Bucle para encender los LEDs de menor a mayor for(int i=1; i<=6; i++) { encenderLed(i); delay(100); } // Bucle para encender los LEDs de mayor a menor eliminando lo extremos for(int i=5; i>1; i--) { encenderLed(i); delay(100); } } // Función que pondrá en los estados correctos para encender un LED (HIGH, LOW e INPUT) void ponerEstados(int pinHigh, int pinLow, int pinInput) { pinMode(pinHigh,OUTPUT); digitalWrite(pinHigh,HIGH); pinMode(pinLow,OUTPUT); digitalWrite(pinLow,LOW); pinMode(pinInput,INPUT); } // Esta función se va a encargar de aplicar la lógica dependiendo del LED que queramos encender void encenderLed(int led_num) { switch(led_num) { case 1: ponerEstados(PIN_B,PIN_A,PIN_C); break; case 2: ponerEstados(PIN_A,PIN_B,PIN_C); break; case 3: ponerEstados(PIN_C,PIN_B,PIN_A); break; case 4: ponerEstados(PIN_B,PIN_C,PIN_A); break; case 5: ponerEstados(PIN_C,PIN_A,PIN_B); break; case 6: ponerEstados(PIN_A,PIN_C,PIN_B); break; } } |
Utilizando técnicas de programación, se puede reducir mucho el código. En este caso sabemos que para encender cualquier LED de nuestra matriz, debemos de tener un PIN en estado HIGH, otro PIN en estado LOW y el último PIN en modo INPUT así que, esto lo podemos sacar a una función donde le digamos el número de pin en cada caso.
Esta función es ponerEstados y admite 3 parámetros, pinHigh (el pin que debemos poner a HIGH), pinLow (el pin que debemos poner a LOW) y pinInput (el pin que debemos poner en modo INPUT). La función encenderLed admite como parámetro el LED que queremos encender y, a través de un switch (no es más que una cadena de if anidados), decidiremos que pines tienen que estar en estado HIGH, LOW o en modo INPUT.
Te dejo a continuación un vídeo del circuito funcionando.
Resumen de la técnica Charlieplexing
Por último te dejo una tabla a continuación de cuantos LEDs podemos controlar dependiendo el número de entradas. La técnica de Charlieplexing nos dice que si tenemos n pins podremos controlar por lo tanto, con 3 pines como en el ejemplo podremos controlar
.
Nº Pins | LEDs Charlieplexing |
---|---|
1 | 0 |
2 | 2 |
3 | 6 |
4 | 12 |
5 | 20 |
6 | 30 |
7 | 42 |
8 | 56 |
9 | 72 |
10 | 90 |
11 | 110 |
12 | 132 |
13 | 156 |
14 | 182 |
Pues esto es todo, espero haber aclaro conceptos sobre electrónica.
Si te interesa este tema, estoy seguro que el articulo Matriz LED con Arduino MAX7219 y MAX7221 te va a gustar.
Cualquier duda la puedes dejar en los comentarios de este artículo, muchas gracias.