[Из песочницы] Pi-Sonos или DIY портативная акустика на Raspberry Pi

ff620cc31ae74fd1985615b8d7d6dbcc.jpg

Тот, кто сталкивался с продукцией Sonos, определенно согласится с тем, что Sonos — это Apple от мира портативной акустики (во всяком случае, пока еще официально не вышел HomePod). Акустика Sonos — это сочетание минимализма, качества и удобства, которая восхищает с первого прикосновения. Я не являюсь счастливым обладателем этой акустики, но знакомство с Sonos Play 1 настолько впечатлило меня, что я решил создать нечто подобное — портативную домашнюю акустику под управлением Raspberry Pi. Под катом я расскажу, как у меня это получилось.
Я мечтал попробовать сделать что-нибудь на Raspberry Pi с самого ее появления, но не мог придумать подходящего применения «малинки» в быту. Идея создать на ее основе акустику родилась совершенно случайно, когда во время очередных посиделок у нас дома мой друг справедливо отметил, что в гостиной не хватает фоновой музыки. Идея сделать собственный Sonos тут же захватила меня.

Требования к будущей акустической системе были очевидны: повторить или имитировать удобство Sonos Play 1 — «воткнул в розетку и управляй со смартфона». В этом плане Raspberry почти идеален — на платке уже есть Wi-Fi и Bluetooth, и можно запустить Kodi, который жует все и у которого уже есть приложения-пульты для iOS и Android. Однако, чтобы получить на выходе желаемое, все же надо было реализовать целый ряд инженерных решений, а именно:

  1. Подобрать динамики
  2. Вывести звук с Raspberry на динамики
  3. Запитать все железки
  4. Построить красивое акустическое оформление для динамиков
  5. Добиться простоты и удобства управления


1. Подобрать динамики


Надо было выбрать правильные спикеры, чтобы, с одной стороны, они были достаточно большими (для более широкого частотного диапазона), а с другой — маленькими, поскольку акустика планировалась быть портативной. После долгих мук выбора, чтений отзывов и сравнения характеристик, я остановился на 5-дюймовых 2-полосных коаксиальных автомобильных спикерах JBL Club 5020. При заявленных 40Вт на ухо, эти малышки обещали выдавать звук в диапазоне от 75Гц до 20кГц, что меня вполне устраивало. Здесь помог личный опыт — мои полочные динамики в кабинете начинают играть уже с 50Гц, выдавая при этом ощутимый бас, но в обычной ситуации лично у меня от него быстро начинает болеть голова, поэтому я старательно убираю эквалайзером все, что ниже 70Гц. Собственно, поэтому не стал переплачивать за АС, обещающую более низкие частоты. Кроме того, у JBL симпатичный дизайн, и у меня сразу появилось представление, как это обыграть.

2. Вывести звук с Raspberry на динамики


В «малинке» есть 3 возможности по выводу звука: mini-jack, HDMI и GPIO. На качество звука, льющегося из mini-jack не ругается только ленивый, а HDMI — сложно. А вот для GPIO есть отличные варианты. Первый — Suptronics X400, представляющую из себя аудиофильский ЦАП на 384кГц (PCM5122) и стерео-усилитель D-класса мощностью 20Вт на канал (TPA3118D2), распаянные на одной плате. Второй — Hifiberry, предлагающие отдельные платы DAC+ и AMP+ (ЦАП и усилок соответственно). При этом, плата Suptronics выглядит предпочтительнее. Помимо того, что это одна плата вместо двух, она еще и дешевле, и ее легче купить/доставить в РФ.

3. Запитать все железки


Блок питания был взят 12V, несмотря на то, что малинка питается от 5V по micro-USB. Все дело в крутом саптронике — он питает «малинку» через GPIO. Это логичное и практичное решение с учетом того, что звуковой усилитель потребляет гораздо больше энергии, чем «малинка». X400 можно питать любым блоком питания с постоянным напряжением от 6 до 24 вольт, но именно от 12 вольт можно было бы запитать еще и светодиодную индикацию работы АС, в качестве которой был использован имевшийся у меня обрезок ленты Navigator 12V 4.8W/м. Собственно, БП и был заказан у продавца светодиодных лент на Али.

4. Построить красивое акустическое оформление для динамиков


Пожалуй, это было самой большой проблемой из всего проекта. Выбор материала был между имевшимися у меня 15 мм фанерой и 8 мм МДФ. Для акустики, конечно же лучше было брать фанеру, но МДФ проще обрабатывать, да и прочности МДФ было вполне достаточно при заданной мощности и размерах. Также в корпусе предполагалось наличие ряда отверстий (для кабеля питания и HDMI, разъемов RJ-45 и USB, регулятора громкости и фазоинвертора), что еще сильнее усложняло задачу в случае с фанерой. Кроме того, у меня нет достаточного опыта и инструмента для того, чтобы сделать из фанеры что-то более интересное, чем простой прямоугольный ящик. И я предпочел податливый МДФ.

Отдельно стоит упомянуть про ФИ. Сделать «закрытый ящик» было бы проще, но прочитав ряд материалов, я понял, что это было бы ошибкой. При планируемом объеме (~4,5 литра) внутри закрытого ящика будет создаваться достаточно сильно акустическое сопротивление двум пятидюймовым динамикам, что в итоге приведет к повышению нижней частоты всей акустической системы в целом. Делать пятилитровую «пищалку» не хотелось, да и тепло от постоянно греющейся электроники тоже надо было куда-то отводить. В итоге, щелевой фазоинвертор был рассчитан на частоту 60–65Гц, чуть ниже, чем нижняя частота спикеров, с тем запасом, что внутренний объем корпуса несколько уменьшится за счет железок и звукоизоляционного материала, и, следовательно, частота при этом уедет вверх.

Описание процесса с фотографиями я скрыл под спойлером
Сначала были вырезаны фронтальные панели, в которые должны монтироваться спикеры. Это было несложно — прямо на коробке от спикеров был специальный шаблон. Для большей прочности я склеил 2 слоя МДФ с помощью жидких гвоздей — для большей прочности, ведь каждый динамик весит по полкило.

bb07778b58eb47a987e7080ac7e64d61.jpg

819cc13b021e4e8e8e5fc7ceebef31a1.jpg

Затем из-под лобзика вышли нижняя и боковые стенки.

2d7880126e4a409a91e75d7c79c50d05.jpg

С верхней и задней стенками пришлось повозиться. В задней стенке необходимо было сделать вывод под разъемы и фазоинвертор, а в верхней — отверстие под регулятор громкости. Заднюю стенку я переделывал трижды по разным причинам, в финальной версии на нее добавился еще тумблер питания и выводы под провода — питания и HDMI. С верхней крышкой повезло — отверстие под регулятор громкости удалось подогнать с первого раза. Ну, а фазоинвертор сделать было вообще несложно. Также пришлось выпаять с платы Suptronics лишние выводы под «тюльпаны», чтобы не делать дополнительных отверстий на верхней крышке.

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

54dd59806d414c5db30ad8cacac502a2.jpg

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

c099aa7901624fab887db70dd38bcdf1.jpg

Потом — корпус был прошпаклеван, зашкурен…

27792a3af22d4aa1b8988936a631a0b3.jpg

… и покрашен эмалью в два слоя. Динамики были присажены на корпус саморезами с прессшайбой, головки которых потом также были подкрашены в цвет корпуса.


Колонка в продакшне:

0495e0a902e848bd9453cae118121a36.jpg

c4c7c39f3c4a4d2891beac560bcc963c.jpg

5. Добиться простоты и удобства управления


Сборка — это еще полдела. Вторая половина — это софт. Здесь тоже не все гладко.
Конечно же, перед тем, как навек запечатать Raspberry Pi в недрах корпуса, я установил на нее образ OSMC. Кто не знает — это тот же Kodi, только embedded. Это медиаплеер, который заменяет собой графический интерфейс операционной системы и позволяет настраивать сети и сервисы и т.п. Между связкой Raspbian+Kodi и OSMC все преимущества однозначно на стороне последней.

