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

Питание:
Входное напряжение 5В или 3,3В постоянного тока, подаётся на выводы Vcc (V) и GND (G).
Примеры:
Тест работы всех кнопок геймпада.
#include <PsxControllerHwSpi.h>
// Вывод ATT (SS) адаптера
const byte PIN_PS2_ATT = 10;
PsxControllerHwSpi<PIN_PS2_ATT> psx;
boolean haveGamepad = false;
// Типы контроллеров
const char* controllerTypeStrings[PSCTRL_MAX] = {
"Unknown",
"Dual Shock",
"Dual Shock Wireless",
"Guitar Hero"
};
// Типы протоколов
const char* controllerProtoStrings[PSPROTO_MAX] = {
"Unknown",
"Digital",
"Dual Shock",
"Dual Shock 2",
"Flightstick",
"neGcon",
"Jogcon"
};
// Обработка геймпада
void handleGamepad()
{
if (!haveGamepad) {
gamepadSearch();
}
else {
gamepadRead();
}
}
// Поиск геймпада
void gamepadSearch()
{
if (psx.begin ()) {
Serial.println ("Найден геймпад!");
delay (300);
if (!psx.enterConfigMode ()) {
Serial.println ("Не получается войти в режим конфигурации");
} else {
PsxControllerType ctype = psx.getControllerType ();
const char* cname = controllerTypeStrings[ctype < PSCTRL_MAX ? static_cast<byte> (ctype) : PSCTRL_MAX];
Serial.print ("Тип геймпада: ");
Serial.println(cname);
if (!psx.enableAnalogSticks ()) {
Serial.println ("Не получилось инициализировать джойстики");
}
if (!psx.exitConfigMode ()) {
Serial.println ("Не получилось выйти из режима конфигурации");
}
}
psx.read ();
PsxControllerProtocol proto = psx.getProtocol ();
const char* pname = controllerProtoStrings[proto < PSPROTO_MAX ? static_cast<byte> (proto) : PSPROTO_MAX];
Serial.print ("Протокол геймпада: ");
Serial.println(pname);
haveGamepad = true;
}
}
// Чтение геймпада
void gamepadRead()
{
if (!psx.read ()) {
Serial.println("Геймпад отключён");
haveGamepad = false;
}
}
void setup () {
pinMode(LED_BUILTIN, OUTPUT);
delay (300);
Serial.begin (115200);
// Ждём последовательный порт на Arduino Leonardo
while (!Serial) {
fastDigitalWrite (LED_BUILTIN, (millis () / 333) % 2);
}
Serial.println("Стартуем!");
}
void loop () {
static bool changed = false;
static uint8_t last_lx, last_ly, last_rx, last_ry;
uint8_t lx, ly, rx, ry;
uint16_t buttons = 0;
// Проверяем наличие или отсутствие геймпада
handleGamepad();
// Читаем положение левого джойстика
psx.getLeftAnalog(lx, ly);
// Обновляем данные, если был сдвинут левый джойстик
if (lx != last_lx || ly != last_ly) {
last_lx = lx;
last_ly = ly;
changed = true;
}
// Читаем положение правого джойстика
psx.getRightAnalog(rx, ry);
// Обновляем данные, если был сдвинут правый джойстик
if (rx != last_rx || ry != last_ry) {
last_rx = rx;
last_ry = ry;
changed = true;
}
// Проверяем изменилось ли состояние кнопок
if (psx.buttonsChanged()) {
// считываем шестнадцатибитное слово состояния кнопок
buttons = psx.getButtonWord();
changed = true;
}
// Если поступили новые данные о состоянии геймпада
if (changed) {
changed = false;
// Формируем строку и выводим в монитор порта
Serial.print("Левый джойстик: ");
Serial.print(lx);
Serial.print(", ");
Serial.print(ly);
Serial.println();
Serial.print("Правый джойстик: ");
Serial.print(rx);
Serial.print(", ");
Serial.println(ry);
Serial.print("Кнопки: ");
if (!buttons) {
Serial.println("не нажаты.");
}
if (buttons & PSB_SELECT) {
Serial.print("Select, ");
}
if (buttons & PSB_L3) {
Serial.print("L3, ");
}
if (buttons & PSB_R3) {
Serial.print("R3, ");
}
if (buttons & PSB_START) {
Serial.print("Start, ");
}
if (buttons & PSB_PAD_UP) {
Serial.print("UP, ");
}
if (buttons & PSB_PAD_RIGHT) {
Serial.print("RIGHT, ");
}
if (buttons & PSB_PAD_DOWN) {
Serial.print("DOWN, ");
}
if (buttons & PSB_PAD_LEFT) {
Serial.print("LEFT, ");
}
if (buttons & PSB_L2) {
Serial.print("L2, ");
}
if (buttons & PSB_R2) {
Serial.print("R2, ");
}
if (buttons & PSB_L1) {
Serial.print("L1, ");
}
if (buttons & PSB_R1) {
Serial.print("R1, ");
}
if (buttons & PSB_TRIANGLE) {
Serial.print("TRIANGLE, ");
}
if (buttons & PSB_CIRCLE) {
Serial.print("CIRCLE, ");
}
if (buttons & PSB_CROSS) {
Serial.print("CROSS, ");
}
if (buttons & PSB_SQUARE) {
Serial.print("SQUARE, ");
}
Serial.println();
}
delay (50);
}Применение:
- Управление, джойстики, контроллеры;
- Роботы, манипуляторы;
Ссылки:
- Геймпад DualShock 2;
- Библиотека PsxNewLib
- Библиотека DigitalIO

Обсуждение