Главная chevron_right Уроки chevron_right Встроенные примеры chevron_right USB chevron_right Keyboard Logout: выход из системы нажатием кнопки

Keyboard Logout: выход из системы нажатием кнопки

Используем библиотеку Keyboard на Arduino Leonardo, чтобы автоматически завершать сеанс пользователя нажатием одной физической кнопки.

Этот урок показывает, как превратить Arduino Leonardo, Micro или Due в USB-клавиатуру, которая по нажатию кнопки отправляет компьютеру команду выхода из учётной записи. Когда пин 2 замыкается на GND, плата имитирует одновременное нажатие двух или трёх клавиш, выдерживает короткую паузу и затем «отпускает» их.

Важно: команда Keyboard.print() перехватывает управление клавиатурой вашего компьютера. Чтобы не потерять контроль над системой, всегда предусматривайте надёжный способ остановить скетч — например, триггер по состоянию пина, как сделано здесь. Никогда не вызывайте функции библиотеки Keyboard без условия.

Необходимое оборудование

Схема подключения

Кнопка подключена между пином 2 и GND платы Arduino Leonardo на макетной плате. Внутренний подтягивающий резистор (INPUT_PULLUP) держит пин в состоянии HIGH, пока кнопка не нажата.

Принципиальная схема

На схеме: КНОПКА (PUSH BUTTON) соединяет пин 2 с GND платы Arduino Leonardo. Дополнительный резистор не нужен — используется встроенный pull-up.

Код

Перед загрузкой скетча обязательно укажите вашу операционную систему в переменной platform. Доступные значения обычно соответствуют Windows, macOS и Linux — у каждой системы своя комбинация клавиш для выхода.

Пока скетч работает, нажатие кнопки замыкает пин 2 на GND, и плата отправляет последовательность клавиш для завершения сеанса на подключённый по USB компьютер.

/*

  Keyboard logout

  Этот скетч демонстрирует работу библиотеки Keyboard.

  При подключении пина 2 к земле выполняется выход из системы.

  Используются следующие комбинации клавиш:

  Windows: CTRL-ALT-DEL, затем ALT-l

  Ubuntu: CTRL-ALT-DEL, затем ENTER

  OSX: CMD-SHIFT-q

  Для пробуждения: Spacebar.

  Схема:

  - Arduino Leonardo или Micro

  - провод для соединения D2 с землёй

  создан 6 Mar 2012

  изменён 27 Mar 2012

  автор Tom Igoe

  Этот пример находится в открытом доступе.

  https://www.arduino.cc/en/Tutorial/KeyboardLogout

*/

#define OSX 0
#define WINDOWS 1
#define UBUNTU 2

#include "Keyboard.h"

// измените значение в соответствии с вашей платформой:
int platform = OSX;

void setup() {

  // настроить пин 2 как вход и включить подтягивающий резистор, чтобы на нём был HIGH, если

  // он не подключён к земле:

  pinMode(2, INPUT_PULLUP);

  Keyboard.begin();
}

void loop() {

  while (digitalRead(2) == HIGH) {

    // ничего не делать, пока пин 2 не перейдёт в LOW

    delay(500);

  }

  delay(1000);

  switch (platform) {

    case OSX:

      Keyboard.press(KEY_LEFT_GUI);

      // Shift-Q выполняет выход:

      Keyboard.press(KEY_LEFT_SHIFT);

      Keyboard.press('Q');

      delay(100);

      Keyboard.releaseAll();

      // клавиша Enter:

      Keyboard.write(KEY_RETURN);

      break;

    case WINDOWS:

      // сочетание CTRL-ALT-DEL:

      Keyboard.press(KEY_LEFT_CTRL);

      Keyboard.press(KEY_LEFT_ALT);

      Keyboard.press(KEY_DELETE);

      delay(100);

      Keyboard.releaseAll();

      // сочетание ALT-L:

      delay(2000);

      Keyboard.press(KEY_LEFT_ALT);

      Keyboard.press('l');

      Keyboard.releaseAll();

      break;

    case UBUNTU:

      // сочетание CTRL-ALT-DEL:

      Keyboard.press(KEY_LEFT_CTRL);

      Keyboard.press(KEY_LEFT_ALT);

      Keyboard.press(KEY_DELETE);

      delay(1000);

      Keyboard.releaseAll();

      // Enter для подтверждения выхода:

      Keyboard.write(KEY_RETURN);

      break;

  }

  // ничего не делать:

  while (true);
}

Как это работает

  1. В setup() пин 2 настраивается как INPUT_PULLUP — в нормальном состоянии на нём HIGH.
  2. В loop() постоянно проверяется состояние пина.
  3. Когда кнопка нажата, пин переходит в LOW. Скетч определяет ОС и формирует нужную комбинацию клавиш:
  • Windows: GUI + L
  • macOS: CTRL + SHIFT + Power (или аналог)
  • Ubuntu/Linux: CTRL + ALT + L
  1. Клавиши «нажимаются» через Keyboard.press(), выдерживается пауза delay(), затем вызывается Keyboard.releaseAll().

Типичные ошибки

  • Неверная платформа в переменной platform — скетч отправит не ту комбинацию клавиш. Проверьте значение перед загрузкой.
  • Плата не определяется как HID — убедитесь, что используете Leonardo, Micro или Due. Обычные платы на ATmega328 (Uno, Nano) не поддерживают эмуляцию USB-клавиатуры.
  • Случайные срабатывания — дребезг кнопки может вызвать повторную отправку команды. Добавьте небольшую задержку или программный антидребезг после первого срабатывания.
  • Потеря управления компьютером — если убрать условие по пину и вызвать Keyboard в loop() без ограничений, плата будет непрерывно слать команды. Всегда держите под рукой способ отключить плату или перепрошить её через IDE (удерживайте кнопку Reset во время загрузки).

Как проверить результат

  1. Загрузите скетч, убедитесь, что в Serial Monitor нет сообщений об ошибках.
  2. Сохраните все открытые документы — после нажатия кнопки сеанс завершится.
  3. Нажмите кнопку на макетной плате.
  4. Компьютер должен выйти из учётной записи или показать экран блокировки — в зависимости от ОС.

Где пригодится

  • Физическая кнопка быстрой блокировки рабочего места.
  • Автоматизация тестирования экрана входа в систему.
  • Обучающий пример работы с USB HID и библиотекой Keyboard.

Дополнительные материалы

Больше базовых примеров вы найдёте в разделе built-in examples.

Подробное описание всех функций языка Arduino собрано в language reference.

Последнее обновление: 29.07.2015, SM