Go Down

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

#### liuzengqiang

##### Apr 12, 2012, 06:20 pm
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.
Serial LCD keypad panel,phi_prompt user interface library,SDI-12 USB Adapter

#### robtillaart

#1
##### Apr 12, 2012, 06:50 pmLast 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

#2
##### Apr 12, 2012, 07:00 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!

Rob Tillaart

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

#### robtillaart

#3
##### Apr 12, 2012, 07:06 pm

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

#4
##### Apr 12, 2012, 07:21 pm
In theory you could get away with no more than two analog pins, I believe...
http://embodimentlabs.tumblr.com/
http://paulstrohmeier.info/

#### robtillaart

#5
##### Apr 12, 2012, 08:31 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 ....

Rob Tillaart

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

#### fkeel

#6
##### Apr 12, 2012, 09:26 pm
I had not even considered that. I *like* that approach....  :-)
http://embodimentlabs.tumblr.com/
http://paulstrohmeier.info/

#### liuzengqiang

#7
##### Apr 12, 2012, 10:47 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.
Serial LCD keypad panel,phi_prompt user interface library,SDI-12 USB Adapter

#### robtillaart

#8
##### Apr 13, 2012, 10:51 am
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)

#### liuzengqiang

#9
##### Apr 13, 2012, 03:54 pm
Thanks Rob!
Serial LCD keypad panel,phi_prompt user interface library,SDI-12 USB Adapter

Go Up