Tessellation Row

This was an experiment with making a hexagonal pixel display. Compared to square pixels, hexagonal pixels render diagonals, diamonds and circles more accurately. Conversely, they are less capable at rendering squares, rectangles, vertical and horizontal lines.


The display has 97 pixels and is approximately the size of an A3 sheet of paper. The richness of colour, brightness and responsiveness of the display are quite incredible. An Arduino coupled to a Raspberry Pi 3 feed the LEDs with RGB data. It would be neat to scale up the display to cover an entire wall.


Ping-Pong balls are the ultimate economical, readily available diffuser. In addition to helping spread the light evenly across each hexagon, the spherical shape helps each hexagon keep the right shape. The hexagons were sized such that their inner circumference would accommodate a table tennis ball perfectly. The entire honeycomb structure was created with cardboard and PVA glue. It is remarkably strong. The balls were cut neatly into half spheres using a hotwire cutter, so they form a little cap over the LEDs.

The honeycomb structure sits on a board made of 6mm MDF. The LEDs protrude through 97 holes drilled in the board. They are P9823/PL9823 8mm LEDs. These come in a conventional through-hole LED package with four leads — +5V, GND, data in and data out. Bus bars made of copper tape run along the back of the board to distribute power to each LED. A 100nF decoupling capacitor is mounted close to each LED and a few 680uF electrolytic capacitors further stabilise the voltage rails. A small length of wire-wrap wire connects each LED’s data in to the output of the previous LED. At the end of each row, the connections snake around in a L-R-L-R-L-R-L style pattern. The wires are held captive by generous amounts of hot melt glue. Between the green caps, red copper strips, and the stringy glue the appearance is reminiscent of a pizza.

Only three wires connect to the board. The first 2 heavy duty wires carry +5V and GND. Thicker wires mean less voltage drop at high currents, necessary since worst case the panel will draw 3 (R-G-B channels) x 20mA (per channel) x 97 LEDs = 5.82 amps! The third wire carries the 800kpbs data signal. The cable is terminated with a chunky metal-plastic plug that connects to the control unit.

Control Unit

The control unit consists of a +5V 10amp power supply module, fuses, a mains switch, a Raspberry Pi 3, an Arduino, and a socket to make the connection from the display. The Arduino converts an asynchronous serial bit stream from the Raspberry Pi to the serial format used by the LEDs. This has quite precise (and quite fast) timing requirements, so it makes sense to hand this task over to an Arduino. The Raspberry Pi, meanwhile, makes the control unit incredibly flexible. It has enough power to generate pleasant effects on the display, but its ethernet and wi-fi connections allow it to display patterns generated remotely.

On boot, the Raspberry Pi starts listening for ArtNet DMX512 over UDP packets which are interpreted and sent over hardware serial to the Arduino to be streamed out to the LEDs.

The front panel of the control unit has a status LED and a shutdown button. The LED is hooked to the Raspberry Pi, taking the place of its on board activity LED. When the shutdown button is pressed for two seconds or more the Raspberry Pi shuts down cleanly.