
Сказ о том, как я реализовал «взрослое» управление питанием одноплатника на одной тактовой кнопке с потреблением в выключенном состоянии 1,2 мкА.
Мне понадобилось реализовать управление питанием одноплатника Raspberry Pi Zero W v1.1. Это тот, что узенький, с блекдж вайфаем и блютузом на борту. Это уже какой-никакой компьютер и жестко рубить его из сети – моветон. Делать несколько кнопок под питание – тоже моветон. Требования были такие:
Обеспечить потребление в выключенном режиме 1 – 2 мкА;
Управление одной тактовой кнопкой (одна группа нормально разомкнутых контактов без фиксации);
Возможность выключения с корректным завершением работы Linux;
Возможность программного выключения устройства без воздействия на кнопку;
Возможность аварийного аппаратного выключения на случай зависания устройства;
Отсутствие программируемых компонентов.
Ничего готового я в интернете не нашел, по этому запилил свою схемку. Я никогда не работал схемотехником, воспринимайте возможные косяки и недоработки с поправкой на этот факт. Сразу хочу попросить не кидаться в меня в комментах ссылками на готовые схемы, если они не соответствуют пунктам три и пять одновременно, обратите на это особое внимание.
Настройка управления питанием в Raspbian
В Raspbian есть механизм управления питанием, а именно – два оверлея: gpio-shutdown
и gpio-poweroff
. Первый служит для подключения тактовой кнопки управления питанием, а второй – для формирования на ножке GPIO импульса в момент окончания выгрузки ОС. Для настройки этих оверлеев открываем файл /boot/config.txt
на вашей SD карточке с образом системы и добавляем в него следующие строчки:
dtoverlay=gpio-shutdown,gpio_pin=16
dtoverlay=gpio-poweroff,gpiopin=4,active_low=1,inactive_delay_ms=4000,active_delay_ms=50
Первая строчка настроит GPIO16 как вход с подтяжкой к питанию. Теперь, если подключить кнопку между этим выводом и землей, то по кратковременному нажатию этой кнопки будет запускаться процесс выгрузки ОС и завершения работы устройства.
Вторая строчка конфигурирует вывод GPIO4 как выход, на котором формируется лог. 1 во время работы устройства. В конце процедуры завершения работы ОС на этом выводе будет сформирован кратковременный импульс низкого уровня. Этот импульс можно использовать для обесточивания внешней периферии.
Источник питания
В качестве источника питания я взял китайскую платку CN9303. Она построена на чипе DC/DC преобразователя HCN3903. Чип выдает стабильные 5 в на выходе при входном напряжении до 30 в и отдает в нагрузку до 3,5 ампер. Нас интересует то, что у этого чипа есть ножка включения – EN. Если подать на неё напряжение лог. 1, то преобразователь начинает работать, а если притянуть её к земле, то стабилизатор переходит в выключенное состояние (shutdown) с потреблением тока порядка 1 мкА.
На том китайском экземпляре, который я прикупил для опытов ножка EN выведена не была. По запросу HCN3903 в первых строках гуглится именно эта модель, по этому приведу инструкцию по её доработке.

Выпаиваем резистор, обведенный красным. Это подтяжка линии EN к питанию. Нам она будет мешать. Паяемся к седьмой ножке (показана красной стрелочкой). Это и есть вывод EN.
Принципиальная схема
Запасаемся макеткой, некоторым количеством случайных транзисторов и собираем схему, показанную на рисунке ниже. Она может показаться несколько запутанной, но желание уместить её на маленькой картинке было сильно. Не пинайте сильно, а я вам за это расскажу, как она работает. Уверен, после этого она станет гораздо понятней и покажется простой.

Включение
При нажатии на кнопку SW1 короткий положительный импульс поступает на вход EN преобразователя через цепочку R2, VD1, C3. Преобразователь запускается, на его выходе появляется напряжение 5 в. Это напряжение подается обратно на вход EN через резистор R4 и схема самоблокируется во включенном состоянии. При этом на выводе GPIO4 Raspberry Pi появляется лог. 1. Т.к. напряжение лог. 1 больше напряжения на стабилитроне ZD1, транзистор Q2 остается закрытым. Оверлей gpio-poweroff
настроен именно так, потому что если инвертировать полярность, то лог. 0 появляется на выходе GPIO4 с ощутимой задержкой, что нарушает работу схемы.
В целях отладки резистор R12 можно оставить висеть в воздухе или, если функционал управления выключением питания от Raspberry Pi вам по какой-то причине не нужен, можно исключить из схемы цепочку Q2, R7, R12.
Выключение
Для выключения питания нужно снова кратковременно нажать кнопку SW1. Откроется транзистор Q1 и подтянет ножку GPIO16 Raspberry Pi к земле. При этом, если правильно настроен оверлей gpio-shutdown
, запустится процесс завершения работы ОС.
После выгрузки всех модулей, в соответствии с настройками оверлея gpio-poweroff
, система сформирует отрицательный импульс на выводе GPIO4. Этот импульс откроет транзистор Q2 и вывод EN стабилизатора притянется к земле. Это приведет к отключению стабилизатора и обесточиванию всех устройств, которые от него питаются, в том числе и нашей Raspberry Pi.
Аварийное выключение
А что делать, если устройство жестко зависло и не реагирует на нажатие кнопки? В таком случае начинает работать самая запутанная часть схемы.
Зажимаем кнопку SW1 и держим порядка 4 – 6 секунд. В это время открыт транзистор Q4 и начинает заряжаться емкость C1. На базу транзистора Q3 воздействует напряжение с делителя, верхним плечом которого является цепочка R2, VD1, C1, а нижним – R9 и переход К-Э транзистора Q4. Напряжение на эмиттере Q3 определяется стабилитроном ZD1 и составляет 2,4 в (для отладки в качестве стабилитрона я использовал синий светодиод). Напряжение на верхнем плече делителя растет по мере заряда конденсатора C1, а на нижнем плече, соответственно, падает.
Когда напряжение нижнего плеча становится меньше напряжения на эмиттере Q3, через базу последнего начинает течь ток, который открывает этот транзистор. Когда транзистор Q3 полностью открыт, он окончательно подтягивает вывод EN стабилизатора к земле и стабилизатор отключается.
Диод VD1 служит для предотвращения разряда конденсаторов C1, C3 через цепь управления транзистором Q4. Резистор R5 служит для разряда C1 после выключения питания аварийным способом.
Заключение
Схема неидеальна. Например, после аварийного выключения она долго не дает включить питание. Это связано с тем, что через резистор R5 номиналом 10 МОм конденсатор С1 разряжается около 2 минут. Однако, победить это за вменяемое время мне не удалось. Я не собирал схему в симуляторе, а сразу взялся за макетку и компоненты. Подозреваю, что не все переходные процессы в этой схеме представляю верно. Практический результат меня удовлетворил, хотя есть ощущение, что схему можно упростить. Бросается в глаза дублирование функций транзисторами Q2 и Q3. Такая же ситуация с Q1, Q4.
Надеюсь, кому-то эта схемка окажется полезной. Критика и дополнения приветствуются.