После установки системы и настройки звуковой карты согласно инструкции с сайта Suptronics, оставалось только добавить в OSMC расширение Radio и забить в него десяток любимых радиостанций. Потом я установил Kodi Remote на свой смартфон, и казалось бы — все, можно наслаждаться.

Но к сожалению, Kodi Remote убивал главное, чего я хотел добиться от акустики — простоты и удобства управления. Дело в том, что включать и переключать радиостанции можно было только из меню расширения Radio, а для доступа к нему надо сделать 5 тапов и 1 скролл. Так себе UX.

Пруф
ee85514864b249d898b95608a1ca15a3.png


Пришлось погрузиться в дивный чудный мир Kodi-API, после чего я написал на React простенькую версию пульта, с минималистичным дизайном, заточенным исключительно под радио. Суть его работы проста — при запуске он запрашивает у плагина «Radio» содержимое раздела «My stations», после чего предлагает выбрать пользователю любую радиостанцию из этого списка. Есть запуск-остановка воспроизведения, регулировка громкости и отображение названия текущего трека. Comme il faut. Исходники опубликованы на github.

38a8ff4b3ced4484b7d7ed413044e249.jpg


В итоге, вся железная начинка проекта состояла из:

1. Raspberry Pi 3 Model B
2. Suptronics X400
3. 12V 60W блок питания
4. JBL Club 5020
5. MicroSDHC Transcend 16Гб

Спикеры и флешка были заказаны в ближайшем интернет-магазине, все остальное — на али. В общей сложности железо обошлось примерно в 7000 рублей. Еще от 1000 до 1500 рублей надо было бы потратить на материалы корпуса, провода, краску и т.п., если бы их у меня не было.

Результат мне нравится, несмотря на то, что к нему есть ряд претензий. Так, например, невозможно отредактировать список избранных радиостанций без подключения к колонке монитора и клавиатуры — ограничения Kodi/OSMC. Нет возможности тюнить звук эквалайзером, по крайней мере я не знаю, как это сделать. А еще хотелось бы добавить автоматическое проигрывание последней станции при включении, но пока тоже непонятно как. Если кто-нибудь знает — черкните в комментариях, буду сильно признателен. Есть работающий из коробки AirPlay, а вот Bluetooth A2DP также настроить не удалось. Но все это не имеет особого значения, и в 99 случаях из 100 достаточно просто ткнуть на смартфоне станцию по жанру или настроению.

Отдельно надо сказать про звук, ведь Sonos в плане звука — передовик. Suptronics X400 не подвел — 25 квадратов гостиной заполняются звуком уже на 1/10 громкости. В целом звук детализированный, без хрипов и дребезжания. Бас — о чудо! — есть, причем мощный и при этом не скатывающийся в «бубнение» — вывозит фазоинвертор. Вблизи отчетливо слышно, как «рассыпаются» звуки хай-хэтов и звуки «с» и «ц» из вокала. Удивительно, но этот неприятный эффект полностью пропадает, если прикрыть твитеры пальцами (кто знает почему — напишите в комментариях). Конечно, Hi-Fi не вышел, но по звучанию получившуюся акустику можно смело поставить в один ряд с такими популярными бытовыми АС, как Microlab Solo 6C или Sven SPS-7xx.

Конечно, предложи мне кто-нибудь на выбор купить такой «Pi-Sonos» за 8 тысяч или Sonos за 18, я, конечно же, выбрал бы Sonos. Но цель была в другом — я хотел погрузиться в новые для себя технологии. Это мой первый мой опыт работы с Raspberry Pi и вообще с SoC, первая попытка создания акустики, первый полностью самостоятельный проект на React. Создание акустики потребовало навыков проектирования, пайки, столярки-малярки, дизайна, верстки, программирования. И подарило то незабываемое чувство вдохновения и трепета, которые сопутствуют процессу творения, ради которого и стоит ввязываться в подобные авантюры!

© Geektimes