Общие сведения:
Геймпад DualShock от PS2 — является хорошо всем известной моделью геймпада от приставки PlayStation 2. Это один из самых удобных геймпадов, с помощью которого вы легко сможете создать систему управления роботами, сервоприводами и другими устройствами.
Для удобного подключения к контроллерам Arduino, ESP понадобится адаптер PSX
Данный геймпад имеет стороннюю библиотеку PS2X, описание которой вы найдёте под ссылкой для её скачивания.
Видео:
Спецификация:
- Питание геймпада: 3 В (2 батарейки типа AAA);
- Питание приёмника: 3.3/5В;
- Дальность действия: до 20м;
- Частота работы: 2.4 ГГц;
Подключение:
При использовании библиотеки PS2X в настройках можно указать, к каким выводам подключен приёмник. Ниже приведено стандартное подключение используя адаптер PSX.
Вывод приёмника | Вывод Arduino |
GND | GND |
VCC | 3.3/5В |
DAT | 8 |
CMD | 7 |
CLK | 4 (для крестной работы лучше использовать именно его) |
CS | 6 |

Питание:
Входное напряжение 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(4, 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.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.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.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мс }
Применение:
- Управление, джойстики, контроллеры;
- Роботы, манипуляторы;
Ссылки:
- Геймпад DualShock 2;
- Библиотека PS2X;
Обсуждение