NAS Radio

2014-05-24

Cardboard NAS Radio

Когда-то я слышал замечательную фразу - “каждый программист должен написать собственный тетрис, текстовый редактор и игру”. Времена меняются - вместо этих пунктов можно вставить что-нибудь посовременнее, в частности, тренд заданный 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)]

В массы

В трубу