Меня это задолбало - управлять громкостью, если источников звука больше одного, особенно больно, когда надо сделать тише/громче быстро, за пару секунд. Если играете в динамичные игры с дискордом, да ещё и музыку фоном включаете, думаю вы прекрасно знаете эти неудобства. И вот, в один прекрасный день я наткнулся на Deej...
![Собственно результат Собственно результат](https://habrastorage.org/getpro/habr/upload_files/84a/615/7f8/84a6157f8f227d307c6a0a7f062e12d8.jpg)
А в чем собственно проблема?
Казалось бы, есть отличное решение для управления громкостью любого приложения - дефолтный микшер винды, какбы да, но нет. Это хорошая вещь, но для того, что бы им воспользоваться надо совершить следующий обряд:
Alt tab из текущего приложения, если курсор захвачен
ПКМ по значку громкости
Выбрать пункт выпадающего меню для открытия микшера
Иногда приходится выбирать устройство вывода звука, почему то иногда винда считает, что мне нужно управлять громкостью монитора, на который никогда ничего не выводилось
Найти нужное приложения пролистав горизонтальный список, или расширив окно
Ура! Наконец то можно поменять громкость
Естественно это занимает какое то время, и за это время в игре может произойти что угодно. Поэтому порой проще подвинуть ползунок в плеере, или в настройках приложения, а потом не понимаешь, почему звук тихий.
![Способы поменять громкость Способы поменять громкость](https://habrastorage.org/getpro/habr/upload_files/eb2/8e6/449/eb28e6449d1d4adb51b76aeb163c5af0.png)
Deej
На просторах гитхаба есть один хороший проект - deej, он идеально решает поставленную задачу, собирается легко из ардуйни и картона, но это не спортивно, список приложений намертво прикручен к ползунам, хочешь больше приложения - либо накидывай больше слайдеров, либо биндь несколько приложений на один потенциометр и запоминай, где есть что. Да и выглядят типовые конструкции не очень - где любимая ЛГБТ RGB подсветка?
![Типичный микшер на Deej - очень просто, но красота и удобство где-то потерялись. Я не хочу гадать, где нужный ползунок, и уж точно не хочу видеть это порождение экструдера на своем столе Типичный микшер на Deej - очень просто, но красота и удобство где-то потерялись. Я не хочу гадать, где нужный ползунок, и уж точно не хочу видеть это порождение экструдера на своем столе](https://habrastorage.org/getpro/habr/upload_files/340/7bd/4e3/3407bd4e3130475e34539a378f6a0db5.png)
В общем было разработано следующее ТЗ:
Внешний вид - как у заводского устройства, никакой изоленты и 3д печати там, где это будет бросаться в глаза
Индикация приложения, которое регулируется, что бы не забивать память, куда же я там приложение забиндил
Наличие подсветки - не видел ни в одном из существующих микшеров. Что у DIY, что у профессиональных подсветки слайдеров нет. С моей точки зрения это должно выглядеть круто + технический челенж
Минимальные размеры, но не в ущерб удобству
По возможности минимальный бюджет
Задача со звездочкой - bluetooth. До сих пор не знаю, зачем, но звучит круто
Концепт
Изначально я хотел свести использование 3д печати к минимуму, и сделать всю конструкцию на печатных платах, но это никак не сочиталось с минимальным бюджетом, поэтому количество ПП было сведено к минимально необходимой двойке
![Один из первых концептов, позднее от печатной платы для дисплеев отказался Один из первых концептов, позднее от печатной платы для дисплеев отказался](https://habrastorage.org/getpro/habr/upload_files/272/971/c0a/272971c0aba617b041c0d691a9abfb2f.png)
В качестве платформы рассмативались контроллеры от nordic, espressif и rp2040 от raspberry, хотелось пощупать nRF, но экономически они дороже и достать чуть сложнее, rp2040 не имеет блюпупа, поэтому выбор пал на ESP32-C3, а точнее на модуль на его основе ESP32 C3 SUPER MINI.
Да как тебя впихнуть???
Оказалось, что вписаться в 100х100мм печатной платы (как правило ПП стоят дороже при выходе за эти пределы), запихав при этом туда пять слайдеров и кучу адресной ленты между ними не такая простая задача, как казалось на первый взгляд. Как ЭТО собирать я не представлял, но вроде должно впихнуться. Ах да, спереди есть выемка, туда же можно запихать аккумулятор для автономки по bluetooth!
![100 адресных светодиодов аккуратно расположились между потенциометрами 100 адресных светодиодов аккуратно расположились между потенциометрами](https://habrastorage.org/getpro/habr/upload_files/da0/439/4c4/da04394c4bdd9c512f8c33f6d12ad6eb.png)
5 дисплеев? На один контроллер I2C?
Перерыв половину алиэкспресса были найдены десятки дисплеев, но все не то, либо маленькие, либо большие, либо I2C only, либо надо городить внешний DC-DC для повышения напряжения. В итоге идеальный дисплей был найден, но вот незадача - он поддерживает только I2C, а бит выбора адреса всего один, то есть 3 устройства с одинаковым адресом будут в любом случае.
Что сделал бы нормальный человек в этом случае? Прочитать документацию на микроконтроллер? Воткнуть мультиплексер? Слишком скучно, надо велосипед, да ещё и с квадратными колесами. В итоге был рожден I2C с CS. Спойлер - он даже заработал, но нашлось решение поприличнее - ESP32C3 имеет pinmux, и можно тупо переназначать выводы для I2C в процессе работы
Принципиальная схема
![Схема верхней платы Схема верхней платы](https://habrastorage.org/getpro/habr/upload_files/c52/ff2/fca/c52ff2fcacbf69cfa674b74ed3f42947.png)
![Дисплей Дисплей](https://habrastorage.org/getpro/habr/upload_files/089/e43/d08/089e43d08dcc22ecc09ea71467cd56f7.png)
![Нижняя плата. Из-за нехватки пинов аналоговые входы работают и на потенциометры, и на кнопки Нижняя плата. Из-за нехватки пинов аналоговые входы работают и на потенциометры, и на кнопки](https://habrastorage.org/getpro/habr/upload_files/773/b01/784/773b01784df65243284787f589a52c8e.png)
В остальном, что схема, что топология примитивны, BOM минимальный, аккумулятор можно выкинуть, тогда схема становится вообще элементарной. Хотя и в такой простоте получилось наделать ошибок...
Топология
![Верхняя плата Верхняя плата](https://habrastorage.org/getpro/habr/upload_files/4e5/1c8/a42/4e51c8a420547dba35508fbe10a93de4.png)
![Нижняя плата. Не спрашивайте, голоса сказали делать ЛУТом Нижняя плата. Не спрашивайте, голоса сказали делать ЛУТом](https://habrastorage.org/getpro/habr/upload_files/ed4/36d/c3a/ed436dc3af037c8a35ffaac29aefa883.png)
Сборка
Я же сказал, что не оценивал трудоемкость сборки? За компактность надо платить, а компонентов заказано на 4 изделия...
Много фоток процесса сборки
![Слава разработчикам МГТФ! Слава разработчикам МГТФ!](https://habrastorage.org/getpro/habr/upload_files/d63/243/2c6/d632432c6751a9563fa95a14c89acaf2.png)
![Ленты на 3 светодиодных блока Ленты на 3 светодиодных блока](https://habrastorage.org/getpro/habr/upload_files/b92/7cd/205/b927cd2054db100d2242a05e1cd8b443.png)
![Собственно сам блок - светодиодная лента, приклеенная к брекетам Собственно сам блок - светодиодная лента, приклеенная к брекетам](https://habrastorage.org/getpro/habr/upload_files/072/07b/62a/07207b62a8a625ce16a68c9343101341.png)
![Брекет, установленный на верхнюю ПП, тут должна быть операция приклейки рассеивателей Брекет, установленный на верхнюю ПП, тут должна быть операция приклейки рассеивателей](https://habrastorage.org/getpro/habr/upload_files/69e/f59/d6a/69ef59d6ad8c99a6958af40be9e6ddcc.png)
![Нижняя печатная плата + корпус Нижняя печатная плата + корпус](https://habrastorage.org/getpro/habr/upload_files/812/826/293/812826293b76b79b4f47564e464ab337.jpg)
![Соединение 2х частей. Аккумулятор от вейпа, хоть какая то польза от них Соединение 2х частей. Аккумулятор от вейпа, хоть какая то польза от них](https://habrastorage.org/getpro/habr/upload_files/a9f/2b3/83e/a9f2b383e95a054545783048df028d31.jpg)
После пары часов мучений (далеко не последних), получается такая сборка
![](https://habrastorage.org/getpro/habr/upload_files/4aa/475/0f7/4aa4750f764481d0c496f7af8e462f25.png)
С отражателями вышло весело - изначально рассчитывали, что рассеиватели из PETG будут недостаточно прозрачными и надо делать их специальным образом, что бы добиться полной прозрачности. После десятков образцов пришли к тому, что светодиодная лента наоборот, слишком яркая и можно просто печатать прозрачным PETG без доп настроек. Почему нельзя было просто сразу приложить к ленте? Рассеиватели разрабатывались, когда компоненты ещё на почту не пришли.
![Слева - затененный рассеиватель с промежуточным слоем белого пластика (оказалось, что беллый пластик на просвет вовсе не белый), центр - стоковые параметры, справа - "стеклянная" печать PETG Слева - затененный рассеиватель с промежуточным слоем белого пластика (оказалось, что беллый пластик на просвет вовсе не белый), центр - стоковые параметры, справа - "стеклянная" печать PETG](https://habrastorage.org/getpro/habr/upload_files/ea4/011/aef/ea4011aefa59c627e98a85924901f9ce.png)
![С рассеивателями и без них С рассеивателями и без них](https://habrastorage.org/getpro/habr/upload_files/5b2/4db/28f/5b24db28f6e779cf4628b9e242933797.png)
Установка рассеивателей - тот ещё квест, это практически единственный компонент, который держится на клею
Прошивка
Так как проект хоббийный, я решил поэксперементировать и попробовать все же перелезть с чистого С на С++, собственно по этой причине прошивка представляет собой невнятный кусок говнокода, который в процессе разработки оброс extern'ами, и прочей ересью, если вы хоть раз начинали новый проект на новом стеке, я думаю прекрасно понимаете о чем речь...
Из интересного - в предыдущем пункте я писал, что светодиоды оказались слишком яркими, и оптимальная яркость - 5. Нет, не 5%, хуже, 5 уровней яркости из 256, в пространстве RGB это всего 125 цветов, что мало для плавных анимаций. Выход? Есть
Можно использовать ШИМ. Не совсем ШИМ конечно, но что-то очень похожее. Да, звучит как бред, шимировать адрессные светодиоды, но это работает. Всего светодиодов последовательно 101, надо передавать 24бит на один диод, соответственно надо передать 2424 бита данных, при частоте передачи 800кГц это значит, что можно обновлять все светодиоды 330 раз в секунду. Соответственно если передавать подряд 2 яркости попеременно, можно получить промежуточные значения, на глаз мерцание не заметно, зато дополнительный бит для каждого цвета дает увеличение цветового пространства в 8 раз! С палитрой из 1000 цветов анимации получаются гораздо плавнее.
Bluetooth все же после долгих попыток удалось завести - сначала я не понимал, почему в ESP32C3 нет bluetooth, хотя в примерах он должен быть... Да, я снова забил на документацию, и пропустил абзац, что в C3 нет bluetooth, есть только BLE. Ну чтож, привет новый стек. Вроде бы все отлично? Но почему то даже примеры из ESP-IDF не работали, спасибо китайцам за бракованный чип, в котором не работал радиомодуль, а через несколько недель он вообще откинулся, подкинув квест - разбирать и перепаивать на новый модуль. Так или иначе, BLE был побежден.
Потенциометры такого формата бывают абсолютно разные, одни линейные, другие логарифмические (или какие они, хз, но точно не линейные), да ещё и бывают с разными коэфициентами. У меня именно такие, логарифмические - документации естественно никакой нет, кроме шакальных изображений с размерами от продавца на али, и то, не всеми.
Поэтому есть процедура калибровки, исходя из крайних положений и средней точки можно программно любой потенциометр превратить в линейный (спасибо ChatGPT, без него на математику ушло бы явно больше времени, чем 3 минуты). При включении надо зажать кнопки сзади, и следовать инструкции на экране
![Процесс калибровки. У среднего слайдера есть доп подтяжка пина к питанию, так как это вывод BOOT у ESP32, и разведена она на китайском модуле, но работе это никак не мешает Процесс калибровки. У среднего слайдера есть доп подтяжка пина к питанию, так как это вывод BOOT у ESP32, и разведена она на китайском модуле, но работе это никак не мешает](https://habrastorage.org/getpro/habr/upload_files/513/6cd/0b5/5136cd0b595001277521c3bd66982713.png)
Осталось дело за малым - написать софт для ПК
ПКшный софт
Тут мои полномочия все, писать под python что-то сложнее скриптов с помощью ChatGPT я не уметь. Благо работал над этим проектом не один, и софт под ПК писал не я. Понятия не имею, как оно работает внутри, но работает хорошо. Все что требуется от пользователя - нарисовать иконки для своих приложений и запустить EXE.
![Набор иконок, приоритет и приложение указыватеся через __Приоритет__НазваниеПроцесса Набор иконок, приоритет и приложение указыватеся через __Приоритет__НазваниеПроцесса](https://habrastorage.org/getpro/habr/upload_files/bb2/967/302/bb2967302aeeb87c35dab447f179b7b7.png)
![Прога в трее, не закончена, но основную задачу выполняет Прога в трее, не закончена, но основную задачу выполняет](https://habrastorage.org/getpro/habr/upload_files/a4d/19a/aff/a4d19aaffc3bf83129d852bbdf8340ad.png)
Протокол обмена сделан таким образом, что он полностью совместим с deej, правда вывод иконок работать не будет
BOM
Не уверен, что я учел все компоненты, ибо часть брал из своих запасов, но это копеечная мелочевка. Итоговая стоимость получилась ~3000Р на один экземпляр в рассчете на изготовление 4шт. Так что и этот пункт ТЗ удалось выполнить. Естественно, не включая стоимость 3д печати и времени потраченного на сборку.
Желтым отмечены компоненты на блок кнопок (пауза, следующий/предыдущий трек), в корпусе расположены магниты и контактные площадки для этого блока, но его делать лень. По задумке он должен прикрепляться слева и держаться на магнитах.
![Таблица закупок Таблица закупок](https://habrastorage.org/getpro/habr/upload_files/06b/283/4d2/06b2834d2b226b9b34c1491c4ecb2b36.png)
Режимы работы
По функционалу режимов работы всего 2 - BLE и проводной. BLE включен всегда, никой процедуры подключения не требует, и если на ПКшном клиенте включен режим блютуза, соединение произойдет автоматически. То же самое по проводу, USB-CDC драйверов не требует.
Так как ничего, кроме подсветки настраивать собственно нечего, все настройки микшера относятся именно к ней. Настроить можно практически любой переодичный/статичный эффект
![Пример настройки Пример настройки](https://habrastorage.org/getpro/habr/upload_files/c59/2c4/638/c592c46388279808e6775617d8278432.gif)
К сожалению, не все идеи работают одинаково хорошо, на то, что бы визуализировать громкость процесса так, же как это делает стандартный микшер винды было протрачено очень много времени, но результат получился так себе, зато я точно понял, что не хочу писать под WinAPI
![Отображение громкости каждого отдельного процесса + режим статического цвета Отображение громкости каждого отдельного процесса + режим статического цвета](https://habrastorage.org/getpro/habr/upload_files/c9c/2a3/121/c9c2a31217a29840ed6a3f3d391b382c.gif)
Финал
Осторожно, ЗВУК! Собственно, демонстрация работы в реальности, примерно в таком сценарии оно используется уже больше месяца и все прекрасно работает
Ссылки на репозитории
Основной репозиторий (Прошивка/железо/3Д модели)
Пока планов на написание документации по сборке нет, так как не уверен, что это хоть кому то надо, если будет интерес, запилю.