Геймпад DualShock 2

Исходники изображение:
Библиотеки:

Общие сведения:

Геймпад DualShock от PS2 — является хорошо всем известной моделью геймпада от приставки PlayStation 2. Это один из самых удобных геймпадов, с помощью которого вы легко сможете создать систему управления роботами, сервоприводами и другими устройствами.

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

Видео:

Спецификация:

  • Питание геймпада: 3 В (2 батарейки типа AAA);
  • Питание приёмника: 3.3/5В;
  • Дальность действия: до 20м;
  • Частота работы: 2.4 ГГц;

Подключение:

При использовании библиотеки PS2X в настройках можно указать, к каким выводам подключен приёмник. Ниже приведено стандартное подключение.

Вывод приёмникаВывод Arduino
GNDGND
VCC3.3/5В
DAT8
CMD7
CLK9
CS6

Питание:

Входное напряжение 5В или 3,3В постоянного тока, подаётся на выводы Vcc (V) и GND (G).

Примеры:

Тест работы всех кнопок геймпада.

#include <PS2X_lib.h>                                             // Подключаем библиотеку
PS2X ps2x;                                                        // Создаём класс "ps2x"

int  error    = 0;                                                // переменная для определения кода ошибки
byte type     = 0;                                                // переменная для определения типа устройства
byte vibrate  = 0;                                                // переменная для значения работы вибромотора

