Go Down

Topic: An analog keypad. Will it work? (Read 1 time) previous topic - next topic

liudr

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.

robtillaart

#1
Apr 12, 2012, 06:50 pm Last Edit: Apr 12, 2012, 06:56 pm by robtillaart Reason: 1
Yes, you must scan allong the pins to see which row has a pressed button.

something like this (not tested)
Code: [Select]

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;
}
Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

robtillaart

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!

Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

robtillaart


how about this project 64 using a MCP23S17  - http://www.spikenzielabs.com/SpikenzieLabs/Project_64.html -

there are some nice videos too ;)
Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

fkeel

In theory you could get away with no more than two analog pins, I believe...
http://embodimentlabs.tumblr.com/
http://paulstrohmeier.info/

robtillaart

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 ....

Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

fkeel

I had not even considered that. I *like* that approach....  :-)
http://embodimentlabs.tumblr.com/
http://paulstrohmeier.info/

liudr

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. :)

robtillaart

it is not visible as a hyperlink, just click on the filename and you fly to - http://www.spikenzielabs.com/SpikenzieLabs/Project_64_files/Button64v4.pde -
Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

liudr


Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy