Физический регулятор громкости для компьютера

Фактически все устройства воспроизведения музыки имеют возможность регулировки уровня громкости. На телефоне есть кнопки + и -, на колонках переменный резистор, автомагнитола регулируется энкодером итд. Но вот с компьютером незадача — для регулировки громкости нужно двигать мышкой в трей за системной громкостью или громкостью плеера. И это неудобно. Для решения этой задачи собрал некоторое устройство…

Я решил, что проще и удобнее всего будет реализовать управление громкостью вращением рукоятки энкодера.

Что такое энкодер и принцип его работы
Энкодер — это датчик угла поворота. Их бывает два вида: абсолютные и относительные(инкрементные).
В случае инкрементного энкодера, который я использовал, при вращении рукоятки получаем информацию о направлении вращения: по часовой стрелке или против. Сильно упрощая, при вращении на некоторый градус приходит сигнал, и так каждые 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)Arduinolibraries»(или куда было установлено 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. 1. Arduino digispark — $1.25
  2. 2. Инкрементный энкодер с кнопкой — $0.99
  3. 3. Рукоятка — $3.99
  4. 4. Немного проводов, паяльник, припой, usb-провод, какой нибудь корпус — условно бесплатно
  5. 5. Более-менее прямые руки — бесценно

Итого $6.23, при этом можно сэкономить на рукоятке, но можно хорошо потратиться на красивый корпус.

Вывод


Самое главное — устройство работает. Работает без задержек, без сбоев. На любом компьютере, с любой О.С.
При этом есть мысли по улучшению корпуса и добавлению дополнительных действий.

И как оказалось — всё весьма просто. Главное это идея, а реализация — вопрос десятый. Так что дерзайте)

Добавить в избранное +6 +8

(c) 2017 Источник материала

Пролистать наверх