Не удается заставить клавиатуру использовать Keyboard.write на Arduino Uno

Я пытался использовать библиотеки Keypad.h и Keyboard.h, чтобы заставить Arduino использовать клавиатуру для ввода с клавиатуры.

Я начну с рабочего кода клавиатуры (это довольно просто, но это мой первый пост, поэтому я хочу сделать его максимально аккуратным).

Рабочая клавиатура

#include <Keypad.h>

const byte Rows = 4;
const byte Cols = 4;

char hexaKeys[Rows][Cols] = {
  {'1', '2', '3', 'A' },
  {'4', '5', '6', 'B' },
  {'7', '8', '9', 'C' },
  {'*', '0', '#', 'D' },
};

byte rowPins[Rows] = {9,8,7,6};
byte colPins[Cols] = {5,4,3,2};

Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins
, Rows, Cols);


void setup() {
  Serial.begin(9600);
}

void loop() {
char customKey = customKeypad.getKey();
  if (customKey){
    Serial.println(customKey);
  }
}

На данный момент, используя Serial Monitor, я вижу, что все ключи считываются и распечатываются без проблем. Затем я попытался добавить библиотеку Keyboard.h, чтобы заставить ее действовать как ввод с клавиатуры. Не работает ввод с клавиатуры

#include <Keypad.h>
//#include <Keyboard.h>
const byte Rows = 4;
const byte Cols = 4;

char hexaKeys[Rows][Cols] = {
  {'1', '2', '3', 'A' },
  {'4', '5', '6', 'B' },
  {'7', '8', '9', 'C' },
  {'*', '0', '#', 'D' },
};

byte rowPins[Rows] = {9,8,7,6};
byte colPins[Cols] = {5,4,3,2};

Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins
, Rows, Cols);


void setup() {
  Serial.begin(9600);
 // Keyboard.begin();
}

void loop() {
char customKey = customKeypad.getKey();
  if (customKey){
    Serial.write(customKey);
    //Keyboard.write(customKey);
  }
}

В закомментированные разделы добавлены изменения. Проблемы, с которыми я столкнулся: - Невозможно включить Keyboard.h на обычном Arduino Uno. Я читал, что смена типа платы на Arduino Leonardo помогает, и это так, но тогда последовательный монитор становится серым и не читает ввод с клавиатуры. Используя следующий код, я получаю следующее сообщение об ошибке (я все еще «использую» плату Leonardo, поскольку Keyboard.h не хочет работать с Uno)

#include <Keypad.h>
#include <Keyboard.h>
const byte Rows = 4;
const byte Cols = 4;

char hexaKeys[Rows][Cols] = {
  {'1', '2', '3', 'A' },
  {'4', '5', '6', 'B' },
  {'7', '8', '9', 'C' },
  {'*', '0', '#', 'D' },
};

byte rowPins[Rows] = {9,8,7,6};
byte colPins[Cols] = {5,4,3,2};

Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins
, Rows, Cols);


void setup() {
  Serial.begin(9600);
 Keyboard.begin();
}

void loop() {
char customKey = customKeypad.getKey();
  if (customKey){
    Keyboard.write(customKey);
  }
}

processing.app.debug.RunnerException на cc.arduino.packages.uploaders.SerialUploader.uploadUsingPreferences(SerialUploader.java:152) на cc.arduino.UploaderUtils.upload(UploaderUtils.java:77) при обработке.app.SketchController.upload(SketchController.java:732) при обработке.app.SketchController.exportApplet(SketchController.java:703) при обработке.app.Editor$UploadHandler.run(Editor.java:2047) на java.lang.Thread.run(Thread.java:748) Вызвано: processing.app.SerialException: ошибка касания последовательного порта «COM7». при обработке.app.Serial.touchForCDCReset(Serial.java:107) на cc.arduino.packages.uploaders.SerialUploader.uploadUsingPreferences(SerialUploader.java:136) ... еще 5 Причина: jssc.SerialPortException: имя порта — COM7; Имя метода - openPort(); Тип исключения - Порт занят. в jssc.SerialPort.openPort(SerialPort.java:164) при обработке.app.Serial.touchForCDCReset(Serial.java:101) ... еще 6 Произошла ошибка при загрузке скетча Исключение в потоке "Thread-28" java.util.ConcurrentModificationException в java.util.LinkedList$ListItr.checkForComodification(LinkedList.java:966) в java.util.LinkedList$ListItr.next(LinkedList.java:888) при обработке.app.packages.LibraryList.getByName(LibraryList.java:61) на cc.arduino.contributions.libraries.LibrariesIndexer.addToInstalledLibraries(LibrariesIndexer.java:130) на cc.arduino.contributions.libraries.LibrariesIndexer.scanLibrary(LibrariesIndexer.java:229) на cc.arduino.contributions.libraries.LibrariesIndexer.scanInstalledLibraries(LibrariesIndexer.java:201) на cc.arduino.contributions.libraries.LibrariesIndexer.rescanLibraries(LibrariesIndexer.java:161) на cc.arduino.contributions.libraries.LibrariesIndexer.setLibrariesFolders(LibrariesIndexer.java:120) при обработке.app.BaseNoGui.onBoardOrPortChange(BaseNoGui.java:677) при обработке.app.Base.onBoardOrPortChange(Base.java:1336) при обработке.app.Editor$UploadHandler.run(Editor.java:2083) на java.lang.Thread.run(Thread.java:748)

, 👍0

Обсуждение

если у вас есть «настоящий» UNO, проверьте это https://github.com/NicoHood/HoodLoader2, @jsotola


1 ответ


Лучший ответ:

0

UNO не может быть клавиатурой. У него нет реального USB-подключения. Он имеет последовательное соединение, которое проходит через преобразователь UART в USB.

Вы не можете использовать UNO в качестве клавиатуры.

Вместо этого вам понадобится одна из плат с настоящим USB-подключением, например Arduino Leonardo или любая другая плата на базе ATMega32U4.

,

Спасибо за это разъяснение! Будет ли работать Arduino Mega 2560?, @Atlantic

Нет. Он также не использует ATMega32U4. Ардуино Микро или Леонардо, @Majenko

если UNO использует ATMega16U4 в качестве преобразователя USB в последовательный порт, то это выполнимо .... вам придется перепрограммировать ATMega16U4, @jsotola