КОРЗИНА
магазина
8 (499) 500-14-56 | ПН. - ПТ. 12:00-18:00
ЛЕСНОРЯДСКИЙ ПЕРЕУЛОК, 18С2, БЦ "ДМ-ПРЕСС"

Геймпад DualShock 2

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

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

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

Для удобного подключения к контроллерам Arduino, ESP понадобится адаптер PSX

Для работы с геймпадом необходимо поставить библиотеки PsxNewLib и DigitalIO

Видео:

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

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

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

Вывод приёмникаВывод Arduino
GNDGND
VCC3.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);
}

Применение:

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

Ссылки:




Обсуждение

Гарантии и возврат Используя сайт Вы соглашаетесь с условями