Sie sind auf Seite 1von 9

CONTROLA ARDUINO CON EL

MANDO INALÁMBRICO DE LA
PS2

14 OCTUBRE, 2014

Una de las mejoras formas de que disponemos para controlar un robot a distancia
es emplear el mando de una Playstation 2. En Internet podéis encontrar multitud de
ejemplos que optan por este controlador por sus excepcionales características técnicas,
incluso en proyectos profesionales. Además es realmente barato, algo especialmente
importante en nuestros proyectos caseros.

Entre sus características como controlador el mando de la PS2 es inalámbrico y


dispone de un alcance bastante aceptable. Por otro lado dispone de una gran variedad de
entradas que incluyen 4 botones de dirección sensibles a la presión, 4 botones de acción
sensibles también a la presión, 2 palancas analógicas y 4 botones digitales ubicados en la
parte frontal.
En cuanto al precio un clónico de este mando se puede conseguir en Ebay por de
9,90€. Un precio increíble que, junto con sus características técnicas, lo convierten en una
de las mejoras opciones para controlar un robot a un coste mínimo.

En este tutorial vamos a aprender a conectar el mando de una PS2 a Arduino para
poder usarlo en nuestros proyectos y poder controlar robots y automatismos de forma
inalámbrica.

Anuncio:

MATERIAL NECESARIO
Además de nuestro Arduino (mini, Uno, Mega, o el que vosotros prefiráis) lo primero
que necesitamos es, lógicamente, un mando de PS2 inalámbrico. Una simple búsqueda en
Ebay nos mostrará una gran cantidad de clónicos. Buscamos uno en el rango de 9 a 10€,
barato pero que tenga un mínimo de calidad.

Por otro lado, en la mayoría de los casos necesitaremos un conversor lógico de nivel
de 3,3V a 5V. El motivo es que, por lo general, nuestro Arduino opera a 5V, mientras que la
electrónica del mando de la PS2 funciona a 3,3V. Podríamos hacer nuestro propio circuito
de adaptación, pero no tienen ningún sentido dado que se venden por 1,10€, gastos de
envío incluidos.
Para encontrar el conversor simplemente buscar “level converter” en Ebay. Estamos
buscando un artículo similar al siguiente “JY MCY I2C LEVEL CONVERTER”, un dispositivo
que permite adaptar 4 señales de forma bidireccional. Fijaros que el modelo que queremos
tiene 6 pines (no compréis uno de 4 pines, que solo pueden adaptar 2 señales).

CONEXIÓN Y MONTAJE
Todo el montaje se realiza exclusivamente en el receptor, por lo que podemos dejar
“tranquilo” al mando propiamente dicho. En primer lugar retiramos los tornillos del receptor
para acceder a los terminales. Desoldamos los pines de conexión sustituyéndolos por
nuestros propios cables, que soldaremos a la placa del receptor. Cerramos el receptor,
dejando saliendo los cables por donde antes estaba la conexión con la vídeo consola.

Ahora empleamos un polímetro para identificar la función de cada uno de los cables
que hemos soldado. No os fiéis de los esquemas de Internet, que identifican cada terminal
por el color del cable que tuvieran soldado, porque el color de los cables y su conexión
varían de un fabricante a otro. Verificarlo manualmente con un polímetro y la ayuda del
siguiente esquema.
A continuación usamos una protoboard para realizar las conexiones con nuestro
conversor digital (o lo soldamos directamente). En el lado de baja tensión se conectan las
cuatro señales del mando, ground, y alimentación, que será proporcionada por Arduino. En
el lado de alta tensión conectamos cuatro pines, ground, y +5V que será convertido por el
conversor a +3,3V para alimentar el receptor.

El esquema definitivo es el siguiente.

Aquí podéis ver un ejemplo del montaje final, conectado a un Arduino Uno.
Y aquí un montaje similar conectado a un Arduino Mini.
Con esta combinación queda un montaje bastante compacto que cabe fácilmente en
cualquier robot, y con los pines libres de ambas protoboard tenemos suficientes conexiones
para el resto de elementos que la requieran.

LIBRERÍA Y CÓDIGO
Vamos a por el código. Afortunadamente para nosotros la parte difícil está resuelta en
una magnífica librería disponible en https://github.com/madsci1016/Arduino-PS2X.
Simplemente descargamos e importamos la librería, y cargamos el skecth de ejemplo.

