Persistence-of-Vision LED Wand

Spell words in mid-air. Eight LEDs on a stick, an Arduino, and your wrist do the rest — physics rendering a virtual display.

Difficulty: Breadboard. Estimated build time: about 45 minutes. Estimated parts cost: about US$5.50. 6-line bill of materials. Compare supplier offers when available. A handheld stick of eight LEDs that, when waved back and forth, paints text or a small bitmap in the air.

Wire eight LEDs to eight GPIOs

Solder eight LEDs in a straight line (about 5 mm spacing) on a strip of perfboard or a slim breadboard — this is your wand. Tie all anodes through individual 330 ohm current-limit resistors back to the MCU pins (D2..D9 on an Arduino Nano is convenient because it's all on PORTD). Tie all cathodes together to GND. Test by writing a sketch that toggles each pin in turn — you should see a chase pattern down the strip when held still.

Encode a font and paint columns

Store each character as a 5-byte array: each byte holds 8 bits, one per LED. The letter 'H' is {0xFF, 0x18, 0x18, 0x18, 0xFF} — two vertical bars connected by a horizontal mid-line. In loop(), iterate through the columns of your message string; for each column, write the byte to D2..D9 (using bitWrite() or direct PORTD = (PORTD & 0x03) | (col << 2) for speed), delayMicroseconds(2000), then write zero to all eight pins for 500 us (this is the inter-column gap that prevents columns from smearing into each other).

Wave and tune the timing

Power the wand from a 9 V battery + clip into VIN, or from a small Li-ion. Hold it vertically and sweep left-right at a steady pace — your message floats in space, dim but clear. If letters squish or stretch, adjust the column delay: longer = wider letters but you need a slower sweep. For self-triggering, glue a tilt switch to one end and start the column loop only on motion-reversal; the message now anchors to one position in space and looks rock-solid. Add a second row of eight LEDs offset by half a column-width for 'antialiased' POV — once you see it, you'll be sold.