Проекту Pi-Sonos недавно исполнилось полгода. За это время колонка успела прижиться в доме и очень часто выполняла роль источника фоновой музыки в гостиной по утрам и вечерам. Но не так часто, как бы мне того хотелось. Виной тому был ряд просчетов, которых я изначально допустил при проектировании колонки. С каждым из них в отдельности можно было бы смириться, но в сумме они заставили меня полностью переделать акустику. Что это были за ошибки, и как их пришлось решать, дорогой %username%, ты узнаешь под катом.


Итак, по порядку

1. Дизайн


Самый субъективный и (по большому счету) наименее значимый момент.

Было

Несмотря на то, что сам по себе изначальный дизайн колонки не был ни пресным, ни чересчур вычурным, первый Pi-Sonos плохо вписывался в интерьер (потому что он черный?!). В гостиной много дерева, как светлого, так и темного, а вот деталей черного цвета совсем нет. Вот наглядная разница между старой и новой версиями:



Кроме того, неприкрытые крепления динамиков выглядели непрезентабельно, а подходящих «грилей» мне так и не удалось подобрать. Это не говоря уже о мелких (и крайне неприятных) огрехах моего неумелого шпатлевания.

Пруф (перфекционистам не открывать!)



Стало

Корпус собран все из того же 8мм МДФ, отделан натуральным шпоном и покрыт специальным воском. 4 динамика закрыты декоративным экраном из акустической ткани. Регулятор громкости переехал с верхней грани на лицевую. Серия оранжевых светодиодов заменена одним белым. Кроме того, появилась кнопка управления воспроизведением (подробнее о ней ниже по тексту). Колонка избавилась от торчащего провода HDMI, необходимость в котором отпала вместе с отказом от OSMC.





Вдохновителем нового дизайна стал канал SoundBlab и один из его проектов.

2. Качество звука


Было

У первоначальной версии по звучанию было два принципиальных недостатка: раздутый бас, от которого через час начинала немного гудеть голова, и скомканная середина, особенно сильно проявляющаяся в звонком вокале и звуках хай-хетов.

То ли сказалось отсутствие акустического разделения каналов стерео, то ли неправильно был подобран тип корпуса для этих спикеров (как было замечено в комментариях – динамики автомобильные, т.е. для «щита», а я собрал фазоинвертор), то ли это проблема самих динамиков, но факт остается фактом – удовольствие от прослушивания музыки было слабеньким. А еще китайский блок питания издавал писк, который можно было отчетливо разобрать с расстояния в полметра. Мелочь, а неприятно.

Стало

В новом корпусе каждый акустический канал, а также вся электроника получили отдельные отсеки. Блок питания был вынесен за пределы корпуса (на корпусе сзади появился разъем 5,5мм под 12В). Новый блок питания имеет меньшую мощность (36Вт против 60Вт), стандартный корпус, и почти не пищит.

За звучание теперь отвечают 3х-дюймовые 15-ваттные мидбасы и 10-ваттные твитеры, разделенные между собой кроссовером. Фазоинвертор для каждого канала на этот раз реализован в виде трубы, рассчитанной на частоту ~100Гц при нижней частоте мидбасов 108Гц.



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

3. Время включения


Да-да, то самый промежуток времени от нажатия кнопки на динамике до начала воспроизведения музыки, которому была посвящена вторая статья.

Было

Несмотря на то, что время загрузки удалось уменьшить вдвое (с 45 до 20 секунд), все равно время ожидания было неприятно велико.

Стало

При выключении тумблером или отключении БП из розетки время последующего включения изменить не удалось, хотя я пытался отключать ненужные сервисы в Raspbian. Но теперь вместе с кнопкой на лицевой стороне появилась появился режим паузы, из которого колонка выходит меньше, чем за секунду! Кроме того, в режиме паузы «малинка» хитрым способом отключает питание звукового усилителя, экономя тем самым электроэнергию. Получается скорее эдакий sleep-mode.

