기초 · 난이도 보통
5V 센서를 3.3V 피코에 안전하게 잇는 분압 저항 계산과 되돌리기
MQ 가스 센서, 초음파 센서처럼 5V 신호를 내는 센서를 피코에 잇는 가장 간단한 방법은 저항 두 개로 전압을 나누는 거예요. 계산식, 10kΩ·20kΩ 조합을 쓰는 이유, 코드에서 원래 전압으로 되돌리는 법, 저항을 크게 해야 할 때와 레벨 변환기가 나은 때를 정리했어요.
왜 나눠야 하나
아두이노 우노는 5V로 동작해서, 아두이노용 센서 모듈 중에는 5V 전원을 받아 0~5V 신호를 내는 것이 많아요. MQ 가스 센서의 AO, 탁도 센서, ACS712 전류 센서, HC-SR04의 Echo가 그래요. 피코의 핀은 3.3V가 기준이라, 이런 신호를 그대로 넣으면 아날로그 입력은 3.3V 넘는 부분을 읽지 못하고 핀이 망가질 수도 있어요(피코 핀 지도 참고).
센서를 3.3V로 켜면 되지 않을까 싶지만, MQ 센서의 히터나 초음파 센서처럼 5V가 있어야 제대로 동작하는 부품이 있어요. 그래서 전원은 5V로 주고, 나오는 신호만 3.3V 아래로 줄이는 방법을 써요.
저항 두 개로 나누기
저항 두 개를 직렬로 이으면, 가운데 점의 전압은 두 저항의 비율대로 나뉘어요.
출력 전압 = 입력 전압 × R2 ÷ (R1 + R2)
R1은 센서 쪽(위), R2는 GND 쪽(아래) 저항이에요. 이 자료실은 R1 = 10kΩ, R2 = 20kΩ을 많이 써요. 비율이 20 ÷ 30 = 2/3이라, 5V가 들어오면 약 3.33V가 나와요. 피코 ADC가 읽는 끝(3.3V)과 거의 같아서 측정 범위를 거의 다 쓸 수 있어요.
배선은 이렇게 해요.
| 연결 | 비고 |
|---|---|
| 센서 출력 → 10kΩ 한쪽 | 위 저항(R1) |
| 10kΩ 다른 쪽 = 나눔 점 → 피코 ADC 핀 | 이 점의 전압을 읽어요 |
| 나눔 점 → 20kΩ → GND | 아래 저항(R2) |
시나브로 PICO 브레드보드 작업대에서 5V 센서를 꽂으면, 이 두 저항이 들어갈 칸과 순서가 [따라 꽂기]에 함께 나와요.
코드에서 되돌리기
피코가 읽은 값은 나뉜 뒤의 전압이에요. 센서가 실제로 낸 전압을 알고 싶으면 나눈 비율의 역수를 곱해요. 2/3으로 나눴으니 1.5를 곱하면 돼요.
from machine import ADC, Pin
import time
R1 = 10000 # 센서 쪽 저항(Ω)
R2 = 20000 # GND 쪽 저항(Ω)
k = (R1 + R2) / R2 # 되돌리는 배율 = 1.5
sensor = ADC(Pin(26)) # 센서 출력 → 10kΩ → GP26 → 20kΩ → GND
for i in range(5):
raw = sensor.read_u16()
pin_v = raw * 3.3 / 65535 # 피코 핀에 걸린 전압
real_v = pin_v * k # 센서가 낸 전압
print(f"DATA: raw={raw}, pin_v={pin_v:.2f}, sensor_v={real_v:.2f}")
time.sleep(1)
저항에는 오차가 있어요. 흔한 탄소 피막 저항은 ±5%라서, 10kΩ이 9.5kΩ일 수도 10.5kΩ일 수도 있어요. 정확한 전압이 필요하면 멀티미터로 두 저항을 재서 R1, R2에 그 값을 넣어요. 1% 금속 피막 저항을 쓰면 오차가 줄어요.
저항 값은 왜 수십 kΩ일까
비율만 맞으면 1kΩ·2kΩ도, 100kΩ·200kΩ도 똑같이 2/3이에요. 그런데 값의 크기에 따라 생기는 일이 달라요.
- 너무 작으면 두 저항으로 전류가 많이 새요. 5V에 1kΩ·2kΩ이면 약 1.7mA가 흘러요. 센서 출력이 이 전류를 감당하지 못하면 전압이 내려가요.
- 너무 크면 ADC가 값을 읽는 짧은 순간에 필요한 전하를 저항이 빨리 채워 주지 못해 값이 흔들리거나 낮게 나와요. 이럴 때는 ADC 핀과 GND 사이에 0.1µF 콘덴서를 달아 저장고로 써요.
10kΩ·20kΩ은 흐르는 전류가 약 0.17mA로 작으면서, 대부분의 센서 모듈 출력과 ADC 사이에서 무리가 없는 크기예요. 다만 센서 자체의 저항이 아주 큰 경우(예: 수백 kΩ에서 MΩ까지 변하는 MiCS-6814)에는 분압 저항이 센서 출력을 눌러 버려요. 그런 센서는 비율은 그대로 두고 저항을 10배(100kΩ·200kΩ) 키우고 콘덴서를 함께 달아요.
디지털 신호도 같은 방법으로
5V로 켜고 꺼지는 디지털 신호도 분압으로 낮출 수 있어요. HC-SR04 초음파 센서의 Echo는 1kΩ·2kΩ으로 나눠 GP 핀에 넣어요. 5V가 약 3.3V가 되니 피코가 1로 읽어요. 펄스 시간을 재는 센서는 신호가 빠르게 바뀌어서, 너무 큰 저항은 신호 모서리를 무디게 만들 수 있어요. 그래서 Echo에는 작은 값(1kΩ·2kΩ)을 써요.
분압으로 안 되는 경우
분압은 센서 → 피코 한 방향 신호에만 써요. 다음 경우에는 레벨 변환기(양방향 레벨 시프터)를 써요.
- 5V로 동작하는 I²C 모듈(예: 5V로 켠 LCD1602 I²C 백팩)처럼 같은 선으로 신호가 양쪽으로 오가는 경우
- 피코가 5V 장치에 신호를 보내야 하는데, 그 장치가 3.3V를 1로 알아듣지 못하는 경우
- 아주 빠른 신호(수 MHz)
반대로 피코의 3.3V 출력을 5V 장치가 1로 알아듣는 경우가 많아서(예: 많은 5V 모듈의 입력), 피코 → 센서 방향은 그대로 잇는 경우가 많아요. 모듈 설명서에서 입력 문턱 전압을 확인해요.
자주 하는 실수
- R1과 R2를 바꿔 꽂기. 20kΩ이 위, 10kΩ이 아래면 비율이 1/3이 돼요. 값이 생각보다 훨씬 작게 나오면 이걸 의심해요.
- 아래 저항의 GND를 빼먹기. 나눔이 안 되고 센서 전압이 그대로 들어가요.
- 되돌리는 배율을 잊기. 피코가 읽은 전압을 센서 전압으로 착각하면 모든 계산이 2/3로 작아져요.
- 분압한 선을 I²C에 쓰기. I²C는 양방향이라 분압으로 해결되지 않아요.
- 저항 색띠를 잘못 읽기. 10kΩ은 갈색·검정·주황, 20kΩ은 빨강·검정·주황이에요. 헷갈리면 멀티미터로 재요.
더 알아보기
- 기초 글: 피코 핀 지도, 브레드보드 처음 쓰기, 센서 값을 믿을 수 있게
- 이 방법을 쓰는 센서 글: MQ-2 가스 센서, MQ-135 공기질 센서, PPD42NS 먼지 센서
- 공식 자료: Raspberry Pi "RP2350 datasheet"(ADC 입력 범위, 핀 전압 조건)