просмотров 122 149

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

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

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

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

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

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

        AVR-usb-tiny45

!!!!! Опубликованная ниже прошивка для ATMega16 настроена на работу с кварцем 12 МГц, а не 16 МГц как на схеме.

Для того чтобы регулятор определялся как устройство управления мультимедиа клавишами был использован соответствующий 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
  7. blyat

108 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%, прибавляется быстрее.

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

  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. Здравствуйте! А как подключить энкодер с тремя ногами вместо пяти? Уж очень не хочется покупать пятиногий, учитывая, что валяются без дела аж два трехногих.

    • Вообще-то три ноги это и есть сам энкодер. Остальные две заведуют кнопкой включения звука в этой схеме. Их можно не использовать. На схеме у энкодера с одной стороны 2 а с другой 3 вывода. Эти 2 вывода можно не использовать.

    • Громкость от 0 до 100% меняется обычно за 2 поворота энкодера (но это зависит от того, сколько импульсов на оборот выдает энкодер)
      АРУ реализовать не получится, т.к. это совсем различные вещи.

  7. C Tiny45 все заработало без проблем, а вот с мегой16 или 32 ни в какую не опредиляется в системе, неизвестное устройство и все тут. 100 раз проверил фьюзы, схему, менял кварцы.
    Подскажите куда копать. Все должно сразу заработать или надо в конфигах что то править?

    • Прошивка рассчитана на кварц в 12 МГц (забыл почему-то в статье упомянуть). Если используется другой кварц то в настройках проекта AVRStudio надо изменить переменную F_CPU

      • Ставил кварц и на 12 мГц, то же самое. А в проекте конкретно в каком файле надо значение кварца? я только в oddebug.h видел этот параметр.

          • Ну хз, может руки не оттуда растут. Поставил кварц на 12 мГц, заново скачал и залил прошивку, никаких изменений.

          • Хз тогда проблема только в схемотехнике или во фьюзах

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