4. Удобство управления (не считая управления со смартфона)


Было…

… всего 2 физических элемента управления – это регулятор громкости и тумблер питания. Если к регулятору особых претензий нет (даже его странное положение не доставляло неудобств), то тумблер питания надо было постоянно нащупывать на тыльной стороне. Это было настолько неудобно, что, например, моя жена часто просто выдергивала шнур питания из розетки.

Стало

Теперь за управление воспроизведением отвечает «волшебная кнопка», а тумблер питания используется редко – только для полного выключения колонки или для последующего её включения.

Что же такого «волшебного» в новой кнопке? Разовое нажатие на кнопку ставит воспроизведение на паузу или снимает с нее, а длительное нажатие переключает радиостанцию на следующую по списку. Таким образом, для управления колонкой необязательно держать в руках смартфон.

Любое действие с «волшебной кнопкой» тут же отражается в клиентском GUI, так что пользователь всегда видит актуальное состояние плеера и точно знает, какая станция сейчас воспроизводится. Светодиод тоже получил интерактивную функцию – он мигает раз в 2 секунды во время паузы и 10 раз в секунду во время нажатия на кнопку, показывая тем самым, что нажатие обрабатывается. Такой принцип управления заимствован у оригинальной Sonos Play 1, к идеалу которой и стремится в своем развитии проект Pi-Sonos.

Несколько слов о том, как работают кнопка и светодиод
Кнопка и светодиод управляются через GPIO. Принципиальная схема этого безобразия выглядит примерно так:



Как видно из схемы, светодиод LED1 подключен параллельно с переходом сток-исток MOSFET-транзистора Q1. Выходной пин OUT1 подает управляющее напряжение на этот транзистор, открывая и закрывая его. Для простоты пример, что сопротивление перехода сток-исток такого транзистора в открытом состоянии равно 0, а в закрытом – бесконечности (по моим замерам примерно 20Ом и 1,7МОм соответственно).

При включении Raspberry в сеть через пин 3,3В на участок цепи «LED1-Q1» подается напряжение через ограничительный резистор R1. Транзистор Q1 при этом закрыт, и весь ток участка LED1-Q1 течет через диод, т.е. диод горит. Если пин OUT1 установить в 1, то на затвор транзистор Q1 будет подано открывающее напряжение, и весь ток участка LED1-Q1 потечет через транзистор, диод при этом погаснет. Номинал резистора R1 взят 10кОм, чтобы свет диода не был слишком ярким.

