
Приветствую! Перед Новым годом для поднятия настроения до праздничного, захотелось сделать что-то необычное и новое. Все мы украшаем елку, ставим на вершину звезду, вешаем на ветки игрушки и ждем Деда Мороза. Женя, 41 годик.
Как всегда, идея родилась спонтанно, когда времени на реализацию почти не осталось. Пишу статью, параллельно софт и прямо сейчас жду платы с производства, даже не зная получится ли задумка. Так как эта зима нас не порадовала снегом в Петербурге, я не придумал ничего лучшего, чем сделать елочную игрушку в виде снежинки. Когда был совсем ребенком, делал гирлянды из старых советских лампочек на 6,3В, которые переключались с помощью схемы мультивибратора. Сейчас же, используя микроконтроллер (на рассыпухе я делать не готов), можно сделать что-то более интересное, а доступность изготовления печатных плат (хотя, хлорное железо тоже рулит), позволяет не использовать картон как основу для установки компонентов.
Я хотел получить устройство с минимумом компонентов, так как плата в форме снежинки не позволит уместить что-то типа микросхем сдвиговых регистров. Хотя переключение было бы более эффектное, например, рандомное зажигание. Так как провода питания к елочной игрушке я тянуть не хочу, буду использовать батарейку. Аккумулятор был бы куда эффективнее, но тогда нужно разводить схему зарядного устройства, а габариты не позволяют.

Удалось сделать 19 групп, каждая из которых состоит из двух-трех светодиодов. Сначала использовал резисторы в корпусе 0603 на каждый LED. Когда выгрузил все на плату, понял, что не остается места для трассировки и переходных отверстий. Оптимизировал.
Для питания поставил батарейный отсек для CR1220 и CR1632 (на выбор) — около 40мА и 120мА, соответственно. Для такого количества светодиодов (60 шт.) этого очень мало, но больше ничего не уместил. Батарейками закупился на все новогодние праздники.

Заберите максимум новогодних подарков с 15 по 23 декабря🎁
Один день — один сюрприз: адвент-календарь со скидками до 100% на IT-инфраструктуру.
Для отключения батарейки и возможности переключения режима работы поставил пару однопозиционных DIP-переключателей. По ширине на лучи снежинки поместились только они.
Как раз тут я понял, что резисторы 0603 и кварц мне не нужны. Батарейный отсек для CR1220 уместился еле-еле. Если диаметр окружности по центру делать больше, то игрушка становится меньше похожа на снежинку.
Только когда начал писать софт заметил, что немного накосячил с распределением светодиодов, но думаю, не критично.
К сожалению, Altium не поддерживает трассировку под углом 30 градусов и пришлось извращаться, используя «PolarGrid», а трассировку делать уже с привязкой к этой сетке.

