INA226 초정밀 전력 모니터링 가이드: 소수점 단위까지 잡아내는 리얼타임 와트메타(Wattmeter) 만들기

1. 들어가며: “내 프로젝트, 전기를 얼마나 먹을까?”

임베디드 프로젝트를 진행하다 보면 단순히 동작 여부를 넘어, 실제 소모 전력이 얼마나 되는지 궁금할 때가 많습니다. 특히 배터리로 구동되는 기기라면 ‘mA’ 단위의 미세한 차이가 기기의 수명을 결정짓죠. 오늘은 16비트 ADC의 강력한 성능을 가진 INA226 센서를 이용해, 단순한 전압 측정을 넘어 전력 소모의 흐름을 눈으로 직접 확인하는 초정밀 디지털 전력계를 만들어 보았습니다.

2. 하드웨어 구성의 핵심: “데이터의 길목을 찾아라”

이번 프로젝트에서 가장 중요한 부분은 INA226의 배선이었습니다. 시중의 모듈은 터미널 구멍이 여러 개라 헷갈리기 쉽지만, 테스터기를 이용해 직접 확인해 본 결과 2번(IN+)과 3번(IN-) 구멍이 션트 저항에 직접 연결된 핵심 경로임을 확인했습니다.

  • 제어기: ESP32-C3 (I2C 통신: SDA GPIO 0, SCL GPIO 1)
  • 센서: INA226 (High-side 측정 방식)
  • 디스플레이: SSD1306 OLED (128×64)
  • 부하(Load): LED 2개, 소형 DC 모터 (스위치로 개별 제어)

3. 소프트웨어 구현

단순히 숫자만 띄우는 것이 아니라, MicroPython을 이용해 데이터의 시인성을 극대화했습니다. OLED 화면에는 전압(V), 전류(mA), 전력(mW)을 소수점 자리까지 정밀하게 표기하고, 하단에는 현재 전력 소모량을 직관적으로 알 수 있는 **바 그래프(Bar Gauge)**를 구현했습니다.

또한, PC의 **시리얼 플로터(Serial Plotter)**를 연동하여 스위치를 켤 때마다 전류가 계단식으로 상승하거나 모터에 부하가 걸릴 때 그래프가 요동치는 모습을 실시간으로 관찰할 수 있도록 설계했습니다.

4. 프로젝트의 하이라이트: LED vs 모터

실제 테스트 결과는 흥미로웠습니다.

  • LED 1개 점등: 안정적인 저전력 소모를 보여주며 그래프가 정지해 있는 느낌입니다.
  • 모터 가동: LED보다 훨씬 높은 전류를 소모하며, 특히 모터 축에 물리적인 부하를 주면 전류값이 즉각적으로 솟구치는 ‘피크 전류’ 현상을 INA226이 아주 예민하게 잡아냈습니다. 이는 가변저항 수치를 단순히 뿌려주는 것이 아니라, 진짜 흐르는 전기를 실시간으로 계측하고 있다는 증거입니다.

5. 마치며: 정밀 측정의 즐거움

INA226은 단순한 센서 그 이상이었습니다. 0.1mA의 미세한 변화까지 잡아내는 이 장치는 이제 제 책상 위에서 모든 프로젝트의 에너지 효율을 감시하는 ‘보디가드’ 역할을 하게 될 것입니다. 여러분도 직접 만든 장치로 보이지 않는 전기의 흐름을 제어해 보세요!

빨간 동그라미 안의 두선이 전력측정선 부하에 직렬연결

Python ina226.py

from machine import I2C

class INA226:
    def __init__(self, i2c, addr=0x40):
        self.i2c = i2c
        self.addr = addr
        # 기본 설정: 1.1ms 변환 시간, 1회 평균
        self.set_calibration()

    def set_calibration(self, shunt_ohms=0.1):
        # 0.1옴 션트 저항 기준 기본 보정값 설정
        cal = int(0.00512 / (0.0001 * shunt_ohms))
        self.i2c.writeto_mem(self.addr, 0x05, cal.to_bytes(2, 'big'))

    @property
    def bus_voltage(self):
        data = self.i2c.readfrom_mem(self.addr, 0x02, 2)
        reg = int.from_bytes(data, 'big')
        return reg * 0.00125  # LSB = 1.25mV

    @property
    def current(self):
        data = self.i2c.readfrom_mem(self.addr, 0x04, 2)
        reg = int.from_bytes(data, 'big')
        if reg > 32767: reg -= 65536
        return reg * 0.1  # mA 단위 (LSB에 따라 다름)

    @property
    def power(self):
        data = self.i2c.readfrom_mem(self.addr, 0x03, 2)
        reg = int.from_bytes(data, 'big')
        return reg * 2.5  # mW 단위 (LSB에 따라 다름)

Python wattmeter.py

from machine import Pin, I2C
import ssd1306
from ina226 import INA226
import time

# 1. I2C 설정 (SDA 0, SCL 1)
i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=400000)

# 2. 장치 초기화
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
ina = INA226(i2c, addr=0x40)

def draw_ui(v, i, p):
    oled.fill(0) # 화면 초기화
    
    # 헤더
    oled.text("POWER MONITOR", 10, 0)
    oled.hline(0, 10, 128, 1)
    
    # 전압(V) 표시
    oled.text(f"Volt: {v:5.2f} V", 0, 18)
    
    # 전류(mA) 표시 및 바 그래프 (최대 1000mA 기준)
    oled.text(f"Curr: {i:5.1f} mA", 0, 32)
    bar_width = int(min(i / 1000 * 120, 120)) # 1000mA일 때 120픽셀
    oled.rect(4, 42, 122, 7, 1) # 바 테두리
    oled.fill_rect(5, 43, bar_width, 5, 1) # 바 채우기
    
    # 전력(mW) 표시 (강조)
    oled.hline(0, 52, 128, 1)
    oled.text(f"PWR : {p:5.1f} mW", 0, 56)
    
    oled.show()

print("측정 시작... (시리얼 플로터를 확인하세요)")

while True:
    try:
        v = ina.bus_voltage
        i = ina.current
        p = ina.power
        
        # 1. OLED 디스플레이 업데이트 (정밀도 UP)
        draw_ui(v, i, p)
        
        # 2. 시리얼 플로터용 데이터 출력
        # 형식: (값1, 값2, 값3) 순서로 튜플 형태로 출력하면 Thonny 플로터가 인식합니다.
        # 전압, 전류, 전력을 각각 다른 선으로 그립니다.
        print(f"({v}, {i}, {p})")
        
        # 모터나 스위치 조작에 빠르게 반응하도록 0.1초 간격으로 설정
        time.sleep(0.05)
        
    except Exception as e:
        print("Error:", e)
        time.sleep(1)
            
       

코멘트

“INA226 초정밀 전력 모니터링 가이드: 소수점 단위까지 잡아내는 리얼타임 와트메타(Wattmeter) 만들기” 에 하나의 답글

  1. micro2iot 아바타

    [구매정보] 블로그에서 사용한 부품 구매정보입니다.
    아래 링크를 통해 구매 시 소정의 수수료를 제공받으며, 채널 운영에 큰 도움이 됩니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다