CONTROL DE ARDUINO CON JOYSTICK DE PS2
El control mediante Bluetooth es práctico porque siempre tenemos a mano un móvil con él, pero un poco errático y al final siempre nos deja la sensación de ser un tanto incomodo o de fundir las baterías del móvil demasiado deprisa y en el mejor de los casos, incómodo para estar un rato con él. Por eso, y como siempre solemos comentaros, al final, alguien tenía que venir con una solución “y por eso el
mercado nos proporciona una impecable para controlar nuestros robots, motores o proyectos varios con un mando único, que a muchos nos resultará familiar: Un mando como el de la PlayStation 2 inalámbrico. Estos mandos se pueden conseguir por poco dinero en estos momentos (Gran cosa las bajadas de precios de todos los componentes electrónicos) y tiene la enorme virtud de ser ergonómicos y muy cómodos de manejar, además de estar dotados de dos joysticks analógicos y como 14 botones incluidos. Estos mandos vienen con un receptor inalámbrico, que podemos conectar a nuestros Arduinos y usarlos para recibir las señales de control, sin complicarnos mucho la vida, y un mando inalámbrico aparte muy similar al que habréis usado más de uno para jugar con la PS2 de Sony. MATERIAL REQUERIDO.
ARDUINO MEGA
O EQUIVALENTE.
UN MOTOR UN MOTOR SHIELD V1
UN CHASIS UN CHASIS ROBOT CON 4 MOTORES.
Trusted by over 1 million members
Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial Cancel Anytime.
Trusted by over 1 million members
Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial Cancel Anytime.
Trusted by over 1 million members
Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial Cancel Anytime.
UN PORTA UN PORTA PILAS
UN MANDO UN MANDO INALÁMBRICO TIPO PS2
En esta sesión vamos a ver como conectar este tipo de mando inalámbrico a nuestros Arduinos y veremos que gracias a las librerías que nuevamente se ha trabajado Mr. Bill Porter, son pero que muy fáciles de implementar y usar.TO usar.TO Como estamos montando un coche a control remoto vamos a utilizar un Arduino Mega como el que venimos usando en las sesiones anteriores, para que el que quiera pueda tener un robot funcional.
Trusted by over 1 million members
Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial Cancel Anytime.
Trusted by over 1 million members
Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial Cancel Anytime.
Tampoco es necesario que os compliquéis la vida entendiendo la utilidad de cada cable, ya que la librería que vamos a usar, se va a encargar de la gestión a condición de que definamos correctamente los pines. Lo más cómodo es que conectéis los pines a vuestro Arduino en secuencia. En mi caso que uso un MEGA y la tabla de conexión seria así: CONEXI CONEXI N RECEPT RECEPTOR OR PS2 PS2 A ARDUI ARDUINO NO MEGA MEGA RECEPTOR 1
2
3
4
5
6
7
8
9
MEGA
22
24
26
28
30
32
34
36
38
PIN
data
command vibration GND
5V
Attention Clock
–
acknoledge
Si disponéis de un pin header plano o a 90º es ideal para esto, porque dispondréis de un peine de pines que se conecta directamente a los conectores conectores de la Mega y el enganche es más fiable, porque están agrupados.
De nuevo, tenemos un par de pines que son GND y 5V, pero como el consumo es despreciable podemos poner en HIGH el pin 30 y en LOW el pin 28.
EL PROGRAMA DE CONTROL
Lo primero es descargar la librería PS2X_lib y que la instaléis siguiendo el procedimiento el procedimiento habitual habitual.. Como ya es costumbre de la casa, vamos a empezar con un programa mínimo para comprobar unos pocos botones y después iremos iremos viendo el resto de los mandos mandos disponibles. Vamos a empezar incluyendo la librería y creando un controlador tipo para el manejo del mando. Prog_96_1 #include
//for v1.6 v1.6
Trusted by over 1 million members
Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial Cancel Anytime.
Trusted by over 1 million members
Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial Cancel Anytime.
digitalWrite(28, LOW);
//Set Ground for remote
digitalWrite(30, HIGH);
// Set 5V for remote
delay(500); LEYENDO LOS JOYSTICKS DEL MANDO
Ya habíamos usado antes este truco de alimentar algo con un pin del Arduino, pero recordar que este no debe Después de esto, si hemos detectado correctamente el mando ya podemos pasar a controlar los botones que se pulsan, Pero antes tenemos que que salir si no hemos detectado el mando: mando:
60352911
String S, Sentido = "" ; if(error == 1) return; //Salir si no encontramos mando Vamos a hacer un pequeño programa que detecte los botones de la mano izquierda: UP, DOWN, LEFT, RIGTH. while(true) { ps2x.read_gamepad();
//Leemos el mando
if(ps2x.Button(PSB_PAD_UP)) if(ps2x.Button(PSB_PAD_UP)) //Es TRUE mientras se pulsa el boton Serial.println("UP"); else if(ps2x.Button(PSB_PAD if(ps2x.Button(PSB_PAD_DOWN)) _DOWN)) Serial.println("DOWN"); else if(ps2x.Button(PSB_PAD if(ps2x.Button(PSB_PAD_RIGHT)) _RIGHT)) Serial.println("RIGHT"); else if(ps2x.Button(PSB_PAD if(ps2x.Button(PSB_PAD_LEFT)) _LEFT))
Trusted by over 1 million members
Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial Cancel Anytime.
Trusted by over 1 million members
Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial Cancel Anytime.
Si volcáis este programa Prog_96_1 a vuestro Arduino, veréis que detecta con un mensaje en la consola el botón que pulsáis. Naturalmente la librería provee variables para todos los botones disponibles en el mando mediante la función ps2x.Button(). BOTONES DE LA IZQUIERDA BOTON
UP
DOWN
RGHT
LEFT
FLAG
PSB_PAD_UP PSB_PAD_DOWN PSB_PAD_RIGHT PSB_PAD_LEFT
BOTONES DE LA DERECHA BOTON
Circle Red
FLAG
PSB_RED
Cross Blue
Square Pink
Green Triangle
PSB_BLUE
PSB_PINK
PSB_GREEN
Más los botones centrales, de SELCT ( PSB_SELECT) y Start (PSB_START) . Para los botones traseros tenemos: BOTONES TRASEROS BOTON
L1
FLAG
PSB_L1
L2
R1
R2
PSB_L2
PSB_R1
PSB_R2
Los botones de la izquierda, tienen además, la curiosidad de que detectan de modo analógico la presión que ejerces en ellos con valores entre 0 y 255, mediante el comando ps2x.Analog( Flag ) Donde Flag representa cualquiera de los valores indicados en la primera table. Por ejemplo para imprimir la intensidad con que s epulsa el botón UP, bastaría con hacer:
Trusted by over 1 million members
Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial Cancel Anytime.
Trusted by over 1 million members
Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial Cancel Anytime.
LEYENDO LOS JOYSTICKS DEL MANDO
Por ultimo para detectar el movimiento de los dos joysticks incluidos en el mando, tenemos que entender que al ser analógicos tenemos que leer de cada uno, dos valores, X e Y, tal y como hacíamos en una sesión previa Joystick y Servo. Servo . Como el mando nos devuelve un valor entre 0 y 255, cuando el joystick esta esta en reposo en la posición central, la lectura que nos da es de 127 tanto en X como en Y. Espero que el siguiente gráfico os resulte sencillo: sencillo:
Para leer los joysticks tenemos que leer independientemente independientemente la posición en X e Y de cada ca da uno de ellos JOYSTICK IZQUIERDO
JOYSTICK DERECHO
EJE
X
Y
X
Y
FLAG
PSS_LX
PSS_LY
PSS_RX
PSS_RY
Para leer los valores de los joysticks podemos usar el siguiente trozo de código: Serial.print("Stick Values:"); Serial.print(ps2x.Analog(PSS_LY), Serial.print(ps2x.Analog (PSS_LY), DEC); Serial.print(","); Serial.print(ps2x.Analog(PSS_LX), Serial.print(ps2x.Analog (PSS_LX), DEC);
Trusted by over 1 million members
Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial Cancel Anytime.
Trusted by over 1 million members
Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial Cancel Anytime.
Trusted by over 1 million members
Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial Cancel Anytime.
Ahora te puede parecer muy complicado pero es una tontería ( En serio), simplemente el mando tiene tantos botones que hay que usar un un montón de flags para definir cada uno, uno, pero siempre es lo mismo. La librería viene con un ejemplo magnifico de uso, pero tiene el inconveniente de que muestra todas las posibilidades a la vez y puede ser un poco avasallador, avasallador, pero si vais a usar este mando desde luego os recomiendo que la echéis una ojeada.
Para aquellos que hayáis hecho el montaje como el de este ejemplo, os pongo el ejemplo corregido para que os funcione a la primera, en la que simplemente he adaptado el ejemplo incluido a nuestros pines. MOVIENDO NUESTRO ROBOT CON EL MANDO DE LA PS2
Solo nos queda ya montar un programa completo que incorpore el control de los motores y la dirección del movimiento respondiendo a las pulsaciones del mando a distancia. Vamos a empezar usando los 4 botones de la izquierda izquierda como controles simples de de dirección. Para ello tenemos que incluir un par de librerías. librerías. Una para el control de la controladora de motores motores y otra para el manejo del mando de la PS2: #include #include //for v1.6 v1.6 PS2X ps2x; // Creamos la clase del mando PS2 AF_DCMotor Motor1(1);
// Instanciamos los motores
AF_DCMotor Motor2(2); AF_DCMotor Motor3(3); AF_DCMotor Motor4(4); Y definimos algunas variables que usaremos luego int error = 0;
// Para reconocer el mando
byte type = 0;
// Tipo del mando. Volveremos Volveremos sobre ello
int Vel Vel = 180 ; // Define Define la velocidad base del del Rover
Trusted by over 1 million members
Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial Cancel Anytime.
Trusted by over 1 million members
Try Scribd FREE for 30 days to access over 125 million titles without ads or interruptions! Start Free Trial Cancel Anytime.
if(error == 0) Serial.println("Controlador Serial.println("Contr olador encontrado y configurado"); type = ps2x.readType(); if ( type == 1) Serial.println("Halladoo controlador DualShock."); Serial.println("Hallad } Fijaros en la línea error = ps2x.config_g ps2x.config_gamepad(34,24,32,22, amepad(34,24,32,22, true, true); Aquí es donde inicializamos el controlador de la PS2 con los pines que usamos y nos aseguramos de que no haya error, para indicar que ha encontrado un mando compatible. compatible. Y por último leemos el tipo de mando que ha encontrado, que puede ser de varios tipos, Tipo DualShock = 1 o tipo Guitar Hero = 2. Por último el loop es una variante del programa Prog_76_1, al que añadimos el control de los movimientos del robot que ya vimos en las sesiones previas. void loop() { if(error == 1) return; //Salir si no encontramos mando While(true) { ps2x.read_gamepad();
//Leemos el mando
if(ps2x.Button(PSB_PAD_UP)) if(ps2x.Button(PSB_PAD _UP)) //Es TRUE mientras se pulsa el boton { Serial.println("UP"); Serial.println("UP"); Avance(); } else if(ps2x.Button(PSB_PAD if(ps2x.Button(PSB_PAD_DOWN)) _DOWN)) { Serial.println("DOWN"); Retroceso(); } else if(ps2x.Button(PSB_PAD_ if(ps2x.Button(PSB_PAD_RIGHT)) RIGHT))