From Trammell Hudson's Projects


Charlieplexing wearable circuits

The Adafruit GEMA has three available digital I/O pins, but thanks to the technique of Charlieplexing you can drive up to six LEDs with those pins, one at a time. In general, charlieplexing allows n tri-state pins to control n^2-n LEDs. My example Arduino sketch in github/charlieplex generates 8-bit PWM for each of the six LEDs, although it does require the full CPU to do it. Here is a short video of it in action, showing the smooth fades on and off.

LED sequins

LED sequin

My sewable sequins are made from 0805 surface mount LEDs and small metal beads from a local shop. Becky Stern of Adafruit has a great tutorial on making LED sequins -- I used smaller LEDs than Becky, so I had a harder time putting them together and had to build a small jig with a piece of wire to support the bead while soldering it under a microscope. If you don't need the small size, Adafruit's premade LED sequins are a much easier way to add them to your project.


Charlieplexing schematic.png

The six LEDs can be laid out in a circle with no wires crossing, which makes it quite useful as a sewable/wearable electronics project. The truth table looks something like this -- Z means High impedance (also known as Hi-Z) and all other states are forbidden since they will result in multiple LEDs being illuminated simultaneously:

D0 D1 D2 -> LED
Z Z Z (None)
0 1 Z 0
1 0 Z 1
0 Z 1 2
1 Z 0 3
Z 0 1 4
Z 1 0 5

DDRB is used to manipulate the Hi-Z state with a single instruction and PORTB is used to source current on one pin (1) and one other pin to sink current (0). The values for which pins map to which LEDs are stored an array, although a switch() statement could also be used since there are so few states. If four output pins were used to drive 12 LEDs, the lookup table definitely wins for code compactness.