Симулятор Arduino Leonardo онлайн: USB-HID клавиатура и мышь
Купил Leonardo ради «суперсилы» — плата притворяется клавиатурой и мышью — и упёрся в то, что проверить HID-скетч негде: плата печатает текст в активное окно, и тест без компьютера бессмысленный, а без самой платы непонятно, жив ли код вообще. Leonardo построена на ATmega32U4, где один чип держит и микроконтроллер, и USB-стек, поэтому Keyboard.h и Mouse.h у неё работают без всяких прошивальщиков. Теперь плата Leonardo есть и в симуляторе — выбирается в списке плат, а вызовы Keyboard и Mouse печатаются в Serial-консоль с пометкой «HID:».
Честная граница такая: в браузере вы проверяете логику — когда нажата кнопка, какие строки и в каком порядке уходят в HID, не заваливает ли скетч USB-буфер. Реальные нажатия клавиш и движения курсора делает только живая плата — браузер не имеет права двигать мышью вашего компьютера, и это правильно. Ниже — чем Leonardo отличается от Uno, рабочий скетч с кнопкой-«предохранителем», таблица «что в симуляторе, что на плате» и распиновка.
Чем Leonardo отличается от Uno: один чип на всё
На Uno два чипа: ATmega328P считает скетч, ATmega16U2 — отдельный конвертер USB-UART. На Leonardo чип один: ATmega32U4 сам считает и сам общается по USB. Отсюда всё остальное — HID-клавиатура и мышь без внешних библиотек, Serial через CDC-USB (виртуальный COM-порт без посредника), и цена ниже при том же объёме памяти: 32 КБ флеша, 2,5 КБ SRAM, 1 КБ EEPROM, 16 МГц. Пинов 20 — D0-D13 и A0-A5, ШИМ на семи (D3, D5, D6, D9, D10, D11, D13). Логика скетчей совпадает с Uno на 95%: digitalWrite, analogRead, Wire, SPI работают одинаково. Различия начинаются на USB-уровне, и именно они кусаются при переносе скетчей из интернета: скетч под Uno с Serial.begin(9600) на Leonardo продолжает работать, но канал другой — CDC, а не UART через конвертер.
USB-HID в симуляторе: что видно в браузере
Выберите плату Leonardo в списке плат симулятора — подпись платы на стенде покажет USB-HID. Скетч с #include <Keyboard.h> компилируется и исполняется: Keyboard.begin() и каждый print/write/move уходят в Serial-консоль строками с префиксом «HID:Kbd» или «HID:Mouse». Вы видите точную последовательность и тайминги вызовов — то, на чём чаще всего ломаются HID-проекты. Что не делается никогда: симулятор не двигает курсором вашего ПК и не печатает текст в ваши окна. Это принципиальная граница браузера — и одновременно удобство: тестовый скетч с Keyboard.print("format") в цикле не снесёт вам документ, а просто напишет пару строк в консоль. Финальную проверку HID-поведения делайте на живой плате с открытым блокнотом — но заходить на неё вы будете уже с работающим кодом.
| Проверка | В симуляторе (плата Leonardo) | На живой Leonardo |
|---|---|---|
| Логика: digitalRead, analogRead, delay | исполняется на стенде | то же самое |
| Keyboard.print / write / press | строки «HID:Kbd …» в Serial-консоли | реальные нажатия в активном окне |
| Mouse.move / click / press | строки «HID:Mouse …» в Serial-консоли | движение курсора и клики на ПК |
| Serial через CDC-USB | виртуальный Serial-монитор | тот же COM/dev/ttyACM, без ATmega16U2 |
| Перезапуск USB при прошивке | не моделируется | порт пропадает на ~8 секунд |
| Ток HID-устройства по шине | нет физики питания | до 100 мА на 5 В от USB-порта |
Скетч: blink плюс клавиатура с предохранителем
#include <Keyboard.h> const byte LED = 13;const byte BTN = 2; // кнопка между D2 и GND — «предохранитель» void setup() { pinMode(LED, OUTPUT); pinMode(BTN, INPUT_PULLUP); Keyboard.begin(); Serial.begin(9600);} void loop() { digitalWrite(LED, HIGH); delay(500); digitalWrite(LED, LOW); delay(500); if (digitalRead(BTN) == LOW) { Keyboard.print("hello from leonardo"); Keyboard.write(10); // Enter Serial.println("Stroka otpravlena"); delay(300); // пауза: не заваливаем USB-буфер }}В симуляторе этот скетч сразу собирает стенд: светодиод на D13, кнопка на D2, Serial-консоль. Жмите кнопку на стенде — в консоли появятся строки Keyboard.print и ваша метка. На живой Leonardo тот же скетч печатает «hello from leonardo» в активное окно — держите фокус в блокноте, а не в IDE. Кнопка-«предохранитель» — не украшение. Скетч с Keyboard.print без условия в loop() завалит USB-буфер за секунды: плата «зависает» на полсекунды, перестаёт отвечать на Serial, и новички в этот момент обычно перезаливают загрузчик, хотя достаточно delay() после каждого print.
Распиновка Leonardo коротко
- D0-D13: цифровые, из них 7 с ШИМ — D3, D5, D6, D9, D10, D11, D13 (мигалка на D13, как на Uno).
- A0-A5: аналоговые входы, могут работать цифровыми — итого 20 программируемых пинов.
- I2C на SDA/SCL: у Leonardo шина сидит на позициях D2/D3 и дублируется отдельными выводами SDA/SCL у AREF — в скетчах это обычный Wire без правок.
- Serial — CDC-USB (ваш COM-порт), Serial1 — аппаратный UART на D0/D1 для HC-05, GPS и второй платы.
- Питание: 5 В от micro-USB, VIN 7-12 В, на пинах 5 В — реле и WS2812 подключаются как на Uno.
Проверьте свой HID-скетч без платы: откройте симулятор и выберите плату Leonardo — blink и Keyboard уйдут в консоль с пометкой HID, а дальше останется залить код на живую плату. Для сравнения борта с конвертером USB держите под рукой распиновку Uno R3, а про то, как CDC-Serial соседствует с обычным UART, — в уроке про USB-CDC на ESP32 и Leonardo. Соседняя новая плата симулятора — Raspberry Pi Pico, у неё USB-стек тоже на основном чипе.