This instructable will take you through the steps I had to go through to discover the pinout on my keypads, and how I hooked it up to my Raspberry Pi. I'll include the code I'm currently using to "drive" my keypad, and then offer some "next step" type insights into what can be done better, and what could be done next.
Finally, this instructable will really be a sub-instructable that will be part of something I'm calling Voiceberry Pi.
Step 1: Taking a look at what you've got
So, I took a look at the back, saw that there were 10 wires, and three "jumpers" on the outside, but no other indication of how things were wired on the inside. So, I took out the five screws, and looked at the actual circuit board to trace the leads.
Step 2: Tracing the leads
Pins are either rows or columns. Rows cover two or more buttons horizontally, and columns cover one or more buttons vertically (even though one key could be a row or a column). Results of tracing are as follows:
Rows: 1,2,3, and 9
Columns: 4,5,6,7,8, and 10
Button- Row - Col
1 - 1 - 5
2 - 1 - 6
3 - 1 - 7
4 - 2 - 5
5 - 2- 6
6 - 2 - 7
7 - 4 - 5
8 - 4 - 6
9 - 3 - 7
0 - 4 - 7
* - 9 - 8
# - 9 - 10
Step 3: Prepping for Prototyping
Next I wired it up to the Raspberry Pi. The actual pins you use don't really matter, as you'll include them in the code, which I've attached to this step.
My code includes a list for the rows:
A list for the columns:
And a multidimensional list for the key/button combinations
Finally, there's a loop to poll the columns and see which row was pushed:
for col in range(0,lenCols):
#print str(cols[col])+" Pushed"
#print str(cols[col])+" Released"
Step 4: Next Steps and Issues
The buttons tended to "bounce"--show more than one press per press. To eliminate this, I put in a sleep statement of 1/100 of a second in to the code as the button was pressed and another when the button was released. This made the "bounce" go away.
Additionally, the CPU ran at 100% while polling the rows and columns. I put in a pause of 1/10 a second at the start of the polling loop, and this dropped the CPU usage to about 50%. Better, but not great.
Where can I go from here?
First, as already said, the code I created is a little CPU intensive, so the code could be cleaned up to fix that issue.
Next, the code should be object oriented so I can import it into other projects easily.
Third, and I'm not sure if there's a way for this to happen, the code should be event driven. Poling is not really the best way to do this, even if I can make it less CPU intensive.
Finally, I need to find a use for this. I mean, just pushing buttons and having the number i push show up on the screen is fun for only so long.