Регулятор громкости на энкодере своими руками

Добавил пользователь Cypher
Обновлено: 01.09.2024

Регулятор громкости на энкодере с индикацией на кольце WS2812b

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Доброго дня. Хотелось бы предложить к реализации проект регулятора громкости с индикацией уровня на светодиодном кольце WS2812b и включением режима VU-метра в промежутках между вращениями энкодера.

Используемые модули:

Функции:

- Изменение уровня громкости при вращении энкодера (точкой/полоской)

- При отсутствии вращения рукоятки энкодера переходить в режим VU-метра (с выделением пика/ без пиков).

- При отсутствии звукового сигнала воспроизводить эффекты наподобие бегущих огней (отключаемые).

- Кнопкой энкодера циклично переключать режимы отображения

Пример подобной реализации представлен по ссылке.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Не хватает еще одного пункта в разделе "Используемые модули" - того, через что будет звук заводиться на ардуину.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Не хватает еще одного пункта в разделе "Используемые модули" - того, через что будет звук заводиться на ардуину.

Да. Звук для VU-metra будет заводиться с линейного выхода через предусилитель на LM358 на пин A7 (ADC7) например. Как на схеме ниже:


  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

И еще из текста неясно: вы этот проект заказать кому-то хотите или наоборот - продать кому-то.

Так-то штука забавная, я бы поучаствовал в этом.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

И еще из текста неясно: вы этот проект заказать кому-то хотите или наоборот - продать кому-то.

Так-то штука забавная, я бы поучаствовал в этом.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

brokly аватар

Для ввода звука лучше используйте модуль ADS1115, копеечный но очень не плохой АЦП, и операционники не нужны.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Для ввода звука лучше используйте модуль ADS1115, копеечный но очень не плохой АЦП, и операционники не нужны.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

brokly аватар

Ну тогда предусмотрите переключние характеристик регулирования, для громкости нужна обратная логарифмическая ;) Для частот, скорее, линейная.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

dimax аватар

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

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Доброго дня. Хотелось бы предложить к реализации проект регулятора громкости с индикацией уровня на светодиодном кольце WS2812b и включением режима VU-метра в промежутках между вращениями энкодера.

Используемые модули:

Функции:

- Изменение уровня громкости при вращении энкодера (точкой/полоской)

- При отсутствии вращения рукоятки энкодера переходить в режим VU-метра (с выделением пика/ без пиков).

- При отсутствии звукового сигнала воспроизводить эффекты наподобие бегущих огней (отключаемые).

- Кнопкой энкодера циклично переключать режимы отображения

Пример подобной реализации представлен по ссылке.

Суть технического задания в принципе ясна, но остается ряд вопросов по поводу звука:

1. Сколько ступеней регулировки громкости?

2. Регулировка громкости линейная или нет?

Если регулировка громкости нужна нелинейная и с большим количеством ступеней (32-128), то задача усложняется, тогда ваш цифровой потенциометр явно не подойдет. Если брать нелинейную регулировку громкости например на 100 ступеней, то там единственный цифровой потенциометр который я встречал за свою практику - CAT5116. Либо при помощи аналогового перемножителя (например AD633 или AD835) и ЦАПа с разрядностью не меньше 12 бит (для реализации нелинейной регулировки), например MCP4822. Если аналоговые перемножители слишком для вас дорого, то можно использовать аудио микросхемы в которых регулировка громкости осуществляется при помощи аналоговых перемножителей, например LM1036. Если количество ступеней не обязательно должно быть равно 100, можно использовать цифровые потенциометры с нелинейной шкалой, например DS1807. Или еще проще взять готовый аудио процессор, например TDA8425 и рулить им по I2C шине.

Last Update 19 июня 2004

Rotary Encoder

( цифровой датчик угла поворота )

Крутим громкость ручкой (дополнение к статье VOL_CTRL)

Эта часть статьи посвящена любителям всевозможных тюнингов и модингов , которые хотят изменять громкость исключительно поворотом ручки . Использовать переменные сопротивления с сопутствующей обвязкой , я счел нерациональным , т.к. помимо того что придется помучиться с проводами и разъёмами , качество звука неизбежно ухудшится . Поэтому было принято решение заменить кнопки регулировки громкости на енкодер (он же corner encoder - цифровой датчик угла поворота) .

Вариант с энкодером

По внешнему виду енкодер мало отличается от переменного сопротивления , но по внутреннему строению енкодер похож на своебразый выключатель , сигналы на его выходах смещены на 90 градусов относительно друг друга (с.м. ниже) , и поэтому использовать его без дополнительной обвязки невезможно . Схема применения енкодера дана в "Мышином варианте" , начиная с блока [B] .

P.S. У фирмы Bourns есть линейка енкодеров EPS1D-F19-AE0036 , со встроенной кнопкой (срабатывает при нажатии на вал), которую можно будет использовать для приглушения звука .

