Найти тему
mcublog

DIY микроамперметр на базе INA219

Здравствуйте, сегодня поговорим о такой важной вещи, как измерения динамически изменяющегося тока. Речь пойдет скорее не просто об амперметре, а об профилировщике питания.

Системные ограничения

На данный момент простая работа с этим модулем возможна только на линукс системе. Я хотел было даже с кондачка запустить эту же сборку на Windows, но меня ожидали некоторые трудности и готовой реализации я не нашел. Я буду следить за популярностью статьи и думаю, если она будет относительно популярна, то попытаюсь сделать поддержку и для Windows. На данный момент есть только заготовки для работы с cp2112.

Задача портирование мне кажется, довольно занимательной, думаю, что если у меня будет время и боевой настрой, то я этим займусь. Но популярность точно, предаст мне мотивации.

Как вариант решения и даже в чем-то проще задействовать одноплатный компьютер Raspberry Pi или аналогичный. Основное требование наличие в /dev/i2c- внешних I2C шин. Именно через подобный системный интерфейс работает python библиотека ina219.

Концепция микроамперметра

Суть устройства заключается в получении данных от измерителя тока INA219 и передачи их на ПК. В качестве преобразователя I2C <-> USB будут выступать модуль на микросхеме cp2112. Данные будем получать с помощью программы на питоне. Следующая глава будет посвящена моим субъективным размышлением о нужности такого прибора и качествах, которые должны в нем присутствовать. Процесс сборки и подключения будет описан ниже, поэтому глава "размышления" не обязательна к прочтению 😁.

Размышления

При разработке устройств с питанием от батареи становится очень важным наличие инструмента, позволяющего измерять микроамперы.

Как правило, автономные устройства 99% процентов времени находятся в режиме глубокого энергосбережения и все полезные действия производят, как можно быстрее, чтобы снова уйти в сон. Эта особенность накладывает еще одно ограничение на амперметр — он должен быть достаточно быстрый, чтобы отслеживать всплески энергопотребления. Обычный мультиметр скорее всего будет слишком инерционным для таких целей и позволит лишь оценить потребление статически. Например, в режиме работы и в режиме сна. Положа руку на сердце, подобных измерений во многих случаях уже достаточно. Если их дополнить расчетным потреблением устройств и замерами интервалов времени активной работы, то уже можно довольно точно оценить время автономной работы прибора.

Но я думаю любой бы разработчик lowpower устройств хотел бы иметь в своем арсенале инструмент, который обладал бы следующими качествами:

  • удобен в использование, поставил этот пункт на первое место. Ибо пользоваться, чем-то неудобным всегда боль и может даже демотивировать творческое рвение 😁.
  • быстродействие, позволял бы относительно быстро получать данные о потреблении, чтобы в реальном времени видеть всплески энергопотребления.
  • доступность, немаловажное свойство. К доступности я отношу и цену, и возможность покупки, и удобную доставку.

На самом деле это свойства, скорее профилировщика питания, чем просто мультиметра. Но тем и лучше, что мне, кажется, удалось найти такое устройство, которое сочетает в себе некоторые перечисленные качества.

Сердце устройства INA219

INA219 это микросхема, которая позволяет измерять ток и напряжение на шунте и отдавать результат измерений по интерфейсу i2c. Она довольно известна и по ней есть много информации в сети. Вот например очень хорошая статья на хабре и про INA219 и даже про то, что мы будем делать далее.

Напишу лишь основные характеристики микросхемы:

  • Напряжение питания: от 3 до 5.5 В
  • Диапазон измеряемых напряжений: от 0 до 26 В
  • Максимальная измеряемая сила тока: 3.2 А
  • Разрядность АЦП: 12 бит
  • Протокол: I2C
Внешний вид модуля на ina219 c aliexpress
Внешний вид модуля на ina219 c aliexpress

CP2112 преобразователь интерфейсов I2C <-> USB

Я также взял готовый модуль с cp2112 на алиэкспрессе.

