내장 ADC 없는 라즈베리 파이에서 아날로그 센서 측정하기
배경
라즈베리 파이에는 내장 아날로그 입력이 없지만, 그렇다고 아날로그 센서를 읽을 수 없는 것은 아닙니다. 몇 개의 저항과 커패시터를 조합해 간단한 스텝 응답 기법을 사용하면 저항을 측정할 수 있습니다. 이는 포텐셔미터, 포토레지스터, 서미스터 등에 이상적입니다.
이 접근법은 Adafruit 튜토리얼과 Raspberry Pi Cookbook에서 대중화되었으며, 커패시터가 임계값을 넘어 충전되는 데 걸리는 시간을 측정합니다. 라즈베리 파이의 GPIO 핀은 전압이 ~1.65V를 초과하는 순간을 감지해 연결된 가변 저항의 저항값을 추론할 수 있습니다.
필요한 것들
- 표준 브레드보드와 점퍼 와이어
- 10kΩ 트림팟 (포텐셔미터)
- 1kΩ 저항 2개
- 220nF 커패시터
파이썬 코드
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
# 핀 할당
A_PIN = 18 # 커패시턴스 방전/충전 제어
B_PIN = 23 # 전압 임계값 감지
def discharge():
GPIO.setup(A_PIN, GPIO.IN)
GPIO.setup(B_PIN, GPIO.OUT)
GPIO.output(B_PIN, False)
time.sleep(0.005)
def charge_time():
GPIO.setup(B_PIN, GPIO.IN)
GPIO.setup(A_PIN, GPIO.OUT)
count = 0
GPIO.output(A_PIN, True)
while not GPIO.input(B_PIN):
count += 1
return count
def analog_read():
discharge()
return charge_time()
try:
while True:
print(analog_read())
time.sleep(1)
except KeyboardInterrupt:
GPIO.cleanup()
스크립트 실행 시 다음과 유사한 출력이 나옵니다:
$ sudo python pot_step.py
101
210
101
623
435
367
728
610
512
314
317
0
포텐셔미터 노브를 돌리면 판독값이 대략 10~170 사이로 변동하며 가변 저항을 반영합니다.
작동 원리
이 기법은 RC 충전 곡선에 의존합니다. 커패시터가 가변 저항과 연결되면 전압이 지수적으로 상승합니다. GPIO 핀은 커패시터 전압이 입력 임계값(~1.65V)을 초과하면 논리 HIGH로 인식합니다. 루프 반복 횟수로 측정된 경과 시간은 저항과 직접적 상관관계가 있습니다: 저항이 낮을수록 충전이 빨라 더 작은 카운트값이 나옵니다.
파이에 아날로그-디지털 컨버터가 없기 때문에 이 타이밍 방식이 그런 한계를 우회해 다양한 아날로그 센서를 비용 효율적이고 신뢰성 있게 읽는 방법을 제공합니다.