Arduino как скрытая клавиатура: программа работает по-разному в режиме клавиатуры / программирования

#c #arduino #hid

#c #arduino #hid

Вопрос:

Я пытаюсь сделать скрытую клавиатуру с помощью моего Arduino Uno. Мой Arduino 1) загорается красным светодиодом при настройке подключения к входу (что-то имитирующее нажатие клавиши и выключает его при установлении соединения; 2) загорается синий светодиод при запуске ввода, один раз отправляет эмулируемый сигнал клавиатуры через последовательный канал и выключает светодиод при вводе.не запущено. Моя программа, похоже, работает, включает красный светодиод примерно на 0,5 с при запуске, загорается синий светодиод и отправляет сигнал, как и предполагалось, при срабатывании внешнего ввода.

Однако после того, как я закоротил Arduino, чтобы очистить исходный шестнадцатеричный и прошить шестнадцатеричный файл, необходимый для того, чтобы помочь моему компьютеру идентифицировать Arduino как клавиатуру HID с помощью Freematics Builder, программа больше не работает по назначению. Красный светодиод больше не включается при запуске; синий светодиод всегда тускло горит и не реагирует на внешние входные триггеры. Я пробовал несколько версий шестнадцатеричных файлов (одна версия, другая версия), но все они ведут себя одинаково.

Я использую плохую версию шестнадцатеричного файла? Я делаю что-то не так?

PS Упрощенный код:

 // #includes

Adafruit_MPR121 cap = Adafruit_MPR121(); // input

/////////////////////////////////////////////////

#define KEY_1 0x59
#define KEY_2 0x5a
#define KEY_3 0x5b
#define KEY_4 0x5c
#define KEY_5 0x5d
// ... Keycodes

void press_key(int key) {
  uint8_t buf[8] = {0};
  buf[2] = key;
  Serial.write(buf, 8);
  buf[2] = 0;
  Serial.write(buf, 8);
}

void setup() {
  pinMode(2, OUTPUT); // blue LED
  pinMode(3, OUTPUT); // red LED
  
  Serial.begin(9600);
  while (!Serial) delay(10); 

  digitalWrite(3, HIGH);
  if (!cap.begin(0x5A)) { // Wait until established connection
    while (1);
  }
  digitalWrite(3, LOW); // turn off red LED

  delay(1000);
}

void loop() {
  if (input_is_valid()) {
    if (input_triggered()) {
      press_key(corresponding_key);
      digitalWrite(2, HIGH); // light blue LED
    } else { // input_untriggered
      digitalWrite(2, LOW); // turn off blue LED
    }
  }
  
  delay(100);
}
 

Комментарии:

1. Я не уверен, какое отношение freematics имеет к созданию клавиатуры ahid?

2. @AlanBirtles Freematics — это программное обеспечение, используемое для прошивки шестнадцатеричного файла в Arduino.

3. Почему UNO? Существуют варианты с atmega32u4 (leonardo, micro, pro micro, ..) с встроенным USB, и он работает…

4. @KIIV В лаборатории моей школы есть только uno… Я хотел сделать leonardo, который хорошо эмулирует встроенную клавиатуру…

Ответ №1:

Я использовал Atmel Flip для перепрошивки, и это сработало. Версии шестнадцатеричных файлов, которые я использовал, приведены в этом руководстве. После замыкания Arduino и перед перепрошивкой проверьте Arduino в диспетчере устройств. Если он показывает что-то вроде atmega16u2 на других устройствах, выполните дополнительный шаг в приведенном выше блоге, чтобы установить драйвер от Atmel. После этих шагов вам может потребоваться несколько попыток, прежде чем успешно загрузить hex.