Interface multiple keys with one wire and save pins of MCU

Usually keyboard is connected by using matrix type of connection – rows and columns. For instance for 12 button keyboard wee need 3+4 digital inputs of microcontroller. There is a way to build keyboard and connect to microcontroller using only one wire. For this we will need only signal wire, power and ground and of course microcontroller must have analog ADC input. One wire keypad circuit:

one_wire_keypad.gif

Circuit is nothing more than simples digital to analog converter. Microcontroller reads voltage from signal line and calculates which key is pressed. Lets see how it works. If no any of keys have been pressed, then line has voltage equal to power source. If any key is pressed, voltage divider divides the voltage according to resistor connected to this button. Capacitor works as filter of mechanical noise during button contact. This way microcontroller can check the voltage of signal line and calculate which button is pressed.

How to choose resistors? For this first we have to select pull up resistor first. In this example is 10kOm. Some ADC may require lower input resistance to maintain desired conversion speed. But if you want to make really low power application, you can increase pull-up resistance and decrease conversion speed.

Further we have to divide voltage in even intervals with keyboard resistors. If B size of interval, K – number of keys, N – number of ADC bits, then: B=2N/K. If ADC resolution is 10 bit and wee have 8 keys, so wee will have B=1024/8=128 voltage steps for one interval. As key value is in the middle of interval then its value will be: XK=KB+B/2.

Resistor values needed for each key: RK=(XKR1)(2N-XK). This is why first resistor has value of 667Ohm, second 23080Ohm and so on. Closes values are displayed in schematic. In this case for 8 keys minimal accuracy of resistors is 1/8=12.5% so in reality 5% accuracy resistors will do the job. If there will be more keys used like 16 and more, then choose more accurate resistors like 1%.

This keyboard can be used in low power devices because while buttons isn’t pressed there is no current required. ADC input can be configured as interrupt activated when any button is pressed. Otherwise microcontroller can be in stand by mode. I find this handy solution with AVR Tiny microcontrollers like Attiny15L where overall number of pins is 8. And for big number of keys you will only need one pin.

Ideas came from: pcb.by.ru

Blogsphere: TechnoratiFeedsterBloglines
Bookmark: Del.icio.usSpurlFurlSimpyBlinkDigg
RSS feed for comments on this post
 |  TrackBack URI for this post

New on WinAVR Tutorial
Running TX433 and RX433 RF modules with AVR microcontrollers,
Sometimes in embedded design you may want to go wireless. Might be you will want to log various readi …
Programming AVR ADC module with WinAVR,
Most of AVR microcontrollers have Analog to Digital Converter (ADC) integrated in to chip. Such solut …
New on WinARM Tutorial
What are differences between WinARM and WinAVR,
Everyone who is working with AVR microcontrollers knows this powerful tool – WinAVR (http://win …
LPC2000 watchdog timer,
As in all microcontrollers watchdog timers purpose isto reset microcontroller after reasonable amount …

3 Responses to “Interface multiple keys with one wire and save pins of MCU”

  1. amin Says:

    hello
    How can push multi keys in the same time and detecr what keys are push and send to the ar micro?
    thanks

  2. scienceprog Says:

    Well if you push multiple keys than you will get summary voltage. If there will be few buttons you might will be able to decode(Just a thought). But in fact this circuit is to work with one button at one time.

  3. Sanoop Says:

    Hello Sir,
    I too have the same doubt as Amin. What if more than one key is pressed. I am planning to interface a keypad of 30/40 keys. is it feasible using this design. If not kindly give me an alternative.
    Regards
    Sanoop B
    SIL

Leave a Reply