(Updated 11/1/2015) I am in the process of editing a complete project writeup which I will post here later. This is an early version of this project -- by popular request, I have actually expanded the project to implement most keys on a standard keyboard by allowing a user to delay release of the dial in one-second intervals to shift from digits to letters or symbols. I will document that expanded project anbd its code "Real Soon Now".

Meanwhile, the following describes Version 1, which only implements digits.

A friend at the LVL1 Hackerspace in Louisville had collected a pile of phone components, including old rotary dial telephones and associated parts. Having grown up in the dial telephone era, I was inspired to interface the very RETRO dial mechanism as a keyboard to a modern PC.

The old telephone rotary dials used a robust but simple mechanism to convert the user's digit selection into a stream of pulsed openings of a switch contact. There are actually two switches in the dial, one is normally open, and closes for the duration of dialing, no matter how far the dial is rotated. The other switch, normally closed, "breaks" once for each digit count -- 1 pulse for "1", 3 pulses for "3", and 10 pulses for "0". The normal POTS (plain old telephone service) telephone circuit was electrically a 20ma current loop which connected to the central office when the receiver was lifted off hook. The central office would provide a dialtone, and interpret the pulses to decipher a destination connection across a complex switching network, and when finished, the current loop would transfer to the destination telephone, and the two parties could then communicate privately. The pulse system worked reliably for billions of customers for most of the 20th Century.

I used an Arduino-compatible microcontroller to interpret the state of switch contacts to decipher the dialed digits and send them to a computer. I implemented the final project with a Teensy 2.0 board, which uses 5.0V signals like the Arduino and clones (I frequently use a Diavolino for prototyping). The reason I use a Teensy is that it is easy to make it emulate a standard USB keyboard, so the digits are sent to any receiving program as if they were typed.

The electronics for the interface are pretty simple, just a pair of 12K pullup resistors to 5V and a 0.1 uf capacitor across each switch to ground. The pullups and capacitors help debounce the switch so that only the intended pulses are counted. The software actually uses an additional layer of debouncing, so perhaps the capacitors weren't absolutely needed, but I felt like improving the safety margin for reliability.

I will eventually post more pictures, instructions, and schematics. At this time, I am ready to share the code I have actually used to produce the project as demonstrated at LVL1 Hackerspace. I will wait for the complete writeup to explain the workings of the code.

I have arranged for some file storage at Github, and have uploaded source code with Arduino IDE 1.0.6 compatible code for the project as currently implemented. You may download a ZIP file of the current master branch of that code at:


In addition to the Arduino IDE installation, you will need to add the Teensy extensions (Teensyduino) if you wish to compile the source code and create the USB keyboard. If compiled for an Arduino board, it will default to 9600 baud serial output and should still transmit decoded digits to a serial terminal such as Putty or Hyperterminal (not as a USB keyboard). The .ZIP file includes both the main pulse dial program and a personal "scheduler" library I use to extend the Timer 0 (e.g. millis()) interrupt to do a variety of things including software debouncing of switch contacts and pulse counting completely in the background. The scheme works well as long as events interpreted are on a human scale, and as such don't need to be monitored at faster than once per ms to work.