Central MN, USA
Offline
Faraday Member
Karma: 37
Posts: 6042
Phi_prompt, phi_interfaces, phi-2 shields, phi-panels
|
 |
« on: April 12, 2012, 11:20:06 am » |
Someone was asking for a solution to sensing 48 buttons. I thought since I might need a solution to a similar problem, I mocked up a diagram that uses 1 analog pin, 8 digital pins, and 7 resistors. Will it work?
The digital pins will be pulled to GND for the active column and left in tri-state for non-active columns.
Thanks.
|
|
|
|
|
Logged
|
|
|
|
|
Netherlands
Offline
Tesla Member
Karma: 100
Posts: 9548
In theory there is no difference between theory and practice, however in practice there are many...
|
 |
« Reply #1 on: April 12, 2012, 11:50:52 am » |
Yes, you must scan allong the pins to see which row has a pressed button. something like this (not tested) int keypress() { int x; int row = -1; int key; for (int i=0; i< 8; i++) { digitalWrite(pin[i], HIGH); x= analogRead(A0); digitalWrite(pin[i], LOW); if (x < THRESHOLD) { row = i; break; } }
if (row > -1) { return 8*row + lookup(x); // to do ;) } return -1; }
|
|
|
|
« Last Edit: April 12, 2012, 11:56:45 am by robtillaart »
|
Logged
|
|
|
|
|
Netherlands
Offline
Tesla Member
Karma: 100
Posts: 9548
In theory there is no difference between theory and practice, however in practice there are many...
|
 |
« Reply #2 on: April 12, 2012, 12:00:35 pm » |
you could also use a shift register serial in parallel out (needs 3 lines IIRC) - http://arduino.cc/en/Tutorial/ShiftOut - shift in 1 bit high and then clock it from bit 0 to 7 - don't use shiftOut() but do the clocking in your own pace!
|
|
|
|
|
Logged
|
|
|
|
|
Netherlands
Offline
Tesla Member
Karma: 100
Posts: 9548
In theory there is no difference between theory and practice, however in practice there are many...
|
 |
« Reply #3 on: April 12, 2012, 12:06:19 pm » |
how about this project 64 using a MCP23S17 - http://www.spikenzielabs.com/SpikenzieLabs/Project_64.html - there are some nice videos too 
|
|
|
|
|
Logged
|
|
|
|
|
Offline
God Member
Karma: 2
Posts: 635
a, b = b, a+b
|
 |
« Reply #4 on: April 12, 2012, 12:21:22 pm » |
In theory you could get away with no more than two analog pins, I believe...
|
|
|
|
|
Logged
|
|
|
|
|
Netherlands
Offline
Tesla Member
Karma: 100
Posts: 9548
In theory there is no difference between theory and practice, however in practice there are many...
|
 |
« Reply #5 on: April 12, 2012, 01:31:44 pm » |
in theory with one analog pin and 48 very precize resistors, say 100 ohm + 5240 ohm
would give 48 steps from 0 to 500 in analogRead => so diff between 2 values is about 10 - just larger than noise (~2 bits)
advantage is that the SW would become very simple: button = analogRead(A0) / 10;
However in practice ....
|
|
|
|
|
Logged
|
|
|
|
|
Offline
God Member
Karma: 2
Posts: 635
a, b = b, a+b
|
 |
« Reply #6 on: April 12, 2012, 02:26:14 pm » |
I had not even considered that. I *like* that approach.... :-)
|
|
|
|
|
Logged
|
|
|
|
|
Central MN, USA
Offline
Faraday Member
Karma: 37
Posts: 6042
Phi_prompt, phi_interfaces, phi-2 shields, phi-panels
|
 |
« Reply #7 on: April 12, 2012, 03:47:37 pm » |
Rob, Thanks for the link. There's no code on the site though. I was a bit concerned when driving with a port extender but since this extender has an open-drain mode, there won't be problems. Still one needs to use it so inactive columns are not driven to opposite polarity. It would short if you drive column 0 to high and 1 to low and hold two buttons one from column 0 and one from 1. If I use arduino pins under tri-state mode, the problem is solved. I think I will give my own schematic a try with a membrane matrix keypad. I have a bunch at home. Next time I order from digikey, I'll grab a few of those port extenders. 
|
|
|
|
|
Logged
|
|
|
|
|
|
|
Central MN, USA
Offline
Faraday Member
Karma: 37
Posts: 6042
Phi_prompt, phi_interfaces, phi-2 shields, phi-panels
|
 |
« Reply #9 on: April 13, 2012, 08:54:50 am » |
Thanks Rob!
|
|
|
|
|
Logged
|
|
|
|
|
|