전기·에너지 · 난이도 보통
ACS712 전류 센서로 낮은 전압 직류 회로의 전류를 재고 영점과 잡음 다루기
ACS712는 홀 효과로 전류를 전압으로 바꾸는 5V 센서예요. 0A일 때 출력이 전원 전압의 절반이고 5A형은 1A에 185mV씩 변해요. 10kΩ·20kΩ 분압 배선, 영점을 재고 평균 내는 코드, 작은 전류가 잡음에 묻히는 이유, 12V 이하 직류만 재는 까닭을 정리했어요.
이 센서로 무엇을 잴 수 있나
ACS712는 알레그로(Allegro)가 만든 전류 센서 칩이에요. 모듈의 나사 단자 두 개(IP+, IP−) 사이로 전류를 흘리면, 그 전류에 비례하는 전압이 OUT 핀으로 나와요. 겉모양이 같은 세 종류가 있으니 칩 윗면의 05B·20A·30A 글자를 먼저 봐요.
| 데이터시트 품번 | 재는 범위 | 감도(VCC 5V) |
|---|---|---|
| ACS712ELCTR-05B | ±5A | 185mV/A |
| ACS712ELCTR-20A | ±20A | 100mV/A |
| ACS712ELCTR-30A | ±30A | 66mV/A |
교실에서는 건전지로 돌리는 작은 직류 모터가 짐을 들 때 전류가 얼마나 느는지, 멀티미터와 견줘 센서가 얼마나 맞는지 같은 것을 재요. 이 글은 5A형을 기준으로 해요. 방향도 알 수 있어서, 전류가 거꾸로 흐르면 음수가 나와요.
반대로 100mA보다 작은 전류는 잡음에 묻히기 쉬워요. LED 하나에 흐르는 전류처럼 작은 값은 멀티미터가 더 맞아요. 그 이유는 '값 해석과 보정'에 숫자로 정리했어요.
원리
전류가 흐르는 구리 길 옆에 홀 소자가 있어서, 전류가 만드는 자기장을 전압으로 바꿔요. 데이터시트에 따르면 이 구리 길의 저항은 1.2mΩ으로 아주 작아서 회로에 끼워도 전류를 거의 방해하지 않아요. 전류가 흐르는 쪽(1~4번 핀)과 신호 쪽(5~8번 핀)은 칩 안에서 전기적으로 떨어져 있어요.
출력의 중심은 0V가 아니에요. 데이터시트의 0A 출력은 VCC × 0.5, 곧 5V에서 2.5V예요. 5A형이라면 IP+에서 IP−로 1A가 흐를 때마다 185mV씩 올라가고, 거꾸로 흐르면 내려가요. 출력은 전원 전압에 비례(레이시오메트릭)해서, VCC가 4.9V라면 0A 출력도 2.45V 근처로 내려가고 감도도 그만큼 줄어요. 피코의 USB 5V(VBUS)는 컴퓨터와 케이블에 따라 조금씩 다르니, 실험할 때마다 0A 출력(영점)을 직접 재야 해요.
칩의 전원 범위는 4.5~5.5V라 3.3V로는 켤 수 없어요. 그래서 전원은 VBUS로 주고, 출력만 분압해서 피코로 읽어요. 5A형 출력은 −5A에서 1.575V, +5A에서 3.425V까지 움직이는데, 10kΩ·20kΩ으로 2/3로 줄이면 GP26에는 1.05~2.28V가 걸려요. 데이터시트는 출력에 4.7kΩ보다 작은 부하를 달지 말라고 하는데, 분압 저항의 합 30kΩ은 이 조건을 지켜요.
준비물
- 라즈베리파이 피코와 USB 케이블
- ACS712 모듈(5A형), 10kΩ 저항 1개, 20kΩ 저항 1개, 브레드보드, 점퍼선
- 잴 회로: AA 건전지 홀더(4개용), 작은 직류 기어 모터, 스위치, 악어 클립 선
- 멀티미터(직류 전류·전압 모드)
- 탐구용: 모터 축에 감을 실과 작은 추(10~50g)
배선
브레드보드 따라 꽂기 순서 (10단계)
- 피코를 브레드보드 가운데 홈에 걸쳐 꽂아요. USB 단자가 왼쪽을 보게 하고, 1번 핀이 f2, 40번 핀이 e2에 들어가요. 다리가 홈 양쪽에 모두 들어갔는지 옆에서 봐요.
- 빨간 선: 피코 40번 핀(VBUS) 옆 칸 a2 → 아래쪽 + 줄(5V). 이제 이 줄 전체가 5V예요. 위쪽 + 줄(3.3V)과 아래쪽 + 줄(5V)은 절대 서로 잇지 않아요.
- 검은 선: 피코 3번 핀(GND) 옆 칸 j4 → 아래쪽 − 줄(GND). 이제 이 줄 전체가 GND예요.
- 전류 ACS712 꽂기: 다리 VCC · GND · OUT를 아래쪽 j24 · j25 · j26에 차례로 꽂아요. 다리가 브레드보드에 바로 안 들어가면 암-수 점퍼선으로 같은 칸에 이어요.
- 빨간 선(5V 전원): 전류 VCC 줄 i24 → 아래쪽 + 줄(5V)
- 검은 선(GND): 전류 GND 줄 i25 → 아래쪽 − 줄(GND)
- 저항 10kΩ(색띠 갈색·검정·주황): g26 ↔ g28 (OUT 다리 칸 → 나눔 칸 28열)
- 저항 20kΩ(색띠 빨강·검정·주황): i28 ↔ 아래쪽 − 줄(GND)
- 초록 선: 나눔 칸 h28 → 피코 31번 핀(GP26) 옆 칸 a11. 5V 신호가 3.3V 아래로 줄어 피코가 안전해요.
- 마지막 확인: ① 위쪽 + 줄(3.3V)과 아래쪽 + 줄(5V)이 서로 이어지지 않았나요? ② 모든 부품의 GND가 − 줄에 이어졌나요? ③ 5V 신호 다리는 저항을 거쳐 피코에 이어졌나요? ④ 긴 브레드보드는 + − 줄이 가운데에서 끊긴 것도 있어요(빨간·파란 선이 끊겨 있으면 짧은 선으로 이어요). ⑤ 그림과 한 칸씩 비교한 뒤 USB를 꽂아요.
| 모듈 핀 | 피코 핀 | 비고 |
|---|---|---|
| VCC | VBUS (40번) | 5V 전원, 칩 전원 범위 4.5~5.5V |
| GND | GND (38번) | 피코와 접지를 함께 써요 |
| OUT | GP26 (31번) | 10kΩ·20kΩ 분압 뒤 연결 |
| IP+ · IP− | 재는 회로에 직렬로 | 피코 핀과 잇지 않아요 |
분압은 OUT ─ 10kΩ ─ ● ─ 20kΩ ─ GND로 잇고, 가운데 점(●)을 GP26에 이어요. 코드에서는 읽은 전압에 1.5를 곱해 OUT 전압으로 되돌려요(분압 회로).
잴 회로는 이렇게 이어요. 건전지 + → 스위치 → IP+ → IP− → 모터 → 건전지 −. 센서는 전선 중간에 끼우는 직렬이에요. 건전지의 −를 피코 GND에 이을 필요는 없어요. 전류 길과 신호 쪽이 칩 안에서 떨어져 있기 때문이에요. 모터 전류가 흐르는 선은 브레드보드를 거치지 않고 모듈의 나사 단자에 직접 물려요.
코드
from machine import ADC, Pin
import time
out = ADC(Pin(26)) # OUT → 10kΩ/20kΩ 분압 → GP26
SENS = 0.185 # 5A형 감도(V/A). 20A형 0.100, 30A형 0.066
def volt(n=64):
s = 0
for i in range(n):
s += out.read_u16()
return s / n * 3.3 / 65535 * 1.5 # 분압을 되돌린 OUT 전압(V)
print("부하 스위치를 끄세요. 3초 뒤 영점을 재요")
time.sleep(3)
zs = []
for i in range(20):
zs.append(volt())
time.sleep_ms(50)
zero = sum(zs) / len(zs)
spread = (max(zs) - min(zs)) / SENS * 1000 # 영점이 흔들린 폭(mA)
print(f"영점 {zero:.4f} V, 흔들림 {spread:.0f} mA")
while True:
v = volt()
amp = (v - zero) / SENS
print(f"DATA: amp={amp:.3f}, ma={amp * 1000:.0f}, out_v={v:.4f}")
time.sleep(0.5)
- 시작할 때 64번 평균을 20번 모아 그 평균을 영점으로 쓰고, 가장 큰 값과 작은 값의 차이를 mA로 바꿔
흔들림으로 보여 줘요. 이보다 작은 전류 변화는 믿기 어려워요. volt()는 64번 읽어 평균을 내고 1.5를 곱해 OUT 전압을 되돌려요.amp는 영점과의 차이를 감도로 나눈 값이에요. 20A형이나 30A형이면SENS만 바꿔요.
값 해석과 보정
작은 전류가 왜 어려울까요? 데이터시트에 적힌 5A형의 출력 잡음은 봉우리 사이 21mV(필터 콘덴서 47nF, 대역폭 2kHz 조건)예요. 185mV/A로 나누면 약 0.11A에 해당해요. 모듈마다 필터 콘덴서가 달라서 실제 잡음은 코드의 흔들림으로 직접 확인해요. 여러 번 평균 내면 잡음이 줄지만, 빠르게 바뀌는 전류는 무뎌져요.
피코가 구별하는 한 칸은 얼마일까요? 피코 ADC의 한 칸은 3.3V ÷ 4096, 약 0.81mV예요. 분압을 되돌리면 OUT에서 약 1.21mV이고, 185mV/A로 나누면 약 6.5mA예요. 숫자로는 6.5mA까지 보이지만 잡음이 이보다 훨씬 커서, 실제로 믿을 수 있는 차이는 흔들림과 평균 횟수로 정해져요.
감도도 보정해요. VBUS를 멀티미터로 재서 5V가 아니라면 SENS = 0.185 × VBUS ÷ 5로 고쳐요. 그다음 멀티미터를 전류 모드로 같은 회로에 직렬로 끼우고, 전류 서너 단계에서 두 값을 기록해 보정 직선을 구해요(센서 값의 신뢰도). 데이터시트의 총 출력 오차는 25℃에서 ±1.5%예요.
모터 전류는 출렁여요. 모터는 도는 동안 전류가 오르내리고 켜는 순간 크게 튀어요. 이 코드의 값은 64번의 평균이니, 켜는 순간의 최댓값이 궁금하면 평균 횟수를 줄여 더 자주 읽어요.
자주 하는 실수
- IP+와 IP−를 건전지 양 끝에 바로 물리기. 센서 안 구리 길은 1.2mΩ이라 이것은 건전지를 그대로 합선시키는 것과 같아요. 전선이 뜨거워지고 전지가 상해요. 센서는 반드시 부하와 직렬로 넣어요.
- 영점을 재지 않고 2.5V로 계산하기. VBUS가 4.9V라 영점이 2.45V라면, 2.5V로 계산할 때 0A에서도 약 −270mA로 나와요.
- OUT을 GP26에 바로 꽂기. +5A 가까이에서 OUT이 3.3V를 넘어요. 분압해요.
- 칩 종류와 다른 감도로 계산하기. 20A형을 0.185로 계산하면 전류가 실제의 약 절반으로 나와요.
- 영점을 잴 때 모터가 돌고 있기. 그 전류가 영점에 섞여 이후 값이 모두 어긋나요.
이 센서로 잴 수 있는 탐구
1. 모터가 무거운 것을 들수록 전류가 늘까 - 질문: 모터 축에 감은 실로 드는 추가 무거울수록 평균 전류는 얼마나 늘까? - 바꾸는 것: 추 무게(0g, 10g, 20g, 50g) - 재는 것: 10초 동안의 평균 전류(mA) - 방법: 건전지 4개를 같은 것으로 쓰고, 무게마다 3번 반복해요. 추가 끝까지 올라가 멈추면 모터에 무리가 가니 그 전에 스위치를 꺼요.
2. 센서와 멀티미터는 얼마나 같을까 - 질문: 같은 회로에 ACS712와 멀티미터를 함께 끼우면 두 값은 몇 % 다를까? - 바꾸는 것: 전류 단계(건전지 2개, 3개, 4개로 돌리는 모터, 추 있음·없음) - 재는 것: ACS712 전류(mA), 멀티미터 전류(mA), 차이(%) - 방법: 멀티미터와 센서를 한 줄로 직렬 연결해요. 단계마다 10줄 평균을 내고, 결과로 보정 직선을 만들어요.
3. 평균을 많이 낼수록 잡음은 얼마나 줄까
- 질문: 한 번에 평균 내는 횟수를 늘리면 0A에서 값이 흔들리는 폭이 얼마나 줄어들까?
- 바꾸는 것: volt()의 n(1, 16, 64, 256)
- 재는 것: 부하를 끈 상태에서 40번 잰 ma의 최대−최소(mA)
- 방법: 회로를 끊어 0A로 두고 n만 바꿔요. 각 조건을 3번 반복하고, 평균 횟수가 4배일 때 흔들림이 어떻게 줄었는지 비율로 정리해요.
안전
- 220V 교류는 재지 않아요. 모듈의 나사 단자와 기판 아래 땜 자리는 덮개 없이 드러나 있어서, 콘센트 전기를 물리면 그 금속 부분 모두에 220V가 걸려요. 브레드보드와 점퍼선도 그 전압을 다루도록 만든 부품이 아니에요. 칩의 절연 성능은 칩 안의 이야기일 뿐 학생이 만져도 된다는 뜻이 아니에요. 이 자료실은 릴레이와 220V 글과 같은 기준으로, 직류 12V 이하 회로만 다뤄요.
- 리튬 전지(휴대폰·보조 배터리 속 전지, 18650)는 합선되면 뜨거워지고 불이 날 수 있어요. 이 글의 실습은 AA 건전지로 하고, 리튬 전지는 보호 회로가 있는 제품을 선생님과 함께만 써요.
- 큰 전류가 흐르는 선과 단자는 뜨거워질 수 있어요. 이 글의 실습은 작은 모터처럼 1A보다 훨씬 작은 전류만 다뤄요.
- 배선은 스위치를 끄고 USB를 뽑은 채로 바꿔요. VBUS 선이 GP 핀에 닿지 않게 해요.