Фактически все устройства воспроизведения музыки имеют возможность регулировки уровня громкости. На телефоне есть кнопки + и -, на колонках переменный резистор, автомагнитола регулируется энкодером итд. Но вот с компьютером незадача — для регулировки громкости нужно двигать мышкой в трей за системной громкостью или громкостью плеера. И это неудобно. Для решения этой задачи собрал некоторое устройство…
Я решил, что проще и удобнее всего будет реализовать управление громкостью вращением рукоятки энкодера.
Что такое энкодер и принцип его работы
Энкодер — это датчик угла поворота. Их бывает два вида: абсолютные и относительные(инкрементные).
В случае инкрементного энкодера, который я использовал, при вращении рукоятки получаем информацию о направлении вращения: по часовой стрелке или против. Сильно упрощая, при вращении на некоторый градус приходит сигнал, и так каждые N градусов. В моём случае каждые 18 градусов(энкодер имеет 20 импульсов на 360 градусов).
Понятно и подробно про работу энкодера можно почитать
здесь.
Значение с энкодера будут передаваться на компьютер через arduino digispark — компактная вариация на тему ардуино, где программатором выступает сам микроконтроллер atiny85. Фишка дигиспарка в том, что его можно запрограммировать как hid-устройство: после подключения к компьютеру он будет определяться как клавиатура/мышь/итд и не нужно ставить на компьютер дополнительные программы.
Помните шутку, про то, что любую вашу задумку уже в совершенстве реализовал какой нибудь азиат? В поисках ответов, как заставить работать мой велосипед я нашёл 5 вариантов сборки подобных устройств. А 2 из них — на той же элементной базе, что использовал и я. В итоге я просто скопировал код у ребят из
adafruit, переподключил энкодер так, как рекомендуют это они и всё заработало! Сразу. Без танцев с бубном.
Но обо всём по порядку.
Железо
Берем
Digispark,
энкодер и подключаем согласно
схеме из доков к библиотеке или моей зарисовке:
2 верхних контакта энкодера — это кнопка(рукоятку можно не только крутить, но и нажать на неё). Один из них подключается к контакту P1, второй к 5V. Какой куда — без разницы.
3 нижних контакта — выход энкодера. Средний подключаем к GND, крайние к P0 и P2.
Так это выглядит у меня
Изночально я не планировал делать обзор, поэтому взял попавшийся под руки МГТФ....
Прошивка
Для начала с
гитхаба digistump(разработчиков digispark) скачиваем Digistump.Drivers.zip из которого устанавливаем драйвера согласно разрядности вашей ОС(DPinst.exe или DPinst64.exe).
Затем ставим
Arduino IDE и открываем его. Добавляем ссылку для менеджера плат, скачиваем в менеджере плат «Digistump AVR Boards» и выбираем плату. Как это сделать
подробно и с гифками показано в вики digistump.
Теперь скачиваем библиотеку
Adafruit-Trinket-USB (Прямая ссылка на скачивание) из которой копируем папку «TrinketHidCombo» в «C:\Program Files (x86)\Arduino\libraries»(или куда было установлено arduino ide).
Открываем эту самую папку «TrinketHidCombo», открываем подпапку «examples/TrinketVolumeKnobPlus» и в ней открываем файл «TrinketVolumeKnobPlus.ino».
Нажимаем «загрузка»(стрелка вперед), ждем пока скетч скомпилируется и появится приглашение для подключения дигиспарка:
Только после этого подключаем наше устройство к компьютеру и ждем завершения загрузки.
Секунд через 5 дигиспарк «отвалится»(раздастся звук отключения устройства) и переподключится уже как hid-устройство ввода.
Крутим рукоятку энкодера, удивляемся что всё работает. При вращении по часовой стрелке звук увеличивается, против часовой уменьшается. При нажатии звук глушится(«mute»).
Как это работает
Если повернуть рукоятку энкодера, п.о. интерпретирует это как сигнал добавить или уменьшить громкость. Для этого средством библиотеки эмулируется нажатие мультимедийных кнопок клавиатуры «увеличить громкость» и «уменьшить громкость». А так же «mute».
Пара прыжков с бубном
Ибо до танцев не дотягивает.
С первого раза получилось немного не так как хотелось и регулировка работала наоборот(при вращении по часовой стрелке звук уменьшался). Решение было простым и банальным:
я заменил
#define PIN_ENCODER_A 0
#define PIN_ENCODER_B 2
на
#define PIN_ENCODER_A 2
#define PIN_ENCODER_B 0
то есть поменял местами входные пины.
Потом я решил, что изменение громкости на 24% при полном обороте рукоятки — это слишком медленно. И я просто дублировал код, эмулирующий нажатие кнопок увеличения и уменьшения громкости:
if (enc_action > 0) {
TrinketHidCombo.pressMultimediaKey(MMKEY_VOL_UP);
}
else if (enc_action < 0) {
TrinketHidCombo.pressMultimediaKey(MMKEY_VOL_DOWN);
}
было заменено на
if (enc_action > 0) {
TrinketHidCombo.pressMultimediaKey(MMKEY_VOL_UP);
TrinketHidCombo.pressMultimediaKey(MMKEY_VOL_UP);
}
else if (enc_action < 0) {
TrinketHidCombo.pressMultimediaKey(MMKEY_VOL_DOWN);
TrinketHidCombo.pressMultimediaKey(MMKEY_VOL_DOWN);
}
А потом я подумал, что отдельная кнопка приглушения музыки музыки бесполезна — можно просто крутнуть регулировку влево. А вот возможность поставить музыку на паузу будет гораздо интереснее.
Для реализации этого, я заменил
TrinketHidCombo.pressMultimediaKey(MMKEY_MUTE);
на
TrinketHidCombo.pressMultimediaKey(MMKEY_PLAYPAUSE);
Список возможных клавиш можно подсмотреть в файле «TrinketHidCombo/TrinketHidCombo.h».
Корпус
Под руки попалась вот такая железная коробочка, её и использовал.
Просверлил отверстие для штока энкодера, зажал его, подложив несколько шайб. Просверлил отверстие для провода usb. Набил внутренности поролоном, чтобы ничего не болталось и не звенело.
Идеи для доработки
Есть мысль реализовать переключение треков. Дополнительные кнопки добавлять не хочется, а вот с имеющейся можно поиграть. Первый возможный вариант — это как на телефонной гарнитуре: двойное нажатие — следующий трек, тройное — предыдущий. Второй вариант — нажать на рукоятку и повернуть: поворот по часовой стрелке — следующий трек, против часовой — предыдущий. Или вообще комбинированный вариант, когда по двойному/тройному нажатию будет переключение, а поворот с нажатием будет работать как перемотка вперед/назад. Я пока не решил как мне больше нравится, поэтому еще не реализовал ни один из вариантов.
Список покупок или элементная база
- 1. Arduino digispark — $1.25
- 2. Инкрементный энкодер с кнопкой — $0.99
- 3. Рукоятка — $3.99
- 4. Немного проводов, паяльник, припой, usb-провод, какой нибудь корпус — условно бесплатно
- 5. Более-менее прямые руки — бесценно
Итого $6.23, при этом можно сэкономить на рукоятке, но можно хорошо потратиться на красивый корпус.
Вывод
Самое главное — устройство работает. Работает без задержек, без сбоев. На любом компьютере, с любой О.С.
При этом есть мысли по улучшению корпуса и добавлению дополнительных действий.
И как оказалось — всё весьма просто. Главное это идея, а реализация — вопрос десятый. Так что дерзайте)
Я даже придумал лайфхак! Берёте любую дешёвую (можно убитую в хламину) мышь. Рубите её топором, оставляете только скроллер (колёсико) и плату. На этот скроллер софтом вешаете VolUP VolDown.
Итого у нас такой же девайс-крутелка, а если это радиомышь — то ещё и беспроводной ))
Компу без разницы, сколько у вас мышей, и чё они делают.
Да-да! А если не рубить мышь и оставить кнопки на переключение треков, плэй и паузу — то мышь превращается… превращается мышь — в крутецкий пультос!!! ))
Лазер ток заклеить, шоб не курсор не рыпался )
теплая ламповаякрутилка.А идея с вандализмом мышки мне понравилась. Правда, для её работы придется держать запущенным софт, и вопрос, будет ли этот софт различать события скролла с одной определенной мыши.
Насчёт мышей — есть мыши с двумя колёсами — горизонтальным и вертикальным, есть мыши с разным количеством кнопок. То есть можно даже при худшем раскладе назначить кнопки так, чтобы они не пересекались с системной мышью. Китаемышь за доллар на 100500 кнопок как манна небесная ))
Что касается конкретного софта — нужно смотреть. У логитек на каждый девайс своя вкладка.
К счастью, все назначения хранятся в xml формате, так что при желании туда можно дописать что угодно.
но ваше решение тоже зачотное :)
Разве что может быть когда то не удобно, как написал ТС.
UPD* Saygon внизу уже упоминал.
нольменьше ресурсов!Правда пришлось отключить надоедливый uac, иначе не везде регулировался звук. Теперь регулируется везде, удобно в играх.
Так что при желании все можно.
За рукастость, конечно же, плюс. Но именно в данном ключе я смысла не вижу.
В общем здорово, но сомнительно )
Как по мне так проще. Но за регулятор плюс)
Статью читать пробовали?
Из поста:
Т.С. Проверь пожалуйста, запоминает ли OC звук при такой регулировке, т.е. если выставить на минимум, выключить компьютер, после включения звук будет на минимуме?
Я не ляхтронщик, но вижу: 2-жильный провод, на одном конце мини-джек, воткнутый в неиспользуемый канал колонок; на другом конце светодиод. Настраиваем событие: при вызове подать на данный канал звук из файла со сгенерированным сигналом, например п-образным (скважным). Не знаю, правда, напряжений на звуковом выходе.
Просто меня удивило, что нет готовых решений, кроме как за $25 ))
3cx/X-lite
В настройках аудиоустройств есть:
Параметр Ringing отвечает за устройство которое будет «играть звонок».
Наушники подрубаем к одной звуковухе, а «динамик» для звонка — к другой. В реальной (в видеокартах есть встроенная звуковуха) или виртуальной (Virtual Audio Cable) — без разницы.
Итого имеем. В одну «динамиковую» звуковуху у вас идёт рингтон, играет на всё помещение, в другую «наушниковую» — всё остальное.
Велком — Skype для бизнеса ))
я купил в свое время (наверно уже лет 15 назад) переменный резистор — uniservice.msk.ru/description.php?good_id=26735
и вставил панельку с ним и коммутатором входов ( 3 входа) в кромку стола.
соответственно вход колонок (активные мониторы) подключается напрямую к этой панельке, а источники (звуковая карта PC) втыкаются в один из трех входов.
это вообщем то столик такой выдвижной — когда дома один то кушаю на нем читая новости или форумы…
З.Ы. Надо свою помыть чутка, грязновата…
во нашел копипасту какуюто — ссылка
А так да — движковый резистор восхитителен, +
Молодец, плюс за идею и обзор!
aliexpress.com/store/product/2017-FX-AUDIO-M1-volume-controller-active-speaker-line-controller-power-amplifier-card-controller-aluminum-alloy/1264787_32800206081.html
Скажу больше, такие крутилки штатно поставляются к ряду компьютерных АС. Даже с «подсцветкой» )
Как в винде на опред кнопки свои действия запрограммировать? Хотя бы запуск скриптов. В линухе все просто — triggerhappy :-)
Вопрос к автору — как микшером рулить этой штукой будите? А если несколько звуковых карт стоит в компе?
Если программно — смотреть в сторону хуков и WINAPI типа такого:
SetWindowsHookEx( WH_KEYBOARD, KeyboardProc, GetModuleHandle( 0 ), 0 );
К счастью у меня одна звуковая карта и вопросов с микшером не возникало) Работать будет так же как и в случае с мултимедийной клавиатурой. Вероятно, через одно место.
А также есть разные макро-хоткей-виртуально-клавиатурные софтины и часто на основе ahk
Вопрос: в дигиспарке особый загрузчик или можно использовать голую 85ю?
Покупал еще в 2007 году акустику 5.1 Creative, у нее такой регулятор/выключатель громкости/басов. Очень удобная штука, всегда под рукой на столе и наушники удобно подключать. До сих пор жива.
Кстати вот есть готовый вариант, обратите внимание на цену )))
aliexpress.com/item/PC-USB-Wire-Controller-USB-Volume-Control-Knobs-Audio-Controller-for-Adjusting-Volume-of-Computer-Laptop/32649442146.html
Сам когдато собирал нечто похожее, но все было растащено друзьями. Для себя хотел сделать беспроводной вариант, но руки так и не дошли. Вот сейчас думаю нужно вернуться к теме
market.yandex.ru/product/909180
И подобных много.
Работает уже несколько лет.
Тоже хотелось таким способом регулировать громкость)
И не парюсь.
acer 5520g удобно было
А так не хватает курсорных и цифровых. И будет идеальная клава для настройщиков биоса :))/ ремонтеров материнок.
https://www.jd.ru/product/1028777.html
Я вынужден рядом с небольшой клавой держать большую :( Вторую клаву от логитека! Только из за кругового /очень удобного/ регулятора звука и десятка удобных программных кнопок.
Совет автору:
А ты поставь туда еще кнопку! Муть!
В смысле кнопку которая делает сразу выкл звук вообще
Очень нужно порой бывает.
выделенное желтым-это + — и mute
на крайняк положить рядом аэромышь
Поэтому сегодня мы изготовим на шаговых двигателях, солнечных батареях, спектрографа и ардуине простейший автоматический слив для унитаза.
habr.com/ru/post/461129/
Все в распаечной коробке 75*75.
На выходных обновил его добавил колечко из ws2812 будет светиться и сигнализировать о переключении режима при долгом нажатии, это три режима: громкость, перемотка вперёд/назад, переход по списку вверх/вниз. Все используется для Kodi.
Мне кажется может нехватать пары кнопок?
— пульты же есть для компа!
— вообще то существуют нормальные клавы для этого
— На клаве ноута есть кнопочки
— Ну и замороч у чела. Плохо Вы комп знаете.
— Не стоило делать устройство отдельной коробкой
И нет, это не просто предложения других вариантов решения задачи. Сотни человек знают, как автору будет лучше. И только их вариант единственный правильный. И как только автор жил без таких советов. Хорошо обзор написал, а то так и мучался бы со своей крутилкой.
Автору респект. Советчикам совет: больше не советовать.
Иногда жалко тратить время, на всякую фигню, когда можно проще.
Мне дали совет, работать через Интернет. Вот и работаю же.
а так, работал бы и дальше у станка на заводе. А здоровье не вечно и в инете можно и больше получать денег.
И времени тратишь меньше.
Доверяй, но проверяй.
Все претензии о зря потраченном времени я расцениваю как предложение вместо этого поразгружать вагоны за деньги.
У меня аналоговая крутилка от Edifier:
Переменный резистор и размыкающая кнопка в разрыв цепи. Без крутилки, конечно, очень плохо)
купил себе такую шайбу, очень удобно
Регулятор звука ( энкодер ) и отключение звука по нажатию.
+ световой индикатор громкости ( отключаемый ) или же ws2812 с круговой диаграммой громкости в % соотношении. и с изменением цвета при отключении звука (или же только двухцветный светодиод )
Ну и отдельное отключение микрофона ( со световым индикатором )
Ну и как отдельный дополнительный вариант отдельное управление плеером с помощью джойстика ( aliexpress.com/item/Dual-axis-XY-Joystick-Module-for-Arduino-Free-Shipping/620290295.html )
Ну и уже имея огромное количество кнопок управления, менять яркость свечения( к примеру одновременное нажатие на энкодер и джойстик)
И вот у меня вопрос созрел. Можно ли как-то на ардуинку получать уровень громкости и состояние вкл или выкл аудио выхода?
П.С. А то пылится куча всего этого барахла, а руки так ничего сделать и не дошли ((((
Если же кто-то считает тчо подобное устройство уже существует — то киньте ссылку.
"- Летучий корабль построишь?
— куплю"
Автору респект, с таких простых вещей начинают строиться великие чудеса. Выкладывай еще проекты.
энкодер, кусок платы с повесткой и ручка остались со старой автомагнитолы — «на шару»
корпус распечатал, там грамм 40 пластика
единственное после перезагрузки ПК надо переподключить регулятор, ибо он определяется с ошибкой при загрузке (пока не разобрался в чем дело)
еще есть решение, задержку подключения USB городить, секунд на 30 после включения компьютера. Но проще оказалось контроллер поменять.
вобщем как и предложенно тормознул запуск на 30 сек, теперь винда корректно определяет «крутилку»
спасибо за идею!
Сам в программировании не очень.
скопировано из файла «TrinketHidCombo/TrinketHidCombo.h».
при попытке скомпилировать скетч arduino IDE говорит что не верная библиотека. все делал по инструкции. это первый опыт работы с микроконтроллером и соответственно программой arduino ide. где может быть ошибка?
может от того что com порт выбран? так usb нет возможности выбрать