Управление светодиодами клавиатуры с помощью USB Host Shield
У меня есть USB-клавиатура, подключенная к моему Arduino Uno с помощью USB Host Shield. Я читаю нажатия клавиш, используя этот пример с USB-хоста Библиотека щитов.
Мне нужно переключить светодиоды на клавиатуре (которые показывают состояние Caps Lock, Num Lock и т. д.)
В этой теме упоминается использование Usb.setReport()
, но это метод больше не существует: такого метода нет в Usb.cpp в библиотеке. Кажется, существует метод, называемый SetReport
в классе USBHID, который, похоже, принимает те же аргументы, что и я.
Что я сейчас делаю:
void keyboard_setup(){
static HIDBoot<USB_HID_PROTOCOL_KEYBOARD> HidKeyboard(&Usb);
if (Usb.Init() == -1) {
Serial.println("OSC did not start.");
}
delay(200);
HidKeyboard.SetReportParser(0, &Prs);
static USBHID usbhid(&Usb);
uint8_t leds = 1;
#define KBD_ADDR 1
#define KBD_IF 0
usbhid.SetReport( KBD_ADDR, 0, 1, KBD_IF, 0, &leds );
delay(100);
leds = 255;
usbhid.SetReport( KBD_ADDR, 0, 1, KBD_IF, 0, &leds );
delay(100);
Кажется, ни один из вызовов SetReport не работает, и я не уверен, что значения KBD_ADDR или KBD_IF верны (я использую те, что видел в примерах), или что вызов SetReport является правильным .
Что я делаю не так?
@Joe Malt, 👍1
Обсуждение1 ответ
Кажется, существует метод, называемый
SetReport
в классе USBHID, который, похоже, принимает те же аргументы, что и я.
Аргументы нового метода SetReport()
не совсем совпадают, а некоторые расположены в другом порядке.
Сигнатура старого метода была такой:
uint8_t setReport( uint8_t addr, uint8_t ep, unsigned int nbytes, uint8_t interface, uint8_t report_type, uint8_t report_id, uint8_t* dataptr );
...а новый:
uint8_t SetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t* dataptr);
Мне кажется, эквивалентным вызовом будет:
usbhid.SetReport( 0, KBD_IF, 0x02, 0, 1, &leds );
- Ввод текста в ESP8266 с помощью USB-клавиатуры
- Как преобразовать USB в PS/2?
- Можно ли создать устройство IP-to-USB HID (клавиатуру) с помощью Arduino?
- Keyboard.print() пропускает клавиши
- Разбудить компьютер из Uno
- STM32 в качестве клавиатуры
- Считать клавиши с обычной USB-клавиатуры
- Эмуляция клавиатуры
Я отправил ответ, но удалил его. Моя первая мысль заключалась в том, что вы создаете свой собственный экземпляр метода SetReport (которым вы и являетесь), который не работает ни с одним USB-устройством. Но, глядя на ваш код еще раз - я не уверен., @st2000
@ st2000 Я создаю свой собственный экземпляр USBHID, который я больше не использую, потому что мне кажется, что он нужен для использования SetReport(). Хотя я не уверен, что это правильный подход., @Joe Malt
Это займет у меня немного размышлений. Но я думаю, что лучший способ управлять светодиодами клавиатуры — это предоставить SetReport вашему Sketch, добавив метод-оболочку в библиотеку USBHost. В противном случае, я думаю, вам нужно настроить все USB-устройства в вашем Sketch, на что уже способен драйвер., @st2000
Я думал, что [NicoHood/HID](https://github.com/NicoHood/HID/tree/master/src/HID-APIs) страница github была ответом, но я думаю, что она работает с пользовательской клавиатурой и не обязательно работает с /стандартные светодиоды USB-клавиатуры., @st2000
NicoHood/HID использует Arduino для эмуляции клавиатуры... на самом деле клавиатура не задействована, @jsotola