просмотров 103 171

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
  7. blyat

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

  1. где именно нужно отредактировать?

    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};

    В каком файле? В Windows или драйверах на клавиатуру? прошу прошения за глупые вопросы… Устройство я собрал, в винде определяется как Volume control, а звук не регулирует! Что делать? помогите плиз!!!

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

  2. Прочитав первую Вашу статью, я понял что код редактируется в исходнике прошивки. В архиве есть откомпилированная прошивка hex. В ней уже присутствуют эти изменения? И под какой ОС это устройство должно работать?

    • Насколько я понял устройство прошилось нормально, и определяется системой правильно. Но не регулируется громкость. Прилагаемая hex прошивка работает если устройство собрано в соответствии с приведенными схемами. Я думаю ваша проблема возникает только из-за того что контакты энкодера подключены к неправильным портам микроконтроллера. В варианте платы Mega16 энкодер подключается к пинам PORT A, PIN 0,1,2 (их можно менять в encoler.h), в варианте Tiny45 PORT B, PIN 3,4,1.
      Спрашивайте если если что-то не понятно объяснил. Работать должно под всеми ОС начиная с Win XP без установки драйверов.

  3. Плата собрана по вашей схеме на Tiny45, единственное я бросил Reset на Vcc! Энкодер подключен к ногам 2 и 3. Энкодер исправен, проверял. Решил дома потестить платку, WinXp Sp3, громкость регулирует только в одну сторону «увеличивает громкость» но нестабильно! Уменьшать не уменьшает громкость! На нажатие ни как не реагирует! В чем беда? Помогите разобраться!

    • Перепроверил прошивку на своей схеме. Все работает. Проверьте правильность подключения энкодера. У энкодера с одной стороны 3 контакта, с другой 2. Там где 3 контакта средний подключается к земле, а крайние ко 2 и 3 ноге контроллера, эти контакты регулируют громкость. Там где 2 контакта один на землю а второй на 5 ногу контроллера (это включение и отключение звука «Mute»). Обязательны конденсаторы между 2,3,5 выводами контроллера и землей, иначе работает нестабильно.

        • После замены конденсаторов на 22нф, результат тот же, устройство определяется, очень плохо увеличивает громкость, но не уменьшает ни как, на кнопку не реагирует!

          • Ну, не знаю, как такое может быть. Я все же думаю на ошибки монтажа.
            Можно еще проверить фьюзы (Low = 0xD1, high = 0xDD), но я не думаю что от них это зависит

  4. Поменял местами крайние ноги энкодера и убрал светодиод, в итоге кнопка заработала, громкость убавляется отлично, а увеличивается не очень, приходиться долго крутить, не на все щелчки реагирует. Как быть? Монтаж весь перепроверил, все верно, плату промыл спиртом!

    • Пропуск щелчков обычно бывает из-за дребезга контактов. Можно попробовать увеличить емкость шунтирующих конденсаторов до 220-330 нФ.
      А светодиод на схеме указан потому что плата макетная и я в нее изменения не вносил. Правильно сделали что его убрали. Он абсолютно не нужен.

  5. Ставлю 0,1мкф вообще громкость не увеличивает, убираю кондер, плохо увеличивает, 0,01-0,033мкф также плохо увеличивает пропускает шаги, менял энкодар на новый PEC16, без изменений!

  6. Насколько я понял, до перемены ног энкодера местами громкость увеличивалась, но не уменьшалась. А после перемены, уменьшается хорошо, но не увеличивается. Можете проверить так ли это. Если так то это похоже все таки что-то с энкодером, или проблема где-то от ноги энкодера до контроллера. У меня энкодер PEC12-4220F-S0024.

  7. До перепайки ног энкодора, громкость плохо увеличивалась и не уменьшалась! после перепайки хорошо уменьшается и плохо увеличивает! Пойду искать PEC12…

    • Не особо понял просьбу. Чтобы скомпилировать прошивку под определенный контроллер я должен знать принципиальную схему (т.е. какая ножка контроллера куда подключена). Исходные коды приложены к статье и скомпилировать их под свою задачу вы можете сами. Но если нужна помощь, то объясните по-конкретнее что вам требуется.

    • Извините я не смогу это сделать, т.к. у меня нет под рукой схемы с контроллером tiny13, чтобы отладить и оттестировать прошивку. К тому же я не знаю какие на нем должны быть выставлены фьюзы, чтобы он запустился на нужной частоте. К тому же у tiny13 всего 2 Кб памяти, а этого недостаточно, нужно минимум 4 Кб

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