При разработке или модернизации различных портативных DIY устройств частенько возникает потребность в отображении актуального текущего уровня заряда аккумулятора или батареек. Первое, что приходит на ум —
купить готовый модуль, типа такого. Это самый простой вариант, но он вынуждает идти на компромиссы: его придется ждать неопределенное время и останавливать разработку на этот срок; он может не подойти по размерам; может сильно врать по показаниям, и исправить это никак не получится. Я хочу показать довольно простой способ изготовления такого индикатора из минимального количества широкодоступных деталей.
Прошивка, схема и список деталей
Модуль реализован на простейшем микроконтроллере Attiny13A и 4х индикаторных светодиодах. Схема сильно упрощенная, без какой-либо защиты от помех и неправильной полярности, в моем случае это допустимо, т.к. индикатор устанавливается в маломощное устройство. Если предполагается работа в более жестких условиях, то стоит добавить в цепь питания микроконтроллера диод Шоттки и конденсатор 1-10мкФ, а так же пересчитать в прошивке пороговые значения напряжений с учетом падения напряжения на диоде.
Исходные коды, готовые прошивки и прочие нужные материалы
можно найти у меня на гитхабе.
Схема:
Для сборки нам понадобятся:
У тех, кто увлекается 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. Первое, что нам для этого нужно — кусок текстолита, размером примерно 20x10мм:
Его даже не обязательно покупать, можно вырезать из ненужной платы какого-либо устройства, покрытые медью площадки такого маленького размера встречаются довольно часто. Далее шкурим и обезжириваем поверхность, затем примеряем наш МК:
Придерживая пинцетом, с помощью тонкого перманентного маркера наносим на будущую плату риски между контактами контроллера:
Так легко и просто мы получаем практически идеальное посадочное место под пайку, и так можно «обрисовать» практически любой 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 и выше, либо вообще на другие элементы питания
Единственный недостаток — сделать его все же несколько сложнее, чем просто заказать и ждать)
светодиод ведь будет постоянно гореть при вашем включении(если я правильно понял)
Единственная проблема — нога ресета также была задействована.
Но за то что сделал своими руками +
a.aliexpress.com/_Adxmsk
Звучит как «Если не хотите заказывать и ждать суши, сделайте их из того, что всегда под рукой. Возьмите рис, корень васаби, мирин, сакэ, водоросли комбу, немного свежевыловленного тунца и живого осьминога...» ))
— «Пошлите кухарку в погреб, пускай она нарежет холодной буженины, лососины, добавит мочёную клюкву, посыплет свежей зеленью и подаст на стол. Разлив домашней наливочки, извинитесь перед гостями...»
a.aliexpress.com/_9uo0pI
Сразу показывает напряжение и более универсален.
Да, проверил. От 3.5 не поплохело.
https://aliexpress.ru/item/item/1005001394064475.html
Перемен требуют наши сердца«Освободится» один вывод у Attiny13A, его можно использовать для переключения режимов заряд/разряд.
Естественно, что программа управления светодиодами будет совершенно другая.
Как поделка из серии «нечем заняться на пару дней» — пойдет.
Корпус на 3D принтере — можно не делать, а просто залить устройство термоклеем в картонной опалубке. В корпусе основного устройства просверлить отверстия под светодиоды, вставить собранный индикатор и залить изнутри термоклеем.
Остальное да, «дома случайно нашлись светодиоды, резисторы, Attiny13, ардуина как программатор, на компе весь софт, в голове умение программировать для ардуино». Но на эту тему уже пошутили…
Проколоть дырки, вставить в них ноги деталей и с обратной стороны спаять?
Формирование дорожек скрайбером тоже достаточно быстрый и надежный способ.
Обьемный монтаж вообще ничего кроме самих радиодеталей не требует.
В приличном стабе за упоминание вслух этого существа могут и побить… (S-T-I-K-S)
Тут нужно чуть больше соображалки и ловкости рук.
P.S. Теперь и вас в стабе побьют…
Я не понял, кто тут минусит, но это не я.У меня почти полное «собрание сочинений» на эту тему и, т.к. читать вообще некогда и к тому же с возрастом зрение здорово подсело, всё это в виде аудиокниг, а т.к. я часто езжу к себе в деревню за 220 км от Москвы, то слушаю в машине с удовольствием, кроме того, в отличии от музона, книга не дает заснуть, потому, что мозги не отключаются, а в голове, как и при чтении обычной книги, рисуется картинка, х\ф практисски.И если вдруг что-то экранизируют, то скорее всего получится совсем не то, что себе в мозгах нарисовал и не понравится.Так уже случалось в моей практике.Есть не сильно известная, но очень сильная книга «Джура». Автор — известный в свое время путешественник Георгий Павлович Тушкан.Невероятный человек. Но наши сняли весьма посредственную картину по его книге, вырезав половину интересных моментов.
А в сети есть такое о нём упоминание:
«Английское издательство в своем предисловии к «Джуре» назвало Георгия Тушкана советским Фенимором Купером и сообщило своим читателям, что «со времени „Последнего из могикан“ мы не читали повести, так насыщенной волнующими происшествиями и оригинальными характерами, как „Джура“.»
Я меня всё наоборот, я не могу слушать аудиокниги за рулём. Отвлекают. Или книгу пришлось бы слушать «в пол-уха» (содержание услышал, удовольствия не получил), или в столб…
Спасибо, попробую.
Когда переводил осциллограф DSO138 на питание от лития, так и сделал. Добавил только кнопку.Работает с 2,1 В.
У меня почему то перекись не очень жалела оный при травлении.
Компактнее бы было, тинька даже в хардварный шим умеет.
Так что вполне безопасно и будет долго и нормально работать.
Понятно, что при не дохлом аккумуляторе напряжение и так будет измеряться точно. А с учётом того, что это лишь «показометр», то точность вообще нафиг не нужна. Однако, на мой взгляд, уж если развлекаться такими поделками, то сделать правильно — отдельное удовольствие.
Но можно сильно расширить показометр, добавив промежуточное мигание, т.е. уровней будет 8.
Ну и ИМХО, измерять нужно между индикацией, те на время измерения вырубать все светики.
И ШИМить по одному, перебирая — тогда потребление будет очень низкое.
Запилил шим и измерение при отключеных светодиодах, яркость каждого канала можно подстраивать программно в прошивке (LED1_MAX, LED2_MAX и т.д). Так же добавил возможность включить плавное переключение светодиодов (FADE_LEDS)
А вот поставить один резистор на все диоды — другое дело. Индикацию, правда, при этом придется сделать динамическую (чтобы яркость не зависела от количества светящихся диодов), а для визуального выравнивания яркости использовать ШИМ.
Тем более что напряжения, которые вы замеряете, больше, чем напряжение падения на любом светодиоде.
Подберите светодиоды с нужным падением напряжения, добейте недостающее диодами — и вот вам готовый индикатор без программирования, регистрации и смс.
Да, не забываем также об отсутствии нормального питания на мк и отсутствии какой-либо защиты.
Делитель, если взять нормальные сопротивления — тоже вполне будет стабилен.
А питание от батареи — это уже не нормальное питание?
Какой защиты? От чего? От батареи же питаемся, не? До 2.8 вольт можно не беспокоится, а если взять контроллер с буковкой «V» то и до 1.8.
Или ещё проще — МК и готовый модуль на TM1637
Добавить копеечный датчик тока типа ZXCT1009 и наш индикатор начинает показывать заряд, напряжение и потребляемый ток.
Извращаться — так по полной.