Плавающий контакт: ложное нажатие кнопки
- Войдите на сайт для отправки комментариев
Сб, 07/03/2020 - 14:13
После подключения геймпада, во время теста были выявлены ложные рандомные нажатия, регистрируемые контроллером даже при выключенном самом геймпаде.
- Значения (analogRead) ложных нажатий и контролируемых мной - одинаковы
- Подтягивающий резистор не решает проблему
- Использование delay неуместно
- Триггера Шмидта в наличии нет
Необходимо либо избавиться от случайных сигналов, либо дать понять микроконтроллеру, где "мои" нажатия, а где - случайные
Задержку использовать очень нежелательно, так как мне необходимо добиться мгновенного реагирования на нажатие кнопки
На PSB_RED ложные нажатия практически отсутствуют
На PSB_PINK нажатий больше
Буду благодарен за помощь в решении проблемы
#include <PS2X_lib.h>
#include <AccelStepper.h>
PS2X ps2x;
byte Type = 0;
byte vibrate = 0;
int RX=0,RY=0,LX=0,LY=0;
AccelStepper Stepper1(1,13,12);
const int fan = 9;
void setup(){
Serial.begin(9600);
pinMode(fan,OUTPUT);
Stepper1.setMaxSpeed(3000);
Stepper1.setAcceleration(13000);
ps2x.config_gamepad(3,6,5,7, true, true);
Type = ps2x.readType();
}
void loop(){
analogWrite(fan,255);
ps2x.read_gamepad(false, vibrate);
if(ps2x.NewButtonState()) {
if (ps2x.Button(PSB_RED)){
Serial.println(PSB_RED);
}
if (ps2x.Button(PSB_PINK)){
Serial.println(PSB_RED);
}
}
}
Задержку использовать очень нежелательно, так как мне необходимо добиться мгновенного реагирования на нажатие кнопки
boolean PS2X::read_gamepad(boolean motor1, byte motor2) { double temp = millis() - last_read; ... if(temp < read_delay) //waited too short delay(read_delay - temp); ...Я не так долго занимаюсь ардуино и не представляю, как это располагается в коде. Могли бы вы написать с объявлением переменных и функций setup() and loop() ?
Это располагается в коде библиотеки, которую Вы используете. О нежелательности каких задержек Вы пишете после этого?
Задержка перед считыванием значения кнопки, когда кнопку необходимо удерживать некоторое время с использованием millis. Дело в том, что у меня при удержании кнопки нет постоянного сигнала - аппаратный вывод TX мигает
Могли бы вы написать с объявлением переменных и функций setup() and loop() ?
«Дяденька, ты, пожалуйста, это разжуй, положи мне в ротик, а когда оно переработается и лишнее выйдет, не забудь мне попку подтереть».
kadnedir, «с объявлением переменных и функций setup() and loop()» пишут за деньги в коммерческом разделе форума. Welcom to the real world, baby!
Кто-нибудь понимает, на каком языке это написано: "когда кнопку необходимо удерживать некоторое время с использованием millis"?
Не нужно компенсировать некомпетентность остротами. Не эквивалентно, знаете ли ;)
Удивлен, мне казалось это очевидным способом. Я точно обращаюсь за советом по адресу?
void loop(){ analogWrite(fan,255); ps2x.read_gamepad(false, vibrate); if(ps2x.NewButtonState()) { if (ps2x.Button(PSB_RED)){ button = 1; Serial.println("button pressed"); } if (button == 1){ inc = 0; } if(millis()-oldTime>1000){ if(button == 0){ inc++; } } if (inc == 2){ Serial.println("2 sec"); } } }В приведённом фрагменте отсутствует задержка и наличествует мгновенная реакция на нажатие кнопки или даны критерии отличия пользовательских нажатий на кнопку от случайных помех?
В приведенном фрагменте присутствует задержка inc и это пример того, что мне не нужно. Конструкция, как я написал выше, основана на millis.
Пробовал использовать другой способ, но по неизвестным мне причинам (возможно, ввиду малых познаний) он не выполняет свою работу, а именно: после установки значения buttonState = 1 цикл не начинает по новой увеличивать значение (RED_buttonState_count++). Так же, RED_buttonState_count-- не сбрасывает счетчик до 0
Я действительно не знаю, что мне использовать для решения. Если есть возможность подсказать так, чтобы я понял, подскажите. Я не прошу писать для меня код. Это касается моей учебы и я отношусь к этому как к навыку, который никто за меня приобрести не способен.
void button_RED(){ if (ps2x.Button(PSB_RED)){ if (RED_but_State == LOW){ if (RED_buttonState_count < 100){ RED_buttonState_count++; } else{ RED_but_State = HIGH; RED_buttonState_count = 1; } } } else{ if (RED_buttonState_count > 0){ RED_buttonState_count--; } else{ RED_buttonState_count = 0; RED_but_State = LOW; } } }Не нужно компенсировать некомпетентность остротами. Не эквивалентно, знаете ли ;)
Ты недооцениваешь мою некомпетентность. Её ничем скомпенсировать невозможно
Я точно обращаюсь за советом по адресу?
Нет!
Если хочешь что-то кроме глума, выкладывай схему подключения, потому что фраза
- Подтягивающий резистор не решает проблему
на 99% означает, что ты что-то неправильно подключил.
Это что? Твоя схема? Или левое картинко, стыренное с какого-то сайта?
Если твоя, то где на ней обещанный
Подтягивающий резистор
который
?
Враги украли?
Самым наглым образом
левое картинко, стыренное с какого-то сайта
К сожалению, не имею возможности качественно нарисовать схему. Но думаю, этого достаточно для понимания. Я пробовал два варианта, более того, менял 3,3 на 5V (2-я пикча), ничего. Ставил конденсатор на питание (GND и 3,3) - тоже.
Я расстраиваюсь

К сожалению, не имею возможности качественно нарисовать схему. Но думаю, этого достаточно для понимания.
А старым, дедовским способом, ручкой, на бумажке, без наскальной живописи? Примерно так: