В предыдущей статье я рассказал, как сделать регулятор громкости подключаемый к компьютеру по USB. Основной
недостаток такого решения это то, что такое устройство относится к Generic HID классу. И хотя для работы такого устройства не требуется установка драйверов однако требуется установка на компьютер программного обеспечения, которое будет управлять звуковым устройством. Избавиться от необходимости установки программы на компьютер можно если устройство будет опознаваться компьютером как мультимедийная клавиатура, в которой предусмотрены клавиши регулировки громкости звука. Тогда громкость будет регулироваться средствами самой операционной системы без использования дополнительных программ.
Для реализации этого решения беру те же самые платы AVR-USB-MEGA16 и 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].
[Ссылки]
- Исходные коды.
- Исходные коды вер.2. Можно увеличить скорость изменения громкости заданием в коде значения переменной AdditionalKeyPress.
- Исходные коды вер. 3. Решена проблема для устройств без кварца (ATTiny45, ATTiny85), которые не определялись после перезагрузки.
- USB регулятор громкости ver.1
- Макетная плата AVR-USB-MEGA16
- Макетная плата AVR-USB-TINY45
- blyat
Спасибо за ответ, придется заказывать attiny45.
Собрал все работает отлично, только при вращении по часовой громкость уменьшается, а против часовой увеличивается, как поправить. Я правильно думаю в файле «encoder.h» нужно помянет местами
#define RIGHT_SPIN 0x01
#define LEFT_SPIN 0xff
Я судя по коду, такой вариант не сработает. Лучше поменять местами значения #define Pin1_Enc и #define Pin2_Enc
Все разобрался в файле «encoder.h» нужно поменять PinB 3 и 4 местами. Еще раз большое спасибо разработку.
Подскажите такой момент, иногда данное устройство не определяется, либо определяется но выдает ошибку (код 10)
Это старая проблема для всех 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 у меня это сделать так и не получилось. То ли библиотека не позволяет сделать это в принципе, то ли у меня руки кривые. Причем совместить в одном устройстве основную клавиатуру и мышь удается без проблем.
Проверял отсюда http://www.obdev.at/products/vusb/hidkeys.html клавиатуру, тут опять не работают медиа кнопки, может получится объединить библиотеки
Здравствуйте.Я купил 3 attiny45,но прошивка в исходниках весит 7кб.на 45 тинь залить не удастся?
Товарищи!как вы прошили тини45?1 микруху сдег,еще одну закосячить не хочется …я нашел в архиве прошивку,весит 7 кб.прошивал юсбасп,монтаж верный,фьюзы прошились кроме одного,на дву мк пробрвал,не прошил:-(
Да эта прошивка зальется на тини 45. Я прошивал тоже юсбасп. Я не понимаю как можно что-то испортить прошивкой. Такое возможно только если неправильно прошить фьюзы. Поэтому не понимаю, что значит не прошился один. Фюзы Для ATTyny85: FUSE_L = 0xD1, FUSE_H = 0xDD
все заработало)Диод подосланный оказался…просадка напряжения была)))))))))
Собрал устройство по схеме, но при подключении постоянно пишет Это устройство было остановлено, поскольку оно сообщило о возникновении неполадок. (Код 43)
Я с таким не сталкивался. Судя по ошибке, схема определяется как нормальное USB устройство. Я думаю проблема с драйверами, которые ему автоматически назначаются. Попробуйте подключить его к нескольким другим компьютерам, чтобы точно знать, что это проблема устройства а не операционки.
Спасибо! Разобрался: не были прошиты фьюзы. Но теперь другая ошибка возникает: через какое то время устройство отключается, комп выдает ошибку неизвестного устройства и не работает до перезагрузки. В чем может быть проблема?
Не знаю что и думать. То есть переподключение устройства эту проблему не решает? Если нет, то мне кажется, что это все-таки проблема операционной системы а не устройства.
День добрый, хороший проект на tiny 45 работает нормально за исключением того что не девайс не всегда определяется, как Вы и писали. Применима ли исходник для 32 мега на 8 мегу, естественно с учетом перекомпиляции проекта под 8 мегу
Исходник, подойдет для Мега 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