Building your own pulse to tone converter

Related article: A crash course in using GPO telephones in the modern world

A few months ago I purchased a Rotatone module for one of my vintage telephones. It’s a great product, but in the event that you find something you don’t like about its functionality, there’s not a lot you can do about it, because it’s not an open source product. Also if on a very tight budget, you could save yourself a bit of money building your own too.

Rotatone module (red) installed into a GPO 746F

Fortunately there are a few projects kicking around the internet which make for quite a good starting point. One of the earlier efforts was undertaken by Boris Cherkasskiy and subsequently improved on by Arnie Weber on this bitbucket repository. Arnie includes some gerbers with this, which I’ve fired off to Seeedstudio PCB and made some of my own of, forming the basis of this project. I have to say it is quite a luxury to be building someone else’s design for once!

Arnie Weber’s pulse-to-tone converter PCB – as constructed by him
For the benefit of those who don’t use Eagle (like me) this is Arnie’s rendition of Boris’s original design.

All of these are based on the application note AVR314 from Atmel, which includes some tricky code that generates DTMF tones using the PWM module of an AVR. Complicated stuff which I am not going to go into the details of.

My build of Arnie Weber’s pulse-to-tone converter

Things I would or have changed from the original design

  • C1 was originally specified to be 200uF. I’ve changed that to 47uF, because I found that value to be overkill. The microcontroller has to be reset between uses, which is done by putting the phone on-hook, which powers it down. Problem with having a 200uF cap there is that it takes quite a wee while to discharge, meaning the phone has got to be on hook for 4 seconds or so before it can be re-used. Reducing it to 47uF cuts that down to 1 second.
  • I am perplexed by the usage of a 4 MHz ceramic resonator. I did use one because I couldn’t be bothered altering the board. You might find as I did that these are not so easy to come by, and can easily be replaced with a 4 MHz crystal and two 22pF capacitors.
  • The board was originally designed for use with a 4 position 8.25mm pitch barrier terminal (specifically OSTYK42104030 – which is only sold by Digi-Key). These do not appear to be available in the UK through any local vendors. In my particular case I used Molex 38700-7304 which has mounting ends, handy for those cable ties.

My version of the code

I have made quite a few alterations from the original implementation – adding “Redial” functionality, as well as simplifying the programming of speed dials.

You can get my code here on github. Alternatively the code on Arnie’s repository works just fine, but functionality differs significantly.

Wiring it up

The exacts of how these are wired varies significantly from phone to phone, you’re on your own there. It is safe to say that interchangeability between converter designs is good. My GPO 746F was originally wired for a Rotatone, and I found that this board dropped straight in its place, with the red wire connected to LINE, and the blue wire connected to GND.

I kept the original blue, pink and grey wires for the connection to the dial, which are wired on as pictured.

Shopping list

I ordered most of the parts for my board from the Mouser UK website.

  • 1x ATTINY85V
  • 1x 5.1V Zener (BZX85C5V1)
  • 1x 47uF 16V capacitor
  • 1x 4 MHz ceramic resonator (I used CSTLS4M00G53-B0) – or a 4 MHz crystal + 2x 22pF capacitors
  • 1x 2N3904 transistor
  • 4x 0.1uF (100nF) ceramic capacitors
  • 1x 330 ohm resistor
  • 1x 220 ohm resistor
  • 1x 4K7 resistor
  • 4x 10K resistor
  • 1x 4 position 8.25mm pitch barrier terminal i.e. OSTYK42104030, Molex 38700-7504, Molex 38700-7304 (with mounting ends).

Programming the AVR

There’s quite a few different ways to do this, I’ll let you do your own research. Your programmer will need:

The .HEX file from here

Correctly set fuse bytes:

  • LFUSE: 0x4F
  • HFUSE: 0xC1
  • EFUSE: 0xFF

The user manual (for boards running my code)

Normal dialing

Just pull the dial round from the desired number to the fingerstop and release immediately.

Dialing * and #

for * Pull the dial from ‘1’ and hold on the fingerstop for 2 seconds until you hear a beep, release, and a tone for * will be generated.

For # do the same but use ‘2’.


Pull the dial around from ‘3’ and hold on the fingerstop for 2 seconds. Release when you hear the beep, and the last number will be redialed.

Speed dials

There are 7 speed dial locations. 0, 4, 5, 6, 7, 8, 9. Pull the dial around  to the fingerstop and hold for 2 seconds, release when you hear the beep and the desired number will be dialed.

Programming a speed dial

Pull the number of the desired location around to the fingerstop and hold for 4 seconds, you will hear a two-tone beep. Release the dial.

You are now in programming mode. Now simply dial out the number you wish to store, releasing the dial immediately after each digit. You will hear a simple beep after digit. Once complete, hang up, the number is now saved.

When doing this you will likely have your telephone exchange furiously beeping at you because you haven’t dialed a number. If annoying, you can enter the BT “quiet line test” (For people in the UK) during programming.