Сначала мне показалось, что это будет не развести, так как лучи относительно тонкие. Пришлось несколько раз распределять светодиоды заново. Запустил автоматическую трассировку, но через 10 минут работы Altium выдал, что это невозможно. Ладно, сделаю сам.
В целом получилось весьма адекватно. Не понятно только, как это будет смотреться на елке. Да, высота всей снежинки 70 мм. Сверху даже запилил отверстие для ниточки, чтобы вешать на ветку.
Из-за батарейки смотрится громоздко, но по-другому никак. Прямо в этот момент курьер принес еще тепленькие печатные платы. Резонит (не реклама), наверное, испытывает тихий ужас от конфигурации моих плат, когда получает гербера.
На самом деле, мне нужно было проверить работу микросхемы MPQ4242BGVE Power Delivery (только не говорите, что лучше бы я написал на эту тему) и платы я заказывал именно из-за нее. Отсюда мультипликация, спешка и зеленая маска (белая смотрелась бы лучше, но под ней не всегда видны проводники.
Плата на мониторе, скажу я вам, выглядит намного больше, чем она есть на самом деле. Мне кажется, что получилось довольно неплохо.
Для прошивки предусмотрел тестовые точки и пожалел, что под батарейку не поставил временный разъем для прошивки и отладки. Для пар светодиодов взял резисторы 2k47, для троек — 2k0. Потребление при всех одновременно зажженных светодиодах (ET-0603QBC) составляет около 9мА, что меня порадовало.
Помучиться пришлось только с GPIO PB6 и PB7, которые в Arduino nano используются для кварцевого резонатора. Я предполагал, что прошив фьюзы для работы от внутреннего генератора, смогу сразу использовать пины как вход/выход (нет).
Для переключения режимов мигания, которых у меня два, решил использовать кнопку, которую зажимаю в момент включения. В setup() читаю показания АЦП и в зависимости от этого принимаю решение, какой алгоритм использовать. Можно еще сделать запоминание в eeprom.
Перепаял холдер для батарейки CR1632, чтобы измерить максимальное время работы. Устройство отработало два часа, потом явно перезагрузилось от недостатка питания, но продолжило работать еще 30 минут, дальше не проверял. Будем начинать оптимизировать потребление.
Первым делом проверяю, какое будет потребление, если спать между циклами. Использую функцию:
LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
Результаты тестов по потреблению (питание 3В):
-
Все светодиоды постоянно горят: 9мА.
-
Все светодиоды постоянно горят, далее делаем SLEEP_8S: 6мА.
-
Гасим светодиоды + делаем SLEEP_8S: 0,005мА.
Отлично! Для реализации сна между зажиганием светодиодов доступно десять констант от 15 мс до восьми секунд. Мне понадобятся таймауты 30 мс и 500 мс. Так как состояния GPIO остаются в установленных значениях вместо delay(30) и delay(500) с потреблением 9мА, я буду спать и тратить микроамперы.
В setup() добавляем делитель, чтобы снизить рабочую частоту до 64кГц (до этого работало на 8МГц).
clock_prescale_set(clock_div_256);
Теперь потребление при всех зажженных светодиодах 6,5мА (в SLEEP, соответственно, не поменялось). Не забываем, что при частоте меньше 1,5МГц прошивка должна осуществляться в SLOW режиме программатора (пониженная частота SPI). Если все-таки забудете, то придется, как мне, рыться в мусорной корзине, чтобы найти контроллер, который внезапно перестал шиться. Я использую старый добрый клон USBasp, джампер припаял, так как его не было.
Теперь отключим «Brown-out detection» — детектирование минимального напряжения питания микроконтроллера. По умолчанию стояло значение «101» в fuses. Это означает, что при снижении напряжения ниже 2,7В произойдет аппаратный сброс. Удаляем. Точнее, изменяем fuses на «111» в файле «boards.txt» (вот калькулятор, чтобы понимать, о чем я)
dior.bootloader.extended_fuses=0xFF #BOD off
Тем самым добиваемся того, что светодиоды продолжают отлично мигать при 2,4В. Можно и ниже, но видно хуже. Эх, не добавил что-нибудь типа TPS60242 (Capacitor Buck-Boost как раз выход до 25мА), чтобы высаживать батарейку еще больше (до 1,8В). Может, к следующему празднику…
Сделал пару гифок с режимами. Выглядит, конечно, после конвертации не очень (скорость нарушена), но суть понять можно. Первый вариант по умолчанию.
Итоги
Я ждал на работе, пока сядут батарейки. Взял с собой домой. Мониторил одним глазом всю ночь… вторую ночь…третью ночь ...
При работе от батарейки CR1220 в первом режиме: на данный момент отработало трое суток. Визуально яркость упала на 20-30%. Тест продолжается.
При работе от батарейки CR1632 в первом режиме: работает третьи сутки без изменений в яркости.
ЗЫ: Ссылка на исходники в Альтиум (добавил резистор на GND для АЦП):
ЗЗЫ: Можно добавить на плату фотодиод и включать питание когда темно.
С наступающим Новым годом! Спасибо за внимание и успехов!
Автор: the_bat
