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

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

Взял готовый модуль с 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

Из вывода становится ясно, что преобразователь это устройство /dev/i2c-1.

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

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

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

Итоги

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

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

Ссылки

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *