Проблемы с реакцией на нажатие кнопок джойстика
Я пытаюсь использовать джойстик в проекте для управления устройством. Нажатие кнопки джойстика должно приводить к увеличению переменной. Режим INPUT_PULLUP используется для внутренней кнопки.
Насколько я понимаю, когда кнопка не нажата, на выводе GPIO присутствует ВЫСОКИЙ уровень, а когда кнопка нажата, присутствует НИЗКИЙ уровень. Сигнал, считываемый с кнопки в этом скетче, инвертируется в ВЫСОКИЙ, когда цепь замкнута.
Я использовал некоторые наброски для устранения дребезга, но во всех случаях при нажатии кнопки на последовательном порту возникает поток бессвязных символов. Это происходит как в симуляторе, так и в IDE.
Что может вызывать этот поток на выходе при ожидании сообщения о нажатии кнопки? Символы также возникали, когда я помещал переменную-счетчик на последовательный порт. Кнопка debounce выглядит правильно?
int Joystick_Y = A0;
int Joystick_X = A1;
int Joystick_but = 1;
int X;
int Y;
int X_prev = 0;
int Y_prev = 0;
int butt_flag = 0;
int butt;
const unsigned long debounceDelay = 50;
unsigned long last_press;
void setup() {
Serial.begin(9600);
pinMode(Joystick_but, INPUT_PULLUP);
}
void loop() {
butt = !digitalRead(Joystick_but);
if (butt == 1 && butt_flag == 0 && millis() - last_press > debounceDelay) {
butt_flag = 1;
last_press = millis();
Serial.println("Button was pressed!");
}
if (butt == 0 && butt_flag == 1) {
butt_flag = 0;
}
Y = analogRead(Joystick_Y);
X = analogRead(Joystick_X);
if (X < 512 && X > 485) {
X = 512;
}
if (Y < 512 && Y > 485) {
Y = 512;
}
if ((Y != Y_prev || X != X_prev) && (X != Y)) {
Serial.print("X: ");
Serial.print(X);
Serial.print(" Y: ");
Serial.println(Y);
}
Y_prev = Y;
X_prev = X;
delay(500);
}
@Artur Krush, 👍-1
Обсуждение1 ответ
Лучший ответ:
Как было упомянуто в комментарии @chrisl: контакт 1 на Arduino Uno/Nano — это контакт TX (передачи) для последовательного порта. Смотрите здесь. Это контакт, который используется для передачи последовательных данных на хост.
Если этот же контакт используется как кнопка джойстика, нажатие на него будет мешать последовательному выводу, что приведет к передаче бессвязных символов, которые вы видите.
Решение: используйте другой (неиспользуемый) PIN-код.
Еще одна потенциальная проблема — это задержка (500)
в конце вашего loop()
, которая, как также отметил @chrisl, мешает устранению дребезга и приводит к тому, что ваш код будет очень медленно реагировать на нажатия кнопок и движения джойстика.
- Устранение дребезга кнопки с помощью прерывания
- Хорошая кнопка debouncing/Библиотека StateChange
- Управление несколькими светодиодами с помощью нескольких кнопок
- Чтение нескольких аналоговых входных контактов
- Будет ли простой RC-фильтр работать с механическим поворотным энкодером или понадобится триггер Шмитта?
- Вибрационный геймпад Arduino с силовой обратной связью
- Кодировщик + Библиотека Bounce2
- Прерывание при нажатии кнопки + устранение дребезга
Какую именно Arduino вы используете? На Uno/Nano контакты 0 и 1 используются для последовательного интерфейса. И debouncedelay в 50 мс не будет работать, если вы задержите на 500 мс в конце
loop()
., @chrisl