Внешний вид модуля cp2112
Внешний вид модуля cp2112

Из особенностей можно разве, что отметь работу в линукс системе, как i2с шины. Это довольно удобно и в примере кода мы и будем пользоваться данным свойством.

Собираем все вместе и запускаем

Структурная схема соединения
Структурная схема соединения

Для определенности я все буду запускать на linux десктопе. Питание модуль ina219 будет получать от платы cp2112. Я даже распечатал основание на 3d принтере для их относительно удобного монтирования.

Внешний вид прототипа устройства в сборе
Внешний вид прототипа устройства в сборе

Модули соединяются просто по шине i2c, питание также на соответствующие пины (VCC, GND). На обоих платах есть маркировка.

Далее контакты V+/ V- на ina219 подключаем в разрыв цепи в которой будем мерить ток. Я подключил в разрыв к батарее и устройства, которое можно считать относительно низкопотребляющим.

Теперь мы вплотную подошли к программе, которая будет обращаться по i2c шине к ina219. Она крохотная поэтому приведу весь код ниже.

#!/usr/bin/env python

import time

from ina219 import INA219
from ina219 import DeviceRangeError

SHUNT_OHMS = 0.1


def read():
ina = INA219(SHUNT_OHMS, busnum=1, address=0x40)
ina.configure(voltage_range=ina.RANGE_32V, gain=ina.GAIN_4_160MV, bus_adc=ina.ADC_64SAMP, shunt_adc=ina.ADC_64SAMP)

while True:
try:
shunt_mv = ina.shunt_voltage()
# print("Bus Voltage: %.3f V" % ina.voltage())
print("Bus Current: %.3f mA" % ina.current())
# print("Power: %.3f mW" % ina.power())
print("Shunt voltage: %.3f mV" % shunt_mv)
print('-' * 15)
except DeviceRangeError as e:
# Current out of device range with specified shunt resistor
print(e)
time.sleep(0.1)

if __name__ == "__main__":
read()

Примечание: если код не запустился проверьте номер шины или установите, через pip библиотеку pi-ina219. Командой:

pip install pi-ina219

Дам некоторые комментарии к коду. В функции read() создается объект класса INA219, в параметры мы передаем сопротивление шунта, номер i2c шины и последний параметр это адрес самой ina219 на шине i2c. Он задается с помощью резисторов и по умолчанию равен 0x40.

Чтобы найти наш адаптер cp2112 воспользуемся следующей командой:

i2cdetect -l

Примечание: возможно, для её исполнения потребуется установить пакет i2c-tools.

Пример вывода i2cdetect -l
Пример вывода i2cdetect -l

После создания класса попадаем в бесконечный цикл опроса. Интервал опроса составляет 100 мс, можно поэкспериментировать с этим значением. Даже такое значение уже неплохо для оценки потребления в моем случае. Мое устройство не спит, до тех пор пока на него идет физическое воздействие выше установленного порога.

Я читал несколько статей и в них говорилось, что частота опроса может быть существенно выше. Сам лично не проверял, но у меня нет никаких предпосылок не доверять этим данным т.к. частота дискретизации в ina219 явно выше 100 мс.

Пример работы скрипта
Пример работы скрипта

Итоги

Я сравнивал показания мультиметра и данной связки на статичном потреблении в районе 700 мкА. Показания приборов были вполне похожи и отличались примерно на 10 мкА. В моем случае это не критично, но могу представить ситуацию, где это играет роль.

Во всяком случае надеюсь материал этой статьи был вам полезен. Даже если это не так, то лишним упоминание микросхемы ina219 не будет. Вдруг, кто-то захочет сделать свой standalone профилировщик потребления, а ina219 вполне сгодиться базой для этого.

Ссылки

Репозиторий с исходным кодом python скрипта: https://github.com/Mcublog/ina-test

Ссылка на статью на моем сайте: https://mcublog.ru/2024/05/11/prostoj-mikroampermetr/