Когда-то я слышал замечательную фразу - “каждый программист должен написать собственный тетрис, текстовый редактор и игру”. Времена меняются - вместо этих пунктов можно вставить что-нибудь посовременнее, в частности, тренд заданный MightyOhm коснулся и меня.
Всё началось с того, что чудо-устройство NAS NS-K330 осталось лежать “не у дел”, ибо SnakeOS загружался очень уж длительное время, да и разумного применения ему в хозяйстве не нашлось - качалка, tor-gate и прочее взял на себя неттоп на “Атоме”.
Но неожиданно обнаружилась вот такая ссылка, где рассказывается о довольно простом способе установки OpenWRT на устройство. Поигравшись с месяц с устройством и убедившись, что VPN-клиент почему-то падает, JAVA не стартует, а в остальном всё нормально устройство было отложено в долгий ящик опять (благо, места оно не занимает). Плюс ещё проблемы со сборкой пакетов (что-то не билдится, что-то собрано не с теми опциями).
Но, внезапно, один из unstable-билдов OpenWRT показал неплохие результаты, да и ошибки, терзавшие билд до этого остались в прошлом.
И всё завертелось…
В одной из многочисленных лавочек был закуплен USB-Audio адаптер, который, как ни странно, определился в OpenWRT.
Первая неприятность подстерегала почти сразу. В unstable-билдах OpenWRT поддержка т.н. external root (файловая система на внешнем накопителе) отваливается довольно часто и мне как раз “посчастливилось” использовать именно такую сборку. Так что пришлось идти другим путем и все пакеты, кроме самых-самых-самых ставить в “/opt” на внешнюю microSD карточку.
Ну да ладно, это мелочи.
В целом - проблему решили 2 “хака”
- Скрипт, линкующий пакеты, установленные на карточке с корневой ФС. Авторство неясно, найден на просторах интернета и в целом работает, как задумано. Уложен в GIT чтобы не пропало
- Код в rc.local, проверяющий, “поднялась” ли карточка. Код здесь
Дальше - устанавливаем mpd и получаем первый прототип. (На фото ниже).
Управляется всё с телефона, громкость регулируется прямо на колонках, первоначальное значение фиксировано.
Нет смысла описывать настройку MPD, ибо ничего там “такого” нет.
Но будем двигаться дальше - пора наполнить всё это “гламуром и креативом”.
План такой - делаем управляющий блок на микроконтроллере, который будет:
- Отображать радиостанцию и трек на экране
- Переключать станции с помощью, допустим, потенциометра
Вся картина выглядит примерно так:
Обмен данными с NS-K330 идет через UART с уровнем сигнала 5 вольт - это отлично подходит для Атмеги. Цоколёвку разъема можно посмотреть тут
ATMega8 должна вполне подойти для подобных затей. Тем более, что благодаря блогу Ильи Данилова у меня давно “завалялась” разведенная плата Arduino на этой микросхеме. Вот она на снимке, уже установленная в как-бы корпус.
Наверное, пора переходить к описанию “процесса”.
- После включения питания Атмега ждёт “отмашки” через UART о том, что можно обмениваться данными
- После получения таковой считывает “значение” потенциометра
- Подает команду через UART о том, что нужно играть станцию X
- Слушает UART на предмет данных о названии станции и треке
- Выводит полученное на экран
- При изменении данных потенциометра опять посылает сигнал о том, что нужно переключиться на нужную станцию
Это со стороны контроллера, а со стороны NS-К330:
- Запускается mpd
- Загружается плейлист
- Посылается (в UART) “отмашка”, что, мол, можно начинать
- Раз в секунду опрашивается MPD с целью получить информацию о том, что сейчас играет
Прошивка ATMega8 написана в Arduino IDE, что здорово сэкномило время и силы. Правда, не обошлось без курьезов.
Во-первых использование объекта String в больших количествах очень быстро “съедало” всю доступную память. Во-вторых, проклятый оператор delay вносил общую сумятицу в опрос оборудования.
В финале получилось:
- Менее 6 кб кода
- Операции без использования delay (ну, почти везде)
- Длинные строки автоматически “скроллятся”
- Скроллинг каждой из строк независим
- Поддержка русских тегов и названий, если они написаны в UTF-8 (что редкость)
- Не требуется отключать отладочную консоль в NS-K330. Работа идет на скорости 38400
- ATMega и экран могут использоваться с почти любым компьютером-платой-устройством, если есть пятивольтовый UART.
Теперь о недостатках:
- Не всегда правильно определяется станция после включения (блок питания NS-K330 “плывёт”, поэтому значение близко к случайному)
- Русские теги - отдельный разговор. Поддержка через библиотеку LiquidCrystalRus (и она прекрасна), но все эти strcmp и strlen конечно же понятия не имеют о UTF-8, так что вычисление длины и вывод приводят к офигенным демоэффектам :) в виде “резиновой” строки. Да и ладно.
- Всего 9 станций в плейлисте, ибо потенциометр стабильно работает только с таким числом. Это решаемо (можно, например, вместо переменного резистора подключить encoder).
Вот оно, крупным планом.
Слева, кстати, регулятор контрастности.
Повторюсь, всё должно заработать с любым другим носителем OpenWRT, был бы UART. И даже если он не пятивольтовый, можно собрать делитель напряжения.
Все исходники выложены на GITHUB
В ближайшее время добавлю еще скрипт для линковки внешнего носителя в файловую систему - чтобы не пропал.
Ну и конечно же, видео.
[[Смотреть на YouTube](http://youtu.be/7IiKjrNN2QI)]