Keyboard Reprogram: автоматическая перепрошивка через эмуляцию клавиатуры
Скетч использует библиотеку Keyboard, чтобы открыть окно Arduino IDE, набрать пример Blink и автоматически перепрошить плату нажатием кнопки.
Этот пример демонстрирует возможности библиотеки Keyboard: скетч открывает новое окно Arduino IDE, вводит код примера Blink с помощью эмуляции клавиатуры и перепрошивает плату. Достаточно подключить пин 2 к GND через кнопку — и через несколько секунд на плате будет работать новая программа.
Важно: когда вызывается Keyboard.print(), Arduino перехватывает управление клавиатурой компьютера. Чтобы не потерять контроль над системой, убедитесь, что эмуляция клавиш запускается только при выполнении чёткого условия. В данном скетче ввод с клавиатуры происходит только после того, как пин 2 подтянут к GND.
Необходимое железо
- тактовая кнопка
- соединительные провода
- макетная плата
Необходимое программное обеспечение
- Запущенная Arduino IDE
Схема подключения

Схема подключения: кнопка соединена с пином 2 и GND платы Arduino Leonardo на макетной плате.
Принципиальная схема

Принципиальная схема: кнопка (КНОПКА) подключена между пином 2 и GND платы Arduino Leonardo.
Как это работает
Arduino Leonardo и аналогичные платы на базе ATmega32u4 умеют представляться компьютеру как HID-устройства — в том числе как USB-клавиатура. Библиотека Keyboard использует эту возможность, чтобы посылать нажатия клавиш в активное окно операционной системы.
Алгоритм скетча:
- При старте плата ждёт нажатия кнопки (пин 2 → GND).
- После нажатия отправляются горячие клавиши для открытия нового окна в IDE.
- Затем посимвольно вводится код примера Blink.
- В конце отправляется команда компиляции и загрузки.
Важно, чтобы перед нажатием кнопки окно Arduino IDE было активным — иначе все нажатия уйдут в другую программу.
Код
Подключите плату к USB порту, убедитесь, что окно Arduino IDE открыто и находится на переднем плане. Затем нажмите кнопку, чтобы соединить D2 с GND и запустить эмуляцию ввода.
/*
Arduino Programs Blink
Этот скетч демонстрирует библиотеку Keyboard.
Только для плат Leonardo и Due.
При подключении пина 2 к земле создаётся новое окно комбинацией клавиш
(CTRL-N), затем вводится скетч Blink, выполняется автоформатирование
текста другой комбинацией клавиш (CTRL-T), после чего скетч загружается
на текущую выбранную плату Arduino комбинацией (CTRL-U).
Схема:
- Arduino Leonardo, Micro, Due, LilyPad USB или Yún
- провод для соединения D2 с землёй
создан 5 Mar 2012
изменён 29 Mar 2012
автор Tom Igoe
изменён 3 May 2014
автор Scott Fitzgerald
Этот пример находится в общественном достоянии.
https://www.arduino.cc/en/Tutorial/KeyboardReprogram
*/
#include "Keyboard.h"
// используйте этот вариант для OSX.
// Закомментируйте, если используете Windows или Linux:
char ctrlKey = KEY_LEFT_GUI;
// используйте этот вариант для Windows и Linux.
// оставьте закомментированным при использовании OSX:
// char ctrlKey = KEY_LEFT_CTRL;
void setup() {
// настроить пин 2 как вход и включить подтягивающий резистор, чтобы он был HIGH,
// если не подключён к земле:
pinMode(2, INPUT_PULLUP);
// инициализировать управление клавиатурой:
Keyboard.begin();
}
void loop() {
while (digitalRead(2) == HIGH) {
// ничего не делать, пока пин 2 не перейдёт в LOW
delay(500);
}
delay(1000);
// новый документ:
Keyboard.press(ctrlKey);
Keyboard.press('n');
delay(100);
Keyboard.releaseAll();
// ждать открытия нового окна:
delay(1000);
// версии Arduino IDE после 1.5 заполняют новые скетчи функциями
// setup() и loop() — очистим окно перед вводом нового текста
// выделить всё
Keyboard.press(ctrlKey);
Keyboard.press('a');
delay(500);
Keyboard.releaseAll();
// удалить выделенный текст
Keyboard.write(KEY_BACKSPACE);
delay(500);
// напечатать скетч "blink":
Keyboard.println("void setup() {");
Keyboard.println("pinMode(13, OUTPUT);");
Keyboard.println("}");
Keyboard.println();
Keyboard.println("void loop() {");
Keyboard.println("digitalWrite(13, HIGH);");
Keyboard.print("delay(3000);");
// 3000 мс — слишком долго. Удалить:
for (int keystrokes = 0; keystrokes < 6; keystrokes++) {
delay(500);
Keyboard.write(KEY_BACKSPACE);
}
// заменить на 1000:
Keyboard.println("1000);");
Keyboard.println("digitalWrite(13, LOW);");
Keyboard.println("delay(1000);");
Keyboard.println("}");
// привести в порядок:
Keyboard.press(ctrlKey);
Keyboard.press('t');
delay(100);
Keyboard.releaseAll();
delay(3000);
// загрузить код:
Keyboard.press(ctrlKey);
Keyboard.press('u');
delay(100);
Keyboard.releaseAll();
// ждать завершения перепрошивки:
while (true);
}
Типичные ошибки
- Окно IDE не активно. Если в момент нажатия кнопки на переднем плане было другое приложение, символы будут введены туда. Всегда кликайте по окну IDE перед нажатием.
- Слишком быстрый ввод. На медленных компьютерах IDE может не успевать обрабатывать символы. Если скетч не срабатывает корректно, добавьте небольшие задержки
delay()между блоками ввода. - Плата не поддерживает USB HID. Библиотека
Keyboardработает только на платах с нативной USB-поддержкой: Leonardo, Micro, Due и аналогичных. На Uno или Nano этот скетч не запустится. - Потеря управления клавиатурой. Если скетч начал отправлять символы и не останавливается, отключите плату от USB. Затем зажмите кнопку Reset перед подключением, чтобы успеть загрузить исправленный скетч.
Как проверить результат
После нажатия кнопки вы увидите, как в IDE открывается новое окно и в него автоматически вводится код. Через несколько секунд начнётся компиляция и загрузка. Когда процесс завершится, встроенный светодиод на плате начнёт мигать — это и есть Blink в действии.
Дополнительные материалы
Больше базовых примеров можно найти в разделе built-in examples.
Подробное описание всех функций языка доступно в language reference.
Последнее обновление: 2015/07/29, SM