Two Tower Display


It would be nice to have a display that can represent different states of a home. I decided to create a device consisting of regular RGB LEDs, but orientated in two, 2×8 matrix, and mounted in two towers.

As an extra possibility to encode information, the towers are also able to rotate using servo motors. They are mounted to the display in this build, but not used. You will need an external power source to power them.

Feel free to ask questions about this build in the comment field below!

The display will be able to show 7 different colors per RGB LED: red, blue, green, yellow, magenta, cyan and white. As shown in figure 1.

Figure 1: The display consists of two towers. Example colors: the left tower displays all the possible colors
Table 1: Components used
Component Quantity Link (Ebay affiliate link)
Arduino Nano 3.0 (ATmega328) 1 Nano V3.0 ATmega328P CH340G 5V 16M Micro-controller Arduino
Bluetooth RF transceiver HC-06 1 HC-06 Wireless Bluetooth Transeiver RF Module Serial+4p Port line
Basic Servo TG9e (optional) 2 Turnigy TG9e Micro Servo
MAX7219 LED Driver 2 MAXIM MAX7219CNG DIP-24 LED Display Driver IC
RGB LEDS – common cathode 32 5mm 4pin RGB Tri-Color DIFFUSED Common Cathode
Resistor 10kΩ 2
Ceramic Capacitor 0.1µF 2

Hooking up the Arduino

The Arduino will listen to the Bluetooth adapter, and control two MAX7219 LED drivers. This will require 6 GPIOS of the Arduino. Connect according to the list below and figure 2 and figure 3.

MAX7219 chips for left tower

  • pin 12 to DataIn on CHIP
  • pin 11 to CLK on CHIP
  • pin 10 to LOAD on CHIP

MAX7219 chip for right tower

  • pin 7 to DataIn on CHIP
  • pin 6 to CLK on CHIP
  • pin 5 to LOAD on CHIP

Bluetooth adapter HC-06

  • Pin 2 to TX on HC-06
  • Pin 4 to RX on HC-06
Figure 2: Connections to the Arduino
Figure 3: MAX7219 LED driver IC

Constructing the LED matrices

The set up for a matrix is 2 RGB LEDs per row, where every tower contains 8 rows. So a 2×8 LED matrix. However, since we are using RGB LEDs this will require 3 inputs per LED. A RGB LED has 4 pins: red, GND, green and blue (common cathode).

A MAX7219 driver can control up to 64 individual LEDs using multiplexing. In short multiplexing for MAX IC means that it will only light a single row of interconnected GNDs at a time, and when the row is turned on, also switch to the correct ouput on the 8 segments pins (SEG DP to SEG A). Figure 5 shows how the rows and segments should be connected to a RGB-matrix for one tower.

The trick to multiplexing a display is to turn rows off and on faster than what a human can perceive. This is easy for a microcontroller, considering that humans are happy with just 30 fps(frames per second). Figure 4 illustrates how to connect the left tower to the MAX7219 IC and the IC to the arduino

Figure 4: Example how LEFT LED matrix is connected to a MAX7219.
Figure 5: LED pin connection to MAX7219 IC. LEFT to RIGHT and TOP to Bottom, tower viewed from the front
Figure 6: Example left tower is connected to arduino

The Code

I decided to make the Arduino code for this project as dumb as possible. Meaning that no fancy functionality like scheduling different animation and triggering them over bluetooth is possible. Instead something from a computer or phone will feed it display data over bluetooth.

The Arduino will simply listen on a serial port, to which the Bluetooth adapter is connected, and trigger when the char '*' is received. Then it will keep collecting bytes(maximum 16 bytes) until it receives a 'L' or 'R' which will mark the end of the data package and what tower to update.

Here is a example of a code that only powers the tower displays.

To run this code you will need to download a library called LedControl. This is easy, just navigate to Sketch->Include library->Manage libraries. And simply search for the lib there

Finally a python script that connects to the display and runs som example color schemas. This script has succesfully been run on both a raspberry 3 and a laptop running Ubuntu. Note that you have to pair with the HC-06, before using this script. Also you will need to update the bluetooth address of the HC-06, it will differ from mine in the below script(bd_address)

The build and finished display

The display in action

Some pictures of the finished display.

Figure 7: Front of display
Figure 8: Back of display
Figure 9: The nano with som additional capacitors(not required)
Figure 10: Back of a tower. MAX7219 mounted below LED matrix