Давно хотел приспособить к своему ноутбуку регулятор громкости, сделанный из кодер .
Вам нужно будет подключить этот регулятор к USB, чтобы все было «по-взрослому» (а другого способа подключить к ноутбуку внешнее устройство нет).
Поверните энкодер влево – громкость должна уменьшиться, вправо – должна увеличиться.
Нажимаем ручку энкодера вниз - запускаем какую-нибудь полезную программу, или переключаемся на регулировку тембра.
Для тех, кто не знает, что такое энкодер, это ручка, как ручка громкости на основе обычного резистора, только эта ручка не имеет предельных положений - крутите ее сколько угодно в любую сторону.
Энкодер вращается с приятными мягкими щелчками, но выглядит как обычный переменный резистор.
Подобные устройства нередки в современных автомагнитолах и любых бытовых устройствах, пользовательский интерфейс которых обрабатывается микроконтроллером (а это практически любая бытовая техника), и где необходима плавная регулировка или настройка.
В энкодер часто встроен третий контакт, который работает как кнопка на ручке – когда мы нажимаем ручку энкодера вниз (вдоль оси), эта кнопка срабатывает. Это значительно обогащает возможности пользовательского интерфейса — на одном энкодере можно построить всю систему управления электронным устройством (но это добавляет головной боли программисту, но это мелочи).
У меня как раз был такой кодер.
Принцип работы энкодера довольно прост – он имеет всего два контакта (кнопка на ручке не в счет), которые начинают замыкаться, как только пользователь начинает поворачивать ручку энкодера.
Контакты подключены к двум ножкам микроконтроллера (работающим как цифровые входы), и при вращении ручки энкодера на этих ножках появляются импульсы, по фазе и количеству которых микроконтроллер определяет направление вращения и угол поворота.
ручки энкодера.
Чтобы регулятор громкости заработал, нужно решить как минимум три инженерные задачи: Шаг 1 .
Создание низкоскоростного USB-устройства на макетной плате.
Шаг 2 .
Подключите к этому USB-устройству энкодер, убедитесь, что микроконтроллер его обрабатывает и передает информацию о вращении энкодера на компьютер.
Шаг 3 .
Разберитесь, как можно программно управлять регулятором громкости.
Наверняка существует какой-то мультимедийный API, позволяющий это сделать.
Программа минимум - нужно написать программу, которая будет принимать сигналы с USB-устройства и управлять громкостью.
Хорошо бы, конечно, драйвер написать, но немного боязно браться.
Лучше оставить это на потом.
Итак, опишу процесс создания регулятора пошагово.
Подробности опущу, иначе будет слишком скучно.
Кому интересно, см.
источники [6] и документацию по ссылкам.
[ Шаг 1. Создайте низкоскоростное USB-устройство на макетной плате.
] Этот шаг прошел, даже не начав — как-то слишком просто и банально.
Я тупо скачал пример проекта по ссылке [1].
Подправил файл usbconfig.h - для понтов назвал свое устройство ДЕМО ЭНКОДЕРА , на большее фантазии не хватило.
Я проверил тип процессора (ATmega16) и частоту кварца (16 МГц) в Makefile, чтобы они соответствовали моему макету AVR-USB-MEGA16. Скомпилировал проект в AVRStudio, прошил макетку, подключил к компьютеру - все завелось с пол-оборота, мое USB-устройство работало исправно как виртуальный COM-порт - все именно так, как написано в статье [1].
[ Шаг 2. Подключите кодер к USB-устройству.
] Этот шаг вызвал у меня самые большие опасения, что все будет работать как надо.
В том, что я подключу энкодер и смогу его прочитать — в этом я не сомневался.
Были сомнения, что я смогу его эффективно прочитать, когда в фоновом режиме еще и работает обработка протокола USB — ведь это непростая задача для микроконтроллера (как потом выяснилось, я совершенно зря волновался).
Как обычно, я начал рыскать по Интернету в поисках готовых подпрограмм для чтения энкодера.
Я очень быстро нашел то, что мне нужно — конкретно для AVR, очень простой код на C[2], файлы encoder.c и encoder.h. Что бы вы ни говорили, открытый код — это круто.
Я прикрепил два индикаторных светодиода — ЗЕЛЕНЫЙ и ЖЕЛТЫЙ — для указания направления вращения энкодера.
Для удобства я подключил энкодер напрямую к разъему ISP, воспользовавшись тем, что сигналы MOSI, MISO и SCK — это всего лишь выводы PB5, PB6 и PB7 микроконтроллера ATmega16 (туда я подключил фазы A и B, а также кнопку кодировщика).
Исправлены определения ног и добавлен код инициализации.
Я добавил в проект модуль encoder.c. Добавлено управление зеленым и желтым светодиодами в основной шлейф при поступлении информации от энкодера.
КРАСНЫЙ светодиод привязан к кнопке энкодера - при нажатии красный светодиод загорается, при отпускании - гаснет. Скомпилировал, прошил - работает. Поворачиваю ручку влево, и зеленый светодиод мигает в такт щелчкам энкодера.
Поворачиваю ручку вправо и загорается желтый светодиод. Несмотря на то, что считывание энкодера методом опроса, благодаря работоспособному коду, нареканий к чтению энкодера НЕТ, даже при одновременной работе с библиотекой V-USB (респект, Пашган!).
Добавлен вывод информации с энкодера на виртуальный COM-порт (поверните энкодер влево и выведите в консоли минусы '-', поверните его вправо, выведите в консоли плюс знаки '+').
С помощью таймера каждые 10 мс отображаю состояние кнопки энкодера и обозначаю его красным светодиодом (кнопка нажата — передаю символ «1», отпущена — «0»).
Все работает. Скучный.
Наконец я выкинул модули cmd.c, crc16.c, eepromutil.c, strval.c. Размер кода уменьшился до 3 килобайт — отлично, теперь он поместится в память ATtiny45 (в будущем можно использовать макетную плату AVR-USB-TINY45, она меньше и дешевле).
[ Шаг 3. Разбираемся, как программно управлять регулятором громкости ] Как обычно, я загуглил вопрос.
Я перебрал кучу мусора и наконец нашел жемчуг - [3].
Тогда это вопрос технологии.
Достаю свой любимый детский конструктор — Visual Studio. Ни о чем не думая, я с помощью мастера сгенерировал диалоговое приложение.
Я помещаю ползунок регулировки громкости на панель, привязываю к нему переменную и добавляю обработчик положения ползунка.
При запуске приложения я устанавливаю для движка минимум 0 и максимум 65535 (чтобы соответствовать границам значения громкости, которыми манипулируют библиотеки управления микшером).
Я прочитал это с помощью функции микшерGetControlDetails текущее значение громкости и установите ползунок в соответствующее положение.
В обработчике положения ползунка все наоборот — я читаю положение ползунка и использую функцию микшерSetControlDetails Выставляю нужную громкость.
Громкость контролирую точно так, как описано в статье [3].
Я проверил - работает. Теперь осталось только прочитать то, что приходит с виртуального COM-порта (у нас есть свежеиспеченное USB-устройство с висящим на нем энкодером).
Если получен знак минус (-), то переместите ползунок влево (уменьшите громкость), знак плюс (+), затем переместите ползунок вправо (увеличьте громкость).
Если приходят символы 0 и 1, то мы соответственно контролируем состояние чекбокса (просто чтобы указать, нажата кнопка энкодера или нет).
С COM-портом можно работать как с обычным файлом (см.
[4]).
Инициализируем подключение к COM-порту как открытие файла (вызовом ::Создать файл ) в режиме блокировки.
Запускаем отдельный поток, добавляем в бесконечный цикл чтение файлов (с блокирующим вызовом ::Читатьфайл ) по одному персонажу и анализировать этот символ.
В зависимости от того, какой символ прибыл, мы поворачиваем ползунок в нужном направлении (громкость будет регулироваться обработчиком ползунка) или обновляем состояние чекбокса.
Я проверил - работает.
Вот и все, собственно.
Тогда вы сможете заниматься бесконечными (и, вероятно, бесполезными) улучшениями.
Произведите автоматический поиск необходимого виртуального COM-порта (теперь для упрощения имя COM-порта передается через командную строку).
Преобразование USB-устройства из CDC -класс на СКРЫТЫЙ - это позволяет упростить код USB устройства, а также упростить программный поиск и открытие устройства на компьютере по VID и HID. Или вместо программы написать сервис (чтобы не запускать отдельную программу).
Или даже водитель.
Это очень интересно, но я не знаю как (может кто-нибудь из хабравовцев меня научит мудрости?.
).
Прикрепите какое-нибудь действие к кнопке энкодера.
И так до бесконечности.
Надеюсь, кто-то найдет мои исследования полезными для своих собственных разработок.
Если я что-то упустил, буду рад услышать ваши замечания в комментариях.
[ UPD120803 ] Один компетентный человек собрал AVR на микроконтроллере.
регулятор громкости — USB HID-устройство, эмулирующее стандартную мультимедийную клавиатуру (как предложено в комментариях).
Эта клавиатура имеет возможность регулировки громкости без дополнительного программного обеспечения; всю необходимую работу выполняет драйвер операционной системы.
[ Ссылки ] 1 .
USB-консоль для управления радиолюбительскими устройствами .
2 .
Здесь я нашел код для кодера .
Вот авторское описание алгоритма .
3 .
Описание работы с микшером звуковой карты через микшерSetControlDetails .
4 .
Как работать с COM-портом в Windows .
5 .
видео , демонстрирующий работу регулятора громкости.
6 .
Исходники проекта ENCODER DEMO (Проект AVRStudio и проект Visual Studio).
Теги: #Сделай сам или Сделай сам #avr #usb #CDC #микшер #энкодер #V-USB
-
Google Теряет Позиции В Китае
19 Oct, 24 -
Галопом По Европе: Изменения В Mysql 5.4
19 Oct, 24 -
Обзор Камеры Galaxy (Часть I)
19 Oct, 24