Главная chevron_right Уроки chevron_right Встроенные примеры chevron_right USB chevron_right Keyboard Reprogram: автоматическая перепрошивка через эмуляцию клавиатуры

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 использует эту возможность, чтобы посылать нажатия клавиш в активное окно операционной системы.

Алгоритм скетча:

  1. При старте плата ждёт нажатия кнопки (пин 2 → GND).
  2. После нажатия отправляются горячие клавиши для открытия нового окна в IDE.
  3. Затем посимвольно вводится код примера Blink.
  4. В конце отправляется команда компиляции и загрузки.

Важно, чтобы перед нажатием кнопки окно 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