Мышиный вариант

(вариант с валкодером)


Левый кусочек схемы [A] (с транзисторами) позаимствован у динамической MIDI клавиатуры с сайта http://members.tripod.com/~sakevich/welcome.htm . Блок [B] задумывался для того чтобы избавить триггер в блоке [C] от пришествия двух единиц (нолей) на R и S одновременно (Пришлось избавитья от триггира ТМ2 в блоке [C] и заменить его на триггер из элементов ЛА3 , в сочетании с блоком [B] всё заработало идеально . ) . С установленным блоком [B] , при вращении оси мыши , не проскакивает сигнал на втором выходе (в блоке [C]) , когда идёт череда импульсов с первого (проверялось светодиодами) . Блок [C] выполняет роль дешефратора . Триггеры в блоке [D] сбрасываются генератором тактовой частоты (С ~20mF 6V , R ~20kOm) , и тем самым гасят "застывшие" сигналы с выходов при отсутствии вращения вала . Чем больше импульсов даёт генератор , тем больше импульсов будет на выходах в блоке [D] при вращении вала .

P.S. В мышах могут быть фотодиоды как с общим катодом , так и с общим анодом .

Схемка под мышиный фото-диот с общим анодом .

Вариант с шаговым двигателем от дисковода



Печатная платка с правильной плотностью печати дана ниже .

Готовая конструкция подключается по схеме в мышином варианте (начиная с блока [B]) .

Более удобный вариант платки - Z.A.N.Enc300dpi.tif

Тоже самое , только без перемычек - Z.A.N.EncWW300dpi.tif

Оригинальный вариант платки с правильной плотностью печати 360dpi - EncPCB360dpi.tif , и вариант в 300dpi - EncPCB300dpi.tif



Небольшой хит парад шаговых движков из пяти дюймовых дисководов .

На втором месте - движёк из "балгарского" дисковода 720k , названия не помню но их в спектрумовые времена так и называли . На движке написано "ИЗОТ СДХ 1,8/40 12V1,8°IP40" В отличии от первого явно меньшее кольчество шагов (на "ощупь") , при обычном вращении ощутимо "проскакивает" , возможно с большой ручкой этот эффект исчезнет .

На третьем месте - движёк из рашен дисковода 720k Электроника хх05 (точно не помню) , на движке написано "ПБМГ-200-265 Ф" . В отличии от первого явно меньшее кольчество шагов (на "ощупь") , при обычном вращении очень сильно "проскакивает" ! , возможно с большой ручкой этот эффект исчезнет .

Есть ещё мелкий движёк из дисковода 1.22К (не помню из какого , вроде митсуми) радикально мелкий (с.м. картинку ниже) , понять на ощупь сколько у него шагов невозможно , ход плавнее чем у резухи !

image

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

image

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

Чтобы заработал регулятор громкости, нужно решить, как минимум, три инженерные задачи:

Шаг 1. Создание низкоскоростного USB-устройства на макетке.
Шаг 2. Подключить к этому USB-устройству энкодер, добиться, чтобы микроконтроллер его отрабатывал, и передавал в компьютер информацию о вращении энкодера.
Шаг 3. Разобраться, как можно программно управлять регулятором громкости. Наверняка есть какое-нибудь мультимедиа-API, которое позволяет это делать. Программа минимум — нужно написать программку, которая будет принимать сигналы от USB-устройства и управлять громкостью. Неплохо бы, конечно, написать драйвер, но за это браться страшновато. Лучше оставим на потом.

Итак, опишу процесс создания регулятора по шагам. Подробности опускаю, иначе будет слишком скучно. Кому интересно, см. исходники [6] и документацию по ссылкам.

[Шаг 1. Создание низкоскоростного USB-устройства на макетке]

Этот шаг прошел, даже не начавшись — как-то слишком просто и банально. Тупо скачал пример проекта по ссылке [1]. Поправил файлик usbconfig.h — для понтов назвал мое устройство ENCODER DEMO, на большее фантазии не хватило. Проверил в Makefile тип проца (ATmega16), частоту кварца (16 МГц) — чтобы соответствовало моей макетке AVR-USB-MEGA16. Скомпилил проект в AVRStudio, прошил макетку, подключил к компьютеру — все завелось с полоборота, мое USB-устройство исправно заработало как виртуальный COM-порт — все в точности так, как написано в статье [1].

[Шаг 2. Подключить к USB-устройству энкодер]

Этот шаг у меня вызывал самые большие опасения, что все заработает как надо. Что энкодер подключу и смогу его читать — в этом я не сомневался. Были сомнения, что смогу его считывать качественно, когда в фоне работает ещё и обработка протокола USB — все-таки это задача для микроконтроллера не из легких (как впоследствии оказалось — волновался я совершенно напрасно).

