- 들어가며 — HC-SR04를 라즈베리파이에 그대로 꽂았습니다
- 로직 레벨이란 무엇인가 — VIH와 VIL
- 3.3V 출력이 5V 입력에서 읽히는 이유, 반대가 안 되는 이유
- 5V가 3.3V 핀에 들어가면 실리콘에서 벌어지는 일
- 보드별 로직 레벨 표
- 저항 분압 — 싸지만 입력 전용이고 빠른 신호에서 무너집니다
- MOSFET 양방향 시프터와 전용 IC
- I2C는 왜 다른가 — 오픈 드레인 버스
- 마치며 — 전원 핀의 전압과 신호 핀의 전압은 다른 숫자입니다
들어가며 — HC-SR04를 라즈베리파이에 그대로 꽂았습니다
초음파 거리 센서 HC-SR04는 아두이노 입문 키트에 거의 항상 들어 있습니다. 핀이 네 개입니다. VCC, GND, TRIG, ECHO. 예제 코드도 열 줄이면 끝납니다.
라즈베리파이로 같은 것을 해 보기로 합니다. 5V 핀에 VCC, GND에 GND, GPIO23에 TRIG, GPIO24에 ECHO를 연결합니다. 논리적으로 아무 문제가 없어 보입니다. 스크립트를 돌립니다. 거리가 나옵니다. 잘 됩니다.
그리고 며칠 뒤, 또는 몇 시간 뒤, GPIO24가 죽습니다. 값이 항상 0이거나 항상 1입니다. 다른 핀으로 옮기면 다시 잘 됩니다. 그 핀도 얼마 뒤 죽습니다.
원인은 코드가 아니라 한 줄의 사실입니다. HC-SR04는 5V 부품이고, ECHO 핀은 5V로 출력합니다. 라즈베리파이의 GPIO는 3.3V 소자이고 5V를 견디지 못합니다.
이 글에서 다룰 내용은 그 "견디지 못한다"가 정확히 무슨 뜻인가입니다. 그리고 견디게 만드는 방법들을 각각의 한계와 함께 보겠습니다.
로직 레벨이란 무엇인가 — VIH와 VIL
디지털이라는 말이 오해를 만듭니다. 핀 안쪽에서 오가는 것은 0과 1이 아니라 전압이고, 0과 1은 그 전압을 어떤 기준으로 해석한 결과입니다.
해석 기준은 데이터시트에 두 개의 숫자로 적혀 있습니다.
VIH는 입력이 HIGH로 확실히 인식되는 최소 전압입니다. VIL은 LOW로 확실히 인식되는 최대 전압입니다. 그 사이는 아무것도 보장되지 않는 구간입니다.
출력 쪽에도 대응하는 두 숫자가 있습니다. VOH는 출력이 HIGH일 때 보장하는 최소 전압, VOL은 LOW일 때 보장하는 최대 전압입니다.
두 칩을 연결한다는 것은 결국 이런 비교입니다. 보내는 쪽의 VOH가 받는 쪽의 VIH보다 큰가, 그리고 보내는 쪽의 VOL이 받는 쪽의 VIL보다 작은가. 두 조건이 모두 참이면 통신이 됩니다.
실제 값을 보겠습니다.
| 소자 | 동작 전압 | VIH (HIGH 최소) | VIL (LOW 최대) | 기준 |
|---|---|---|---|---|
| ATmega328P (아두이노 우노) | 5V | 3.0V | 1.5V | 0.6 배 / 0.3 배 |
| 74HC 계열 CMOS | 5V | 3.5V | 1.5V | 0.7 배 / 0.3 배 |
| 74HCT 계열 | 5V | 2.0V | 0.8V | TTL 호환 고정값 |
| BCM2835 (라즈베리파이) | 3.3V | 2.31V | 0.99V | 0.7 배 / 0.3 배 |
| ESP32 | 3.3V | 2.475V | 0.825V | 0.75 배 / 0.25 배 |
같은 5V 소자인데 ATmega328P는 3.0V, 74HC는 3.5V입니다. 이 0.5V 차이가 다음 절의 주제를 갈라 놓습니다.
3.3V 출력이 5V 입력에서 읽히는 이유, 반대가 안 되는 이유
3.3V에서 5V로 보내기 — 대체로 됩니다
3.3V 소자가 HIGH를 출력하면 대략 3.2V에서 3.3V가 나옵니다. 이 신호를 5V 아두이노가 받으면,
받은 전압 3.3V vs ATmega328P의 VIH 3.0V
3.3V가 3.0V보다 크므로 HIGH로 읽힙니다.
읽힙니다. 마진은 0.3V입니다. 넉넉하지는 않지만 동작합니다. 그래서 ESP32나 라즈베리파이의 출력을 아두이노 입력에 직접 연결하는 회로가 실제로 많이 돌아다니고, 대체로 문제없이 동작합니다.
다만 "대체로"라는 단어를 강조하고 싶습니다. 위 표의 두 번째 줄을 다시 보십시오. 74HC 계열 로직 IC의 VIH는 3.5V입니다. 3.3V는 3.5V보다 작으므로 규격상 HIGH로 인식된다는 보장이 없습니다. 실온에서 운 좋게 동작하다가 온도가 변하거나 다른 로트의 부품으로 바꾸면 갑자기 실패합니다. 74HC 시프트 레지스터나 버퍼를 3.3V 보드에 물렸을 때 "가끔 이상하다"는 증상의 정체가 이것입니다.
이 경우의 정답은 74HCT 계열로 바꾸는 것입니다. HCT는 입력 임계값이 TTL 규격인 2.0V로 고정되어 있어서 3.3V 입력을 여유 있게 받습니다. 74AHCT125 같은 버퍼 하나를 끼우는 것이 널리 쓰이는 해법이고, 3.3V 보드로 WS2812 LED 스트립을 구동할 때 신호가 불안정하면 대개 이 부품으로 해결합니다.
5V에서 3.3V로 보내기 — 절대 안 됩니다
반대 방향은 인식의 문제가 아니라 파괴의 문제입니다.
3.3V 소자의 데이터시트에는 절대 최대 정격이 적혀 있습니다. 라즈베리파이의 BCM 칩 기준으로 GPIO 핀에 걸 수 있는 최대 전압은 다음과 같습니다.
절대 최대 입력 전압 = VDD + 0.5V = 3.3V + 0.5V = 3.8V
3.8V입니다. 5V는 이 값을 1.2V 초과합니다. 그리고 절대 최대 정격이라는 말은 "이 값을 넘으면 성능이 나빠진다"가 아니라 "이 값을 넘으면 손상될 수 있으며 제조사는 아무것도 보장하지 않는다"는 뜻입니다.
무엇이 손상되는지는 다음 절에서 봅니다.
5V가 3.3V 핀에 들어가면 실리콘에서 벌어지는 일
CMOS 입력 핀의 안쪽에는 정전기 보호 회로가 들어 있습니다. 구조는 이렇습니다.
VDD (3.3V)
│
▼ 상단 클램프 다이오드 (핀 → VDD 방향으로 도통)
│
핀 ─────┼───── 내부 게이트로
│
▼ 하단 클램프 다이오드 (GND → 핀 방향으로 도통)
│
GND
핀 전압이 VDD보다 다이오드 전압강하만큼 높아지면 상단 다이오드가 도통합니다. 즉 핀에서 3.3V 레일로 전류가 흘러 들어갑니다. 이것이 원래 설계된 동작입니다. 사람 손에서 나오는 수천 볼트의 정전기 펄스를 안전하게 흘려보내라고 만든 회로입니다.
문제는 그 펄스의 지속 시간입니다. 정전기 방전은 나노초 단위입니다. 클램프 다이오드는 그 짧은 순간의 큰 전류를 견디도록 설계되었을 뿐, 지속적인 전류를 흘리도록 만들어지지 않았습니다.
HC-SR04의 ECHO 출력을 연결하면 어떻게 되는지 계산해 보겠습니다. ECHO가 HIGH일 때 5V를 내보내고, 그 출력 트랜지스터의 저항은 대략 50옴입니다. 다이오드의 순방향 전압을 0.7V로 잡으면,
다이오드에 흐르는 전류 = (5V - 3.3V - 0.7V) / 50옴
= 1.0V / 50옴
= 0.02A = 20mA
20mA가 클램프 다이오드를 통해 3.3V 레일로 계속 흘러 들어갑니다. 이 다이오드는 폭이 수 마이크로미터인 얇은 구조라 20mA를 지속적으로 견디지 못합니다. 반복되면 실리콘과 금속 배선의 접합부에서 원자가 전류를 따라 이동하는 일렉트로마이그레이션이 일어나 결국 끊어지거나 단락됩니다.
여기까지가 첫 번째 손상 경로입니다. 두 번째가 더 나쁩니다.
주입된 20mA는 3.3V 레일로 들어갑니다. 레귤레이터는 전류를 내보내도록 만들어졌지 받아들이도록 만들어지지 않았습니다. 다른 회로가 그만큼을 소비하지 않으면 3.3V 레일 전압이 올라갑니다. 그러면 그 레일에 붙어 있는 모든 소자가 규격 밖 전압을 받게 됩니다. 손상이 GPIO 핀 하나에서 끝나지 않는 이유입니다.
세 번째가 결정적입니다. 래치업입니다.
CMOS 구조 안에는 설계자가 의도하지 않은 기생 트랜지스터 쌍이 항상 존재합니다. p형과 n형 영역이 번갈아 배치되면서 자연스럽게 만들어지는 pnpn 구조인데, 이것은 사이리스터입니다. 평소에는 꺼져 있지만 핀으로 충분한 전류가 주입되면 켜집니다. 그리고 사이리스터의 성질상, 한 번 켜지면 전원을 끊기 전에는 스스로 꺼지지 않습니다.
켜진 순간 전원과 접지 사이에 저저항 경로가 생깁니다. 수백 밀리암페어에서 암페어 단위의 전류가 칩 내부를 관통합니다. 증상은 이렇습니다. 라즈베리파이가 갑자기 뜨거워지고, 멈추고, 전원을 껐다 켜야 살아납니다. 살아나도 그 자리에는 이미 녹은 배선이 남아 있는 경우가 많습니다.
정리하면 5V를 3.3V 핀에 넣었을 때 벌어지는 일은 세 가지입니다. 클램프 다이오드가 서서히 마모되어 끊어지거나, 3.3V 레일이 밀려 올라가 다른 부품까지 규격 밖으로 밀어내거나, 래치업으로 칩이 즉사합니다. 그리고 세 가지 모두 되돌릴 수 없습니다.
한 가지 덧붙이면, 이 손상이 즉시 나타나지 않는다는 점이 오히려 위험합니다. 며칠 잘 돌아가던 회로가 어느 날 죽으면 원인을 배선에서 찾지 않게 됩니다. 처음부터 잘 돌아갔다는 사실은 배선이 옳다는 증거가 되지 못합니다.
보드별 로직 레벨 표
내 보드가 어느 쪽인지 아는 것이 출발점입니다. 여기서 세 번째 열이 이 글의 핵심입니다.
| 보드 | 로직 전압 | 5V 입력을 견디는가 | 핀당 최대 전류 | 전체 GPIO 합계 | ADC |
|---|---|---|---|---|---|
| 아두이노 우노 R3 / 나노 / 메가 | 5V | 해당 없음 (자체가 5V) | 20mA (절대 최대 40mA) | 200mA | 있음 |
| 아두이노 프로 미니 3.3V | 3.3V | 아니오 | 20mA | 200mA | 있음 |
| 아두이노 두에 | 3.3V | 아니오 | 3mA (권장), 15mA (최대) | 130mA | 있음 |
| 라즈베리파이 40핀 헤더 | 3.3V | 아니오 | 16mA | 50mA | 없음 |
| 라즈베리파이 피코 | 3.3V | 아니오 | 12mA | 50mA | 있음 |
| ESP32 DevKit v1 | 3.3V | 아니오 | 12mA | 120mA | 있음 |
| ESP8266 (NodeMCU) | 3.3V | 아니오 | 12mA | 알려진 값 없음 | 있음 (1채널) |
| Teensy 4.x | 3.3V | 아니오 | 4mA (권장) | 제한 있음 | 있음 |
세 가지를 짚겠습니다.
첫째, 3.3V 보드 중 5V를 견디는 것은 목록에 하나도 없습니다. 예전 Teensy 3.x나 일부 STM32 계열에는 5V 내성 핀이 있었지만, 요즘 흔히 쓰는 보드에서는 예외라고 생각하는 편이 안전합니다.
둘째, 라즈베리파이에 ADC가 없다는 점이 자주 사고를 만듭니다. 아날로그 출력 센서를 파이에 연결하려면 MCP3008 같은 외부 ADC가 필요한데, 이 사실을 모르고 아날로그 센서를 GPIO에 직접 연결하면 값도 안 나오고 5V 센서라면 핀도 잃습니다.
셋째, 5V 전원 핀이 있다고 해서 GPIO가 5V라는 뜻이 아닙니다. 라즈베리파이 헤더의 2번, 4번 핀은 5V를 내보내지만 그것은 부품에 전원을 공급하기 위한 것입니다. 그 5V를 쓰는 부품의 신호선을 GPIO에 바로 물리는 순간 이 글의 첫 문단으로 돌아갑니다.
배선을 그려 놓고 이 조합이 안전한지 확인하고 싶다면 배선 검증 도구에 보드와 부품을 올려 보십시오. HC-SR04처럼 5V로만 동작하면서 5V 로직을 출력하는 부품을 3.3V 보드에 연결하면 로직 레벨 위험으로 오류가 뜨고, 핀당 전류와 레일별 합계도 함께 계산해 줍니다.
저항 분압 — 싸지만 입력 전용이고 빠른 신호에서 무너집니다
가장 저렴한 해법은 저항 두 개입니다. 앞 글에서 본 전압 분배기 그대로입니다.
5V 신호 ──[ R1 ]──┬── 3.3V 보드의 입력 핀
│
[ R2 ]
│
GND
출력 전압은 이렇게 나옵니다.
출력 = 입력 × R2 / (R1 + R2)
R1을 1킬로옴, R2를 2킬로옴으로 잡으면,
출력 = 5V × 2000 / (1000 + 2000) = 5V × 0.667 = 3.33V
3.33V입니다. 3.3V 핀에 안전한 값입니다. 흔히 쓰는 다른 조합은 1.8킬로옴과 3.3킬로옴입니다.
출력 = 5V × 3300 / (1800 + 3300) = 5V × 0.647 = 3.24V
3.24V이고, 파이의 VIH인 2.31V보다 충분히 높으므로 HIGH로 잘 읽힙니다.
이 방식의 장점은 명확합니다. 저항 두 개면 되고, 부품이 5원짜리이며, 브레드보드에 바로 꽂을 수 있습니다. HC-SR04의 ECHO 핀에는 이 방법이 사실상 표준입니다.
단점은 세 가지이고, 각각 정확히 알고 써야 합니다.
단점 1 — 한 방향으로만 동작합니다
분압기는 높은 전압을 낮출 뿐 낮은 전압을 올리지 못합니다. 즉 5V 부품의 출력을 3.3V 보드가 받는 데만 쓸 수 있습니다. 3.3V 보드의 출력을 5V 부품에 보내야 한다면 이 회로는 아무 도움이 되지 않습니다.
다행히 대부분의 경우 반대 방향은 시프팅 없이 통합니다. HC-SR04의 TRIG는 파이의 3.3V 출력을 그대로 받아도 잘 인식합니다. 하지만 앞에서 본 74HC 사례처럼 상대의 VIH가 높으면 통하지 않습니다.
단점 2 — 상시 전류를 씁니다
신호가 HIGH인 동안 R1과 R2를 통해 계속 전류가 흐릅니다.
1킬로옴 + 2킬로옴 → 5V / 3000옴 = 1.67mA
1.67mA는 USB 전원에서는 무시할 만하지만, 배터리 장치에서 이 회로가 여덟 개 있으면 13mA가 되고 무시할 수 없습니다.
전류를 줄이려고 저항을 키우면 다음 단점이 커집니다. 이 둘은 맞바꾸는 관계입니다.
단점 3 — 빠른 신호에서 무너집니다
이것이 가장 중요하고 가장 자주 간과됩니다.
분압기의 출력에서 회로를 바라본 저항, 즉 출력 임피던스는 두 저항의 병렬값입니다.
1킬로옴 || 2킬로옴 = (1000 × 2000) / 3000 = 667옴
여기에 입력 핀과 배선의 정전 용량 약 30피코패럿이 붙어 RC 저역 통과 필터가 만들어집니다.
시상수 = 667옴 × 0.00000000003F = 0.00000002초 = 20나노초
신호가 10퍼센트에서 90퍼센트까지 올라가는 시간은 시상수의 2.2배입니다.
상승 시간 = 20ns × 2.2 = 44나노초
HC-SR04의 ECHO는 수 밀리초 단위로 변하는 신호이므로 44나노초는 전혀 문제가 되지 않습니다. 그래서 이 조합이 잘 동작합니다.
이제 저항을 키워 보겠습니다. 전류를 아끼려고 10킬로옴과 20킬로옴을 썼다면,
출력 임피던스 = 10000 || 20000 = 6667옴
시상수 = 6667 × 30pF = 200나노초
상승 시간 = 440나노초
440나노초입니다. 1MHz SPI 신호의 한 비트 길이가 1000나노초이므로, 신호가 절반쯤 올라갔을 때 이미 다음 비트가 시작됩니다. 파형이 삼각형으로 뭉개지고 데이터가 깨집니다. 저항 분압기를 SPI나 빠른 UART에 쓰면 안 되는 이유가 이것입니다.
정리하면 저항 분압기의 적용 범위는 이렇게 정리됩니다.
| 신호 | 대략적인 주파수 | 저항 분압기 적합성 |
|---|---|---|
| 버튼, 릴레이 상태 | 수 Hz | 매우 적합 |
| HC-SR04 ECHO | 수백 Hz | 적합 |
| UART 9600bps | 9.6kHz | 적합 |
| UART 115200bps | 115kHz | 낮은 저항값이면 가능 |
| I2C 100kHz | 100kHz | 부적합 (오픈 드레인이라 구조가 다름) |
| SPI 1MHz 이상 | 1MHz 이상 | 부적합 |
| WS2812 데이터 | 800kHz, 엄격한 타이밍 | 부적합 |
MOSFET 양방향 시프터와 전용 IC
BSS138 두 저항 회로
가장 널리 쓰이는 양방향 시프터는 N채널 MOSFET 하나와 풀업 저항 두 개로 만듭니다. 브레이크아웃 보드로 팔리는 네 채널 레벨 시프터의 내부가 대부분 이 회로입니다.
동작 원리를 알아 두면 한계도 함께 이해됩니다. MOSFET의 게이트를 낮은 쪽 전압인 3.3V에 고정하고, 소스를 3.3V 쪽 선에, 드레인을 5V 쪽 선에 연결합니다. 양쪽 선에는 각자의 전압으로 풀업이 걸려 있습니다.
두 선이 모두 놓여 있으면 3.3V 쪽은 3.3V, 5V 쪽은 5V로 각자 올라갑니다. 게이트와 소스 전압이 같아 MOSFET은 꺼져 있습니다.
3.3V 쪽이 LOW로 끌어내려지면 소스가 0V가 됩니다. 게이트는 3.3V이므로 게이트와 소스 사이에 3.3V가 걸려 MOSFET이 켜지고, 5V 쪽도 함께 끌려 내려갑니다.
5V 쪽이 LOW로 끌어내려지면 먼저 MOSFET의 기생 다이오드가 도통해 3.3V 쪽을 0.7V 근처까지 끌어내리고, 그러면 게이트와 소스 사이에 전압이 생겨 MOSFET이 완전히 켜집니다. 결국 양쪽이 LOW가 됩니다.
어느 쪽에서 시작하든 LOW가 전달되고, HIGH는 각자의 풀업이 만듭니다. 방향을 지정할 필요가 없습니다.
여기서 한계가 드러납니다. 이 회로는 본질적으로 오픈 드레인 방식입니다. HIGH로 올라가는 속도는 풀업 저항과 정전 용량이 정하고, MOSFET은 그 과정에 아무 도움을 주지 않습니다. 10킬로옴 풀업에 50피코패럿이면 상승 시간이 1마이크로초를 넘습니다. 그래서 실용적인 상한이 대략 400kHz에서 1MHz 사이입니다. I2C에는 완벽하지만 고속 SPI에는 쓸 수 없습니다.
전용 레벨 시프터 IC
속도가 필요하거나 채널이 많으면 전용 IC로 갑니다. 부품마다 성격이 뚜렷하게 다르므로 고르는 기준을 알아야 합니다.
| 부품 | 방향 | 출력 방식 | 대략적인 속도 | I2C 사용 | 특징 |
|---|---|---|---|---|---|
| 저항 분압기 | 단방향 (하향) | 수동 | 100kHz 이하 | 불가 | 가장 저렴, 부품 두 개 |
| BSS138 회로 | 양방향 | 오픈 드레인 | 400kHz ~ 1MHz | 적합 | 방향 지정 불필요 |
| 74LVC245 | 단방향 (핀으로 지정) | 푸시풀 | 100MHz 이상 | 불가 | 8채널, 매우 빠름 |
| 74AHCT125 | 단방향 (상향) | 푸시풀 | 50MHz 이상 | 불가 | 3.3V를 5V로 올릴 때 |
| TXB0104 / TXB0108 | 자동 방향 감지 | 푸시풀 | 수십 MHz | 부적합 | 풀업과 충돌함 |
| TXS0102 / TXS0108 | 자동 방향 감지 | 오픈 드레인 대응 | 수 MHz | 적합 | I2C 전용에 가까움 |
| PCA9306 | 양방향 | 오픈 드레인 | 400kHz | 적합 | I2C 전용 2채널 |
이 표에서 반드시 기억할 줄은 TXB 계열입니다. TXB0104는 자동 방향 감지 기능이 있어 편해 보이지만 I2C에는 쓰면 안 됩니다. 이 칩은 신호가 바뀌는 순간을 감지해 잠깐 강하게 밀어 주는 회로를 내장하고 있는데, I2C 버스의 풀업 저항이 그 감지를 방해해서 방향 판정이 엉킵니다. 데이터시트에도 오픈 드레인 신호에는 쓰지 말라고 명시되어 있습니다. 같은 제조사의 TXS 계열이 그 용도입니다. 이름이 한 글자 다른데 용도가 정반대이므로 주문할 때 주의해야 합니다.
I2C는 왜 다른가 — 오픈 드레인 버스
I2C를 따로 다루는 이유는 이 버스가 앞의 모든 방법과 전제가 다르기 때문입니다.
I2C의 SDA와 SCL은 오픈 드레인입니다. 버스에 붙은 어떤 장치도 선을 HIGH로 밀지 않습니다. 끌어내리거나 손을 뗄 뿐이고, HIGH는 풀업 저항이 만듭니다.
여기서 즉시 문제가 하나 드러납니다. 풀업이 어느 전압에 연결되어 있느냐가 버스 전체의 전압을 결정합니다. 5V 센서 모듈에는 보드 위에 5V 풀업이 이미 붙어 있는 경우가 많습니다. 그 모듈을 라즈베리파이의 SDA와 SCL에 그대로 연결하면 버스가 쉬고 있는 동안에도 두 선이 5V가 됩니다. 파이의 GPIO2와 GPIO3에 5V가 상시로 걸리는 것입니다. 앞에서 본 클램프 다이오드 이야기가 신호가 있을 때만이 아니라 항상 벌어집니다.
그래서 I2C의 레벨 시프팅은 선택이 아닙니다. 그리고 방법도 제한됩니다. 저항 분압기는 쓸 수 없습니다. 오픈 드레인 선에 분압기를 달면 그 저항이 풀업과 상호작용해서 LOW 전압이 0V까지 내려가지 않습니다. 푸시풀 시프터도 쓸 수 없습니다. 앞에서 본 TXB 계열의 문제입니다. 남는 것은 BSS138 회로나 TXS 계열, PCA9306입니다.
풀업 저항값 계산
I2C를 다룰 때 알아야 할 계산이 하나 더 있습니다. 풀업 저항값의 상한과 하한입니다.
하한은 장치가 선을 끌어내릴 수 있는 능력이 정합니다. I2C 규격은 출력이 LOW일 때 0.4V 이하를 유지하면서 3mA를 흡수할 수 있어야 한다고 정하고 있습니다.
최소 풀업 저항 = (3.3V - 0.4V) / 0.003A = 967옴
967옴보다 작은 풀업을 쓰면 장치가 선을 충분히 낮추지 못합니다.
상한은 상승 시간이 정합니다. 표준 모드 100kHz에서 허용되는 최대 상승 시간은 1000나노초이고, 버스 정전 용량을 100피코패럿으로 가정하면,
최대 풀업 저항 = 1000ns / (0.8473 × 100pF) = 11803옴 ≈ 11.8킬로옴
400kHz 고속 모드라면 허용 상승 시간이 300나노초로 줄어드므로,
최대 풀업 저항 = 300ns / (0.8473 × 100pF) = 3541옴 ≈ 3.5킬로옴
그래서 표준 모드에는 4.7킬로옴, 고속 모드에는 2.2킬로옴이 관례로 자리 잡았습니다. 근거 없는 관습이 아니라 이 계산의 중간값입니다.
라즈베리파이에서 자주 나오는 함정
파이의 GPIO2와 GPIO3에는 보드 위에 1.8킬로옴 풀업이 고정으로 붙어 있습니다. 그런데 시중의 I2C 모듈에도 대개 자체 풀업이 달려 있습니다. 이들은 전부 병렬입니다.
모듈 두 개를 붙였고 각각 10킬로옴 풀업을 가지고 있다면,
합성 저항 = 1 / (1/1800 + 1/10000 + 1/10000) = 1 / 0.000756 = 1324옴
LOW 유지에 필요한 전류 = (3.3V - 0.4V) / 1324옴 = 0.00219A = 2.19mA
2.19mA로 3mA 규격 안쪽입니다. 동작합니다.
이제 4.7킬로옴 풀업을 가진 모듈 네 개를 붙이면,
합성 저항 = 1 / (1/1800 + 4/4700) = 1 / 0.001406 = 711옴
필요한 전류 = (3.3V - 0.4V) / 711옴 = 0.00408A = 4.08mA
4.08mA로 규격을 넘습니다. 어떤 장치는 선을 0.4V 아래로 내리지 못하고, 버스가 간헐적으로 깨집니다. 증상은 "장치를 세 개까지는 괜찮은데 네 개째부터 이상하다"입니다. 해결책은 모듈의 풀업 저항을 물리적으로 제거하는 것입니다. 대부분의 모듈에서 그 저항은 기판 위의 작은 부품이고, 인두로 떼면 됩니다.
실제 코드에서의 모습
HC-SR04로 돌아가 보겠습니다. ECHO에 1킬로옴과 2킬로옴 분압기를 넣고 나면 코드는 평범해집니다.
# HC-SR04를 라즈베리파이에 연결합니다.
#
# 배선:
# VCC -> 5V (2번 핀)
# GND -> GND (6번 핀)
# TRIG -> GPIO23 (파이의 3.3V 출력을 그대로 받습니다. 시프팅 불필요)
# ECHO -> 1k 저항을 거쳐 GPIO24, 그리고 GPIO24에서 2k 저항으로 GND
#
# 분압 결과: 5V * 2000 / 3000 = 3.33V
# ECHO를 GPIO24에 직접 연결하면 핀이 손상됩니다.
from gpiozero import DistanceSensor
from time import sleep
sensor = DistanceSensor(echo=24, trigger=23, max_distance=2.0)
while True:
# distance는 미터 단위입니다.
print(f"{sensor.distance * 100:.1f} cm")
sleep(0.2)
코드에는 분압기의 흔적이 전혀 없습니다. 소프트웨어 쪽에서 보면 아무 일도 일어나지 않았기 때문입니다. 이것이 하드웨어 문제를 코드에서 찾게 되는 이유이기도 합니다. 배선이 잘못되어도 코드는 정상으로 보이고, 잘 동작하는 것처럼 보이기까지 합니다.
마치며 — 전원 핀의 전압과 신호 핀의 전압은 다른 숫자입니다
이 글의 결론은 짧습니다. 부품을 연결하기 전에 두 가지를 따로 확인해야 합니다. 이 부품이 몇 볼트로 동작하는가, 그리고 이 부품이 출력하는 신호가 몇 볼트인가.
두 값은 대개 같지만 반드시 같지는 않습니다. HC-SR04는 5V로 동작하고 5V를 출력합니다. PIR 센서 HC-SR501은 5V로 동작하지만 출력은 3.3V입니다. 같은 5V 부품이라도 하나는 파이를 죽이고 하나는 안전합니다. 데이터시트에서 확인해야 하는 것은 전원 전압이 아니라 출력 로직 레벨입니다.
그리고 이 확인은 회로가 동작하는지 여부로 대신할 수 없습니다. 5V ECHO를 파이에 직접 물린 회로는 처음에 잘 동작합니다. 잘 동작한다는 사실이 안전하다는 증거가 되지 않는 영역이 하드웨어에 있고, 로직 레벨이 그중 가장 대표적인 자리입니다.
다음 글에서는 전압이 아니라 전류가 문제를 일으키는 경우로 넘어갑니다. 모터를 GPIO에 연결하면 왜 보드가 재부팅되는지 다루겠습니다.
현재 단락 (1/166)
초음파 거리 센서 HC-SR04는 아두이노 입문 키트에 거의 항상 들어 있습니다. 핀이 네 개입니다. VCC, GND, TRIG, ECHO. 예제 코드도 열 줄이면 끝납니다.