Introduction: Rotary Dialer PIC Interface
I have found myself with an abundance of rotary phones. In fact, they're everywhere I look. In hopes that I may someday see less of them, I've begun taking them apart and re-using the parts for other purposes.
For some reason I got it into my brain that interfacing the rotary control with a PIC chip would be a good idea. I can only think of a couple of vague uses for it at the moment and none are particularly useful, but I hope to do something cool with this in the future.
Step 1: Go Get Stuff.
You will need:
1 - Rotary phone
3 - 220 ohm resistors
2 - 0.1uF capacitors
2 - 20K resistor (can substitute anything between 10K and 47K)
2 - LEDs
1 - PIC development board (I used the Basic Micro development environment)
1 - 20 MHZ resonator or crystal
1 - Breadboard
1 - 5V power source
1 - A foot or so of hookup wire
1 - Screwdriver
1 - Wire stripper
Step 2: Dissect the Phone.
Open up your rotary phone. On the inside you will notice the few basic parts; the rotary dial, the ringer, two jacks, the hook switch and the basic circuitry which is usually encased in a metal junction-box-like thing.
There will be four wires running from the rotary dialer to this junction-box-like thing. The wires should be held in place by little more than tightened screws. Loosen the screws and disconnect the wires.
After that, disconnect the rotary dialer from the phone itself.
Step 3: Determine What the Wires Do.
Wire up two LEDs as shown in the diagram below.
The two white wires should be the pair that closes the switch that lets you know when the dial is turned. The blue and green wire should be the pair that lets you know what number was dialed.
As such, when you turn the dial, the LED connected to the white wires should turn on, and when you let go of the dial, the LED connected to the blue and green wires should blink on and off as many times as the number you dialed (see video).
For instance, if you dial 8, the LED connected to the green and blue wire will turn off and on 8 times. This happens because one way to dial a phone number is to rapidly break the connection the number of times for the digit you are trying to dial. So, again, to dial an 8 you would have to rapidly break the connection 8 times.
Step 4: Connect the Dialer to the PIC Chip.
Connect the rotary dialer to the PIC chip as seen in the diagram. Notice that I am reading in the state of the rotary dialer by using RC-timing. In other words, the PIC chip is counting the number of times it takes for a capacitor to discharge (which changes when resistance is added).
That is where the 20K resistor comes in. Adding this to the input allows for a clear differentiation between the signal from a closed and open rotary switch connection.
Step 5: Assemble the Code.
To program the chip, I used the MBasic development environment available from Basic Micro. MBasic, quite simply, is a variation of Basic designed for use with PIC chips. It is easily convertible into a more universal (useful) language.
The code is essentially determining when someone has turned the dial and then does edge-detection on the signal (determining low-high transitions) until the dial recoils to its initial state. After tallying the number of times it measures a signal transition, it then blinks the LED accordingly.
For instance, if you dial 3, the PIC will count three low-high transitions and then blink an LED 3 times.
The LED, as you may have inferred, is unnecessary for this to operate and is just there to give you visible feedback. You can substitute any output device that you deem necessary.
Here is some code:
CPU = 16F877
MHZ = 20
clicker var word
startcountin var word
countclicks var word
repvar var word
clacker var word
largefig var word
countclicks = 0
repvar = 0
countclicks = 0
if startcountin > 10 then goto countmeup
' checks to see if dial has been turned and goes to subroutine if it has
'sets compare value
'checks counting value
largefig = clacker + 100
'sets a value for the threshold that will be larger
'than 0 but lesser than possible pin-high values
if largefig < clicker then
countclicks = countclicks + 1
'adds 1 value every time a low to high transition is recorded
if startcountin < 10 then
if countclicks > 0 then
'checks to see if the dial has recoiled back to its initial state
'if it has and a number was dialed it goes to the LED routine
'otherwise, if no number was dialed it goes to main
clacker = clicker
'resets the comparison value to the current pin value
'no pauses AT ALL in this routine!
repvar = repvar + 1
'counts each repetition of this routine
'blinks the LED
if repvar = countclicks then
repvar = 0
'if the repetitions equal the number of times the LED should blink
'then it goes back to the main routine
Step 6: Testing.
If you did everything the same as I, it should work (see video).
If it doesn't work, make sure that you wired everything correctly and that the code is copied correctly. Also, be certain that your resonator (or crystal) is 20 MHZ. If you wrote your own code make sure there are no pauses in the routine that checks for low-high transitions.
Step 7: Go Beyond.
Figure out some sort of other use for the rotary dial other than blinking an LED.