Как обычно, начал рыться в Интернете в поисках готовых подпрограмм для чтения энкодера. Нашел очень быстро то, что нужно — именно для AVR, очень простой код на C [2], файлики encoder.c и encoder.h. Что ни говори, а open source крутая штука.

Приделал два индикационных светодиода — ЗЕЛЕНЫЙ и ЖЕЛТЫЙ — для обозначения направления вращения энкодера. Подключил энкодер для удобства прямо к разъему ISP, воспользовавшись тем, что сигналы MOSI, MISO и SCK — это всего лишь ножки PB5, PB6 и PB7 микроконтроллера ATmega16 (подключил туда фазы A и B, а также кнопку энкодера).

image

image

В заключение выкинул модули cmd.c, crc16.c, eepromutil.c, strval.c. Объем кода упал до 3 килобайт — отлично, теперь поместится и в память ATtiny45 (можно в будущем задействовать макетку AVR-USB-TINY45, она меньше по размерам и дешевле).

[Шаг 3. Разобраться, как можно программно управлять регулятором громкости]

Как обычно, прогуглил вопрос. Отсеял кучу мусора, и наконец выгреб жемчужину — [3]. Дальше дело техники. Достаю любимый детский конструктор — Visual Studio. Ни о чем не думая, визардом генерю dialog-based приложение. Бросаю на панель движок регулятора громкости, привязываю к нему переменную, добавляю обработчик положения движка. При старте приложения настраиваю движок на минимум 0 и максимум 65535 (чтобы соответствовало границам значения громкости, которым манипулируют библиотеки управления микшером). Считываю функцией mixerGetControlDetails текущее значение громкости, и ставлю движок регулятора в соответствующее положение. В обработчике положения движка все наоборот — читаю положение движка и функцией mixerSetControlDetails устанавливаю нужную громкость. Управление громкостью делаю в точности так, как написано в статье [3]. Проверил — работает.

Теперь осталось дело за малым — читать, что приходит с виртуального COM-порта (на нём у нас висит свежеиспеченное USB-устройство с энкодером). Если пришел минусик (-) то двигаем движок влево (уменьшаем громкость), плюсик (+), то двигаем движок вправо (увеличиваем громкость). Если приходят символы 0 и 1, то соответственно управляем состоянием чекбокса (просто для индикации — нажата кнопка энкодера, или нет). С COM-портом можно работать, как с обычным файлом (см. [4]). Инициализируем подключение к COM-порту как открытие файла (вызовом ::CreateFile) в блокирующем режиме. Запускаем отдельный поток, туда в бесконечный цикл добавляем чтение файла (блокирующим вызовом ::ReadFile) по одному символу, и этот символ анализируем. По тому, какой символ пришел, крутим движок слайдера в нужную сторону (громкость будет регулировать обработчик слайдера) или обновляем состояние чекбокса. Проверил — работает.

image

Вот и все, собственно. Дальше можно заниматься бесконечным (и, наверное, бесполезным) улучшательством. Сделать автоматический поиск нужного виртуального COM-порта (сейчас для упрощения имя COM-порта передается через командную строку). Переделать USB-устройство с CDC-класса на HID — это может упростить код USB-устройства, а также упростить программный поиск и открытие устройства на компьютере по VID и HID. Или написать вместо программы сервис (чтобы не надо было запускать отдельную программу). Или даже драйвер. Это очень интересно, но не умею (может, кто из хабравчан научит уму-разуму. ). Прикрутить к кнопке энкодера какое-нибудь действие. Ну и так далее до бесконечности.

Надеюсь, кому-нибудь мои изыскания пригодятся в собственных разработках. Если чего-нибудь упустил, буду рад выслушать замечания в комментариях.

Один грамотный человек собрал на микроконтроллере AVR регулятор громкости — USB HID устройство, эмулирующее стандартную мультимедийную клавиатуру (как предлагалось в комментариях). Такая клавиатура имеет возможность регулировать громкость без дополнительного программного обеспечения, всю необходимую работу выполняет драйвер операционной системы.

Важно! Ардуино обязательно должна быть на контроллере atmega 32u4, так как данный контроллер умеет выступать вроли HID устройства.

HID Устройство (human interface device) class — класс устройств USB для взаимодействия с человеком. Этот класс включает в себя такие устройства как клавиатура, мышь, игровой контроллер. Так как регулировка громкости существует на некоторых клавиатурах, то регулировка с помощью энкодера как раз будет подходить к данному типу устройств.

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


На схеме показана плата arduino leonardo, но это не мешает нам использовать как например я использую arduino pro micro.

В скетче можно поменять пины к которым подключены CLK, DT и SW энкодера.

После заливки скетча, если у Вас есть 3d принтер, то можно распечатать корпус, в архиве со скетчем будут лежать файлы для печати такого корпуса который показан на фото.

Наглядную демонстрацию работы данного устройства можно увидеть в видео:

Читайте также: