Часть 10: Программный USB-Host — Подключаем клавиатуру к Arduino

Обычно 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, но это тема для отдельного хак-гайда.

Вам также может понравиться

About the Author: ардуинчиков

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *