Блок включения и выключения Плеера «RuneAudio» на базе микрокомпьютера «Raspberry Pi 3»
Описываемый блок предназначен для ручного (нажатием кнопки) и дистанционного (с помощью проводного потенциального сигнала «Remote On») включения и выключения Плеера «RuneAudio» на базе микрокомпьютера «Raspberry Pi3» для ЦАП с интерфейсом USB.
Предлагаемый подход к организации процедур управления питанием микрокомпьютера можно использовать также совместно с другими операционными системами на основе Linux (например, «Raspbian»), при наличии установленной библиотеки RPi.GPIO и транслятора с языка Python3. Кроме наличия дополнительной платы блока управления питанием требуется соответствующая программная поддержка на уровне операционной системы, предусматривающая как выдачу внешнего управляющего сигнала программного завершения работы микрокомпьютера («shutdown -h now»), так и опрос сигнала обратной связи от микрокомпьютера («Ready»), сигнализирующего о его готовности, т.е. о состоянии загрузки операционной системы. Такая программная поддержка уже реализована в настроенных образах операционной системы «RuneAudio», ссылки на скачивание которых приведены в конце статьи. Эти образы, предназначенные для записи на карту Micro SD, обеспечивают поддержку символьного индикатора 1602 или 2004, кнопок управления и ИК приёмника.
Перед рассмотрением работы собственно блока включения и выключения приведём схему его интеграции в уже существующую систему с индикатором, кнопками и ИК приёмником:
На приведённом рисунке видно, что блок подсоединяется к микрокомпьютеру тремя проводами: земля «Gnd», сигнал выключения «/Shutdown» (активный низкий уровень сообщает операционной системе микрокомпьютера о необходимости завершения работы) и сигнал готовности «Ready» (активный высокий уровень показывает, что система загружена). Распиновка портов GPIO («General Purpose Input Output») приведена по системе BCM («Broadcom»), принятой для библиотеки RPi.GPIO. Указанные сигналы «Gnd», «/Shutdown» (GPIO9) и «Ready» (GPIO10) соответствуют физическому расположению контактов разъёма с номерами 21, 19 и 25. Следует заметить, что в настройках файла конфигурации системы можно поменять номера используемых для этих целей портов GPIO на другие (будет описано ниже).
К блоку включения и выключения подключаются внешний разъём «Remote On» (для подачи потенциального сигнала дистанционного включения и выключения) и кнопка ручного включения / выключения «On / Off». Во включённом состоянии питающее напряжение сети ~220V подаётся на узел питания микрокомпьютера плеера через управляемый силовой блок коммутации, выполненный на симисторе.
Рассмотрим принципиальную схему блока включения и выключения и алгоритм его работы.
Основу устройства составляет микроконтроллер (МК) D1 ATtiny2313 (в планарном корпусе). В качестве источника дежурного питания A1 применён готовый малогабаритный импульсный блок питания 5V 0,6A. Так как порты GPIO микрокомпьютера работают от напряжения +3,3V, предусмотрена установка дополнительного стабилизатора напряжения D2, однако, как показала практика, вполне можно обойтись и без него. Сигнал «/SHTDN» с порта PD5 МК подаётся на соответствующий порт GPIO микрокомпьютера через защитный диод VD4, предотвращающий поступление на порт микрокомпьютера уровня выше +3,3V. Для сигнала «RDY», поступающего от микрокомпьютера на порт PD4 МК, максимальный уровень +3,3V является достаточным.
Принцип дистанционного управления питанием заимствован из блока управления усилителя PA2020. Сигнал дистанционного включения «REM» поступает на порт PD3 МК через эмиттерный повторитель на транзисторе VT1. Причём активно этот сигнал воздействует только на выключение, когда его уровень низкий, поэтому свободный не подсоединённый вход означает включение. Наличие диода VD1 позволяет подключать к одному источнику сигнала дистанционного включения сразу несколько однотипных по управлению устройств, при этом обесточивание одного из таких устройств не будет влиять на управление остальными.
Микроконтроллер проверяет факт нажатия кнопки включения / выключения Sw1 (импульсный сигнал замыкания на землю «/SW») опросом состояния порта PD2. Также он анализирует состояние перемычки J9 «Not Check Ready», заведённой на порт PD1, и, если она замкнута, не опрашивает в процессе работы состояние сигнала готовности «RDY», что полезно при отладке, или если на микрокомпьютере установлен образ системы, не поддерживающий обработку этого сигнала.
С целью индикации режима работы к портам PA1, PA0 МК подключён двухцветный (для определённости: красный + зелёный) светодиод с общим катодом HL1, HL2:
- красный, светящийся непрерывно – дежурный режим работы «Standby», когда микрокомпьютер обесточен;
- красный, мигающий медленно – идёт процесс включения или выключения микрокомпьютера;
- красный, мигающий часто («вспыхивающий») – ошибка процесса загрузки или выключения микрокомпьютера (так и не был получен сигнал подтверждения загрузки или выключения в течение заданного времени);
- зелёный, светящийся непрерывно (или оба горящих светодиода, дающие вместе жёлтый цвет – это определяется программно) – нормальный рабочий режим, когда микрокомпьютер включён и готов к работе.
Микроконтроллер управляет силовым блоком на симисторе VS1 через порт PD0 (сигнал «/ON» с активным низким уровнем). Для гальванической развязки служит оптрон U1 с симисторным выходом и детектором перехода через 0. Коммутируемая симистором VS1 мощность достаточно мала, поэтому он используется без радиатора. Для полного обесточивания устройства можно использовать слаботочный выключатель Sw2, установленный в разрыв первичной цепи ~220V блока дежурного питания A1.
После включения описываемого устройства выходные сигналы «/ON» и «/SHTDN» программно устанавливаются в состояние высокого уровня, что обеспечивает обесточивание блока питания микрокомпьютера и готовность к последующему включению. В этом состоянии «Standby» горит красный светодиод, и микрокомпьютер выключен (обесточен). Здесь и далее описание состояний устройства будет относиться к микрокомпьютеру, так как предполагается, что само устройство запитано от блока дежурного питания и всегда находится во включённом состоянии.
Логика обработки входных сигналов «REM» и «/SW» следующая. Если микрокомпьютер был выключен кнопкой вручную (импульсом низкого уровня /SW=0), то сигнал удалённого включения (REM=1) не обрабатывается, пока его уровень не станет низким (т.е. для дистанционного включения нужен положительный перепад сигнала «REM»). Если микрокомпьютер был включён кнопкой вручную (также импульсом низкого уровня /SW=0), то сигнал удалённого выключения (REM=0) не обрабатывается, пока его уровень не станет высоким (другими словами, для дистанционного выключения нужен отрицательный перепад сигнала «REM»). Таким образом, включение и выключение кнопкой имеет приоритет перед сигналом дистанционного включения «REM». В противном случае устройство было бы невозможно включить кнопкой при низком уровне сигнала «REM», и наоборот, его нельзя было бы выключить кнопкой при высоком уровне сигнала «REM» (в том числе, если вход дистанционного управления не задействован). В реальности это выглядит совершенно естественно: устройство всегда можно включить или выключить вручную кнопкой, а для активации дистанционного включения или выключения, возможно, потребуется сначала дистанционно выключить или включить устройство.
Рассмотрим процессы, происходящие при нажатии на кнопку Sw1. Сначала анализируется состояние входного сигнала «RDY», и, если он имеет высокий уровень, то считается, что микрокомпьютер был включён, и его надо выключить, и наоборот.
Для включения микрокомпьютера на выходе МК «/ON» формируется активный низкий уровень, подающий питание через силовой блок, который будет действовать до отключения микрокомпьютера. После подачи низкого уровня сигнала «/ON» проверяется состояние сигнала «RDY» до тех пор, пока его уровень не станет высоким, при этом красный светодиод мигает. Если по истечении заданного времени (100 секунд) уровень сигнала так и остался низким, красный светодиод начинает мигать учащённо, и устройство переходит в состояние ошибки, до его выключения. В случае успешной загрузки системы микрокомпьютера (RDY=1) устройством фиксируется состояние готовности, и загорается зелёный светодиод.
При нажатии на кнопку Sw1 при включённом микрокомпьютере формируется низкий уровень сигнала «/SHTDN» до тех пор, пока микрокомпьютер не выключится (до достижения низкого уровня сигнала «RDY»). При этом зелёный светодиод гаснет, и начинает мигать красный светодиод, означающий переход в состояние ожидания выключения. Если в течение заданного времени (40 секунд) низкий уровень сигнала «RDY» не будет достигнут, то фиксируется состояние ошибки, и красный светодиод станет мигать быстро. В случае успешного выключения (RDY=0) выходные сигналы «/ON» и «/SHTDN» устанавливаются в состояние высокого уровня, обесточивая микрокомпьютер; красный светодиод загорается непрерывно, и устройство переходит в дежурный режим.
Обработка сигнала дистанционного включения «REM» происходит аналогично с учётом текущего состояния сигнала «RDY».
В случае программного выключения микрокомпьютера, например, через веб-интерфейс, при неожиданном обнаружении низкого уровня сигнала RDY=0 во время работы устройства происходит отключение питания и переход в дежурный режим. Таким образом, перезагрузка («Reboot») микрокомпьютера через веб-интерфейс невозможна (только через выключение и повторное включение).
При удержании кнопки Sw1 в нажатом состоянии в течение 4 секунд происходит принудительное обесточивание плеера (по аналогии с обычным PC).
Прошивка МК ATtiny2313 для блока включения и выключения (с исходным текстом), а также рисунок печатной платы из одностороннего стеклотекстолита размерами 95x30 мм в формате Sprint Layout (для ЛУТ) и список устанавливаемых элементов, приведены во вложении.
МК работает на тактовой частоте 1 МГц. Программируются следующие Fuse-биты: High: 0xDB (SPIEN=0, BODLEVEL=101 -> 2,7V), Low: 0x64 (CKDIV8=0, SUT=10, CKSEL=0100).
Готовый блок включения и выключения с защитным диэлектрическим кожухом размещается внутри корпуса плеера (на следующих фотографиях выделен красным прямоугольником):
Для дистанционного включения и выключения плеера используется отдельное устройство, совмещённое с селектором входов и регулятором громкости, управляемое вручную и от ИК пульта:
Как видно по второй фотографии, устройство имеет 4 выхода «Remote On» (они запараллелены, и их контакты замыкаются для выключения внешних устройств с помощью реле). Один из этих выходов подключается к соответствующему разъёму плеера «RuneAudio», остальные – к другим устройствам с дистанционным включением (например, индикатору выходной мощности).
Для узлов аудио комплекса, в которых возможность дистанционного управления питанием не предусмотрена (усилитель НЧ, ЦАП) изготовлен отдельный блок включения на основе коммутатора мощной нагрузки, доработанного для совместимости по входу с сигналом управления «Remote On». Этот коммутатор при желании можно разместить даже в корпусе сетевого фильтра типа «Пилот» с несколькими розетками, и управлять питанием устройств через него:
В процессе проверки режима дистанционного выключения плеера при одновременном обесточивании ЦАП выяснилось, что ЦАП нужно выключать после полного отключения плеера, иначе программные настройки MPD в части выходного звукового устройства при выключении сбиваются. Эта проблема проявляется в том случае, если плата USB транспорта, в частности, «Amanero», запитывается не от разъёма USB, а от отдельного источника +5V через модуль гальванической развязки.
Этот недостаток может быть легко устранён, если между контактом +5V на разъёме USB платы «Amanero» и между контактом +5V на разъёме J5 (EXT_PW) платы модуля гальванической развязки включить диод Шоттки (с малым падением напряжения), например 1N5817 (анодом – к разъёму USB, катодом – к разъёму EXT_PW). В этом случае при включении ЦАП и наличии питания USB диод будет закрыт, так как на обоих его выводах будет присутствовать одинаковый потенциал +5V, и питание с разъёма USB никуда поступать не будет. Если ЦАП обесточен, питание +5V от плеера через порт USB будет поддерживать работоспособность модуля «Amanero» до полного выключения плеера. Плата «Amanero» с диодом между шинами +5V от разъёма USB до разъёма PW_EXT:
В заключение кратко рассмотрим принцип реализации программной поддержки включения и выключения плеера в операционной системе «RuneAudio». В плеере для управления индикатором, кнопками и ИК-приёмником используется скрипт на языке Python3 от Luka Žgur, который является модификацией выдающегося скрипта, разработанного Randy Čupić.
Полностью и досконально изучить работу этих скриптов мне не удалось, но адаптировать под нужды процедур включения и выключения получилось. Заметим, что в системе уже установлен язык Python3, библиотеки RPi.GPIO, Adafruit Python GPIO, Adafruit Python char LCD, модуль ИК-управления lirc и программа mc (файловый менеджер). Язык Python3 поддерживает многопоточность, и указанные скрипты её в полной мере реализуют, т.е. для выполнения определённых функциональных задач, таких как вывод информации на индикатор, опрос кнопок, обработка команд от ИК-приёмника и других, в скрипте создаются отдельные потоки (Thread), которые в процессе функционирования плеера взаимодействуют между собой.
В нашей реализации плеера (ссылки на скачивание готовых образов которого приведены в конце) все эти скрипты размещаются в папке /root/controls, а стартовым является находящийся там файл start.py. Для автозапуска этого скрипта в системе создан пакетный файл /usr/bin/control_script.sh, содержащий команду «python /root/controls/start.py», который, в свою очередь, загружается службой автозапуска lib/systemd/system/control_script.service, инициированной командами «systemctl enable control_script.service» и «systemctl start control_script.service».
В рамках разработки описываемого блока включения и выключения к скриптам был добавлен новый файл shutdown.py, инициализирующий порты GPIO для сигналов «/Shutdown» (на ввод) и «Ready» (на вывод) и опрашивающий состояние входного сигнала «/Shutdown» каждые 0,5 сек (чтобы не загружать процессор) с выдачей команды «sudo shutdown -h now» в случае его низкого уровня. Для инициализации нового модуля также был скорректирован и файл start.py.
В головном файле start.py можно задать номера портов для сигналов «/Shutdown» (SHUTDOWN_PIN = 9) и «Ready» (READY_PIN = 10), период опроса сигнала «/Shutdown» в секундах (SHUTDOWN_CHECK_PERIOD = 0.5) а также вообще запретить поддержку включения и выключения (задав SHUTDOWN_ENABLE = False).
В этом же файле задаются номера портов для подключения ЖКИ, число его столбцов (LCD_COLUMNS = 16 или 20) и строк (LCD_ROWS = 2 или 4), а также номера портов для подключения кнопок. Далее в программе создаются и запускаются экземпляры потоков: «mpdcl» (для клиента собственно плеера MPD), «display» (для индикатора), «remote» (для ИК управления), «btn» (для кнопок), «shtdn» (для процедур включения и выключения). Экземпляры потоков клиента MPD, индикатора, ИК управления и кнопок устанавливают между собой связи для дальнейшего обмена информацией. Экземпляр потока включения и выключения с указанными потоками не взаимодействует.
Все файлы скриптов можно просмотреть (и при необходимости модифицировать), подключившись к работающему плееру удалённо по IP-адресу через программу Putty (после входа в консольный режим надо запустить программу mc) или WinSCP; пароль суперпользователя: rune. После изменения содержимого файлов плеер необходимо перезагрузить. Готовые файлы конфигурации также приведены для изучения отдельно в виде ZIP-архива в конце статьи.
В системе имеются файлы заготовок для разных индикаторов: start.py.1602 – для индикатора 1602, start.py.2004 – для индикатора 2004, display.py.en – для англоязычного индикатора (при этом русские названия выводятся транслитом), display.py.ru – для русскоязычного индикатора. Для использования этих заготовок их нужно скопировать из папки /root/controls в промежуточную папку, переименовать соответственно в start.py или в display.py, а затем скопировать с заменой обратно в папку /root/controls, с последующей перезагрузкой плеера. Именно так и были получены разные образы (см. ниже ссылки на их скачивание) для индикаторов 1602, 2004, en, ru. Базовым вариантом можно считать 1602en, так как он будет работать с любым индикатором.
Заметим, что вместо ЖКИ можно использовать OLED индикаторы, которые имеют более высокую контрастность. Проверена работа с жёлтым индикатором типа Winstar WEH002004BLPP5N00000 (см. также https://www.chipdip.ru/product/weh002004blpp5n00000), который отлично функционирует не только при питании +5V, но и при питании +3,3V. Так как индикаторы OLED не имеют подсветки, для обеспечения совместимости по включению / выключению отображения (выполняется нажатием кнопки «BL») необходима небольшая доработка индикатора: перемычка JV на плате индикатора перепаивается на место перемычки JV0. После этого изменением напряжения на выводе 3 индикатора можно управлять его яркостью: если вывод никуда не подключен, яркость минимальна, при соединении с землёй яркость максимальна. На практике резистор регулировки контрастности / яркости можно удалить, оставив подключение вывода 3 к коллектору управляющего (можно совсем маломощного) транзистора. Замечено, что если индикатор OLED запитан от напряжения +5V, яркость полностью не убирается, т.е. функция отключения индикации полноценно работает только при питании индикатора напряжением +3,3V.
Примечания: для OLED нужно использовать настройку образа системы под англоязычный индикатор (en). На приведённой ниже схеме подключения OLED не показан блок включения и выключения.
Можно вообще отказаться от функции управления яркостью индикатора OLED (если посчитать её здесь лишней), при этом индикатор не дорабатывать, и его вывод 3 никуда не подключать.
С индикатором OLED плеер выглядит так:
В дополнение к узлу включения и выключения плеера удалось наконец-то реализовать гашение подсветки экрана через заданное время, если плеер не находится в режиме воспроизведения (стоп, пауза). Время ожидания в секундах до гашения экрана задается в параметре BACKLIGHT_TIMEOUT, расположенном в файле start.py (если задано 0, то экран не гасится). Экран «просыпается» на указанное время при нажатии любой кнопки или в случае приёма ИК команды. Изменения внесены в файлы конфигурации start.py, display.py, buttons.py, ir_remote.py. Скорректированные файлы конфигурации приведены в прикреплённом вложении, а полностью готовые образы системы RuneAudio с уже внесёнными изменениями можно скачать по ссылкам, приведённым в конце первой статьи.
Pushok62 3 года назад #
В конец предыдущей статьи добавил ссылки на скачивание новых версий полностью настроенных образов для систем RuneAudio 0.5 и RuneAudio+Re6 (rAudio-1). Последний вариант — rAudio-1 — очень порадовал новым интерфейсом, поддержкой режима Native DSD, функцией Spotify Connect.
Pushok62 3 года назад #
Обновил прошивку для МК ATtiny2313 — повышена устойчивость работы за счёт введения 1-секундной задержки перед обесточиванием плеера в процессе выключения.
iggus 1 год назад #
На базе разработок Владимира, сделал для своего RPi 3B блок питания, включения и выключения. Все отлично работает, Владимиру огромное спасибо.