Interface multiple keys with one wire and save pins of MCU

12,555

Circuit Image

A keyboard is typically connected using a matrix configuration of rows and columns. For example, a 12-button keyboard requires 3 to 4 digital inputs from a microcontroller. However, it is possible to construct a keyboard that connects to a microcontroller using only one wire. This setup necessitates a signal wire, power, and ground, and the microcontroller must have an analog ADC input. The one-wire keypad circuit functions as a simple digital-to-analog converter. The microcontroller reads the voltage from the signal line to determine which key is pressed. When no keys are pressed, the line voltage equals the power source voltage. If a key is pressed, a voltage divider alters the voltage based on the resistor connected to that button. A capacitor serves as a filter for mechanical noise during button contact. This allows the microcontroller to monitor the signal line voltage and identify which button is pressed.

To select resistors, the pull-up resistor must be chosen first; a common value is 10 kΩ. Some ADCs may require lower input resistance to achieve the desired conversion speed. However, for low-power applications, increasing the pull-up resistance can reduce conversion speed. The voltage must be divided into even intervals with keyboard resistors. If B represents the size of the interval, K is the number of keys, and N is the number of ADC bits, then the equation is B = 2^N / K. For a 10-bit ADC with 8 keys, B equals 1024 / 8, resulting in 128 voltage steps per interval. The key value is positioned in the middle of the interval, calculated as XK = K * B / 2. The resistor values needed for each key can be determined using the formula RK = (XK * R1) / (2^N - XK). Consequently, the first resistor value is 667 Ω, the second is 23080 Ω, and so on. The closest values are displayed in the schematic. In this scenario, with 8 keys, the minimal accuracy for resistors is 1/8, or 12.5%, thus 5% accuracy resistors are adequate. For configurations with more keys, such as 16 or more, selecting resistors with 1% accuracy is advisable. This keyboard design is suitable for low-power devices since no current is drawn when buttons are not pressed. The ADC input can be configured to activate interrupts when any button is pressed, allowing the microcontroller to remain in standby mode. This solution is particularly effective with AVR Tiny microcontrollers, such as the Attiny15L, which have a total of 8 pins, requiring only one pin for a larger number of keys.

The one-wire keypad circuit design is an efficient method for interfacing multiple buttons with minimal pin usage on a microcontroller. By employing a voltage divider network, the circuit effectively translates button presses into distinct voltage levels that the ADC can interpret. The choice of resistor values is critical to ensure accurate readings, with the arrangement allowing for a clear distinction between the voltage levels corresponding to different keys. The capacitor included in the design plays a vital role in filtering out transient signals caused by mechanical bounce, enhancing the reliability of key detection. This approach reduces the complexity of wiring and simplifies the design of user interfaces in embedded systems, making it particularly advantageous for compact or resource-constrained applications. The overall architecture promotes low power consumption, which is essential for battery-operated devices, thereby extending the operational life of such systems.Usually keyboard is connected by using matrix type of connection a‚ 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: 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 a‚ number of keys, N a‚ 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. We aim to transmit more information by carrying articles. Please send us an E-mail to wanghuali@hqew. net within 15 days if we are involved in the problems of article content, copyright or other problems.

We will delete it soon. 🔗 External reference