Клавиатура Arduino Nano. Клавиши удерживаются нажатыми.
Я новичок в программировании на Arduino и пытаюсь создать клавиатуру с джойстиком для управления одной рукой в качестве личного проекта. Я пытался заставить её печатать некоторые символы ASCII, но не понимаю, почему кнопка остаётся нажатой и не отображает заданный мной код ASCII.
#include <Keyboard.h>
#include <Mouse.h>
//IndexFinger=IF,MiddleFinger=MF,RingFinger=RF
//LittleFinger=LF
int fingerCodes[3][4]={
{LF_Up, RF_Up, MF_Up, IF_Up},
{LF_Mid, RF_Mid, MF_Mid, IF_Mid},
{LF_Down, RF_Down, MF_Down, IF_Down}
}
int asciiCodes[3][4]={
{33, 34, 35, 36},
{37, 38, 39, 40},
{41, 42, 43, 44}
}
//a
int x=0;
int y=0;
const int joystickVRx1 = A0;
const int joystickVRy1 = A1;
const int joystickButton1 = 14;
// Define the FPS
const int FPS = 120;
// Initialize the last time variable
unsigned long lastTime = 5;
// Define the functions
void finger_ButtonsControl(int x, int y);
void joystickMovementControl(int joystickvrx, int joystickvry, int joystickButton1);
void setup() {
// Initialize the serial port
Serial.begin(115200);
// Set the button pins as input
pinMode(joystickVRx1,INPUT);
pinMode(joystickVRy1,INPUT);
for (int i = 2;i<11;i++){
pinMode(i,OUTPUT);
}
Keyboard.begin();
Mouse.begin();
}
void loop() {
// Check if it's time to update the controls
if ((millis() - lastTime) > 5) {
// Update finger buttons
finger_ButtonsControl(x,y);
// Update the joystick movement
joystickMovementControl(joystickVRx1, joystickVRy1, joystickButton1);
// Reset the last time variable
lastTime = millis();
}
Keyboard.releaseAll();
}
// Function to control finger buttons
void finger_ButtonsControl(int x, int y) {
// Check if a button is pressed
for (int x=2;x<5;x++){
for (int y=5;y<9;y++){
buttonState_x = digitalRead(x);
buttonState_y = digitalRead(y);
if (buttonState_x == HIGH && buttonState_y == HIGH){
x=x-2;
y=y-5;
Keyboard.write(asciiCodes[x][y]);
}
}
// Function to control the joystick movement
void joystickMovementControl(int joystickvrx, int joystickvry, int joystickButton1) {
// Read the joystick values
int x = analogRead(joystickvrx);
int y = analogRead(joystickvry);
if (digitalRead(joystickButton1) == LOW) {
Keyboard.write(245);
}
}
@Burritodeltodo, 👍-1
Обсуждение1 ответ
Лучший ответ:
Не уверен, что это ваша проблема, но здесь определенно есть проблема:
void finger_ButtonsControl(int x, int y) {
// Проверяем, нажата ли кнопка
for (int x = 2; x <5; x++) {
for (int y = 5; y < 9; y++) {
buttonState_x = digitalRead(x);
buttonState_y = digitalRead(y);
if (buttonState_x == HIGH && buttonState_y == HIGH) {
x = x - 2; // <-- здесь проблема...
y = y - 5; // <-- ...и здесь
Keyboard.write(asciiCodes[x][y]);
}
}
}
}
Подумайте, что произойдет, если вы нажмете кнопки 2 и 5. На первом
итерации циклов, у вас будет x = 2 и y = 5, if
условие будет истинным, и проблемные линии превратятся как в x, так и в
y до 0. Затем внутренний цикл увеличит y и на следующем шаге
итерации, вы будете считывать выводы x = 0 и y = 1. Поскольку это
(предположительно, неактивный) последовательный порт, оба контакта будут иметь уровень HIGH. Затем
Проблемные линии изменят значение x на −2, а значение y на −4. В этой точке
чтение asciiCodes[x][y] вызывает неопределенное поведение и может произойти что угодно
произойдет.
Я полагаю, что вы хотели написать следующее:
void finger_ButtonsControl(int x, int y) {
// Проверяем, нажата ли кнопка
for (int x = 2; x <5; x++) {
for (int y = 5; y < 9; y++) {
buttonState_x = digitalRead(x);
buttonState_y = digitalRead(y);
if (buttonState_x == HIGH && buttonState_y == HIGH) {
Keyboard.write(asciiCodes[x-2][y-5]);
}
}
}
}
:0 Ого, я несколько дней ломал голову, что делать, и ваш ответ был просто великолепен. Спасибо за помощь. Я никогда не думал, что код будет использовать результат вычитания как «параметр» в цикле, и передача мне этих отрицательных значений приведёт к неправильным значениям., @Burritodeltodo
- Arduino nano как клавиатура HID
- Нажать клавишу Windows, используя «keyboard.press();»
- OneButton с контактами A6 и A7
- Кнопка с таймером переключения и функцией сброса времени + светодиод обратной связи
- Проблема с сигналом датчика пульса
- Keyboard.h не найдена на Arduino nano
- Контроллер радиоуправляемой машины с использованием библиотеки RC-switch
- Кнопка и поворотная ручка для отправки нажатия клавиши на ПК
попробуйте определить контакты джойстика как INPUT_PULLUP, @jsotola