Как реализовать ввод клавиш с помощью rp2040, используя библиотеку USBHID?

Какой процесс я должен пройти для выполнения автоматического ввода нескольких горячих клавиш на плате Raspberry Pi Pico 2040, модели YD-RP2040? Я обнаружил, что стандартная библиотека Keyboard не работает на этой плате. Позже я нашёл альтернативное решение по следующей ссылке: <a href="https://github.com/arduino/ArduinoCore-mbed/issues/252" rel="nofollow">https://github.com/arduino/ArduinoCore-mbed/issues/252</a>. Я достиг определённых успехов и заработал код для отправки простого сообщения, однако затем столкнулся с проблемами при попытке реализации функциональности для создания нового документа с помощью комбинации клавиш. Я привожу свои попытки кода ниже:

<pre><code>#include "PluggableUSBHID.h"
#include "USBKeyboard.h"

USBKeyboard Keyboard;

void setup() {
  pinMode(24, INPUT_PULLUP);
  Keyboard.rewind();
}

void loop() {
  if (digitalRead(24) == LOW) {
    //Send the message
    Keyboard.printf("Hello!");
    delay(1000);
  }
}</code></pre> 

К сожалению, мой следующий код, который должен был создать новый документ с помощью нажатия сочетания клавиш, не сработал так, как я ожидал:

<pre><code>#include "PluggableUSBHID.h"
#include "USBKeyboard.h"

USBKeyboard Keyboard;

void setup() {
  pinMode(24, INPUT_PULLUP);
  Keyboard.rewind();
}

void loop() {
  while (digitalRead(24) == HIGH) {
    delay(500);
  }
  delay(1000);
  Keyboard.press(KEY_LEFT_CTRL);
  Keyboard.press('n');
  delay(100);
  Keyboard.releaseAll();
  delay(1000);
}</code></pre> 

В результате, мне не удаётся получить желаемый результат. Каковы следующие шаги, которые я могу предпринять для успешного выполнения автоматического ввода горячих клавиш?
  • 15 сентября 2024 г. 21:33
Ответы на вопрос 1
Для реализации автоматического ввода горячих клавиш с использованием библиотеки USBHID на плате Raspberry Pi Pico 2040, вам нужно учесть несколько ключевых моментов и скорректировать ваш код. Давайте пройдемся по шагам и внесем необходимые исправления.

### Шаги для успешного выполнения автоматического ввода горячих клавиш:

1. **Правильное использование библиотеки `USBKeyboard`:** Убедитесь, что вы используете правильные экземпляры методов при отправке нажатий клавиш.

2. **Дебаунс кнопки:** При использовании кнопки, важно добавить защиту от дребезга контактов, чтобы избежать множественных запусков.

3. **Корректная логика работы с клавишами:** При отправке сочетаний клавиш убедитесь, что между их нажатиями есть достаточная задержка.

### Исправленный код

Вот исправленный пример, который включает в себя все вышеперечисленные моменты:

```cpp
#include "PluggableUSBHID.h"
#include "USBKeyboard.h"

USBKeyboard Keyboard;

const int buttonPin = 24; // Номер пина кнопки
bool lastButtonState = HIGH; // Предыдущее состояние кнопки
unsigned long lastDebounceTime = 0; // Время последнего изменения состояния
unsigned long debounceDelay = 50; // Время задержки дебаунса

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  Keyboard.rewind();
}

void loop() {
  // Считываем текущее состояние кнопки
  int buttonState = digitalRead(buttonPin);

  // Проверяем, изменилось ли состояние кнопки
  if (buttonState != lastButtonState) {
    lastDebounceTime = millis(); // Сохраняем текущее время
  }

  // Если состояние кнопки изменилось после задержки дебаунса
  if ((millis() - lastDebounceTime) > debounceDelay) {
    // Если кнопка нажата (LOW)
    if (buttonState == LOW) {
      // Делаем паузу перед нажатием клавиш
      delay(1000);

      // Нажимаем комбинацию клавиш Ctrl + N
      Keyboard.press(KEY_LEFT_CTRL);
      Keyboard.press('n');
      delay(100); // Убедимся, что это заметно для системы
      Keyboard.releaseAll(); // Отпускаем все клавиши

      // Делаем паузу перед ожиданием следующего нажатия
      delay(2000);
    }
  }

  lastButtonState = buttonState; // Обновляем предыдущее состояние кнопки
}
```

### Объяснения:

- **Дебаунс кнопки:** Мы добавили логику для обработки дребезга контактов на кнопке, чтобы предотвратить случайные множественные срабатывания.

- **Задержки:** Убедитесь, что добавлены достаточные задержки между нажатиями клавиш, чтобы система смогла их распознать.

- **Проверка состояния:** Мы следим за изменением состояния кнопки и запускаем логику только при активном нажатии.

Этот код должен корректно работать для отправки комбинации клавиш `Ctrl + N`, создавая новый документ. Убедитесь, что ваше устройство правильно распознается как HID, и что у вас есть все необходимые библиотеки. 

### Пожелание:

Также важно протестировать ваш код, чтобы удостовериться в его работоспособности на таргетированном устройстве, так как производительность может варьироваться в зависимости от ваших конкретных настроек и среды.
Похожие вопросы