Геймпад DualShock от PS2

skv.inet

✩✩✩✩✩✩✩
6 Авг 2024
2
0
Привет, сообщество!
Помогите понять, это мне с геймпадом не повезло или я криворукий?)

Второй вечер пытаюсь добиться стабильной работы геймпада с Arduino. Подключал к Uno через Trema-Power Shield и без него. Подключал к Nano. Везде плюс-минус один и тот-же результат:
  1. С первого раза геймпад никогда не подключается к приемнику. Поэтому и пришлось изобразить бесконечный цикл на этапе подключения.
  2. Если случается чудо и он подключается, то сигналы с кнопок приходят так отвратительно, что лучше один раз увидеть, вот 60 секунд страданий (без регистрации и смс). Чтобы получить сообщение о нажатой кнопке приходится давить как не в себя, но и это не дает гарантий.
Уже были мысли припаять выводы с приемника геймпада к Nano, чтобы коннект был нормальный, а то вдруг все из-за плохого соединения. Но пришла мысль – а что если это тот редкий случай, когда не я глупенький, а они буки-бяки?))) Подключал по схеме из репозитория AlexGyver.


C++:
#include <PS2X_lib.h>

#define PS2_DAT        2
#define PS2_CMD        3
#define PS2_SEL        4
#define PS2_CLK        5
#define pressures   false
#define rumble      false

PS2X ps2x;

int error = 0;
byte type = 0;
byte vibrate = 0;
int attemptCount = 0;   

void setup(){
 
  Serial.begin(9600);
  delay(500);
  
  error = ps2x.config_gamepad(PS2_CLK, PS2_CMD, PS2_SEL, PS2_DAT, pressures, rumble); 
  while (error != 0) {
      attemptCount++;
      error = ps2x.config_gamepad(PS2_CLK, PS2_CMD, PS2_SEL, PS2_DAT, pressures, rumble);
      if (error == 1)
        Serial.print("error: Контроллер не найден. Попытка: ");
      else if (error == 2)
        Serial.print("error: Контроллер найден, но не принимает команды. Попытка: ");
      else if (error == 3)
        Serial.print("error: Контроллер найден, но без режима давления. Попытка: ");
      Serial.println(attemptCount);
      delay(500);
    }
    type = ps2x.readType();
    Serial.println("Контроллер готов к проверке кнопок.");
}

void loop() {
 
    ps2x.read_gamepad(false, vibrate);
    
    if(ps2x.Button(PSB_START))
      Serial.println("Start is being held");
    if(ps2x.Button(PSB_SELECT))
      Serial.println("Select is being held");     

    if(ps2x.Button(PSB_PAD_UP)) {
      Serial.print("Up held this hard: ");
      Serial.println(ps2x.Analog(PSAB_PAD_UP), DEC);
    }
    if(ps2x.Button(PSB_PAD_RIGHT)){
      Serial.print("Right held this hard: ");
      Serial.println(ps2x.Analog(PSAB_PAD_RIGHT), DEC);
    }
    if(ps2x.Button(PSB_PAD_LEFT)){
      Serial.print("LEFT held this hard: ");
      Serial.println(ps2x.Analog(PSAB_PAD_LEFT), DEC);
    }
    if(ps2x.Button(PSB_PAD_DOWN)){
      Serial.print("DOWN held this hard: ");
      Serial.println(ps2x.Analog(PSAB_PAD_DOWN), DEC);
    }   
 
  delay(50); 
}
 

Вложения

viktor1703

★★★✩✩✩✩
9 Дек 2021
616
146
Попробуйте другие проводники. У меня было, что вместо проволоки под изоляцией какая-то труха. Тоже так то работает, то нет, а после и вовсе перестало.
 

skv.inet

✩✩✩✩✩✩✩
6 Авг 2024
2
0
@viktor1703, спасибо за идею. Купил новые провода, но это не помогло. Отправил результаты эксперимента в магазин где покупал геймпад. Там взяли паузу, пообещали протестировать у себя)