Door Message v2

Being bored this summer, I decided to make a better version of the door message circuit. It is an improvement in that it has some RAM in which it stores the message. This means that you don't have to keep writing to it for it to display the message, so you don't necessarily need a dedicated computer. Also, you can write slower (or more slowly, if you prefer), making it less prone to flickering and general intermittent brokenness. At least that's the idea.

The disadvantage is that it uses all four control lines and all eight data lines of a standard parallel port, which means more wires than the "bit-banging" serial interface the other sign had. Perhaps I'll find a way to make the interface serial, although it's slightly harder because of the control lines.

Here's the schematic, in PDF, PostScript (gzipped), or gschem format.

The circuit uses a 61256 SRAM to store the message. This is a 32x8 chip, but since I didn't have enough counters only 4KB of that is addressable. Each 14-segment display pattern uses two bytes, so you can have up to 2048 characters in a message.

The circuit has two clocks. One goes at about half a kilohertz and clocks one of the three counters; this counter determines the least significant 4 bits of the address. The other two counters are clocked at about a hertz and determine the high 8 bits of the address. The fast clock also controls the 4017 that does the LED multiplexing.

The result is that the display shows the first 8 characters of the message for a second, then the next "screenful," and so on.

You can also make it display a scrolling message, although you will be limited to 256 characters. If you want to scroll the message "HELLO WORLD", you would write

       H
      HE
     HEL
    HELL
   HELLO
  HELLO 
 HELLO W
HELLO WO
ELLO WOR
LLO WORL
LO WORLD
O WORLD 
 WORLD  
WORLD   
ORLD    
RLD     
LD      
D     
          

I used an LM339 for the slow clock where an 555 would have been more appropriate simply because that's what I had. The circuit is straight from the application notes in the LM339 datasheet.

The circuit itself doesn't translate ASCII codes into segment patterns; that is done in software. It would be nifty, though, and would just require a 128x8 (or, even better, 128x16) ROM and some hopefully simple modifications. There are 14 segments, which I split into two groups of seven. Even addresses contain segments h through p (there is no i or o), and odd addresses are for segments a through g; a couple of 74541 tri-state buffers (you could also use '244s) handle this. The high bit is usually 1; a segment pattern with its high bit set to zero resets the counters. Thus, a screen containing a segment pattern with its high bit set to zero marks the end of the message.

The low-address counter also gets reset whenever the 4017 resets itself, to keep the address in sync with the LED muxing.

You write to the display by connecting it to a PC parallel port. To enable writes, bring the Auto Line Feed line (pin 14) low. This turns off output enable on the RAM. It also disconnects the clocks from the counters and cascades the low-address and high-address counters. Also set Select In, Strobe, and Init high.

Then reset the address counters by bringing the Select In line low, then high.

To write, put the data on the parallel port's data lines and bring the Strobe line (pin 1) low, then high again.

To select the next address, set Init (pin 16, I think) low, then high again.

When you're done writing, reset the counters again and set Auto Line Feed high.

You'll probably want to insert a delay between writes to the parallel port. A delay of a millisecond seemed to be about the fastest I could go on my pessimally breadboarded version. (Because of my haphazard design process, the breadboard ended up with really long wires going back and forth all over it, which is bad for stuff.)

Preliminary Python code to write a message to the sign is here. It's just a quick hack, but it seems to work OK for me. It uses the PyParallel module, which claims to work under Windows and Linux. (Under Linux it uses the ppdev kernel module.)

Creative Commons License All content licensed under a Creative Commons Attribution-ShareAlike 3.0 United States License, unless otherwise noted.
Hosted by UGCS