Понимание отчета USBHID_DESC
Недавно я запустил программу USBHID_DESC на моём Arduino Uno с USB-концентратором, подключённым к джойстику. Мне хотелось запрограммировать джойстик для интеграции с моим проектом. Circuits@Home разработали код и опубликовали две статьи, посвящённые пониманию отчёта . Но они очень скудны по содержанию и содержат только один пример. Многие из возвращаемых полей вообще не описаны в руководстве. Более того, попытки разобраться в официальной документации с сайта USB.org оказались крайне утомительными. Я даже не знаю, с чего начать. Может ли кто-нибудь помочь мне расшифровать поля данных для этого контроллера?
Вот данные, которые я получил от последовательного монитора:
Начать 0000: 05 01 09 04 A1 01 09 01 A1 00 09 30 09 31 09 32
0010: 09 BB 15 80 25 7F 46 FF 00 66 00 00 66 00 00 75
0020: 08 95 04 81 02 C0 09 39 15 01 25 08 35 00 46 3B
0030: 01 65 14 75 04 95 01 81 02 05 09 19 01 29 04 15
0040: 00 25 01 75 01 95 04 81 02 95 08 81 01 05 08 09
0050: 43 15 00 26 FF 00 35 00 46 FF 00 75 08 95 04 91
0060: 82 55 00 65 00 55 00 65 00 55 00 C0
Использование страницы Gen Desktop Ctrls(01)
Использование геймпада
Заявка на взыскание
Указатель использования
Коллекция Физическая
Использование X
Использование Y
Использование Z
Использование Undef
Логический минимум(80)
Логический Макс(7F)
Физический Макс(FF00)
Единица(0000)
Единица(0000)
Размер отчета(08)
Количество отчетов(04)
Ввод(00000010)
Конец коллекции
Использование переключателя Hat
Логический минимум(01)
Логический Макс(08)
Физический Мин(00)
Физический Макс(3B01)
Блок(14)
Размер отчета(04)
Количество отчетов(01)
Ввод(00000010)
Кнопка страницы использования(09)
Мин. использование(01)
Максимальное использование(04)
Логический минимум(00)
Логический Макс(01)
Размер отчета(01)
Количество отчетов(04)
Ввод(00000010)
Количество отчетов(08)
Ввод(00000001)
Светодиоды страницы использования(08)
Использование Медленно Blk On Time
Логический минимум(00)
Логический Макс(FF00)
Физический Мин(00)
Физический Макс(FF00)
Размер отчета(08)
Количество отчетов(04)
Выход(10000010)
Единица Эксп(00)
Единица(00)
Единица Эксп(00)
Единица(00)
Единица Эксп(00)
Конец коллекции Игровой манипулятор Указатель XYZ Неопределенный(00)(00)(7F)(00)
Смена шляпы(00)
Btn0001
(00) Btn0002
(00) Btn0003
(00) Btn0004
(00)
(00)(00)(00)(00)(00)(00)(00)(00)
Медленно останавливается вовремя
@B. Guisgand, 👍1
1 ответ
Лучший ответ:
Это довольно легко понять, если сделать отступы и разбить текст на части. Позвольте мне также добавить несколько примечаний:
Usage Page Gen Desktop Ctrls(01) // Использования описывают, что
Usage Game Pad // следующие данные используются для.
Collection Application
Usage Pointer // Используйте настройки для физического
Collection Physical // указывающее устройство
Usage X // Имеет четыре оси -
Usage Y // X, Y, Z и некоторые другие неопределенные оси.
Usage Z
Usage Undef
Logical Min(80) // Вывод значений от 0x80 до 0x7F, которые при
Logical Max(7F) // интерпретируемый как знаковый байт, составляет от -128 до 127.
Physical Max(FF00) // Вход имеет диапазон от 0 до 255
Unit(0000)
Unit(0000)
Report Size(08) // Значение отчета имеет длину 8 бит,
Report Count(04) // и их 4 (по одному на ось)
Input(00000010) // На этом раздел «ввода» завершается.
End Collection
Usage Hat Switch // Теперь описываем HAT Switch.
Logical Min(01) // Интерпретировать как значение от 1 до 8
Logical Max(08)
Physical Min(00) // Входные данные находятся в диапазоне от 0 до 0x3B01.
Physical Max(3B01) // Не уверен, что значение интерпретируется правильно.
Unit(14)
Report Size(04) // Отчет состоит из 4 бит,
Report Count(01) // и там только один из них.
Input(00000010) // И завершаем раздел ввода.
Usage Page Button(09) // Далее идут кнопки.
Usage Min(01) // Это в основном номера кнопок
Usage Max(04) // - есть 4 кнопки, от 1 до 4.
Logical Min(00) // Кнопка либо выключена (0),
Logical Max(01) // или на (1).
Report Size(01) // И может иметь только одно состояние, поэтому размер 1.
Report Count(04) // Есть 4 кнопки, поэтому 4 отчета.
Input(00000010) // И завершаем ввод.
Report Count(08) // Это особый случай. Он сохраняет настройки.
Input(00000001) // как и раньше (они не были изменены), но
// это просто фиктивный вариант, чтобы дополнить данные
// правильный размер. Выравнивание — это ключ к успеху.
Usage Page LEDs(08) // Теперь у нас есть 4 светодиода с
Usage Slow Blk On Time // 8-битное значение ШИМ. 0-FF, которое не
Logical Min(00) // требуется интерпретация, поэтому 0=0 и FF=FF.
Logical Max(FF00)
Physical Min(00)
Physical Max(FF00)
Report Size(08) // Как я уже сказал, 8 бит,
Report Count(04) // и их 4.
Output(10000010) // И это вывод.
Unit Exp(00) // Теперь, похоже, тут немного мусора.
Unit(00)
Unit Exp(00)
Unit(00)
Unit Exp(00)
End Collection Game Pad // И конец.
Таким образом, интерпретируя это, вы получаете отчет, который содержит:
Byte Function
0 X Axis 0-255 which you map to -128 to 127
1 Y Axis 0-255 which you map to -128 to 127
2 Z Axis 0-255 which you map to -128 to 127
3 Another Axis 0-255 which you map to -128 to 127
4 Upper 4 bits buttons, lower 4 bits HAT direction
5 Padding byte to make ita multiple of 16 bits long
И вы можете отправить 4-байтовый отчет, где:
Byte Function
0 LED 1 PWM
1 LED 2 PWM
2 LED 3 PWM
4 LED 4 PWM
Эти «светодиоды» могут быть двигателями с обратной связью по усилию или вибраторами.
Также я подозреваю, что в выходных данных может быть небольшое искажение или неверная интерпретация многобайтовых значений.
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- avrdude ser_open() can't set com-state
- Как подключиться к Arduino с помощью WiFi?
- Mac OSX Yosemite не отображает последовательные порты для Uno R3
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?