So I started this project after a friend told me their grandfather had issues with dialing phone numbers with their advanced Alzheimer's. They had purchased a phone designed however it didn't work. The major issue is it had large buttons that are programmed for specific phone numbers and the ability to put pictures so that they can dial the phone numbers. Similar to the following
However I was told that his grandfather would continue to attempt to dial the phone like a normal phone and that would lock-up the phone or have it try and dial up many numbers preventing it from working. My friend came to me and knew I worked on electronics and asked if I could help, especially with COVID being in full swing and limiting their grandfathers communication with the outside world.
So with the above being set I decided I need a phone that looked like an old phone but was easy to update. However on the outside I wanted it to look like a normal phone. So I did a search on ebay and found the CordtelCo 2500 model phone.
It looked just like old model phones and from teardowns I could fine online had a relatively normal matrix keypad. This fit all of my ideals, old looking phone and easy to modify
Being that I wanted this to be an easy and cheap model I had to find parts that I already had with few modifications. Due to this I choose to work with a atmega328p. The atmega328p works natively with arduino and is easy to program over usb just with a usb->serial converter. I already had cp2102n usb->serial converters due to another project. Finally I just need a way to connect the atmega328p to the phone and power it and it needs to require no external circuitry
So the good news is as part of phone line specifications all phones get a 48v through the phone line that they use to perform their own functions. However this is not designed to be used for more than a few milliamps. The atmega328p only uses a few miliamps total so should work pretty well with this restriction. So I just needed a way to down convert from 48v to 5v needed for the atmega328p.
So I initially tried a simple linear regulator however there is too much swing in the power rail whenever the phone was picked up and it caused a brownouts on the device whenever a call was answered. The line voltage dropped from 45v down to 4.5v or lower depending on how much drain was on the line. I noticed that the current circuitry within the phone that is used to generate the dial tone used a zener dropper. As such I modeled a similar circuit.
In order to allow for easier programming it has 2 4148 diodes as an oring circuit followed by a 20 ohm resistor as current limit and then a 5.1v zener to insure the voltage is never enough to damage the atmega328p and this worked perfectly.
Final issue was intercepting the phones dial-pad.
Thankfully this is another subject that has been researched very heavily, and there is even chips designed specifically for this purpose. Reading the matrix from the phone is easy and it thankfully already had a slot it fit into so it should be easy to read what is pressed, have the atmega328p decide what was pressed, and then send the same signal to the phone. Now the problem with this is that phone dial-pads, at least for the model 2500, use matrix pulsing to find out what is pressed.So it has 4 columns and 4 rows, it will send a voltage out on say a column and look for it on a row. So if I just send a signal to the row it will think all the keys in that column are pressed.
Whenever I said there are chips designed for this however it are, I found this arduino post which mentions the CD22100 which is a 4x4 matrix analog mulitplexer where the commons of each channel are connected to each other. So if you say channel 1A and channel 2B then those are now connected physically and it can simulate a button press. Problem is the CD4066 is discontinued and no one seems to make them anymore. Thankfully you can emulate how it worked with 2 4 channel analog multiplexiers such as the CD4066 and tie their commons together on the PCB. So I did.
I now had everything I needed. So I wrote some quick arduino code and spun out a board with the help of OSHpark which have always provided good service and got a device that perfectly fit behind the main phone PCB and connected to the long pins of the dial-pad and plugged into a header I replaced on the main board to send out a signal. All you had to do is remove 2 screws to access the usb port on the board to change which numbers it dialed. It had a special carve-out for 911 so the phone still functioned for 911. Even better to prevent the issue with current phones designed for this, it accepted the first number pressed and dialed that and then ignored the rest. It required a reset of the board after every press but thankfully the phone does that for me by cutting power whenever its on hook.
All the files and firmware can be found On my Gitlab