Не удается заставить клавиатуру использовать 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)
@Atlantic, 👍0
Обсуждение1 ответ
Лучший ответ:
UNO не может быть клавиатурой. У него нет реального USB-подключения. Он имеет последовательное соединение, которое проходит через преобразователь UART в USB.
Вы не можете использовать UNO в качестве клавиатуры.
Вместо этого вам понадобится одна из плат с настоящим USB-подключением, например Arduino Leonardo или любая другая плата на базе ATMega32U4.
Спасибо за это разъяснение! Будет ли работать Arduino Mega 2560?, @Atlantic
Нет. Он также не использует ATMega32U4. Ардуино Микро или Леонардо, @Majenko
если UNO использует ATMega16U4 в качестве преобразователя USB в последовательный порт, то это выполнимо .... вам придется перепрограммировать ATMega16U4, @jsotola
- Невозможно использовать библиотеку клавиатуры с Arduino UNO даже после смены прошивки.
- Делаем библиотеку для ардуино
- Библиотека клавиатуры не работает или я где-то ошибаюсь
- Как использовать SPI на Arduino?
- Как подключить Wi-Fi Shield ESP-12E-ESP8266-UART-WIFI-Wireless-Shield к Arduino
- Нажать клавишу Windows, используя «keyboard.press();»
- Отправка мультимедийных клавиш клавиатуры с помощью библиотеки клавиатур
- Глобальные переменные занимают много места в динамической памяти.
если у вас есть «настоящий» UNO, проверьте это https://github.com/NicoHood/HoodLoader2, @jsotola