просмотров 70 535

USB регулятор громкости на энкодере и микроконтроллере AVR ver.2

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

Для реализации этого решения беру те же самые платы AVR-USB-MEGA16 и  AVR-USB-TINY45 . 

Макетная плата AVR USB MEGA16                      Макетка AVR USB TINY45

И те же схемы подключения энкодера.

        AVR-usb-tiny45

Для того чтобы регулятор определялся как устройство управления мультимедиа клавишами был использован соответствующий USBHidReportDescriptor, взятый из USB дескриптора мультимедиа клавиатуры, и написан соответствующий код обработки.

Пример USB дескриптора
PROGMEM char usbHidReportDescriptor[25] = { /* USB report descriptor */
 0x05, 0x0c, // USAGE_PAGE (Consumer Devices)
 0x09, 0x01, // USAGE (Consumer Control)
 0xa1, 0x01, // COLLECTION (Application)
 0x85, 0x01, // REPORT_ID (1)
 0x19, 0x00, // USAGE_MINIMUM (Unassigned)
 0x2a, 0x3c, 0x02, // USAGE_MAXIMUM (AC Format)
 0x15, 0x00, // LOGICAL_MINIMUM (0)
 0x26, 0x3c, 0x02, // LOGICAL_MAXIMUM (572)
 0x95, 0x01, // REPORT_COUNT (1)
 0x75, 0x10, // REPORT_SIZE (16)
 0x81, 0x00, // INPUT (Data,Var,Abs)
 0xc0 // END_COLLECTION};

Рабочие примеры firmware для макеток находятся в исходниках написанных с использованием AVR Studio 5.0.

P.S. Устатовка FUSE битов

Для ATMega32: FUSE_L = 0xCF, FUSE_H = 0x18, LOCKOPT BYTE: 0x3F.

Для ATTyny85: FUSE_L = 0xD1, FUSE_H = 0xDD

P.P.S. Предупреждение! Регулятор собранный на ATTiny45, может не определяться после выключения компьютера, если во время включения он подключен к USB порту. Приходится его переподключать.

P.P.P.S 16.02.2015 Решена проблема с тем, что регулятор собранный на ATTiny45 не определялся после перезагрузки или выключения компьютера. Описание решения смотреть в статье. Исходные коды качать по ссылке [3].

[Ссылки]

  1. Исходные коды.
  2. Исходные коды вер.2. Можно увеличить скорость изменения громкости заданием в коде значения переменной AdditionalKeyPress.
  3. Исходные коды вер. 3. Решена проблема для устройств без кварца (ATTiny45, ATTiny85), которые не определялись после перезагрузки.
  4. USB регулятор громкости ver.1
  5. Макетная плата AVR-USB-MEGA16
  6. Макетная плата AVR-USB-TINY45

89 thoughts on “USB регулятор громкости на энкодере и микроконтроллере AVR ver.2

  1. А можете показать тоже самое но вместо encodera использовать просто кнопки? я пытаюсь сделать на Atmega328 всю голову сломал так и не получилось, использовал ваш пример так и не вышло.

    • Перепешите функцию ENC_GetStateEncoder(), чтобы при нажатии кнопки «Громче» она возвращала значение RIGHT_SPIN, а при нажатии кнопки «Тише» LEFT_SPIN.
      Самому мне это делать неинтересно.

  2. Здравствуйте. Скажите пожалуйста, а можно ли реализовать данное устройство не для регулировки громкости, а для управления некоторыми параметрами в игре, грубо говоря эмулировать нажатия клавиш поворотом энкодера?

    • Теоретически можно. В данном устройстве и так происходит посыл нажатия мультимедиа клавиш «Громче» и «Тише». Какая клавиша нажата определяется кодом присваиваемым переменной KeyPressed. Коды берутся из http://obruboff.ru/wp-content/uploads/KeyLogScanCodes.xls.
      Однако если надо нажимать не мультимедиа клавиши, а обычные, то тогда понадобися переписать константу usbHidReportDescriptor и значение макроса USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH из usbconfig.h установить в соответствии с новым размером дескриптора. Пример реализации обычной клавиатуры http://www.obdev.at/products/vusb/hidkeys.html. Оттуда можно взять дескриптор.

  3. Привет.
    Собрал, вроде всё сделал верно, новичок. Но чтобы громкость изменилась — нужно не мало крутить энкодер. В чем может быть беда?
    Чуть ли не пару оборотов для убавления 1%, прибавляется быстрее.

    • Может быть теряются импульсы на энкодере. Нужно проверить что стоят правильные кондеры на ножках энкодера, которые для защиты от дребезга. Может сам энкодер дохлый, такое, как писали, тоже бывает.

    • Еще в коде есть переменная AdditionalKeyPress если менять ее значение, то можно скорость изменения увеличивать в 2 и более раз

  4. Собрал на макетке и одинаково работает, как с т45, так и с т85 на Win8.1.
    Связь вроде не отваливается.
    Соглашусь с d19codec — уж долго крутить приходится :(
    Открыл main.c но AdditionalKeyPress так и не нашел.
    Имеется вот это:
    KeyPressed = 0xea; //VolDn
    KeyPressed = 0xe9; //VolUp
    Буду признателен, если кто подправит прошивку и выложит сюда.

    • В исходниках для Mega32 переменная AdditionalKeyPress объявляется в строке 122 в main.c
      В исходниках для Tiny45 переменная AdditionalKeyPress объявляется в строке 188 в main.c
      Исходники качать по ссылке номер 3
      Но все это странно у меня за два оборота громкость увеличивается до предела
      Есть конечно еще вариант менять настройки в реестре для увеличения скорости изменения громкости но я так и не разобрался как

  5. Очень хочу такой регулятор громкости в на стерео систему для Андроид в машину.
    Я программист (С++,.NET,Java…), но под железо никогда не писал…
    На сколько на знаю Андроид имеет драйвера под мультимедийную клавиатуру, это правда?
    И еще, где купить:
    — Саму «ручку крутилку»
    — AVR-USB-MEGA16 или AVR-USB-TINY45 ? Искал на Алиэкспрессе и Ибейе, нашел кучу других, но не именно эти.
    Заранее благодарю за совет. Михаил.

  6. Здравствуйте. Скажите пожалуйста, а можно ли реализовать данное устройство на Digispark ATtiny85 arduino. Может есть прошивка.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>