• Цена: $2

При разработке или модернизации различных портативных DIY устройств частенько возникает потребность в отображении актуального текущего уровня заряда аккумулятора или батареек. Первое, что приходит на ум — купить готовый модуль, типа такого. Это самый простой вариант, но он вынуждает идти на компромиссы: его придется ждать неопределенное время и останавливать разработку на этот срок; он может не подойти по размерам; может сильно врать по показаниям, и исправить это никак не получится. Я хочу показать довольно простой способ изготовления такого индикатора из минимального количества широкодоступных деталей.

Прошивка, схема и список деталей

Модуль реализован на простейшем микроконтроллере Attiny13A и 4х индикаторных светодиодах. Схема сильно упрощенная, без какой-либо защиты от помех и неправильной полярности, в моем случае это допустимо, т.к. индикатор устанавливается в маломощное устройство. Если предполагается работа в более жестких условиях, то стоит добавить в цепь питания микроконтроллера диод Шоттки и конденсатор 1-10мкФ, а так же пересчитать в прошивке пороговые значения напряжений с учетом падения напряжения на диоде.

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

Схема:

Простой самодельный индикатор уровня заряда аккумулятора

Для сборки нам понадобятся:

  • Attiny13A
  • Резисторы на 18 кОм и 4.7 кОм — для делителя напряжения. Не обязательно SMD и именно с такими значениями, прошивку можно настроить под другие
  • Резисторы 220 Ом — для подключения к светодиодам
  • Arduino Nano 3.0 — для использования в качестве программатора
  • SOIC клипса — по желанию, без нее можно обойтись, но она сильно ускоряет и облегчает прошивку микроконтроллера в SOIC-8 исполнении
  • Разноцветные 3мм светодиоды

У тех, кто увлекается DIY и всякими ардуинами, перечисленных выше компонентов скорее всего навалом, так что покупать ничего не придется, разве что Attiny13A.

Возможности

Я поставил цель запилить максимально простой, но в то же время достаточно функциональный индикатор. Для отображения уровня заряда в нем используются 4 светодиода, логика работы проста:

  • Горят 4 светодиода — заряд 100% — 75%, напряжение 4.2В — 3.9В
  • 3 светодиода — 75% — 50%, напряжение 3.9В — 3.7В
  • 2 светодиода — 50% — 25%, напряжение 3.7В — 3.5В
  • 1 светодиод — 25% — 0%, напряжение 3.5В — 3.3В

Первый и последний светодиоды могут мигать, сигнализируя соответственно либо о перезаряде (напряжение > 4.25В), либо слишком низком напряжении (< 3.3В). Диапазон рабочих напряжений модуля лежит в пределах от 2.7В до 5.5В, максимальный потребляемый ток — около 50мА (зависит от значений ограничительных резисторов).

Настройки и режимы работы

На гитхабе в разделе firmware лежат уже готовые «отполированные» мною бинарники прошивок (файлы all_leds.hex и single_led.hex), они рассчитаны на применение резисторов номиналами 18 кОм и 4.7 кОм в делителе напряжений. Но бывает так, что именно таких резисторов может не оказаться, либо может попасться кривой микроконтроллер (по даташиту у Attiny13A заявлена точность измерений ADC в районе 10%), тогда потребуется самостоятельно модифицировать и пересобрать прошивку для себя, сделать это можно в программе Atmel Studio.

Доступные для изменения настройки в прошивке:

Простой самодельный индикатор уровня заряда аккумулятора

UHI здесь задает порог напряжения, выше которого начинает работать индикация перезаряда, остальные (U100, U75, U50, U25) — пороги для зажигания соответствующих светодиодов. При напряжении ниже U25 срабатывает индикация низкого напряжения. Общая формула для вычисления этих пороговых значений в зависимости от номиналов резисторов и напряжения аккумулятора имеет вид:

Простой самодельный индикатор уровня заряда аккумулятора

Где Ubat — напряжение на входе, R1, R2 — значения сопротивлений резисторов делителя. В случае, если МК подключен через диод Шоттки, в формулу добавляется величина падения на диоде Ud:

Простой самодельный индикатор уровня заряда аккумулятора

Но, как я уже говорил, погрешность АЦП у этого типа МК довольно большая, поэтому занесенные мною в прошивку значения слегка отличаются от теоретических. В идеале можно добиться очень высокой точности, но только методом проб и ошибок на конкретном экземпляре микроконтроллера. Для использования индикатора в качестве простого показомера «заряжено» — «разряжено» подойдут и мои значения.

Помимо пороговых значений изменять можно еще 2 параметра: гистерезис UHYS и режим отображения USE_ALL_LEDS. Первый служит для предотвращения мерцания светодиодов при переходе через пороговые напряжения, чем выше значение — тем меньше вероятность мерцаний. Если никаких неожиданных миганий при работе индикатора вы не наблюдаете — то этот параметр трогать нет необходимости. Второй параметр, USE_ALL_LEDS, задает один из двух способов индикации: в случае наличия строки с этим параметром в индикации будут участвовать все «младшие» светодиоды, если же эту строку закомментировать или вовсе удалить — будет гореть только один светодиод, отвечающий за текущий уровень заряда. Как это выглядит — покажу дальше, а пока предлагаю приступить к сборке модуля.

DIY, DIY, DIY

В случае использования МК в исполнении DIP-8 удобнее всего собирать модуль навесным монтажом. В моем случае МК в SOIC-8, поэтому я буду делать плату буквально на коленке и покажу небольшой лайфхак, как можно легко от руки разводить платы для SMD. Первое, что нам для этого нужно — кусок текстолита, размером примерно 20×10мм:

Простой самодельный индикатор уровня заряда аккумулятора

Его даже не обязательно покупать, можно вырезать из ненужной платы какого-либо устройства, покрытые медью площадки такого маленького размера встречаются довольно часто. Далее шкурим и обезжириваем поверхность, затем примеряем наш МК:

Простой самодельный индикатор уровня заряда аккумулятора

Придерживая пинцетом, с помощью тонкого перманентного маркера наносим на будущую плату риски между контактами контроллера:

Простой самодельный индикатор уровня заряда аккумулятора

Так легко и просто мы получаем практически идеальное посадочное место под пайку, и так можно «обрисовать» практически любой SMD компонент:

Простой самодельный индикатор уровня заряда аккумулятора

Далее просто от руки дорисовываем места под резисторы делителя и выводы на светодиоды:

Простой самодельный индикатор уровня заряда аккумулятора

Осталось протравить нарисованную плату, сделать это легко и просто с помощью валяющихся у каждого дома ингредиентов, записываем рецепт:

  • Пол рюмки перекиси водорода из аптечки
  • Кидаем в нее половину чайной ложки поваренной соли
  • Добавляем чайную ложку лимонной кислоты
  • Перемешиваем до полного растворения компонентов, если плохо растворяется — смесь можно подогреть

Кидаем плату в раствор:

Простой самодельный индикатор уровня заряда аккумулятора

О начавшемся процессе травления возвещают появившиеся на поверхности меди пузырьки. Пока плата травится, я распечатал на принтере будущий корпус для индикатора:

Простой самодельный индикатор уровня заряда аккумулятора

Спустя 15-20 минут плата полностью протравилась, а раствор стал бирюзовым:

Простой самодельный индикатор уровня заряда аккумулятора

Вытаскиваем плату, смываем маркер, проверяем дорожки:

Простой самодельный индикатор уровня заряда аккумулятора

Все протравилось идеально, можно паять компоненты, которых не так много: всего 1 МК и 2 резистора. Паять удобнее всего пастой, фен в нашем случае не нужен, можно обойтись обычным паяльником с тонким жалом:

Простой самодельный индикатор уровня заряда аккумулятора

Плата готова, теперь нам нужно подготовить светодиоды. Я использовал обычные дешевые 3мм светодиоды: красный, оранжевый, зеленый и белый. Для удобства пайки я распечатал второй корпус и сделал из него подставку:

Простой самодельный индикатор уровня заряда аккумулятора

Минусовые выводы светодиодов подрезаны и запаяны вместе, к плюсовым паяем ограничительные резисторы:

Простой самодельный индикатор уровня заряда аккумулятора

Я использовал по 220 Ом, но при использовании одинаковых резисторов для всех светодиодов у них будет сильно отличаться яркость. В моем случае это не критично, но для большей красоты следует подбирать резисторы индивидуально.

Далее берем нашу плату, размещаем между выводами светодиодов и паяем минусовой контакт диодов к нижней дорожке земли на плате:

Простой самодельный индикатор уровня заряда аккумулятора

Свободные концы резисторов паяем к соответствующим пятакам платы:

Простой самодельный индикатор уровня заряда аккумулятора

Последний штрих — паяем провода питания. Я забыл развести пятаки для удобства, поэтому пришлось паять так:

Простой самодельный индикатор уровня заряда аккумулятора

Вид с обратной стороны:

Простой самодельный индикатор уровня заряда аккумулятора

Модуль готов, теперь в него необходимо «вдохнуть жизнь» прошивкой.

Заливаем прошивку

Для заливки прошивок в контроллеры я приспособил Arduino Nano. Прямо в Arduino Studio есть специальный скетч, который заливается в Nano и превращает его в AVRISP программатор:

Простой самодельный индикатор уровня заряда аккумулятора

В коде скетча перед заливкой в Arduino необходимо предварительно раскомментировать строку #define USE_OLD_STYLE_WIRING:

Простой самодельный индикатор уровня заряда аккумулятора

В результате мы получаем удобный ISP программатор, который можно использовать с avrdude. Подключаем ардуину к микроконтроллеру в соответствии со схемой:

Простой самодельный индикатор уровня заряда аккумулятора

SOIC клипса в таких делах очень сильно выручает, но при ее отсутствии можно подпаяться напрямую к контроллеру. Конденсатор между RESET и GND можно не использовать, все должно работать и без него.

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

avrdude -p t13 -c avrisp -b 19200 -u -Uflash:w:название_файла_прошивки.hex:a -Ulfuse:w:0x65:m -Uhfuse:w:0xFD:m

В случае успеха на экране будет что-то типа такого:

Простой самодельный индикатор уровня заряда аккумулятора

Если ошибка — то проверяем в первую очередь провода и правильность установки софта/драйверов, правильность выбора COM-порта. По опыту скажу, что сломать Attiny при прошивке очень сложно, они практически не убиваемые. Ни внезапно отвалившаяся в процессе прошивки клипса, ни баги с софтом на компе ему не страшны. Единственное, чем можно запороть этот МК — это неправильными фьюзами.

Проверяем работоспособность

После удачной прошивки модуль должен сразу заработать, потому что на него подается питание через программатор. Для большей уверенности необходимо подключить его к регулируемому источнику питания и прогнать диапазон 3В — 5В и проверить, что все светодиоды и режимы индикации работают. За неимением ЛБП выйти из положения можно с помощью наборов различных элементов питания: при работе от одной CR2032 модуль должен мигать красным светодиодом, сигнализируя о слишком низком напряжении; при питании от 3xAA или 2xCR2032 должен напротив мигать белый светодиод, обозначая превышение допустимого для Li-ion напряжения. Если при проверке на ЛБП выясняются расхождения с заявленными пороговыми напряжениями и индикацией, то для повышения точности можно методом проб и ошибок найти более точные значения UHI, U100, U…

Примеры работы в гифках

Изменение напряжения от 4.2В до 3.3В и обратно:

Простой самодельный индикатор уровня заряда аккумулятора

Индикация превышения допустимого напряжения:

Простой самодельный индикатор уровня заряда аккумулятора

Те же примеры с удаленной из прошивки строкой USE_ALL_LEDS:

Простой самодельный индикатор уровня заряда аккумулятора

Простой самодельный индикатор уровня заряда аккумулятора

Индикация низкого напряжения:

Простой самодельный индикатор уровня заряда аккумулятора

Продолжаем DIY

Модуль прошит, проверен и отлажен, теперь осталось разместить его в напечатанном ранее корпусе. Вставляем плату:

Простой самодельный индикатор уровня заряда аккумулятора

Простой самодельный индикатор уровня заряда аккумулятора

Для надежности внутренности я залил эпоксидной смолой:

Простой самодельный индикатор уровня заряда аккумулятора

Как оказалось, сделал я это зря) Эпоксидка при застывании расширилась и немного повела корпус, для целей фиксации все же лучше использовать герметик или термоклей.

Переднюю часть для красоты шкурим и тем самым матируем:

Простой самодельный индикатор уровня заряда аккумулятора

Итоговый вид:

Простой самодельный индикатор уровня заряда аккумулятора

Простой самодельный индикатор уровня заряда аккумулятора

Разница в яркости немного портит впечатление, но при желании это можно легко решить.

Выводы

По функциональности самодельный модуль ни в чем не уступает покупным, и при этом имеет кучу преимуществ:

  • В нем легко добиться высокой точности с помощью подгона параметров
  • Легко адаптировать под любой дизайн и встроить куда угодно
  • Его можно собрать на коленке из имеющихся элементов
  • При необходимости можно модифицировать его на работу с 2S и выше, либо вообще на другие элементы питания

Единственный недостаток — сделать его все же несколько сложнее, чем просто заказать и ждать)