A basic 12 button keypad for user input. The buttons are setup in a matrix format. This allows a microcontroller to 'scan' the 7 output pins to see which of the 12 buttons is being pressed.
Check the Documents tab examples and hookup guides.
This skill defines how difficult the soldering is on a particular product. It might be a couple simple solder joints, or require special reflow tools.
Skill Level: Rookie - The number of pins increases, and you will have to determine polarity of components and some of the components might be a bit trickier or close together. You might need solder wick or flux.
See all skill levels
If it requires power, you need to know how much, what all the pins do, and how to hook it up. You may need to reference datasheets, schematics, and know the ins and outs of electronics.
Skill Level: Competent - You will be required to reference a datasheet or schematic to know how to use a component. Your knowledge of a datasheet will only require basic features like power requirements, pinouts, or communications type. Also, you may need a power supply that?s greater than 12V or more than 1A worth of current.
See all skill levels
We welcome your comments and suggestions below. However, if you are looking for solutions to technical questions please see our Technical Assistance page.
Based on 9 ratings:
1 of 1 found this helpful:
If you can figure out how to keep it from coming apart, you'll be golden. For a few dollars though, not bad. Mentioned before but put headers on it so you won't need to resolder it and maybe some hot glue on the back to help the little rivet like posts hold it together.
2 of 2 found this helpful:
This thing is cheap, and that's the best thing it's got going for it. A few caveats:
In order to get this thing to work for my application, I had to significantly (and tediously) remanufacture it. Specifically, I replaced the three conductive paint jumpers on the board with actual wire jumpers to remove their ~84 ohms resistance. And even more tediously, I put aluminum tape caps on the insides of the silicone spring forms, so that the buttons themselves would also have near-zero resistance. Then I had to superglue the thing back together, because it is heat-welded and not meant to ever be disassembled.
If my application were different, I would likely have been able to use this keypad out of the box. It's not bad, but the decision to save $0.25 by not either a) having a double-sided circuit board, or b) soldering three jumpers onto the board really did cause problems for me.
As for programming, it is trivial. I used 7 GPIOs on a Pi, driving the columns with three outputs and polling the rows with four inputs. No external components required.
I gave the thing a three-star rating because I largely disagree with the corners that were cut in its manufacturing (which are not technically Sparkfun's fault - this is an off-the-shelf part). But for simple applications, physically close to the microcontroller, this part will work fine.
2 of 2 found this helpful:
I didn't have any of the issues that other reviewers had. This worked perfectly out of the box. I don't have to press the buttons too hard.
1 of 1 found this helpful:
I used this for a custom number sign. Worked fine. Word of caution do not use a cold soldering iron on this as it will fry the traces. :)
2 of 2 found this helpful:
Look at the diagram of the PCB, see the black traces? They are conductive paint (or something) and on mine at least, they don't conduct. I was able to fix it by cutting off the melted plastic that keeps the case closed, carefully sanding off the black stuff until the underlying pads at each end were exposed, and then soldering fine wire between the three pairs of pads. While you are in there, gently sand the exposed metal where the keys are supposed to press down, or half the keys will need to be pressed REALLY hard to register. Put it all back together and apply superglue where the melted plastic was on the back of the case. NOW it works like it should have out-of-the-box.
Sorry for all the extra trouble. These should work better out of the box. If you get one that gives you trouble, please let us know. https://www.sparkfun.com/returns
1 of 1 found this helpful:
Like someone else said, these buttons work by pushing down a connection on some electrical paint on the circuit. Just pushing the buttons is inadequate.
You must mash the buttons deep into the next dimension to get a clean reading (or in my case, any reading).
2 of 2 found this helpful:
For the price it works okay, its still a conductive pad type of keypad, no frank, satisfying click when you press a button and most of them need to be pressed quite a bit to get a decent reading. I found that some of the buttons had over 50 and even up to 100 ohm of resistance on the line even when pressed, so take that into account if, say, you use a voltage divider in front of some pins and are expecting a precise reading.
Once I soldered some pins and figured out how to hook it up properly to my PIC18F4550 it worked great! Solid little keypad.
So far, works like a beauty. However, this DOES NOT have headers pre-soldered. I would recommend products/115 or 553.
I basically remanufactured this thing to have near-zero resistance by soldering jumpers over the conductive paint paths on the board, and by affixing aluminum tape caps to the insides of the button membrane. Was it worth it? Well necessity is the mother of invention.
Picture of the jumper job: jumpers Picture of the aluminized caps: caps Picture of the completed mods: mods
You get what you pay for.
Upon further thinking and research, I've (and a friend) devised the best plan to use this thing while taking only ONE (yes 1) analog input. You make a resistor ladder of sorts (see picture 1 below) between the pads and sample the last pad with respect to gnd with one analog input. The nature of what pads short out and how they short makes this non-trivial. I ran a simulation with 1,000,000 different combinations of resistors to optimize the different readings on the analog input. The resistor values and expected analog input readings are given on the second image.
Circuit Schematic
Excel Sheet
edit:
Picture of Resistors (SMD 603s) on the Pads: the red wire is +5V, purple is analog out, black is ground.
So what I'm taking from this is that using one analog pin, you can attach a series of buttons in serial, and depending on the resistance they give, determine which button was pressed.
Am I correct?
I think there is a simpler way to get an evenly spaced analog output without much computation to determine resistor values. This method doesn't use a resistor ladder. I don't have this keypad, but I assume that one output pin is connected to each key column and one pin is connected to each key row to make three column pins and 4 row pins. I haven't figured out how to attach a schematic, so here is a text description of the circuit:
1. Connect R6 to the voltage reference then to the key "1" row pin.
2. Connect the key "1" row pin to R5 then to the key "4" row pin.
3. Connect the key "1" row pin to R4 then to the key "7" row pin.
4. Connect the key "1" row pin to R3 then to the key "*" row pin.
5. Connect the key "1" column pin to ground.
6. Connect the key "2" column pin to R1 then to ground.
7. Connect the key "3" column pin to R2 then to ground.
The voltage output is taken from the key "1" row pin. This circuit sets up a simple voltage divider from Vref through R6 then to an equivalent resistance, Re, to ground. Resistors R1 through R5 are expressed as multiples of R1 as follows:
R1=R1
R2=2R1
R5=3R1
R4=6R1
R3=9R1
This results in the Re for each key as follows:
Key, Re
1, 0
2, R1
3, 2R1
4, 3R1
5, 4R1
6, 5R1
7, 6R1
8, 7R1
9, 8R1
*, 9R1
0, 10R1
"#", 11R1
no keypress, infinity
R6 can be set to whatever you want. The voltage output is then:
Vout = Vref * Re/(R6 + Re)
This circuit can be easily modified to work with any number of rows and columns. If the leftmost column is column 0 and the topmost row is row 0, then the column resistors are in the ratios of 0, 1, 2, ... n and the row resistors are in the ratios of 0, n+1, 2(n+1), 3(n+1), etc.
There are a couple of improvements to be made to this resistor ladder technique.
The resistor ladders discussed so far are tapped at "Pin 7", where there is relatively little possible variation in voltage. It should be tapped somewhere in the middle, so that the voltage can swing nearly rail-to-rail with different button pushes.
The combinatorics haven't been done quite right by either example. The 24-choose-7 = ~350,000 combinations assumes every value can be used only once, whereas in fact repeats are allowed. This pushes the number of combinations into the billions, where an exhaustive search is impractical.
Nevertheless, much better separation can be achieved. Using a random-sampling approach on 500,000 combinations from the set of resistor values [220 470 560 3300 3900 4300 4700 5600 6800 8200] (based on a sample-pack of surface mount resistors I had, limited to values large enough to keep the current reasonably low), the following set of resistors works much better (P==Pin, R==Resistor):
** +Vs--P0--R470--P1--R5600--P2--R8200--P3/TAP--R3300--P4--R5600--P5--R8200--P6--R3900--P7--R220--P8--GND**
Tap it to the A/D at "Pin 3".
The minimum voltage difference between button pushes is 3.4% of Vsupply. That's 35 digital levels of a 10-bit (1024 level) A/D converter. That should be more robust to variations in contact resistance of the buttons.
Here are a couple other good combinations with similar results:
[560, 5600, 8200, 3300, 3300, 6800, 3300, 4700], tapped at "Pin 4". Minimum of 3.2% of Vsupply (33 digital levels of 10-bit A/D).
[3300, 6800, 8200, 4300, 3300, 4700, 3300, 4700], tapped at "Pin 4". Minimum of 2.3% of Vsupply (24 digital levels of 10-bit A/D). Note the higher values here - good for lower current.
[220, 3300, 8200, 4700, 3900, 8200, 4300, 560], tapped at "Pin 4". Minimum of 2.7% of Vsupply (28 digital levels of 10-bit A/D).
I've been using that last one, and the data returned are pretty reliable. The lowest difference I've observed in practice was 18 digital levels, lower than spec because my VSupply is just a GPIO, and it's still drawing too much current when you push button "5" (shorts pins 1-7; resulting resistance 780 ohm; current ~4.2mA). You might want to multiply them all by 10 to prevent that problem, or use one of the other options above.
Hope that helps.
My optimal combination is as follows
GND-220-P1-3300-P2-10000-P3/TAP-220-P4-3000-P5-5100-P6-1800-P7-300-Vs
The minimum difference is ~7.1% which equates to about 73 digital levels at a min.
After a hundred trillion plus calculations(34^8 checks ~ 1.7 trillion * 80 calculations per check) I was able to find even better results. The theoretical maximum minimum spread is ~85 digital levels. With using only 34 resistor values ( I could have used many more values say 40 or 50 but I feel that the result would have been similar and took another day or more to calculate I was able to find 2 results with a minimum spread of ~78 digital levels. The resistor values are:
1) 390 3900 9100 510 5100 8200 2700 39
2) 390 3900 9100 560 5100 8200 2700 39
you can multiply these values by 10 or 100 and get the same result. The 34 resistor values I used were as follows:
39 47 51 68 82 100 150 180 220 270 300 390 470 510 560 680 820 1000 1200 1500 1800 2200 2700 3000 3300 3900 4700 5100 5600 6800 8200 9100 10000 12000
Doing further analysis with a larger number of values has yielded some slightly better results. The best being
560 8200 18000 910 9100 15000 5100 51
This result has a minimum spread of 80!
This test was based on the following 98 resistor values:
1 2 3 3.9 5.1 6.2 8.2 9.1 10 11 12 13 15 16 18 20 22 24 27 30 33 36 39 43 47 51 56 62 68 75 82 91 100 110 120 130 150 160 180 200 220 240 270 300 330 360 390 430 470 510 560 620 680 750 820 910 1000 1100 1200 1300 1500 1600 1800 2000 2200 2400 2700 3000 3200 3300 3600 3900 4300 4700 5100 5600 6200 6600 7500 8200 9100 10000 11000 12000 13000 15000 16000 18000 20000 22000 24000 27000 30000 33000 36000 39000 43000 47000
Sweet work with the cluster computation. Have you built it and found it to work?
I would only caution against the smaller values due to current, per above (i.e., at some point is that 51 Ohm or the 39 Ohm above it the only resistor in the circuit? If so, then high current!). But if it works it works.
Can you share the exact method you're using for the calculations? It'd be nice to find the best combinations based on a given set of resistors...
I am doing it with simple math and a beowulf cluster of computers(you can do it with a pc but it will take a long time). The math is as follows:
where "a" is the left most resistor and "h" the farthest on the right. Ground or - is on the left and Vcc or + is on the right. So my previous result would read like this
GND --> 560(a) --> pin1 --> 8200(b) --> pin2 --> 18000(c) --> pin3(this pin is connected to an analog pin of a micro controller) --> 910(d) --> pin4 --> 9100(e) --> pin5 --> 15000(f) --> pin6 --> 5100(g) --> pin7 --> 51(h) --> Vcc where "-->" is a connection between the two.
button 1: 1024 * ( a + b ) / ( a + b + d + e + f + g + h ) button 2: 1024 * ( a + c ) / ( a + c + d + e + f + g + h ) button 3: 1024 * ( a + b ) / ( a + b + f + g + h )
button 4: 1024 * ( a + b + c ) / ( a + b + c + h ) button 5: 1024 * ( a ) / ( a + h ) button 6: 1024 * ( a + b + c ) / ( a + b + c + d + e + h ) button 7: 1024 * ( a + b + c ) / ( a + b + c + g + h ) button 8: 1024 * ( a ) / ( a + g + h ) button 9: 1024 * ( a + b + c ) / ( a + b + c + d + e + g + h ) button 10: 1024 * ( a + b + c ) / ( a + b + c + e + f + g + h ) button 11: 1024 * ( a ) / ( a + e + f + g + h ) button 12: 1024 * ( a + b + c ) / ( a + b + c + d + f + g + h )
For further study do a google search on "Voltage resistor ladder" or "voltage resistor divider"
heh, I have cluster power, hence why I was interested. Essentially then you are just brute force checking all possible combinations? There has to be a faster way of doing this.
I have some python code for calculating the optimal combination based on a given set of resistor values up in a bitbucket repo
I'm porting this over to a hadoop job at some point - I'd like to find the best combination for the E12 series, as those are easiest to find.
So far, with 46 digital levels, the best E12 series I've found is: [1000, 1200, 10000, 1500, 4700, 8200, 1800, 2200]
You can see this in circuitlab
Your solution makes me think that I may be fundamentally misunderstanding the keypad...
Doesn't pressing button 5 create a short between pads 1 and 7? Thus sampling anywhere other than 1 and 7 will give ambiguous readings. If you sample at pad 4, pressing button 5 (short 1 to 7) and button 3 (short 2 to 5) will both give a floating voltage read.
Similarly, suppose you used the same resistor value for R1 and R2, when you press button 2 (short around R1) and button 1 (short around R2) you will get readings.
However, I never got my keypad to work because the readings were dancing around too much (I was thinking of using a cap and/or an op amp to get a better signal) - but the behavior wasn't drastically different than I expected...
You do have a point about using higher resistor values (I'll edit my solution), but I was implying kOhms and was using smaller numbers just for readability.
Your understanding of the board is correct, you just forgot that with pin 1 shorted to pin 7, the readings from pins between 1 and 7 will all be the same, not ambiguous.
That is, with V1 == V7, you get no current through the resistor ladder between them, so the implication is that V1==V2==V3==V4==V5==V6==V7.
So tapping at e.g. Pin 4 and pressing Button 5 (short pin1 and pin7), V1 through V7 all have a voltage reading coming from a simple voltage divider of the first (left of pin1) and last (right of pin7) resistors in the ladder.
As for the equal values problem on e.g. R1 and R2, you're right. But that's the very problem that motivates the combinatorics - finding the combination that optimally spaces the output voltages.
Give it a shot, the way I'm using it has been working well and reliably, and the noise is not a problem because the readings are so far apart!
If I'll ask you kindly, could you do the same calculation for 4x4 keypad, which have 8 outs? Raw outs are 3 5 6 7 and column are 8 1 2 4, counting from left to right and up to down. Thank you.
Me, by myself, came to the variant which uses 2 analog inputs (didn't counted it yet), but your variant is nuch better.
Thank you for this great idea! However, what exactly were you trying to optimize? I thought this was a really interesting problem and was wondering if our solutions would match.
Given your solution, I assume that you took the common resistor values to be your universe of possible resistors: 10,12,15,18,22,27,33,39,47,56,68,82, and all their multiples of 10. That's 24 different values and we pick 7, which gives us less than 350,000 combinations (Maybe you were making their multiples of 100 too? Doing so did not change my result)..
I figured that what we wanted was to space out the Vout/Ain Return for each button as much as possible; that is, maximize the minimum distance between any two possible readings.
The following sequence of resistors did this optimally for me: 39, 82, 120, 150, 180, 220, 680 (in K OHMS)
It gives a minimum difference between two possible readings of 11.7 instead of 6.5 from your ladder (this is in the Arduino's 1024 res). I'm pretty happy with the improvement but perhaps you intended to optimize something else?
If I’ll ask you kindly, could you do the same calculation for 4x4 keypad, which have 8 outs? Raw outs are 3 5 6 7 and column are 8 1 2 4, counting from left to right and up to down. Thank you.
Me, by myself, came to the variant which uses 2 analog inputs (didn’t counted it yet), but your variant is nuch better.
I found the following resistor ladder for 4x4: (12, 15, 39, 56, 82, 100, 150, 180)
The minimum difference is only 4.9 however.
Looking at the top of the board, the pinout from left to right is:
No connection
Column 1
Row 0
Column 0
Row 3
Column 2
Row 2
Row 1
No connection
I've made a Python Package that works with this keypad as well as 4x4 ones. It is made for the RaspberryPi for now but could be ported over to work on the beaglebone as well once I get one to mess with. It supports both the RPi's GPIO aswell as support for the I2C chip family MCP230xx
http://crumpspot.blogspot.com/p/keypad-matrix-python-package.html https://pypi.python.org/pypi/matrix_keypad
Thanks so much for sharing that!
Damn wish you guys carried a 4x4 keypad !
It's very odd but there is no 12 button keypad with included status red/green LEDs available. If anyone has seen one, please tell, where? Also, is there a mounting face plate for this 12 key unit? Again, where? Seems a missing product opportunity; 12 keys, 2 leds, face plate. Such a simple idea yet no one makes it.
Any ideas? Thanks
It's very odd but there is no 12 button keypad with included status red/green LEDs available. If anyone has seen one, please tell, where? Also, is there a mounting face plate for this 12 key unit? Again, where? Seems a missing product opportunity; 12 keys, 2 leds, face plate. Such a simple idea yet no one makes it.
Any ideas? Thanks
It's very odd but there is no 12 button keypad with included status red/green LEDs available. If anyone has seen one, please tell, where? Also, is there a mounting face plate for this 12 key unit? Again, where? Seems a missing product opportunity; 12 keys, 2 leds, face plate. Such a simple idea yet no one makes it.
Any ideas? Thanks
It's very odd but there is no 12 button keypad with included status red/green LEDs available. If anyone has seen one, please tell, where? Also, is there a mounting face plate for this 12 key unit? Again, where? Seems a missing product opportunity; 12 keys, 2 leds, face plate. Such a simple idea yet no one makes it.
Any ideas? Thanks
It's very odd but there is no 12 button keypad with included status red/green LEDs available. If anyone has seen one, please tell, where? Also, is there a mounting face plate for this 12 key unit? Again, where? Seems a missing product opportunity; 12 keys, 2 leds, face plate. Such a simple idea yet no one makes it.
Any ideas? Thanks
It's very odd but there is no 12 button keypad with included status red/green LEDs available. If anyone has seen one, please tell, where? Also, is there a mounting face plate for this 12 key unit? Again, where? Seems a missing product opportunity; 12 keys, 2 leds, face plate. Such a simple idea yet no one makes it.
Any ideas? Thanks
Do I hear an echo?
For anyone needing it you can follow the Keypad tutorial and get the library here: http://www.arduino.cc/playground/Code/Keypad
And if you want to use the example sketch they provide on the page you would connect the keypad as follows
Looking at the top of the keypad (key side) with the pins at the bottom from left to right you have pins 1-9 with pins 1 and 9 being null (not connected)
Ard - Keypad
2 - 5
3 - 7
4 - 8
5 - 3
6 - 6
7 - 2
8 - 4
Can anyone help? I've been pulling my hair out trying to figure out what I've messed up here. I wired the keypad exactly as noted below in previous comments: Ard - Keypad 2 - 5 3 - 7 4 - 8 5 - 3 6 - 6 7 - 2 8 - 4 (Including the resistors suggested in this article: http://bildr.org/2011/05/arduino-keypad/ And used the code in that article, which matches up with the code in the arduino page here: http://www.arduino.cc/playground/Code/Keypad
But when I check my work, I get the following outputs: Keypad entry -- Output 1 -- 1 2 -- 2 3 -- 3 4 -- 4 5 -- 5 6 -- 4 7 -- 4 8 -- 5 9 -- 6 * -- * 0 -- 0
--
I thought maybe I just got a defective piece, so I bought another one, and I got the same problem. Can anyone figure out why?
Thanks!
I created an awesome 3 digit sign for a club and Used this keypad with the arduino library. Worked very nice. buying another one to work with a remote control unit. Picture of the sign.
The spacing between the cheap pads are frustratingly small, meaning it's incredibly easy to short when soldering. Even with using pin headers I've had little luck in soldering this adequately.
If you buy this piece of garbage, you're definitely going to want to solder on pin headers. If you try to use wire, you're going to life those cheap solder pads almost instantly. I've gone through 3. Just use headers.
See my blog for an example of interfacing this keypad to a single I/O pin: http://www.technoblogy.com/show?NGM
Will the COM-10856 resistor network work for this?
A problem with the R-ladder is that with no button pressed, the "idle voltage" is too near one of the actual "key voltages". So, here's another approach.
Given the narrow spread between voltages, I've opted for using 1% resistors for this. They are available at Mouser.
Hookup: Connect a 27.4K resistor from pad 3 to GND Connect pad 3 to pad 1 with a 60.4K resistor Connect pad 1 to pad 5 with a 210K resistor Connect a 309K resistor from pad 2 to V+ Connect a 154K resistor from pad 7 to V+ Connect a 66.5K resistor from pad 6 to V+ Connect a 10.0K resistor from pad 4 to V+ Connect pad 3 to an analog input on the Arduino (or any 1024-bit ADC)
With this, the expected digital readings for the various keys are:
1: 82 ~ 85 4: 152 ~ 157 2: 223 ~ 230 7: 295 ~ 303 5: 367 ~ 377 3: 497 ~ 509 8: 576 ~ 590 6: 667 ~ 683 *: 742 ~ 759 9: 828 ~ 846 0: 909 ~ 929
: 980 ~ 1002
with a reading of zero if no key is pressed. The minimum gap between any two key reading ranges is 51.
Just as a help, I don't know if it is fully functional with this specific keypad, but their is a matrix keypad library and tutorial available in the Arduino playgroud
Anyone know when this will come back in stock?
Possibly before the end of Jan.?
For those having problems, and not wanting to have many cable crossings: Using the arduino keypad tutorial (with the keypad library), you can do a straight connection from pin 2 on keypad, pin 12 on arduino, then the last pin (pin 7) on keypad would go to arduino pin 6. (2 ends are NC)..
In this case the proper setup lines are: byte rowPins[ROWS] = { 11, 6, 7, 9 }; byte colPins[COLS] = { 10, 12, 8 };
If you want to start on pin 2, you would shift by 4 pins (pin 6->2, 7->3 .... 12 -> 8) .. Hope this helps, spent the last 30 minutes mapping this out :)
hello. I ordered a few of theese keypads via Robonor, Norway.
3 OF 4 doesnt work.
Key functions have been measured using a multimeter.
Is this a known problem?
Regards Jan Eikeland
I found these to work great with an arduino (AVR Atmega328) ... however I cant get it to work reliably with an uno32(pic32 processor) ... you may just be using a chip thats too fast or something ... it wouldnt matter howlong I debounced stuff for I could not get it to work reliably with the pic32
Note that when pressed, these keys may still show over 100 Ohms resistance (they are not switches so much as conductive rubber pads). This works perfectly fine for logic circuits, but they may not "beep" for a multimeter on the continuity setting. If you're using continuity, try measuring the resistance instead. Hope this helps!
Correct, they do not beep, but they show different resistance. I thought for a second that I got a dead keypad, but the other did the same thing. Works fine with an arduino :)
Hi Jan! Sorry to hear you are seeing problems with the keypads. Please contact us at techsupport@sparkfun.com so we can troubleshoot and help you out! It is not common for these to be bad. Please email us! :)
Anyone know when these are expected back in stock or anyone else who carries them?
Got one of these today.
Soldering is a bit tricky since the pads are so close together but with a little solder wick, I had it going on the first try. The sample code I used failed to set pin 13 to an output so I thought I was having problems when the led would not change state. Once I fixed that it was perfect. This thing would not survive an industrial environment for long but I was pleasantly surprised at both how quickly I was up and running and the fact that it is reasonably well constructed for $4.
Happy today with this and the other stuff I got!
How about a hexadecimal version, please?
I wish you had a cheap 4x4 pad and was a little bigger then this.... like number pad on a computer
Why not carrying membrane keypads? Cheap and sticks to a hard surface, such as an enclosure. They are way easier to understand regarding the connection.
Keypad I've received does not work at all... Metered it out: 4 buttons in total work :-(. Shipping it back oversees probably costs more than buying a more expensive one somewhere more closeby :-(
Hello. I have the same problem, I bought one of this and when I mounted in in project I found that bottons 4-5-6 not working. Sparkfun sent another one, I just finish it to mount the new keypad in my project and found the same, ramdoly botton 1 and 7 not work. Possible a bad lot.
I think part of the problem is the very cheap soldering pads on this. I lifted 2 pins while soldering and didn't notice. Took me awhile to figure out why a row of numbers was not working. From the comments it appears some others are having the same issues with the pads.
When will this be back in stock?
I need it for a project
I haven't seen anyone else talk about interfacing this with a PLD, so I thought I'd suggest it. You can get a PLD like the "ATF16V8BQL-15PU" for $1.60. Use the 7 outs of the keypad as ins for the PLD, make a truth table, and have the PLD output a 4 bit (HEX) number for each (Carnaugh maps may help, but I'm just gonna use maxterms). This would be much simpler to interface with an arduino than using another MCU in the middle. Here's code that I wrote that I haven't tested yet, but it should work. You do need a IC programmer.
Ok, it's late, and I realized that I'm going to have to write it out and look check it and what not to make sure it works, I'll reply to this later. I really do think this is the best method to decode this keypad though. It's a static decode, thus logic circuits should be used, not MCUs. Problems will arise if two buttons are pressed, but whatever.
So, looks like it'll be easier inverting the output, using negative logic (note the slash in front of the outs). These are the outputs, 0=0000, 1=0001... 9=1001, *=1010, #=1011. And otherwise (no buttons being pressed) = 1111. I'll be checking this in awhile, but I checked the hand work several times and believe this to be right.
edit: due to the formatting, I can't write it correctly. Replace the ' " ' with shift+8, the multiply symbol.
CHIP ID ATF16V8BQL;
Pin 1 Clk ; Clock pin
Pin 2 p1 ; pad 1
Pin 3 p2 ; pad 2
Pin 4 p3 ; pad 3
Pin 5 p4 ; pad 4
Pin 6 p5 ; pad 5
Pin 7 p6 ; pad 6
Pin 8 p7 ; pad 7
Pin 12 /out0 ; output 0
Pin 13 /out1 ; output 1
Pin 14 /out2 ; output 2
Pin 15 /out3 ; output 3
EQUATIONS
out0 = p1"p4 + p1"p2 + p3"p7 + p5"p7 + p1"p6 + p3"p4
out1 = p1"p4 + p2"p3 + p3"p7 + p1"p7 + p1"p6 + p5"p6
out2 = p1"p4 + p2"p3 + p1"p2 + p2"p5 + p1"p6 + p5"p6 + p3"p4 + p4"p5
out3 = p1"p4 + p2"p3 + p1"p2 + p2"p5 + p3"p7 + p1"p7 + p5"p7 + p3"p6
If you press two or more buttons on this thing, will you get ghost keys? Or is the matrix designed otherwise?
Had this working in a few hours, but ran into an issue where holding two more more buttons would cause unusual behavior. For some combinations, it would register the wrong button, other combinations it would do nothing. Undefined behavior is never desirable, so debugged it for a few hours and found the solution.
If you set all the columns to be "INPUTS", and use pull-down resistors, then set all the rows to be "OUTPUTS", with switching diodes, allowing those pins to transmit high, but not ground a low signal, then it is possible to identify the state of each individual button, even if more then one button is pushed at a time. Then the algorithm is basically to set all the rows LOW, then one by one, set each one HIGH and then back down to LOW. While its HIGH, check each of the column pins to see which button in that column is registering a HIGH (that button is pushed).
A few interesting notes:
* Depending on the pressure you put on the button, the resistance between the two connected pins will change. In other words, the less you push the button, the higher the resistance. I was not able to get a solid resistance free connection, even with tons of pressure (but it is very low resistance)
* When you push a button, it will fluctuate between connected and not connected for a few nanoseconds. As such, you will need to time the button and make sure its been depressed for somewhere around 30ms before you register it as a push. Otherwise you end up seeing the button get pushed a few times for every individual push.
Since it's in a matrix configuration with no multiplexing, if you push down 2 buttons it gets weird.
In case anyone is looking for a good tutorial, I wrote one !
A lot is covered along with how to use it with the Password library.
http://bildr.org/2011/05/arduino-keypad/
Hi asselinpaul,
I have become very frustrated while trying to build the project "What's the password? Arduino + Keypad". I did everything exactly as specified but when I downloaded the provided code, and then tried to compile it, this is the error that I received:
secret_keypad.cpp.o: In function
__static_initialization_and_destruction_0': secret_keypad.cpp:20: undefined reference to
Password::Password(char)'secret_keypad.cpp:37: undefined reference to
Keypad::Keypad(char*, unsigned char*, unsigned char*, unsigned char, unsigned char)' secret_keypad.cpp.o: In function
checkPassword()':secret_keypad.cpp:64: undefined reference to
Password::evaluate()' secret_keypad.cpp.o: In function
keypadEvent(char)':secret_keypad.cpp:51: undefined reference to
Keypad::getState()' secret_keypad.cpp:57: undefined reference to
Password::reset()'secret_keypad.cpp:58: undefined reference to
Password::append(char)' secret_keypad.cpp.o: In function
loop':secret_keypad.cpp:46: undefined reference to
Keypad::getKey()' secret_keypad.cpp.o: In function
setup':secret_keypad.cpp:42: undefined reference to `Keypad::addEventListener(void ()(char))'
I have no clue how to fix this, maybe you can help.
Thanks
ok, figured it out
It would be awesome for other people having the problem if you pointed out how you fixed it...
Dear all,
the first time i plugged the keypad to my circuit it worked. After testing it, 10 minutes later, the col3 didnt want to work. Later on i opened it and check out all the connections inside. I found out that this is a very basic and cheap model, but worht for 4$. After all i noticed that it is very sensitive on solder connections.
what i mean is that if you use more that 15W to solder then it might be possible to burn the pins.
I use one with 12W. Then i solder some pins in 1 to 7.
I have noticed and something else. The connections from 1 to 7 are very close. Even if you carefuly solder in there the pins, the keypad is very sensitive and can be sorted some pins.
Not real solder but the solderine out of the metal. that can cause a sort circuit. I havent found that before but yesterday i was playing and testing the keypad.
Now after a day my circuit works and the keypad is stable.
A very good discussion of this keyboard along with a well-documented sketch showing its use is provided on pages 149-152 of "Arduino Cookbook" by Michael Margolis.
This keypad works. However it took some time getting it to work. There's a lot of wrong information on the internet. My biggest mistake was involving pin 13, which has an LED on it on the Duemilinove and thus leaked to ground which resulted in oscilating readings.
I wired it up as follows:
keypad -> arduino
1 6
2 7
3 8
4 9
5 10
6 11
8 5 (bear in mind you could connect it to 12 but my RF unit was set to that)
The code uses the KeyPad library:
include
const byte ROWS = 4; //four rows
const byte COLS = 3; //four columns
//define the cymbols on the buttons of the keypads
char hexaKeys[ROWS][COLS] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};
byte rowPins[ROWS] = {7,5,11,9}; //This order is important if you use pin 12 instead of 5 change the 5 into 12
byte colPins[COLS] = {8,6,10}; //The order is important
//initialize an instance of class NewKeypad
Keypad cusomKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
void setup(){
Serial.begin(9600);
}
void loop(){
char customKey = cusomKeypad.getKey();
if (customKey != NO_KEY){
Serial.println(customKey);
}
}
I have created a datasheet that is LIKELY correct. I located a keypad that this is either a clone of or close enough that it is kinda silly. It appears to be an Accord Co. AK-304-N series keypad.
Big informative datasheet:
http://www.tenrod.com.au/pdf/accord/keypads.pdf
The datasheet I made (because the only images online were AWFUL) can be found here: COM-08653 Datasheet
The SVG I created can be found here:
COM-08653 SVG
I hope this is helpful to someone and PLEASE email me (email in the PDF) if I've made any mistakes! Oh, and if Sparkfun doesn't like this, I'll take it down.
I use this on a door with a small solenoid lock. It's a nice keypad.
Why does this product not have a datasheet? I'm trying to laser cut an enclosure but it has no info on the exact dimensions. At least give the company name so i can find a datasheet on their website.
Twizted:<br />
<br />
It is not clear for me how it can be connected to a computer? Is it a regular laptop numeric keypad?
It is not meant for connecting to a computer. Think of it as a lot of individual buttons. When you press '3', you need something on the other end to read the pins to see that it was '3' that was pressed. You will need some sort of microcontroller to read which pins are connected to determine which button gets pressed. For instance, if 2 and 3 are connected, you should be reading a '1'.
I just got this keypad and wired it up to an Arduino Duemilanove. I followed the instructable linked above (http://bit.ly/dkpYCY) and am having some weird problems.
I'm using the sample code provided in the instructable that outputs the characters of any button pressed to serial. It often prints two characters for a button that I only press once. For example, if I press each button once it should print out 1234567890# but it might print 1234456778990#. It doesn't seem to be a specific button, as I can sometimes push each button and get the correct output, but usually there are some errors. I can get duplicate characters with any button, too. The duplicate character, when it shows up, seems to come from releasing the button.
I've tried wiring it up using 1k resistors between pins 4, 6, 7, and 8 on the keypad as directed in the instructable and without and resistors, and I get the same behavior. Do I need resistors? I'm not exactly an electronics expert, but I'm slowly learning.
Does anyone have any ideas what might be wrong?
Thanks!
Make sure the button is stabilized.
This is what I use: (keypad1 to PA1, keypad2 to PA3 ...)
don't forget that Pin0 and Pin7 on keypad do not lead anywhere.
void initKeypad()
{
DDRA = 0b0101010; // keypad columns set as output
PORTA =0b1010101;
}
uint8_t getKey()
{
uint8_t n=0;
PORTA = 0b11011110;
n=PINA >> 1;
if (n!=111) return n;
PORTA = 0b11110110;
n=PINA >>1;
if (n!=123) return n;
PORTA = 0b11111100;
n=PINA >> 1;
if (n!=126) return n;
return 0;
}
sorry, Pin0 and Pin9
uint8_t readKey()
{
uint8_t k,tmp,i;
i=0;
k=0;
while (i<20)
{
k=getKey();
if (k==lastKeypadChar) return 0;
if (k==tmp)
{
i++;
} else {
i=0;
}
tmp = k;
}
lastKeypadChar = k;
if (k==134) return 0;
if (k==121) return '1';
if (k==124) return '2';
if (k==109) return '3';
if (k==59) return '4';
if (k==62) return '5';
if (k==47) return '6';
if (k==91) return '7';
if (k==94) return '8';
if (k==79) return '9';
if (k==115) return '*';
if (k==118) return '0';
if (k==103) return '#';
return 0;
}
http://www.corby.com/product/pricelst.php (Scroll down to the 7130 products)
I haven't bought this keypad assembly, so I can't say for sure, but it looks like it uses the same keypad as the one offered here. It's installed in a single-gang bezel with red, yellow, and green LED's, but doesn't include any sort of electronic brain - you have to provide your own. Perfect for a DIY alarm system! They also have versions with two LED's, eight LED's, and a few others.
A bezel or case for this would be nice. It'd be even nicer if the case included a hole for a lcd :D
I can confirm that the cover plate used for this item is designed to fit this keypad...
http://www.homedepot.com/webapp/wcs/stores/servlet/ProductDisplay?productId=100396591
Not only does it fit, it snaps into place and stays there. The question is, is it possible to just get the cover plate? I'd love to have a few more keypads for my Arduino-based alarm system :-}}
I found out that Home Depot links require a store ID, a language ID and a catalog ID. If you don't have it in cache or cookie it will error:
You should be able to get to it here:
http://www.homedepot.com/webapp/wcs/stores/servlet/ProductDisplay?storeId=10051&productId=100396591&langId=-1&catalogId=10053&
That link doesn't go anywhere for me, do you know the name of the plate? or a working link?
I had the same problem, but if you go to www.homedepot.com and in the search bar type the product id number he has listed, "100396591" the product comes right up.
The link still works for me.
When will this be in stock?
ive had no problems so far working with this keypad.
ive hooked it to a picaxe-14M which decodes the keypad and then sends the pressed key to my arduino through a Xbee link. i havent had a single time that a button did not respond so im very happy with this little cheap keypad.
can i get any more info on how you did this as i want to do something similar.
did you ever get more info?
I got one of these from www.allelectronics.com, but I had to pay $4.50 more there, although the design was admittedly better quality than this one.
here is the datasheet
http://sycelectronica.com.ar/electromecanicos/TECLA-TELEF.pdf
Hello all,
I've just bought one keyPad for connect this to Arduino. Well, after having many problems, I have tested all the combinations with the pins, and i think that my KeyPad is not working properly, the problem is that my rows 1 and 2 doesn't respond to no keys pressed.
Have anyone had this type of problem.
My tests with a continuity tester has been the folowing
KeyPad
col 0 3
col 1 1
col 2 5
row 0 2
row 1 7
row 2 6
row 3 4
I undestand that when a press the '4 key, I'll have a closed circuit between 3 and 7 pins of keypad, doesn't it.
Can Help me anyone.
Thanks.
Has anybody found a ready-made case for this (or similar keypad)? It's pretty labor-intensive making the case from scratch.