Плавающий контакт: ложное нажатие кнопки

kadnedir
Offline
Зарегистрирован: 07.03.2020

После подключения геймпада, во время теста были выявлены ложные рандомные нажатия, регистрируемые контроллером даже при выключенном самом геймпаде.

- Значения (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);
       }
  } 
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

kadnedir пишет:

Задержку использовать очень нежелательно, так как мне необходимо добиться мгновенного реагирования на нажатие кнопки

boolean PS2X::read_gamepad(boolean motor1, byte motor2) {
   double temp = millis() - last_read;
   ...

   if(temp < read_delay)  //waited too short
      delay(read_delay - temp);
...

 

kadnedir
Offline
Зарегистрирован: 07.03.2020

Я не так долго занимаюсь ардуино и не представляю, как это располагается в коде. Могли бы вы написать с объявлением переменных и функций setup() and loop() ?

sadman41
Offline
Зарегистрирован: 19.10.2016

Это располагается в коде библиотеки, которую Вы используете. О нежелательности каких задержек Вы пишете после этого?

kadnedir
Offline
Зарегистрирован: 07.03.2020

Задержка перед считыванием значения кнопки, когда кнопку необходимо удерживать некоторое время с использованием millis. Дело в том, что у меня при удержании кнопки нет постоянного сигнала - аппаратный вывод TX мигает

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

kadnedir пишет:

Могли бы вы написать с объявлением переменных и функций setup() and loop() ?

«Дяденька, ты, пожалуйста, это разжуй, положи мне в ротик, а когда оно переработается и лишнее выйдет, не забудь мне попку подтереть».

kadnedir, «с объявлением переменных и функций setup() and loop()» пишут за деньги в коммерческом разделе форума. Welcom to the real world, baby!

sadman41
Offline
Зарегистрирован: 19.10.2016

Кто-нибудь понимает, на каком языке это написано: "когда кнопку необходимо удерживать некоторое время с использованием millis"? 

 

kadnedir
Offline
Зарегистрирован: 07.03.2020

Не нужно компенсировать некомпетентность остротами. Не эквивалентно, знаете ли ;)

kadnedir
Offline
Зарегистрирован: 07.03.2020

Удивлен, мне казалось это очевидным способом. Я точно обращаюсь за советом по адресу?

 

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");
        }
  } 
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

В приведённом фрагменте отсутствует задержка и наличествует мгновенная реакция на нажатие кнопки или даны критерии отличия пользовательских нажатий на кнопку от случайных помех?

kadnedir
Offline
Зарегистрирован: 07.03.2020

В приведенном фрагменте присутствует задержка 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;
    }
  }
}

 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

kadnedir пишет:

Не нужно компенсировать некомпетентность остротами. Не эквивалентно, знаете ли ;)

Ты недооцениваешь мою некомпетентность. Её ничем скомпенсировать невозможно

kadnedir пишет:

Я точно обращаюсь за советом по адресу?

Нет!

Если хочешь что-то кроме глума, выкладывай схему подключения, потому что фраза

kadnedir пишет:

- Подтягивающий резистор не решает проблему

на 99% означает, что ты что-то неправильно подключил.

kadnedir
Offline
Зарегистрирован: 07.03.2020

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Это что? Твоя схема? Или левое картинко, стыренное с какого-то сайта?

Если твоя, то где на ней обещанный

kadnedir пишет:

Подтягивающий резистор

который

kadnedir пишет:
не решает проблему

?

Враги украли?

kadnedir
Offline
Зарегистрирован: 07.03.2020

Самым наглым образом

Цитата:

левое картинко, стыренное с какого-то сайта

К сожалению, не имею возможности качественно нарисовать схему. Но думаю, этого достаточно для понимания. Я пробовал два варианта, более того, менял 3,3 на 5V (2-я пикча), ничего. Ставил конденсатор на питание (GND и 3,3) - тоже.

Я расстраиваюсь

bwn
Offline
Зарегистрирован: 25.08.2014

kadnedir пишет:

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

А старым, дедовским способом, ручкой, на бумажке, без наскальной живописи? Примерно так: