In my day job I write software on a team that is part of a large Redmond software company.
I’ve always been a fan of information radiators, as the information that is most apparent is the information that drives the behavior of team members. On my old team, we had an issue with failing tests, so I was going to build a display that we could put up in the hallway that would display the number of failing tests in LED letters. But I never got around to it.
Recently, I was playing around with a bit of LPD8806 RGB strip – the part of the 32-led strip that was left after I accidentally hooked it up to 19V instead of 5V – and I was struck with an idea. Why not combine an LED display, a short bit of RGB strip, and a whiteboard to come up with a system that can display many different values. Here’s how it will work:
A computer will send data across USB to the display, consisting of:
- The slot number of the data
- The data value for the numeric display
- The RGB color to display on the LED strip
The display will cycle through the slots; the active slot will show its value and the rgb color on the strip at full brightness, while all the other slots will show their colors at reduced brightness.
Hardware & Software
I’m going to build this as an Arduino shield. for the first version, I’m going to build my shield onto a piece of perfboard, but I may do a real version. The LEDs that I’ve chosen are 1” in height (one reason I’m going to build the display rather than just buy it), and I think they’re big enough that my shield is going to have to be bigger than the standard LED footprint.
The RGB strip is easy to drive from the Arduino, and I don’t need a lot of speed, so either the SPI version or the bit-bang version will be fine.
The 7 segment displays are a bit harder. The simplest thing is to buy a MAX7219 and drive it over SPI, but at $9 it’s fairly pricey and it takes up a fair bit of real estate. It’s also a bit too easy for the developer in me, so I instead decided that I’m going to drive the displays myself.
I’ll use 4 of outputs to drive the common terminals of the displays. I’m guessing I’ll put about 6mA per segment of the display, which would give 42mA total, which is just over what you can do with a single avr pin. But… I’m multiplexing, which means that instead of putting 6mA through the segment full-time, I’m going to put 24mA through each segment for 25% of the time. Which means I need to be able to drive around 300mA, which will require a transistor on the common pins of the display. I will also probably hook the commons to the PWM outputs so that I can control the brightness of the displays, though I’ll have to be careful to design the software so the PWM and the multiplexing don’t interfere in weird ways.
The display code will be fairly simple; a timer interrupt to multiplex at perhaps 1 KHz, and on each interrupt, I’ll flip to the next digit. I’ll probably hook up the rest of the updating to run off the timer interrupt.
That puts the code to read and decode the USB commands on the main loop.