Обычно Arduino выступает в роли USB-устройства (периферии). Но что, если мы хотим подключить USB-клавиатуру или мышь к нашему проекту? Для этого нужен хост-контроллер.
Хак: Используем библиотеку USB Host Shield 2.0 (аппаратный шилд) или, в бюджетном варианте, эмулируем USB-Host через GPIO (с помощью библиотеки V-USB).
Вариант 1: С шилдом (MAX3421E) — готовое решение:
#include <USBHost.h>
#include <hidboot.h>
#include <Usb.h>
USB Usb;
HIDBoot<HID_PROTOCOL_KEYBOARD> Keyboard(&Usb);
// Обработчик событий клавиатуры
class KbdRptParser : public KeyboardReportParser {
public:
void PrintKey(uint8_t key) {
if (key == 0) return;
Serial.print("Нажата клавиша: ");
switch (key) {
case 0x04: Serial.println("A"); break;
case 0x05: Serial.println("B"); break;
case 0x1E: Serial.println("1"); break;
case 0x28: Serial.println("Enter"); break;
default: Serial.println(key, HEX);
}
}
void OnKeyDown(uint8_t mod, uint8_t key) {
PrintKey(key);
}
};
KbdRptParser Prs;
void setup() {
Serial.begin(115200);
if (Usb.Init() == -1) {
Serial.println("Ошибка инициализации USB");
return;
}
Keyboard.SetReportParser(0, &Prs);
}
void loop() {
Usb.Task(); // Обработка USB-событий
}
Вариант 2: Без шилда — эмуляция USB-Host через V-USB (для ATmega328P):
Сложность: Реализация USB-Host на голом железе — это магия для профи. Но мы можем использовать библиотеку V-USB (Virtual USB), которая эмулирует USB на любых пинах.
// Библиотека V-USB позволяет Arduino общаться по USB на уровне Low-Speed (1.5 Мбит/сек)
// Скачиваем с https://github.com/obdev/v-usb
#include <usbdrv.h>
// Настраиваем пины для USB
#define USB_CFG_IOPORTNAME D
#define USB_CFG_DMINUS_BIT 2 // Пин 2 (D2)
#define USB_CFG_DPLUS_BIT 3 // Пин 3 (D3)
void setup() {
usbDeviceDisconnect(); // Отключаем от USB для инициализации
_delay_ms(200);
usbDeviceConnect(); // Подключаем
Serial.begin(115200);
Serial.println("USB Host эмуляция запущена!");
}
void loop() {
usbPoll(); // Обрабатываем USB-события
// Теперь можно подключать USB-клавиатуру через специальный переходник!
}
Где взять переходник: Понадобится микросхема FTDI или CP2102 для преобразования USB в UART, но это тема для отдельного хак-гайда.