Saturday, June 25, 2011

Dual 9-Segment LED Display Module with Points

Dual 9-Segment LED Display Module
With Points
By @SparkDustJoe
Open Hardware, No trademark or patents

I’m not great with microcontrollers and surface mount components, so I’m putting out this spec document and hoping someone runs with it.
What I’m looking for is a module with 2 digits, capable of displaying some simple English or Latin alphanumeric characters, and a few special characters (think degree symbol, apostrophe, +/-, etc.).  The module also includes 4 dots next to each digit (to the right) for decimals, colons, am/pm indicators, etc.
This module will have either traditional serial (9600/8N1) or SPI serial inputs with cascade capability, and the possibility of being addressable.  
The diagram at the top is a simplified version of what I’m looking for.  The actual individual digit height should be closer to 3”-5” (read, three to five INCHES) high with individual surface-mount LED’s grouped together to make up the segments.  For easy mounting behind glass or acrylic, the components should be on the opposite side as the LED’s, and with the possible need for a MAX7219 (or equivalent) chip along-side the microprocessor, the board will be have to be double-sided.  The segments and points should be close enough to the left and right sides to allow for easy stacking side-by-side for longer displays (think clocks, scoreboards, etc.).  Mounting holes at the top and bottom are acceptable and preferred.  If the usual slant or angle found in most LED/LCD displays push the dimensions outside the realm of possible, then the digits and points should simply be vertical.
The actual data input should be easy and intuitive for the end-user to allow for quick development.  The schema for commands should allow for direct segment control or simple alphanumeric input.  The simplest form would be “AcVV”, where A is an address between 0 and F (up to 16 stacked modules allowed),  c is the command type, and VV would be the values of the left and right digits OR the middle and right sets of points respectively.  In the case of the points, they are turned on or off like flags in a 4-bit number, 0 being all off, F being all on.  For direct segment control, the command would look more like “AsXXXYYY”, as that requires a larger input to accommodate all the bits.  Any invalid or malformed command is simply dropped.

Commands (always lower case):
a = ASCII input (not every character can be displayed in 9 segments, upper and lower case are treated as the same)
d = Digit input (0-9, A-F, upper and lower case are treated as the same)
p = Points (binary flags for each of the 8 points).
s = Segment (raw binary control of the 18 segments)
e = Erase (no other input, just blanks all segments and points, and removes them from memory, the module is still considered "awake")
b = Blank (no other input, just blanks all segments and points, but leaves them in memory until a wake command is received.  Essentially puts module to "sleep".  All future commands will still affect memory, but they will not be displayed)
w = Wake (display current memory to the segments and points)
; = separator, more than one command on a line allowed when separated


“FaWY” would set module 15’s digits to the characters W and Y.  

“4e” would blank the digits and points of module 4

“3pF0” would turn all the points in module 3 in the middle ON and on the right side OFF.

“0d 9;0p06;1d45;1p08” would set the digits on module 0 to blank and 9, and set the points in the middle OFF, and the middle two right-most points ON, and the digits on module 1 to 4 and 5, with the middle points OFF, and the top right-most point ON.  This displays [ 9:45’] (for a clock, 9:45 PM).

For actual segment control, each segment is a bit in a 9-bit number as follows (refer to the diagram at the top):

A=1 (lsb), B=2, C=4, D=8, E=16, F=32, G=64, H=128, I=256 (msb)

Add up the numbers and pass hexadecimal to command “AsXXXYYY” (x = left, y = right). 

This example is open to tweaks for performance in whatever platform it is developed, but any command set used must be fully documented.

To achieve the addressable access, perhaps a 16 position hex encoder or dip switches can be used in a manner that the on-board micro controller reads at boot, but then doesn’t bother to check it again until next boot.
The serial inputs can be copied across the board to the opposite side, so that all modules receive the same data at the same time when connected in a string.  If this will be the problem with the SPI bus, then the micro controller can echo any commands it received to the next module.  This may introduce unwanted propagation delay.  Perhaps a trace on the board can be soldered or unsoldered to select a slower, standard clock rate (or baud), or a much higher but still standard clock rate (or baud).

If the performance allows, and if the costs of the final board are tolerable, this spec can be expanded to 4 digits, with corresponding points.  The inputs to all the commands would be doubled.

I hope this spec is straight-forward enough to get some creative juices flowing.   I look forward to seeing what anyone builds from this, and I am releasing this design spec as OPEN HARDWARE, NO TRADEMARK, NO PATENTS.

I own one of these little guys, but it's on the small side, not able to be stacked, doesn't allow colons AND decimal points, just doesn't cut it.  Don't get me wrong, it works great, but... it's limited. 

No comments:

Post a Comment