просмотров 87 586

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

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

  1. Собрал все работает отлично, только при вращении по часовой громкость уменьшается, а против часовой увеличивается, как поправить. Я правильно думаю в файле «encoder.h» нужно помянет местами
    #define RIGHT_SPIN 0x01
    #define LEFT_SPIN 0xff

    • Это старая проблема для всех USB устройств сделанных на Tyni45-85 без кварца, когда устройство не определяется если в момент включения компьютера оно вставлено в порт. Я так и не смог ее решить. Можно сделать в программе большую задержку, чтобы устройство активизировалось уже после загрузки ОС. Или использовать схему с кварцем.

    • Кнопки просто можно добавить только к схеме на Mega32.
      в enсoder.h добавить
      #define Btn_1 3
      ………………
      #define Btn_5 7
      в enсoder.с
      Для каждой кнопки сдублировать процедуру
      ENC_GetBtnState(void) или другим способом проверять нажатие кнопок.
      в main.c проверять какая кнопка была нажата
      и присваивать переменной KeyPressed соответствующий код клавиши с клавиатуры. http://obruboff.ru/wp-content/uploads/KeyLogScanCodes.xls
      Можно использовать только коды мультимедиа клавиш. Коды основных клавиш передаваться не будут.

      • Понятно почему не работало, использовал коды основных клавиш, а так заработало:

        else if ((PINB & (1 << PB3)) == 0)
        {
        KeyPressed = 0xCD; // pause/play
        }

        А вообще есть ли возможность запрограммировать кнопки, например UP/DOWN

        • Для того чтобы добавить основные клавиши, нужно чтобы устройство определялось как композитное устройство состоящее из клавиатуры и устройства управления мультимедиа (так например определяется любая мультимедиа клавиатура). На библиотеке V-USB у меня это сделать так и не получилось. То ли библиотека не позволяет сделать это в принципе, то ли у меня руки кривые. Причем совместить в одном устройстве основную клавиатуру и мышь удается без проблем.

  2. Товарищи!как вы прошили тини45?1 микруху сдег,еще одну закосячить не хочется …я нашел в архиве прошивку,весит 7 кб.прошивал юсбасп,монтаж верный,фьюзы прошились кроме одного,на дву мк пробрвал,не прошил:-(

    • Да эта прошивка зальется на тини 45. Я прошивал тоже юсбасп. Я не понимаю как можно что-то испортить прошивкой. Такое возможно только если неправильно прошить фьюзы. Поэтому не понимаю, что значит не прошился один. Фюзы Для ATTyny85: FUSE_L = 0xD1, FUSE_H = 0xDD

  3. Собрал устройство по схеме, но при подключении постоянно пишет Это устройство было остановлено, поскольку оно сообщило о возникновении неполадок. (Код 43)

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

      • Спасибо! Разобрался: не были прошиты фьюзы. Но теперь другая ошибка возникает: через какое то время устройство отключается, комп выдает ошибку неизвестного устройства и не работает до перезагрузки. В чем может быть проблема?

        • Не знаю что и думать. То есть переподключение устройства эту проблему не решает? Если нет, то мне кажется, что это все-таки проблема операционной системы а не устройства.

  4. День добрый, хороший проект на tiny 45 работает нормально за исключением того что не девайс не всегда определяется, как Вы и писали. Применима ли исходник для 32 мега на 8 мегу, естественно с учетом перекомпиляции проекта под 8 мегу

    • Тогда энкодер подключается к свободным ногам любого другого порта, а в файле encoder.h правятся строки
      //encoder port & pins
      #define PORT_Enc PORTA
      #define PIN_Enc PINA
      #define DDR_Enc DDRA
      #define Pin1_Enc 0
      #define Pin2_Enc 1
      #define Btn_Enc 2

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