Шилд бесперебойного питания для Raspberry Pi

27 мая 2019

При использовании Raspberry Pi в качестве роутера я столкнулся с одной проблемой. Дело в том, что дома иногда отключают свет. По моим наблюдениям, это происходит ненадолго и только в рабочие часы. Видимо, неподалеку идут какие-то ремонтные работы. Так вот, когда это происходит, мне приходится заходить на малину по SSH и запускать все, что в ней крутилось в tmux — как минимум, это OpenVPN. Мне также приходится выставлять время на микроволновке и газовой плите, поскольку в них сэкономили на часах реального времени, но это другая история. Так или иначе, встал вопрос о приобретении UPS для моего роутера.

В ходе поиска по eBay было обнаружено устройство под названием «Raspi UPS HAT Board». Судя по описанию, «шапка» делает в точности то, что мне было нужно. Цена вопроса — 16$ вместе c Li-Ion аккумулятором и доставкой. Чего тут думать, нужно брать!

Вблизи устройство выглядит таким образом:

UPS для Raspberry Pi, вид сверху

Вид снизу:

UPS для Raspberry Pi, вид снизу

Заметьте, что при использовании шапки питание нужно подавать на ее USB-разъем, а не разъем Raspberry Pi. Для включения одноплатника нужно нажать боковую кнопку (на последнем фото она справа вверху).

Основные компоненты устройства:

  • ETA9741 — чип является контроллером заряда Li-Ion аккумулятора;
  • ETA1096 — повышающий регулятор напряжения, минимум 1.8 В на входе, 5 В на выходе;
  • Маленький чип с маркировкой «7048» представляет собой MAX17048 (даташит [PDF]), датчик уровня заряда Li-Ion аккумулятора с интерфейсом I2C;

Давайте выясним, сможем ли мы пообщаться с последним из Linux. Для этого выполним команду:

sudo raspi-config

… и убедимся, что поддержка I2C включена в Interfacing Options → I2C.

Далее:

sudo apt-get install i2c-tools
i2cdetect -y -a 1

Должны увидеть:

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- 36 -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

Из даташита MAX17048 мы можем узнать, что он действительно имеет адрес 0b0110110 или 0x36. Также в даташите содержится информация о регистрах, среди которых нас в первую очередь интересуют VCELL с адресом 0x02 и SOC с адресом 0x04. В первом регистре содержится напряжение аккумулятора, а во втором — уровень его заряда в процентах.

$ i2cget -f -y 1 0x36 2 w
0xf0c5

Скорректировав порядок байт, и воспользовавшись формулой из даташита, узнаем, что напряжение на аккумуляторе в вольтах:

>>> 0xC5F0 * 78.125 / 1000000
3.95875

Что же до уровня заряда:

$ i2cget -f -y 1 0x36 4 w
0xcf3d

Или в процентах:

>>> 0x3DCF / 256.0
61.80859375

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

Дело в том, что при отключении питания Raspberry Pi переключается на питание от аккумулятора и продолжает питаться от него, даже после восстановления питания. Аккумулятор начинает снова заряжаться только когда уровень заряда падает до 0% (напряжение где-то 2.7-2.8 В). Система, конечно, при этом не прерывает своей работы. Но при таком подходе пользы от датчика MAX17048 не много. Кроме того, мы становимся более уязвимы к повторному отключению питания. Плюс подхода, по всей видимости, заключается в том, что аккумулятор переживает меньше циклов разряда и заряда, и потому предположительно прослужит дольше.

Емкость аккумулятора, заявленная продавцом, составляет 2500 мАч. При моем сценарии использования Raspberry Pi для полного разряда аккумулятора требуется 4 часа. Чтобы снова зарядить его с 0% до 100% требуется 35 часов.

Не могу сказать, что шилд представляет собой в точности то, что я от него ожидал. Тем не менее, он вполне успешно решает проблему, с которой я столкнулся.

Метки: , , .

Понравился пост? Узнайте, как можно поддержать развитие этого блога.

Также подпишитесь на RSS, Facebook, ВКонтакте, Twitter или Telegram.