Симулятор Arduino Leonardo: HID-клавиатура и USB без платы
Arduino Leonardo — особенная плата: один чип ATmega32U4 держит и микроконтроллер, и USB-стек. Это даёт «суперсилу» — плата притворяется клавиатурой или мышью для компьютера, без прошивки загрузчика HID. Скетч Keyboard.print("hello") печатает текст в любое окно, в котором стоит курсор. Суперсила оборачивается граблями: переполнение USB-буфера «зависает» на полсекунды, и плата молчит, а скетч из интернета под Uno с Serial.begin(9600) на Leonardo использует CDC-USB — другой стек.
Плата Leonardo теперь есть и в симуляторе — выбирается в списке плат, а вызовы Keyboard/Mouse печатаются в Serial с пометкой «HID:»; подробный разбор с таблицей — в лендинге про Leonardo-эмулятор. Ниже — разбор API Keyboard/Mouse, рабочего скетча под HID, кросс-ссылки на распиновки соседних плат и на уроки по IDE, таблица различий с Uno и честная граница.
Что у Leonardo внутри
ATmega32U4 — 16 МГц, 32 КБ флеша, 2,5 КБ SRAM, 1 КБ EEPROM — те же параметры, что у Uno. Разница в USB: ATmega16U2 на Uno — отдельный конвертер USB-UART, а ATmega32U4 на Leonardo держит USB сам. Отсюда HID-возможности (Keyboard, Mouse), CDC-Serial без чипа-посредника, и меньшая цена готовой платы. Пинов у Leonardo 20 (D0-D13, A0-A5), и 7 из них — ШИМ (D3, D5, D6, D9, D10, D11, D13).
- ATmega32U4: один чип — и микроконтроллер, и USB-стек, без отдельного конвертера.
- HID-клавиатура: Keyboard.print("hello") печатает в активное окно — плата притворяется клавиатурой.
- HID-мышь: Mouse.move(x, y) двигает курсор, Mouse.click() — клик. Удобно для макросов.
- CDC-Serial: Serial.begin(9600) идёт через USB, без UART-чипа — на плате один USB-порт для всего.
- Тонкости: при загрузке скетча плата на 8 секунд перезапускает USB-стек — порт пропадает из списка.
Скетч-проба: HID-клавиатура
void setup() { pinMode(2, INPUT_PULLUP); Keyboard.begin(); Serial.begin(9600); Serial.println("Gotov");} void loop() { if (digitalRead(2) == LOW) { Keyboard.print("hi from leonardo"); Keyboard.write(10); // Enter Serial.println("otpravleno"); delay(500); // антидребезг }}Скетч вставьте в основной симулятор: компилятор поймёт Keyboard.begin/print/write, а сам HID-вывод в браузере не пойдёт — платформа другая. Логику «нажал кнопку — отправил строку» вы проверяете через Serial, а вживую курсор в любом окне получает текст. Полный разбор Keyboard.h и оговорки по безопасности — в уроке про матричную клавиатуру, где HID — соседняя тема.
Leonardo против Uno: таблица различий
| Параметр | Leonardo | Uno R3 |
|---|---|---|
| Чип | ATmega32U4, 16 МГц | ATmega328P, 16 МГц |
| USB-стек | на самом чипе (CDC + HID) | ATmega16U2 — отдельный конвертер |
| Serial в скетче | CDC-USB, виртуальный COM | UART через ATmega16U2 → USB |
| HID-клавиатура/мышь | да: Keyboard.h, Mouse.h | нет: нужен HID-прошивальщик |
| Перезапуск USB при загрузке | да — порт пропадает 8 с | нет — всегда виден |
| Цена клона | 700-900 руб. | 700-1200 руб. |
Леонардо выигрывает там, где нужен HID: макросы, кнопочные пульты для ПК, контроллеры игр. Uno — для учебной классики: мигалки, датчики, серво, без неожиданностей с USB. Логика скетчей у плат совпадает на 95% — пины, Serial, analogRead, Wire, SPI работают одинаково. Различия начинаются на уровне USB: CDC-Serial и HID — территория Leonardo. Сравнение соседних плат — в шпаргалке по Nano и по Uno.
Честная граница: что в браузере, что только на плате
| Проверка | Симулятор | Только железо |
|---|---|---|
| Логика скетча: digitalRead, analogRead | да: на Uno-стенде | то же, пины те же |
| Keyboard.print, Mouse.move: HID | исполняется: строки «HID:» в Serial | да — плата притворяется HID |
| CDC-Serial через USB | Serial как на Uno | то же, но через CDC, без ATmega16U2 |
| Перезапуск USB при загрузке | не моделируется | да — порт пропадает на 8 секунд |
| Загрузка скетча по USB | не моделируется | да — у Leonardo один порт |
| Ток по USB и просадки | нет: модель без физики | да — HID-мышь под нагрузкой роняет 5V |
Браузер исполняет логику скетча: digitalRead, analogRead, Serial работают одинаково, а вызовы Keyboard/Mouse печатаются в Serial-консоль с пометкой «HID:» — последовательность и тайминги видны. Реальные нажатия и движения курсора делает только живая Leonardo: вставьте скетч, откройте блокнот, нажмите кнопку — текст печатается в окне.
Грабли Leonardo
- Serial1 против Serial: у Leonardo есть оба — Serial это CDC-USB, Serial1 это аппаратный UART на D0/D1. Перепутали — обмен с модулем идёт в никуда.
- Загрузка падает с таймаутом: при прошивке Leonardo перезапускает USB, и IDE не успевает поймать порт. Лечение — кнопка Reset перед заливкой, или использовать плату «Arduino Micro» в меню IDE.
- Keyboard.print в цикле без задержки: плата заваливает USB-буфер, и скетч «зависает» на полсекунды. Ставьте delay(50-100) после каждого print.
- HID-мышь двигает курсор сама: Mouse.move(x, y) с большими значениями уводит курсор в угол экрана. Сначала проверяйте с Mouse.move(1, 0) и пишите в Serial — потом увеличивайте.
- Пины D2-D3 на Leonardo не внешние прерывания в IDE по умолчанию: attachInterrupt(0, ...) — это D0, а не D2. Уточняйте по таблице прерываний Leonardo.