void setup() {
  Serial.begin(57600);                                            // Инициируем работу последовательного порта на скорости 57600 бод
  //--------------------------------------------------------------//
  error = ps2x.config_gamepad(9, 7, 6, 8, true, true);            // Инициируем работу геймпада, проверяя указанные выводы для подключения (clock, command, attention, data, Pressures, Rumble)
  if (error == 0) {                                               // Если код ошибки = 0, то выводим в монитор порта сообщение, что всё нормально,
    Serial.print("Found Controller,");                            // 
    Serial.print("configured successful.");                       // 
    Serial.print("Try out all the buttons, ")                     // 
    Serial.print("X will vibrate the controller, ");              // нажатие клавиши Х включает работу вибромотора
    Serial.print("faster as you press harder; ");                 // 
    Serial.print("holding L1 or R1 will print out");              // клавиши L1 и R1 включают отображение работы джойстиков ("Стиков")
    Serial.print("the analog stick values. ");                    // 
    Serial.print("Go to <a href="http://www.billporter.info" class="redactor-autoparser-object">www.billporter.info</a> for ");               // 
    Serial.println("updates and to report bugs.");                // 
  } else if (error == 1) {                                        // Если код ошибки = 1, то выводим в монитор порта сообщение, что контроллер не найден. Проверьте подключение или включите режим DEBUG
    Serial.print("No controller found, ");                        // 
    Serial.print("check wiring, see readme.txt ");                // 
    Serial.print("to enable debug. visit ");                      // 
    Serial.print("<a href="http://www.billporter.info" class="redactor-autoparser-object">www.billporter.info</a> for ");                     // 
    Serial.println("troubleshooting tips");                       // 
  } else if (error == 2) {                                        // Если код ошибки = 2, то выводим в монитор порта сообщение, что геймпад найден, но не отвечает на команды.
    Serial.print("Controller found but not ");                    // 
    Serial.print("accepting commands. ");                         // 
    Serial.print("see readme.txt to enable debug. ");             // 
    Serial.print("Visit <a href="http://www.billporter.info" class="redactor-autoparser-object">www.billporter.info</a> for ");               // 
    Serial.println("troubleshooting tips");                       // 
  } else if (error == 3) {                                        // Если код ошибки = 3, то выводим в монитор порта сообщение, что геймпад найден, но не вошёл в режим работы аналогового устройства
    Serial.print("Controller refusing to enter ");                // 
    Serial.println("Pressures mode, may not support it. ");       // 
  }
  //--------------------------------------------------------------//
  type = ps2x.readType();                                         // Считываем тип устройства
  switch (type) {                                                 // 
    case 0:                                                       // Если тип = 0, то
      Serial.println("Unknown Controller type");                  // "Неизвестный тип устройства"
      break;                                                      // 
    case 1:                                                       // Если тип = 1, то
      Serial.println("DualShock Controller Found");               // "Найден геймпад DualShock"
      break;                                                      // 
    case 2:                                                       // Если тип = 2, то
      Serial.println("GuitarHero Controller Found");              // "Найден геймпад GuitarHero"
      break;                                                      // 
  }
  //--------------------------------------------------------------//
}

void loop() {
  //--------------------------------------------------------------//
  if (error == 1)                                                 // Если ошибка = 1, то прервать выполнение скетча
    return;
  //--------------------------------------------------------------//
  ps2x.read_gamepad(false, vibrate);                              // инициализируем геймпад (motor_1, motor2), где motor_1 - вибромотор на проводном геймпаде, motor_2 - вибромотор на беспроводном геймпаде
  //--------------------------------------------------------------//
  if (ps2x.Button(PSB_START))                                     // Пока кнопка "Start" НАЖИМАЕТСЯ, то
    Serial.println("Start is being held");                        // выводим сообщение в монитор порта
  if (ps2x.Button(PSB_SELECT))                                    // Пока кнопка "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);                // выводим сообщение в монитор порта c аналоговым значением
  }
  if (ps2x.Button(PSB_PAD_RIGHT)) {                               // Пока кнопка "СТРЕЛКА ВПРАВО" НАЖИМАЕТСЯ, то
    Serial.print("Right held this hard: ");                       // выводим сообщение в монитор порта
    Serial.println(ps2x.Analog(PSAB_PAD_RIGHT), DEC);             // выводим сообщение в монитор порта c аналоговым значением
  }
  if (ps2x.Button(PSB_PAD_LEFT)) {                                // Пока кнопка "СТРЕЛКА ВЛЕВО" НАЖИМАЕТСЯ, то
    Serial.print("LEFT held this hard: ");                        // выводим сообщение в монитор порта
    Serial.println(ps2x.Analog(PSAB_PAD_LEFT), DEC);              // выводим сообщение в монитор порта c аналоговым значением
  }
  if (ps2x.Button(PSB_PAD_DOWN)) {                                // Пока кнопка "СТРЕЛКА ВНИЗ" НАЖИМАЕТСЯ, то
    Serial.print("DOWN held this hard: ");                        // выводим сообщение в монитор порта
    Serial.println(ps2x.Analog(PSAB_PAD_DOWN), DEC);              // выводим сообщение в монитор порта c аналоговым значением
  }
  //--------------------------------------------------------------//
  vibrate = ps2x.Analog(PSAB_BLUE);                               // Считываем аналоговое значение кнопки "Х" и устанавливаем его в переменную для работы вибромотора
  //--------------------------------------------------------------//
  if (ps2x.NewButtonState()) {                                    // Если кнопка ИЗМЕНИЛА СОСТОЯНИЕ, то вывести один раз:
    if (ps2x.Button(PSB_L3))                                      // Если нажата кнопка "ЛЕВЫЙ ДЖОЙСТИК"
      Serial.println("L3 pressed");                               // выводим сообщение в монитор порта
    if (ps2x.Button(PSB_R3))                                      // Если нажата кнопка "ПРАВЫЙ ДЖОЙСТИК"
      Serial.println("R3 pressed");                               // выводим сообщение в монитор порта
    if (ps2x.Button(PSB_L2))                                      // Если нажата кнопка "ЛЕВЫЙ ШИФТ L2"
      Serial.println("L2 pressed");                               // выводим сообщение в монитор порта
    if (ps2x.Button(PSB_R2))                                      // Если нажата кнопка "ПРАВЫЙ ШИФТ R2"
      Serial.println("R2 pressed");                               // выводим сообщение в монитор порта
    if (ps2x.Button(PSB_GREEN))                                   // Если нажата кнопка "ТРЕУГОЛЬНИК"
      Serial.println("Triangle pressed");                         // выводим сообщение в монитор порта
  }
  //--------------------------------------------------------------//
  if (ps2x.ButtonPressed(PSB_RED))                                // Если кнопка "КРУГ" была НАЖАТА, то
    Serial.println("Circle just pressed");                        // выводим сообщение в монитор порта
  if (ps2x.ButtonReleased(PSB_PINK))                              // Если кнопка "КВАДРАТ" была ОТПУЩЕНА, то
    Serial.println("Square just released");                       // выводим сообщение в монитор порта
  if (ps2x.NewButtonState(PSB_BLUE))                              // Если кнопка "Х" была НАЖАТА ИЛИ ОТПУЩЕНА, то
    Serial.println("X just changed");                             // выводим сообщение в монитор порта
  //--------------------------------------------------------------//
  if (ps2x.Button(PSB_L1) || ps2x.Button(PSB_R1))                 // Если кнопка "ШИФТ L1" ИЛИ "ШИФТ R1" нажата, то
  {
    Serial.print("Stick Values:");                                // выводим аналоговые значения джойстиков:
    Serial.print(ps2x.Analog(PSS_LY), DEC);                       // Левый джойстик, ось Оу
    Serial.print(",");                                            // 
    Serial.print(ps2x.Analog(PSS_LX), DEC);                       // Левый джойстик, ось Ох
    Serial.print(",");                                            // 
    Serial.print(ps2x.Analog(PSS_RY), DEC);                       // Правый джойстик, ось Оу
    Serial.print(",");                                            // 
    Serial.println(ps2x.Analog(PSS_RX), DEC);                     // Правый джойстик, ось Ох
  }
  //--------------------------------------------------------------//
  delay(50);                                                      // Задержка 50мс
}

Применение:

  • Управление, джойстики, контроллеры;
  • Роботы, манипуляторы;

Ссылки:

Обсуждение