1979 "Heathkit" D&D Digital Dice Tower

Revision 2 of the resto-Mod Dungeons and Dragons Digital Dice Tower based on a 1975 Bell & Howell IMD-202 Digital Multi-meter

Public Chat
Similar projects worth following
This is an updated build of the original 1978 "Heatkit" D&D Digital Dice Tower. It's based on the same Bell & Howell IMD-202 multi-meter. This revision will attempt to simplify the build procedure, update some of the hardware, and add a few new features like sound/voice.

This project implements the function of a Dungeons and Dragons dice tower and dice using a retro digital multimeter with nixie tube display. The user selects a number of dice using the two digit thumb-wheel switches, then selects the dice type (2 sided, 4 sided, 6 sided, 8 sided, 10 sided, 12 sided, 20 sided, or 100 sided) using a rotary switch, and finally presses the roll button to get a result. The device applies the GNU AVR lib C pseudo random rand() function, calculates the result, and displays it on the nixie tube display. The user can then re-roll by pressing the roll button again, or change the count and/or dice and roll a different set of die. It's that simple to use.

This is a revision of the previous 1978 "Heathkit" D&D Digital Dice Tower project. In this revision, I'll attempt to simplify the build process, add some features, and subsequently update the list of components and source code.

The content I'll be adding here assumes you're at least familiar with the previous project. So if you haven't already, check out the link in the paragraph above.

Just like the original project, this is based on a 1975 Bell & Howell Digital Mulitmeter.

When I was thinking up the concept for the original project, several of my friends expressed interest. So as I often do when purchasing parts for a project I bought extras of everything so I would have plenty of spares and a couple extra to build for friends. Given the year it took to find time to work on this project, I've managed to collect enough parts to build 9-10 of these. So, I am motivated to figure out how to make these easier to build, add new features, and keep the original period look and feel. Besides if I am gonna build 5-10 of these, I'm definitely going to riff on this a little with each build. I'm not a machine that would happily stamp out 10 of these exactly like the original one.

So what are these new features you speak of?

  • Simplified Case Modifications - I'm ditching the riveted faceplate for the new switches and button and reusing the existing holes and cutting/grinding the square hole for the thumbwheel switch directly in the case. The three holes for the banana jacks will be re-purposed for a panel mount LED, the roll button, and an access point to let the glorious new sounds out of the case. This will save a couple steps in the build process.
  • New Controller Board Layout - The controller board will be soldered up to a breadboard style protoboard and connected to the original PCB through a separate board connected by a 10 pin IDC flat cable.
  • New Thumbwheel Switch w/Stops - I'm trying a new 2 digit thumbwheel switch that has stops so I can configure a reasonable range of dice count the user can select.
  • Sound and possibly voice - Adding a speaker, PCM sound functionality to the software, and possibly voice.
  • New Microcontroller with more Flash memory - Need somewhere to store those PCM sound images.
  • Result Status LED - This LED will light solid when the displayed value on the nixies is the result of the current dice count and type settings. If the settings are changed, the LED will pulse until a new roll is initiated.
  • Additional I/O Board - The new status LED and speaker will need a board to serve as a mount point. I'll need to figure out how to mount this to the faceplate.
  • Different Faceplate Graphics - I'm wanting to play with different types of faceplate graphics. I don't want two of these dice towers to look exactly the same. For this next iteration, I'm going with classic plastic embossed labels to give it that 70's home built look. In another iteration, I'd like to try a toner transfer process. I've had poor luck with that in past and I like to figure out how to make that work better. Going to try an acetone soak with pressure for the transfer.

With that, it's time to get started on this new spin. Look for updates soon.


Linux command line application to convert media/sound files into C source PCM data to be linked directly with embedded applications

C Source File - 5.93 kB - 02/15/2020 at 06:01



Sound samples to be linked with the dice tower application

h - 217.72 kB - 02/15/2020 at 06:01



Program source code for the "Heathkit 1979 Digital Dice Tower. Developed with Atmel Studio 7 for the ATmega 328.

C Source File - 16.15 kB - 02/15/2020 at 06:01


  • 1 × Bell & Howell IMD-202-2 multi-meter Provides the case, power supply, 7441 decoders/drivers, and nixie tube displays
  • 1 × Microchip ATmega328 AVR microcontroller 28 pin DIP, 32K flash, 2K ram
  • 1 × 74HC148 8 line to 3 line priority encoder 14 pin DIP
  • 1 × Small panel mount push button Momentary contact type
  • 1 × Rocker switch 10A 120V AC type

