# Charlieplexing

## Charlieplexing

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.com/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

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.

## Schematic

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.

## More LEDs

By re-drawing the schematic into a matrix it becomes clearer how to add more LEDs. This example uses five IO pins and can drive 20 individually addressable LEDs. Since only one LED is on at a time the display can have some flicker if too many LEDs are included.

The ATtiny85 with Vusb and the reset pin disabled provides five drive pins (the sixth has a pullup for the Vusb port, so it is not available for charlieplexed IO). The Orion and Andromeda constellation PCBs use this circuit to make a flickering star field effect.

Last update: November 8, 2020