Mando PS2 para arduino y ESP32

Es posible conectar un mando clásico de PS2 de forma inalámbrica en un microcontrolador como arduino o ESP32. Esto nos permite controlar nuestros proyectos con diversos botones y dos joysticks.
La conexión es algo complicada vamos a usarlo con un arduino, por lo que debemos usar un level shifter para convertir las señales de 5V de arduino a 3.3V:
- CLK receptor a LV1.
- ATT receptor a LV2.
- LV a 3.3V de la placa.
- GND: hay que hacer un puente entre los GNDs y luego a la placa.
- COM receptor a LV3.
- DAT receptor a LV4.
En la parte que recibe la placa podemos conectar los cuatro pines de datos a cualquier pin de entrada digital:
- HV1, HV2, HV3 y HV4 a pines digitales.
- GND a uno de la placa.
- HV a 5V.
Precauciones
- El voltaje de funcionamiento del receptor es de 3.3V. NO aplicarle 5V o más directamente o se dañará el módulo.
Código de ejemplo para varios botones:
OJO, no debemos tener instaladas otras librerías de PS2 porque crea conflicto. Este código está adaptado tanto para arduino como ESP32. También es necesario incluir un delay al final del loop de al menos 1ms y mínimo 300ms al iniciar el programa:
Definimos pines DAT, CLK, CMD Y ATT:
#define PS2_CLK 12
#define PS2_SEL 11
#define PS2_CMD 10
#define PS2_DAT 9
Creamos el objeto:
PS2X ps2x;
En el setup iniciamos la configuración del gamepad con los pines anteriores y si tiene rumbles y botones analógicos:
ps2x.config_gamepad(PS2_CLK, PS2_CMD, PS2_SEL, PS2_DAT, pressures, rumble);
Para poder leer constantemente los inputs que recibimos llamamos a la función read_gamepad y, si tiene rumbles, qué nivel de vibración 0-255 tendrá:
ps2x.read_gamepad(false, vibrate);
Funciones:
- ps2x.Button( ‘botón’ ): Lee de continuo si se está mantiendo pulsado un botón.
- ps2x.Analog( ‘botón’ ): Lee la presión sobre el botón si es analógico de 0-255.
- ps2x.ButtonPressed( ‘botón’ ): Lee una vez si se ha pulsado el botón.
- ps2x.ButtonReleased( ‘botón’ ): Si se ha soltado.
- ps2x.Analog( ‘joystick’ ): Retorna el valor del eje de un joystick de 0-255 como 127-128 si está en el centro.
- ps2x.NewButtonState( ‘botón’ ): Devuelve true si se ha detectado un cambio en un botón o en general.
Nombres de botones (Dualshock y guitar):
- PSB_SELECT
- PSB_L3
- PSB_R3
- PSB_START
- PSB_PAD_UP
- PSB_PAD_RIGHT
- PSB_PAD_DOWN
- PSB_PAD_LEFT
- PSB_L2
- PSB_R2
- PSB_L1
- PSB_R1
- PSB_GREEN
- PSB_RED
- PSB_BLUE
- PSB_PINK
- PSB_TRIANGLE
- PSB_CIRCLE
- PSB_CROSS
- PSB_SQUARE
- PSS_RX
- PSS_RY
- PSS_LX
- PSS_LY
- PSAB_PAD_RIGHT
- PSAB_PAD_UP
- PSAB_PAD_DOWN
- PSAB_PAD_LEFT
- PSAB_L2
- PSAB_R2
- PSAB_L1
- PSAB_R1
- PSAB_GREEN
- PSAB_RED
- PSAB_BLUE
- PSAB_PINK
- PSAB_TRIANGLE
- PSAB_CIRCLE
- PSAB_CROSS
- PSAB_SQUARE
- GREEN_FRET
- RED_FRET
- YELLOW_FRET
- BLUE_FRET
- ORANGE_FRET
- STAR_POWER
- UP_STRUM
- DOWN_STRUM
- WHAMMY_BAR
Notas
- No requiere de librerías.