El código del ejemplo es demasiado extenso y tiene líneas en exceso (cómo es lógico
ya que el objetivo es mostrar todas las posibilidades). No es en absoluto difícil analizar y
adaptarlo a nuestras necesidades. Sin embargo, os dejo un código reducido para que podáis
emplear fácilmente como punto de partida para vuestros proyectos.
1 #include <PS2X_lib.h>
2
3 PS2X ps2x;
4
5 int error = 0;
6 byte type = 0;
7 byte vibrate = 0;
8
9 void setup(){
10 Serial.begin(57600);
11
12 error = ps2x.config_gamepad(13,11,10,12, true, true); //setup pins and settings: GamePad(
13 clock, command, attention, data, Pressures?, Rumble?) check for error
14
15 if(error == 0){
16 Serial.println("Found Controller, configured successful");
17 Serial.println("Try out all the buttons, X will vibrate the controller, faster as you press hard
18 er;");
19 Serial.println("holding L1 or R1 will print out the analog stick values.");
20 Serial.println("Go to www.billporter.info for updates and to report bugs.");
21 }
22
23 else if(error == 1)
24 Serial.println("No controller found, check wiring, see readme.txt to enable debug. visit www.
25 billporter.info for troubleshooting tips");
26
27 else if(error == 2)
28 Serial.println("Controller found but not accepting commands. see readme.txt to enable debu
29 g. Visit www.billporter.info for troubleshooting tips");
30
31 else if(error == 3)
32 Serial.println("Controller refusing to enter Pressures mode, may not support it. ");
33
34 type = ps2x.readType();
35 }
36
37 void loop(){
38
39 if(type == 1){
40 ps2x.read_gamepad(false, vibrate); //Lectura del estado
41
42 //Lectura de los botones de dirección
43 if(ps2x.Button(PSB_PAD_UP)) {
44 Serial.print("Up held this hard: ");
45 Serial.println(ps2x.Analog(PSAB_PAD_UP), DEC);
46 }
47 if(ps2x.Button(PSB_PAD_RIGHT)){
48 Serial.print("Right held this hard: ");
49 Serial.println(ps2x.Analog(PSAB_PAD_RIGHT), DEC);
50 }
51 if(ps2x.Button(PSB_PAD_LEFT)){
52 Serial.print("LEFT held this hard: ");
53 Serial.println(ps2x.Analog(PSAB_PAD_LEFT), DEC);
54 }
55 if(ps2x.Button(PSB_PAD_DOWN)){
56 Serial.print("DOWN held this hard: ");
57 Serial.println(ps2x.Analog(PSAB_PAD_DOWN), DEC);
58 }
59
60 //Lectura del estado de botones
61 if (ps2x.NewButtonState())
62 {
63 if(ps2x.Button(PSB_RED))
64 Serial.println("Circle pressed");
65 if(ps2x.Button(PSB_GREEN))
66 Serial.println("Triangle pressed");
67 if(ps2x.Button(PSB_PINK))
68 Serial.println("Square pressed");
69 if(ps2x.Button(PSB_BLUE))
70 Serial.println("X pressed");
71
72 if(ps2x.Button(PSB_START))
73 Serial.println("Start is being held");
74 if(ps2x.Button(PSB_SELECT))
75 Serial.println("Select is being held");
76
77 if(ps2x.Button(PSB_L3))
78 Serial.println("L3 pressed");
79 if(ps2x.Button(PSB_R3))
80 Serial.println("R3 pressed");
81 if(ps2x.Button(PSB_L2))
82 Serial.println("L2 pressed");
83 if(ps2x.Button(PSB_R2))
84 Serial.println("R2 pressed");
85 }
86
87 //Lectura de las palancas analógicas
88 Serial.print("StickValues:");
89 Serial.print(ps2x.Analog(PSS_LY), DEC); //Mando izquierdo
90 Serial.print(",");
91 Serial.print(ps2x.Analog(PSS_LX), DEC);
92 Serial.print(",");
93 Serial.print(ps2x.Analog(PSS_RY), DEC); //Mando derecho
94 Serial.print(",");
95 Serial.println(ps2x.Analog(PSS_RX), DEC);
96 }
97 else
98 {
99 return;
}

delay(500);
}
Por último decir que, en general, la librería en sí es bastante pesada y consume una
buena parte de la memoria de nuestro pequeño Arduino. No obstante es posible optimizarla
y reducirla eliminando partes de código dedicadas a otros controladores (guitar hero, por
ejemplo). Además es un buen ejercicio de aprendizaje, por lo que os invito a que la leáis e
intentéis optimizarla.

Das könnte Ihnen auch gefallen