Очевидно, что сама по себе кнопка SW1 гальванически не связана с затвором Q1, а значит, она управляет миганием диода не напрямую. Нажатие кнопки подает напряжение логической 1 (~3В с учетом резистивного делителя R2-R3) на пин IN, а в код плеера добавлен обработчик событий для этого пина. При нажатии на кнопку, обработчик запускает таймер, который раз в 100 миллисекунд меняет уровень на пине OUT1, включая и выключая светодиод, при отпускании – отключает таймер и возвращает диод во включенное состояние. Аналогично реализовано мигание в режиме паузы. Код по-прежнему живет на github (https://github.com/bellerofonte/rpi-radio).

Ограничительные резисторы R2 и R3 также призваны уберечь пины 3,3В и IN от перегрузки.
Пара резисторов R4 и R7 (равно как и пара R5 и R6) тоже представляют собой резистивный делитель. Дело в том, что транзистор 2N7000 имеет предельное напряжения затвор-исток 3В, а пин OUT1 с логической 1 на выходе – 3,3В. Чтобы не спалить затвор транзистора, на него надо подать меньшее напряжение. Но не меньше 2,1В, иначе транзистор не откроется. Номиналы резисторов подобраны так, чтобы получалось:

$V_{зи} = 3.3V \frac{47k \Omega}{47k \Omega + 10k \Omega} ? 2.7V$


Аналогично, через пин OUT2 открывается и закрывается транзистор Q2, который в свою очередь замыкает и размыкает контакт отключения усилителя на плате Suptronics



А так плата выглядит в собранном виде (реальный размер 2х3см):



5. Невозможность доработки/обслуживания


Было

Доступ к внутренностям акустики осуществлялся путем снятия одного из спикеров, но даже в этом случае проводить какие-то манипуляции было практически нереально. Ни о какой доработке корпуса не было и речи. Даже при демонтаже плат мне потребовалось больше часа, чтобы открутить всего 8 винтов.

Стало

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



Пара фотографий с процесса изготовления




Что в итоге


Обновленный Pi-Sonos почти полностью соответствует моим представлениям об удобной акустике для гостиной. Старина Джобс был прав – пользователю достаточно всего одной кнопки. И несмотря на то, что колонка уже сейчас кажется мне почти идеальной, текущая версия – это лишь очередной шаг в долгом и интересном пути. В ближайших планах – попробовать добавить голосовое управление (надо же идти в ногу со временем). А еще у меня есть нарекания по дизайну – шпон оказался очень капризным материалом, и сделать все без помарок не удалось. Да и форма прямоугольного ящика смотрится довольно старомодно. Придется потренироваться в работе с фрезером, чтобы когда-нибудь сделать корпус более современным и привлекательным. В конце концов, сама акустика не есть цель. Цель – это всегда пытаться расширять круг своих знаний/умений и делать что-то более сложное.

Комментарии (48)


  1. zedroid
    26.03.2018 12:20
    +1

    Несмотря на то, что время загрузки удалось уменьшить вдвое (с 45 до 20 секунд), все равно время ожидания было неприятно велико.
    Это даже после пересборки ядра с отключением ненужных модулей?


    1. bellerofonte Автор
      26.03.2018 12:25
      +1

      Нет, в такие дебри я еще не забирался. Я взял обычный образ Raspbian с оф.сайта и после установки игрался отключением сервисов через systemctl enable/disable. Если у Вас есть ссылка на подробный туториал по сабжу, то прошу поделиться, буду признателен.


      1. JohnBoe
        26.03.2018 12:34
        +1

        я начинал с этого туториала
        для современного ядра существенных изменений нет
        www.linuxcenter.ru/lib/articles/system/kernel26_install.phtml

        для дебаинов и их производных рекомендуется собирать ядро в пакет
        habrahabr.ru/post/82600
        очень удобно


      1. zedroid
        26.03.2018 12:42
        +1

        Ссылка
        Можете попробовать вот с этой инструкцией. А потом перед командой make используете make menuconfig и настраиваете модули и проч.


      1. bellerofonte Автор
        26.03.2018 12:49

        JohnBoe, zedroid, спасибо за наводку, попробую поковырять в свободное время.


      1. iDm1
        26.03.2018 22:00

        Можно пойти дальше и собрать squashfs образ при помощи buildroot, таким образом система на Raspberry загружается за 9 секунд. Подглядеть на данную реализацию можно, к примеру, в batocera-linux.


        1. bellerofonte Автор
          27.03.2018 08:47

          Спасибо, тема с собственными образами интересная, но уже не особо актуальная. Малина теперь просто не выключается, все в доме за пару дней привыкли пользоваться кнопкой паузы. Теперь время от нажатия до воспроизведения — 1 секунда, и оптимизировать его имхо бессмысленно.


    1. bugdesigner
      26.03.2018 14:00
      +1

      Можно еще убрать задержку u-boot (переменная bootdelay=0). Можно выиграть еще 5 секунд.


      1. bellerofonte Автор
        26.03.2018 14:20

        Попробовал, ничего не поменялось. дописывал в /boot/cmdline.txt.


        1. bugdesigner
          26.03.2018 15:34

          Некоторые версии U-Boot читают переменные из файла eEnv.txt, который должен быть в корневом каталоге загрузчика. Если это не поможет, нужно будет править скрипт загрузки boot.scr, точнее его исходник, а потом уже создать этот скрипт командой mkimage — этот способ работает всегда. Почитайте
          здесь https://elinux.org/RPi_U-Boot


  1. Dmitriy62
    26.03.2018 12:47

    Не перевелись ещё Левши на Руси. Ждём продолжения…


    1. bellerofonte Автор
      26.03.2018 12:47

      Месяца три ждать, не меньше.


  1. vconst
    26.03.2018 13:41

    Прикольно выглядит. Но почему так странно собран корпус? Обычно верхнюю и нижнюю крышки крепят симметрично.


    1. bellerofonte Автор
      26.03.2018 14:21

      В п.5 описал, что нижнюю крышку можно снимать для обслуживания/доработки.


      1. vconst
        26.03.2018 14:36

        Мне кажется, одно другому не мешает.


        1. bellerofonte Автор
          26.03.2018 14:39

          Да, но тогда шов будет виден и на лицевой и на боковой грани, причем на боковой грани — во всю ее ширину. а так шов почти скрыт. Его было вообще не видно, будь я немного аккуратнее с торцовкой :)


          1. vconst
            26.03.2018 14:44

            //еще раз поглядел фотографии
            Все равно, по моему можно, было сделать симметрично. Нижняя крышка также крепится на саморезах к перегородкам и задней стенке, а к боковым просто прижимается, не прикручиваясь к ним. Хотя, я компоновку вижу только на фото, может так и правда было удобнее собирать.


  1. RomanArzumanyan
    26.03.2018 15:12

    шпон оказался очень капризным материалом

    Если есть фрезер — можно купить мебельный щит из дерева, и сделать ящик любым удобным столярным соединением.


    1. bellerofonte Автор
      26.03.2018 15:25

      Фрезер есть, а навык еще не наработан. Я все-таки больше программист, чем столяр. Кроме того, у МДФ в моем проекте есть ряд существенных преимуществ:
      1) достаточно тонкое — 8мм, что немаловажно для компактной акустики.
      2) слабо подвержено выгибанию, в отличие от деревянных щитов
      3) не дает сколов и щепок при распиле/сверлении
      Лично для меня п.1 решает все.


      1. vconst
        26.03.2018 15:30
        +1

        Лишние 2-3 см в размерах этого ящичка не так критично, как малопредсказуемое дерево. Я купил себе столешницу из дубового щита, в сб ее привезли, в след субботу я ее вскрою от упаковки и еще недельку буду неторопясь шлифовать, полировать, только потом буду покрывать. И две недели это еще мало, по хорошему надо минимум месяц выдерживать, но меня тоска сожрет раньше, а небольшую кривизну стола я переживу.


        1. RomanArzumanyan
          26.03.2018 15:48

          С дубом не работал, но могу точно сказать, что ламинарный буковый щит (длина доски в составе щита рана длине щита в целом) столярного качества влажности около 10% стоит очень вменяемых денег.


          Возможно, его поведёт (МДФ в этом плане более предсказуем, соглашусь), но для ящика такого малого размера это не должно быть критично.


          Можно даже купить уже шпонированный МДФ. Подороже, но для колонки его нужно не так много.


          1. vconst
            26.03.2018 15:53

            Мебельные шиты — это не очень дорого, даже дуб стоит вполне вменяемо. Проблема в том, что длинный щит нельзя сделать из цельных ламелей и больше полутора метров уже набирают из коротких реек. А это делает их еще менее предсказуемыми. Но у меня идиосинкразия к ДСП и подобному, еще с советских времен, вот и вожусь со щитами… Хотя щит для такой мелочи и правда очень избыточен, тут можно фанеру взять, ее тожекрасиво шпонируют. Но в фанере тоже есть клей и не много меньше, чем в ДСП или МДФ.


    1. vconst
      26.03.2018 15:27
      +1

      Дерево штука анизотропная, а в мебельном щите сделанном кое-как — проблем будет еще больше. Поведет разные боковинки в разные стороны и будет все в щелях. Дубовый мебельный щит, если сделан быстро и дешево — запросто может взломать бетон и сталь гнет как пластилин. МДФ намного предсказуемее, но вот натуральный шпон…


      1. bellerofonte Автор
        26.03.2018 15:38

        +100


  1. Sdima1357
    26.03.2018 15:31
    +1

    Твиттеры слишком близко друг к другу. Стерео эффект будет потерян.


    1. bellerofonte Автор
      26.03.2018 15:37

      с учетом того, что это одна колонка, вряд ли можно рассчитывать на сколь-либо значимый стерео-эффект в помещении площадью ~25кв.м. на расстоянии 3-5м от нее. Вот взять тот же Sonos Play 1 — он вообще моно. Там один мидбас и один твитер. Нужно стерео — докупаешь вторую такую же, ставишь где-то в другом углу — профит.


      1. vconst
        26.03.2018 15:49

        Есть колонки, которые можно связать через БТ и они будут разделять каналы через внутренний софт, можно поставить их по разным углам, объединить и будет настояще и хорошо различимое стерео. Здесь такое планируется?


        1. Sdima1357
          26.03.2018 15:53

          Тогда распберри будет лишней деталью :) ESP32 вполне хватит. Или просто телефона.


          1. vconst
            26.03.2018 16:01
            +1

            Ну… Можно через малинку мигать светодиодами :)


        1. bellerofonte Автор
          26.03.2018 16:12

          Здесь такое планируется?

          Не исключено, но маловероятно. Идея — не достичь Hi-Fi качества, а сделать супер-простое устройство для каждодневного применения с просто хорошим звуком. Чтобы хватало для вечеринок и не уснуть с утра, пока собираешься.


          1. vconst
            26.03.2018 16:18

            Прикольно. Буду следить за темой.


  1. Transfocatorq
    26.03.2018 15:44
    +1

    Пороговое (threshold) напряжение полевого транзистора — это напряжение его условного отпирания. Допустимое напряжение затвор-исток для 2n7000 =20В, то есть в делителях перед затворами нет необходимости. Вернее они даже вредны, так как из-за разброса значения порогового напряжения разные экземпляры транзисторов могут оказаться в линейном режиме и просто перегреться. Рекомендую уменьшить резисторы от GPIO на затвор до 50-100 Ом.


    1. bellerofonte Автор
      26.03.2018 16:03

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

      Видимо, из-за недостатка знаний в области электроники, трактовал неправильно. спасибо за замечание, переделаю.


    1. bellerofonte Автор
      26.03.2018 16:15

      Transfocatorq, чтобы два раза не вставать, подскажите еще — как лучше реализовать плавное мигание светодиодом? Как я понимаю, в параллель со светодиодом нужно воткнуть конденсатор с ограничительным резистором. Но тогда плавность и в режиме быстрого мигания, и в режиме медленного. Чтобы плавность была только в режиме медленного мигания, наверное, нужно сделать вторую цепь с отдельным транзистором и конденсатором, так?


      1. Sdima1357
        26.03.2018 16:23
        +1

        1. bellerofonte Автор
          26.03.2018 16:47

          спасибо за наводку, попробую поиграть.


      1. Transfocatorq
        26.03.2018 16:29
        +1

        Допустимые значения напряжений-токов указаны в самой первой таблице даташита — Absolute Maximum Ratings.
        Плавное мигание лучше всего делать с помощью ШИМ, если это умеет малинка. Ну или в крайнем случае выделить параллельно второй GPIO и транзистор с RC-цепочкой на затворе. Вот там как раз понадобится большое сопротивление, чтобы плясать в районе порогового напряжения. То есть по вашей схеме надо всего лишь добавить конденсатор параллельно R7 (увеличив его килоом до 500).
        Ещё меня очень смутила схема с закорачиванием светодиода транзистором. Почему нельзя было поставить его просто последовательно с ключом? Понимаю, что оно работает, но это же нерационально — постоянно гнать ток через резистор.


        1. bellerofonte Автор
          26.03.2018 16:46

          Если поставить его последовательно с ключом, то пока не загрузится малинка и не стартанет мой сервис, диод нельзя будет поджечь. А задумка была в том, чтобы этот диод сразу же при включении показывал, что «малинка» завелась.

          постоянно гнать ток через резистор

          Ток через этот резистор так и так будет течь, то через диод, что через транзистор. В худшем случае он будет не выше 0,33мА, что не так уж и много. Если когда я буду пепепаивать схему, я заменю его на 20кОм (или даже 47кОм), т.к. все равно эта зараза светит слишком ярко.


          1. vconst
            26.03.2018 16:51
            +1

            Малинка там уже есть — теперь надо поставить Ардуино, что бы он занимался своими прямыми и самыми популярными обязанностями — мигал светодиодом :):)


            1. bellerofonte Автор
              26.03.2018 16:56

              vconst, про ESP8266 не забудьте! и ESP32! нужно больше плат!


              1. vconst
                26.03.2018 16:59
                +1

                Больше печатных плат, богу печатных плат! (С)
                Если есть ненужная pci-сетевуха, ее тоже можно туда поставить. Места занимает мало, а подключать ее не обязательно :)


    1. bellerofonte Автор
      26.03.2018 17:01

      Transfocatorq, уточню еще по поводу номинала резисторов на затворе: если мне надо «чистые» 3,3В кинуть на затвор, значит, R4 вообще не нужен? И тогда, если R7 сделать 100Ом, то в случае логической 1 через него будет течь ток = 3,3В/100Ом = 33мА, так? Не многовато ли? не лучше ли убрать R4 и вместо R7 воткнуть 100кОм? Или я что-то важного не понимаю в принципе работы MOSFET-транзистора?


      1. Transfocatorq
        27.03.2018 12:29

        100 Ом — это R4, R5 — они ограничивают бросок тока заряда-разряда затвора (просто хорошая практика защищать управляющую логику; в данном случае они вообще не обязательны, ибо не такие тяжёлые затворы), идущий через пин GPIO.
        R6 и R7 выбраны нормально — они всего лишь притягивают затвор к истоку в случае неопределённого состояния входного сигнала (момент подачи питания, всякие наводки).


        1. bellerofonte Автор
          27.03.2018 12:46

          Теперь понял. спасибо за уточнение.


  1. rustavelli
    28.03.2018 15:36

    Что-то я не понял, зачем акустику всё время выдергивать из розетки? В первой версии не было другого способа выключить звук, кроме как отключив питание?


    1. bellerofonte Автор
      28.03.2018 16:11

      Я ждал этот вопрос!
      У прежней версии было 4 способа заглушить звук:
      1) выдернуть вилку из розетки
      2) щелкнуть тумблер питания
      3) выкрутить громкость на минимум
      4) поставить на паузу со смартфона

      Пользователь с ником «Жена» почему-то предпочитал первый.
      Когда же потом мне хотелось включить музыку обратно, каждый раз приходилось ждать (сначала по 45 секунд, потом по 20).

      Теперь все пользователи приучены к кнопке.
      image


  1. vyacheslavteplyakov
    29.03.2018 18:05

    Просто в виде совета со стороны.
    Я понимаю что очень «чешется» сделать «красиво» и ваш прошлый дизайн коробки немного объясняет почему. Без обид, но то было лютый отвратительный колхоз, свойственный обычно людям которые умеют что-то придумать и спаять, но как дело доходит до внешнего вида поделки, выдают нечто вот такое из старой фанеры, с синей изолентой или оклеенное виниловой клеенкой под дерево и торчащими проводами. Сейчас внешний вид очень лаконичный, выглядит просто идеально, я и зашел только ради того чтобы посмотреть как и из чего сделан этот корпус. Не нужен вам фрезер, оставьте как есть, это очень красиво и эстетично и шпон и его цвет и форма, не надо ничего скруглять.


    1. bellerofonte Автор
      29.03.2018 18:18

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