Saturday, October 24, 2009

The company I work for recently upgraded their phone system. They got a new IP phone system that can supposedly do everything - the new phones have big LCD screens with fancy menus, lots of different modes, PC connection for remote control of the phone, e-mailing voice messages, and tons of other features. All that said, there was a critical piece missing from the picture - a way to dial a stored number while already in a call. This is a feature I use often - I'm using a calling card to call home and I need to first dial the 800 number and then send my calling card pin number. Well, believe it or not, the cool new phones with all the fancy software couldn't do this and I had to switch back to pencil and paper! "We will include this feature in release 8.0 or possibly 8.5" was the response from the phone company. Yeah right, like I'm going to wait for 8.5!

So, here is the obvious solution - a dialer box that connects to the phone and can be used to store and dial phone numbers, pins, credit card numbers and what not. The circuit uses a NTE1690 DTMF dialer chip and a PIC16F690 microcontroller.

Because this is an IP phone and I cannot just send the DTMF tones over the line, the easiest place to plug in the box is between the phone and the handset. The box has two RJ9 ports at the back - one gets connected to the headset's port on the phone, the other to the headset itself. The dial tones are sent over the microphone line. This way, it works both on IP-phones, and on standard (old fashioned, non-IP) ones.

Here is the thing, assembled and put in an old network transceiver box:

Sure looks ugly, :-) A friend of mine likened it to something from Dr. Evil's hideout. All the better - this is the way I like it! Ugly or not, the dialer works perfectly and can dial at blazing speed - so fast that it sounds more like R2-D2 than a phone.

The headset from the phone is connected to one of the RJ9 ports under the "AUI PORT" label; the other port is connected with an extra headset cable to the phone body. The pins sticking out on the other side from the port formerly known as "10BASE-T" can be connected to Microchip's PICkit 2 programmer for updating the firmware without taking the box apart.

The dialer is operated this way:

Storing a number. The device can store up to 12 numbers, identified by a bank ID. The ID is one of the buttons 0-9, SEQ, or RST. To store a number, press ENT, followed by the bank ID button. After pressing the bank ID, the green LED will light up, showing you that the device is expecting the number. Enter the number sequence (up to 15 digits); the SEQ button corresponds to the *-key on a phone; the RST number is #. You can use the DEL or TKO buttons to insert a pause. When you finish press ENT to store the number, or ABT to discard the changes and leave the old number stored in this bank unchanged. The green LED will turn off at this point. Example: To store the number 555-1234 in bank 0, press ENT-0-5-5-5-1-2-3-4-ENT.

Dialing a stored number. Just press one of the 12 bank ID keys (0-9, SEQ, or RST). If there is a number stored in that bank the device will dial the number, otherwise nothing will happen. Example: To dial the 555-1234 stored number (see "Storing number" above) simply press the 0 button.

Copying a stored number from one bank to another. Moving stored numbers around is a useful feature that I have not seen in any off-the-shelf dialer. To copy a number, first press ABT. The LED will light prompting you for source bank ID. Press the source bank button. The LED will remain on, waiting for a target bank ID. Press the target bank button. The number stored in the source bank will be copied to the target bank. You could cancel the operation at any time by pressing ABT. Example: To copy the 555-1234 number stored in bank 0 to bank 3, press ABT-0-3. After this, pressing the 3 button will dial 555-1234.

Manually dialing a number. Press the DEL button. The LED will turn on. Now you can use the keypad to dial any number. The SEQ button corresponds to the *-key on a phone; the RST number is #. To exit manual dial mode, press the DEL button again (pressing ENT, TKO, or ABT button will exit manual dial mode too). The LED will turn off at this point. Example: To manually dial 555-9999 press DEL-5-5-5-9-9-9-9-DEL.

Changing the dial speed. The maximum reliable dial speed depends on the system that you are dialing into and the noise on the line. To change the dial speed press TKO. The green LED will light up, indicating that the dialer is waiting for you to select dial speed. Press a number button between 0 and 7. The new dial speed will be set, 0 being the lowest speed, and 7 - the highest. The green LED will turn off after the speed is selected. Example: To switch to the highest dialing speed press TKO-7.

Here are some notes, in case you want to build such a dialer:

It's not very likely you'll find exactly the same keyboard that I have (this one I got for $0.33 apiece from a great electronics store in Santa Clara, CA; check also my list of SF Bay Area electronic shops). In case your keyboard have different layout, the change is easy to make - simply adjust the K_something constants defined in the beginning of HandheldDialer.asm. Define your layout by changing the hex digits to match the corresponding button on your keyboard (compare the source and the images of the keyboard to figure out the numbering of the buttons).

The schematics doesn't show the power supply. I'm using internal supply with a 9V battery and a 7805 voltage stabilizer. A sample design can be find here. Or maybe you will chose to construct something with external power supply?

Handsets may use different microphones, and can be wired in a different way. The schematics diagram shows two ways to connect to the handset cable - use whichever works for you. Special thanks to the friendly guys from the sci.electronics.design newsgroup for the help with the alternative design.