View all 19 components

  • It speaks...

    John Anderson02/15/2020 at 05:20 0 comments

    I decided to document how I got this little processor to talk while it's still kinda fresh in my mind.

    First off, how do you get sound out of a ATmega328? The short answer is you use the PWM peripheral to output a signal (wave) that drives a speaker. In fact, the outputs on the AVRs are stout enough to drive a tiny speaker directly. I think Sparkfun and/or Adafruit sell the little speakers. The sound is a little quiet, but it's pretty good. In this latest build of the dice tower, I added a simple LM386 op amp circuit to drive a slightly bigger 8 ohm speaker for better sound. I also inserted a simple RC low band pass filter circuit between the timer compare output pin on the AVR and the op amp. I used a .01 uf capacitor with a 200 ohm resistor to filter out frequencies roughly above 8 kHz. 

    There's lot more details to reproducing sound involved here. But, I'm not going to try an explain all of that. I assume there are several sources on the inter-webs and text books that explain pulse code modulation or why I added a low band pass filter much better than I can.

    I wrote a simple AVR PWM "driver" that sets up the ATmega's Timer/Counter 2 in fast PWM mode, sets the period to 7812 Hz at the 8 mHz internal oscillator clock rate, and loads 8 bit pulse code modulated (PCM) data from the program space (flash) into the comparator each cycle. This code actually came from a previous project of mine. If you dig through the source code, you'll see it can also setup the PWM to play square wave tones at a given audible frequency. I didn't use any of that in this project.

    At this point, I had a dice tower that could play PCM sound data. So how do I make it talk?

    This isn't a full speech to text implementation. It can only say the numbers 1 through 99 and pronounce "Dee" as in the letter "D" or "roll six D six for damage on that fireball." But, that's still pretty good for a little 8 bit microcontroller with just 32K of Flash, 2 K of RAM, and a simple built-in PWM peripheral. For perspective, that 32K of RAM will store just 4 seconds of 8 bit PCM encoded mono sound sampled at ~8 kHz. Try to count from 1 to 99 out loud in less then 4 seconds and make it easy to understand. It ain't gonna happen.

    So, I figured I could just sample the unique words that are used to say the numbers one to ninety nine. I started by snagging an older version of the Microsoft text to speech demonstration application TTSApp. I liked the dated quality of the speech generated by the app and it was very easy to generate wave source files of the words I wanted. I could even control how fast the words were spoken. I generated .wav files for all the words that represent the numbers 1 to 20 and Thirty, Forty, ..., and Ninety. I then used the Audacity application on my little Linux notebook to max out the sound levels on the samples.

    Next, I needed to get those .wav files into the ATmega328's flash memory. The easiest way to do that with the minimum amount of additional program memory overhead is to convert the data the sound files represent into C arrays and link that code with my application. There are likely some existing programs out there to do that, but I decided to write one myself. I figured there was a good chance I might want to do some additional processing on the data. 

    I wrote a simple Linux command line application in C to convert the .wav files into text files that represent the data as C arrays of type uint8_t. To save the headache of trying to figure out how to decode a .wav file and add some additional features like converting mpeg and other sound/video files and changing the sample rate from any source sample rate to a user provided rate, I piped the output from the FFMPEG application into my app and output the text file with all the C required stuff. Now my source file could be just about any type of media file and I could convert it to mono 8 bit PCM data at any sample rate I chose and my little command line app would spit out some statistics...

    Read more »

  • Got it working...

    John Anderson02/10/2020 at 05:42 3 comments

    I got sound/voice working after some very interesting experimentation. This version of the dice tower uses a ATmega328. So I had to pack all the logic and audio samples into 32K of flash. It will tell the user the dice count, die type, and the die roll result. It took some compression tricks to get the all the samples packed in there. I'll explain it all in another log if someone is interested. However, seeing this project has just one like and no followers, I won't bother posting the details until someone asks about it.

    For now, here's a video demonstrating this latest version of the Heathkit D&D Digital Dice Tower.

  • User Interface circa 1979

    John Anderson02/08/2020 at 02:16 0 comments

    The next step was to configure/build the new user interface switches, button, and speaker and wire those to the controller board.

    The two digit Omron Thumbwheel is configurable. It comes with pins that you install. This pins act as stops preventing the user from selecting a range of numbers. This is useful because I could reduce the range of selectable dice counts down to something realistic and reduce the number input pins required on the microcontroller. So, I installed the stops making the selectable tens digit range 0-3. This makes the user selectable range for the number of dice 0-39 and reduces the pins required for the dice count input from 8 to 6.

    The pins that came with the switch are rather small and difficult to handle with my fingers. But, they are made of a ferrous metal. I discovered that I could used the magnetic end of my scribe tool to hold the pins and install them.

    Once those were in place, the two digits snap together and the end caps snap onto each side of those.

    Once the thumbwheel was all configured, it was a simple matter of soldering a 10 pin cable to the 4 BCD traces of the ones digit, the common on the ones digit, the 2 low order BCD traces of the tens digit, and the common on the tens digit.

     The rotary switch required a little more effort to wire up. Just like the previous version of the dice tower, I used a simple single pole 8 way rotary switch. However, I wanted to minimize the cable conductors and controller input pins required. So, I wired up a 74HC148 8 line to 3 line priority encoder on a small proto-board.

    I then wired the board to the common and 8 selector lugs and used a couple stand-offs to connect it to the back of the switch.

    Lastly, I cut another small piece of proto-board and soldered up a connector, LED, push button, and speaker to it so they lined up with the holes in the case.

    It looks like this installed.

    This required cutting a small notch in the front right corner of the original PCB so it would clear this new board.

  • Mod the case...

    John Anderson02/07/2020 at 08:06 0 comments

    Now that I had the control board built and connected to the original PCB, I needed to modify the case so the new switches can be installed. As mentioned before, I tried to simplify the modifications to the front faceplate this time. Instead of cutting a larger hole in the original faceplate and riveting a new faceplate over it, I decided to modify the original faceplate to install square thumbwheel switch and use existing holes in the faceplate for the rotary switch, LED, push-button, and speaker hole.

    The first task was cleaning the old graphics off the original faceplate. I use some 100% acetone and rag to do that.

    Then I drew up a template for the 22.5 mm x 22.5 mm square hole required for the 2 Digit Omron A7BS BCD encoded thumbwheel switch and end caps. I used Inkscape to draw it to scale and printed it.

    I then taped this paper template to the front faceplate of the case and secured it to a scrap piece of 2x4. I was generous with the template and painters tape used to secure it. This provides a protective barrier the prevents scratches on the faceplate while drilling, filing, cutting, etc.. Once secured in the vise, I punched the center point of the marked drill holes in the template.

    Next I drilled the holes and used a square file to start squaring off the corners marked by the template. I had to be a little careful to keep everything inside the lines of the template. The aluminum sheet metal files very easily.

    Once three of the four holes were squared to the corners of the template square, I used a jigsaw to cut out each side of the square. The filed holes were just large enough to fit the jigsaw blade flush to each side of the square. Again, I had to be very careful to cut slowly following the template line and not cutting past the perpendicular line of the next side.

    Once the cuts were complete and I pulled out the remaining bit of metal, I used a larger metal file to clean up the square a little. I then test fitted the thumbwheel switch and filed a little more until it slid in snugly. My template was intentionally about .2 mm too small so I wouldn't end up with a hole too large. I knew filing the last .1 - .2 mm would be more precise than cutting. It was easy to file and took just a couple minutes to get it just right.

    Once I was satisfied with the fit, I pulled off the tape and template paper.

    And, the fit for the switch looked like this. BTW, don't press the switch into place just yet. Once it snaps into place it's difficult to remove. I still needed to configure and solder the cable to the switch.

    The rest of the holes will be used as is. In the pics above, you can see that I also test fitting the panel mount LED holder as well.

    The three holes on the right are about 3/8" (9 mm). So, I needed a small panel mount push button that could fit. I pulled one off a panel from my spares stash that I keep for just such occasions. This panel came out of an old Cable TV line tester/analyzer that's no longer useful. I bought it cheap for the case, power supply, and vector scope CRT for another project. This panel will be replaced in the final version. So, I can used all the cool switches, knobs, pots, jacks, and LEDs for other projects :-)

  • We have assumed control...

    John Anderson01/25/2020 at 02:10 0 comments

    The next step was to build the controller board and interface it with the original PCB with power supply, 7441 decoders/drivers, nixie tubes.

    I started with the interface to the PCB. I wired up the a small piece of protoboard with four 7 pin single row headers and a 10 pin dual row header. The single row headers line up with the 7490 decode counter sockets in the original PCB. To make that work, I pressed the single row headers into the sockets and then put the protoboard onto the headers. I soldered the headers to the protoboard there in place. This ensured they line up perfectly. Then I wired up the Vcc, Gnd, Output A, Output B, Output C, and Output D to the 10 pin connector. 

    For more details and schematics regarding the original PCB, checkout these logs from the original project: Let there be light... and Getting Started...

    The protoboard that interfaces to the original PCB looked like this when I was done.

    Next, I wired up the controller board. It contains the ATmeg328 microcontroller and connectors to the original PCB, thumbwheel switch, rotary switch, LED/push button/speaker daughter board, and ISP programming/debug port. I am using the integrated oscillator so once again the controller board is just the controller, wires, and connectors.

    Note: If you look closely, you can see where I cut traces on the protoboard so I could used the dual row connectors. I've seen some breadboard style protoboards lately that have the traces on both sides under a solder mask. Don't buy those. I really like these Adafruit protoboards because they use thin traces that are easy to cut and the holes are plated through.

    Lastly, I selected a location on the original PCB to mount the controller board. I picked a spot on the right side of the board behind the switched where I could drill without cutting existing traces.

    I installed the standoffs.

    And, I installed the controller board.

    It looks like this in the case with the programmer/debugger connected.

  • Gut it and prep it...

    John Anderson01/25/2020 at 01:02 0 comments

    Just like the 1978 "Heathkit" D&D Dice Tower, I opened the case.

    Removed the existing switches and PCB.

    Installed a rocker switch for power on/off.

    And, wired it up to the original power wires.

View all 6 project logs

Enjoy this project?



Ken Yap wrote 01/23/2020 at 21:37 point

That chevron rotary knob, white paint in the groove, fastening screw at the end, is absolutely of that past era. Brings back memories.

  Are you sure? yes | no

John Anderson wrote 01/23/2020 at 21:46 point

Dusting off the old rotary embossing label maker brought back memories too :-)

  Are you sure? yes | no

Ken Yap wrote 01/24/2020 at 00:34 point

I always wondered if that was the inspiration for the Star Trek phasers. :)

  Are you sure? yes | no

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates