전자회로 실무 / 입력·펌웨어

여러 버튼(button)을 ADC(Analog-to-Digital Converter) 하나로 읽을 때는 중심값 대신 허용 전압 구간을 정합니다

입력 핀(pin)을 아끼면서 여러 버튼(button)을 읽으려면 저항마다 다른 전압을 만드는 회로를 ADC(Analog-to-Digital Converter) 하나에 연결할 수 있습니다. 실제 전압에는 부품 오차와 잡음이 섞이므로 버튼마다 숫자 하나만 지정해서는 오입력이 생길 수 있습니다. 버튼별 허용 전압 구간과 손을 뗀 상태·동시 누름 상태를 구분하는 방법을 설명합니다.

먼저 알아둘 용어

저항 네트워크·ADC(Analog-to-Digital Converter) 코드 — 저항 네트워크는 버튼 상태에 따라 다른 분압을 만드는 연결입니다. ADC 코드는 그 전압을 기준 전압에 대한 숫자로 표현한 값으로 실제 공차와 잡음 범위를 함께 고려해야 합니다.

히스테리시스(hysteresis)·디바운스(debounce) — 히스테리시스는 상태 진입과 해제 경계에 차이를 두어 경계 근처의 흔들림을 줄이는 방법입니다. 디바운스는 접점이 짧게 여러 번 튀는 구간을 안정된 한 번의 입력으로 처리합니다.

비율 측정·병렬 경로 — 버튼망 전원과 ADC 기준이 같으면 전원 변화 일부가 전압의 비율에서 상쇄될 수 있습니다. 두 버튼을 동시에 누르면 저항이 병렬이 되어 별도의 전압이 생길 수 있습니다.

버튼별 중심 전압 대신 오차를 포함한 허용 구간을 비교하는 방법입니다.
버튼별 중심 전압 대신 오차를 포함한 허용 구간을 비교하는 방법입니다. · 클릭하면 확대됩니다.

저항 연결을 정한 뒤 버튼별 전압을 계산합니다

예를 들어 ADC 노드(node)를 10 kΩ으로 3.3 V에 풀업(pull-up)하고, 여섯 버튼 각각이 서로 다른 저항을 통해 그 노드를 GND(Ground)로 연결하는 구조를 생각합니다. 버튼 아래쪽 저항을 0 Ω·1 kΩ·2.2 kΩ·4.7 kΩ·10 kΩ·22 kΩ으로 가정하면 한 버튼만 누른 이상적인 전압은 다음과 같습니다. 아래는 설계 계산 예시이며 측정 결과나 모든 부품에 적용할 권장값은 아닙니다.

상태아래쪽 저항이상적인 ADC 노드 전압
버튼 10 Ω0 V
버튼 21 kΩ0.300 V
버튼 32.2 kΩ약 0.595 V
버튼 44.7 kΩ약 1.055 V
버튼 510 kΩ1.650 V
버튼 622 kΩ약 2.269 V
누르지 않음개방3.300 V

전압은 3.3×아래쪽 저항/(10 kΩ+아래쪽 저항)으로 계산합니다. 실제 판정 범위는 풀업과 아래쪽 저항의 공차, 접점 저항, ADC 잡음·정착을 포함해 이 표와 별도로 정합니다. 버튼을 누르지 않았을 때 걸리는 전원 전압이 ADC 허용 범위와 맞는지도 확인합니다.

버튼을 전원 쪽에 연결하면 무입력 전압이 0 V가 됩니다

위의 계산 예시에서는 ADC 입력을 풀업 저항으로 3.3 V에 연결하고, 버튼을 누르면 저항을 거쳐 접지로 전류가 흐릅니다. 반대로 배선할 수도 있습니다. ADC 입력에 풀다운 저항(pull-down resistor)을 달아 평소에는 접지 전압인 0 V로 유지하고, 각 버튼은 서로 다른 저항을 거쳐 전원에 연결합니다. 풀다운 저항이 없으면 버튼을 모두 뗐을 때 입력이 떠서 잡음에 따라 값이 흔들릴 수 있습니다.

전원 쪽의 여섯 버튼 저항이 공통 ADC 입력에 모이고, 입력의 풀다운 저항이 접지로 이어지는 구조
전원 쪽의 여섯 버튼 저항이 공통 ADC 입력에 모이고, 입력의 풀다운 저항이 접지로 이어지는 구조 · 클릭하면 확대됩니다.

버튼 하나만 눌렀을 때는 그 버튼의 저항과 풀다운 저항이 분압기를 이룹니다. 전원 전압을 VCC, 누른 버튼 쪽 저항을 R버튼, 풀다운 저항을 R풀다운이라고 두면 VADC = VCC × R풀다운 / (R버튼 + R풀다운)입니다. R풀다운이 같다면 버튼 쪽 저항이 작을수록 ADC 전압이 높습니다. 아무 버튼도 누르지 않은 상태는 이론상 0 V입니다. 따라서 앞의 풀업 회로용 전압표를 이 회로에 그대로 사용하면 버튼 상태를 잘못 판정합니다.

두 버튼을 동시에 누르면 전원에서 ADC 입력으로 향하는 두 버튼 저항이 병렬이 됩니다. 위 식의 R버튼 자리에 두 저항의 병렬값을 넣어 계산할 수 있지만, 그렇게 얻은 전압이 다른 단일 버튼의 허용 구간과 겹칠 수 있습니다. 실제 사용할 저항값을 정한 뒤 무입력·각 단일 버튼·가능한 동시 누름의 전압 구간을 계산하고 보드에서 측정하십시오. ADC 기준 전압이 버튼망의 전원과 같은지, 입력 전압이 A0 핀의 허용 범위를 넘지 않는지도 먼저 확인합니다. 이후의 디바운스와 허용 구간 판정은 앞에서 설명한 방법대로 적용합니다.

작동 원리

각 버튼이 다른 분압을 만들면 한 ADC로 여러 상태를 구분할 수 있습니다. 버튼을 판별할 때는 계산한 전압 하나가 아니라, 저항 오차와 ADC 잡음, 접점 저항 때문에 달라질 수 있는 전압 범위를 사용합니다. 동시에 두 버튼을 누르면 새 병렬 경로가 만들어져 다른 단일 버튼처럼 보일 수 있습니다.

적용 순서

  1. 무입력과 각 단일 버튼의 실제 전압·ADC 코드를 기록합니다. 전원과 온도, 저항 공차에 따른 최소·최대 구간을 계산하거나 측정합니다.
  1. 서로 이웃한 상태의 구간 사이에 여유를 두고 판정 경계를 정합니다. 기준 전압과 버튼망 전원이 같다면 비율 측정의 이점을 활용하되 절대값을 무조건 고정하지 않습니다.
  1. 연속된 여러 샘플이 같은 구간에 들어올 때만 상태를 바꾸고, 눌림과 해제에 히스테리시스·디바운스를 둡니다.
  1. 가능한 동시 누름 상태를 시험합니다. 지원하지 않을 상태는 오류/무효로 처리하고 단일 버튼으로 잘못 해석되지 않는지 확인합니다.

적용 조건과 한계

저항 네트워크에 긴 배선이 붙으면 잡음·입력 정착·정전기 보호 조건이 추가됩니다. 보호소자와 필터(filter)의 누설·용량도 전압 구간과 응답에 영향을 줍니다.

동시 누름이 항상 무효 구간으로 나타나지는 않습니다. 위 계산 예시에서 0 Ω 버튼과 다른 버튼을 함께 누르면 0 Ω 버튼 하나와 같은 전압이므로 ADC만으로 구분할 수 없습니다. 지원하지 않는 조합이 단일 명령으로 겹치는지 실제 저항 네트워크로 확인합니다. 조합 식별이나 중요한 명령의 독립성이 필요하면 별도 입력 또는 적합한 키 매트릭스(matrix) 방식과 요구사항을 비교합니다.

확인과 기록

각 버튼 상태에서 측정된 코드의 최솟값과 최댓값을 기록하고, 이웃 버튼으로 판정될 경계까지 얼마나 여유가 있는지 확인합니다. 노이즈가 많은 상태에서도 버튼 하나가 다른 버튼으로 판정되지 않는지 반복 확인합니다.

작업 순서를 다시 확인합니다

여러 버튼을 ADC 하나로 읽을 때는 중심값 대신 허용 전압 구간을 정합니다 — 설명용 도해
여러 버튼을 ADC 하나로 읽을 때는 중심값 대신 허용 전압 구간을 정합니다 — 설명용 도해 · 클릭하면 확대됩니다.