Tanque Robot Arduino Controlado por Joystick Inalámbrico PS2
Componentes y materiales
| Componente | Cantidad | Notas |
|---|---|---|
| Arduino UNO | 1 | |
| Controlador de motores dual H-Bridge L298 (SparkFun) | 1 | |
| Kit robot tanque DIY | 1 | Incluye 2 motores DC, engranajes, orugas, tornillos, tuercas |
| Mando inalámbrico Sony PS2 | 1 | Con receptor |
| Baterías 18650 3.7V | 3 | En serie para 11.1V (motores 12V) |
| Soporte 3S para baterías 18650 | 1 | |
| Cargador de baterías 18650 | 1 | |
| Cables jumper | Varios | 6 macho-hembra (señales), 2 macho-macho (5V/GND) |
| Cable USB tipo B | 1 | Para subir código |
| Plancha de soldar y estaño | 1 | Los motores ya traen cables, pero pueden romperse |
| Lámina de goma EVA | 1 | Material no conductor para aislar placas del chasis metálico |
| Cinta de doble cara | 1 | Para fijar goma EVA y módulo H-Bridge |
| Tijeras | 1 | Para cortar rectángulos de goma EVA |
Aplicaciones y servicios online
- Arduino IDE
Sobre el proyecto
En este tutorial te mostraré cómo usar un joystick inalámbrico de PlayStation 2 (PS2) para pilotar un tanque robótico. Se utilizó una placa Arduino Uno como núcleo del proyecto. Recibe comandos del mando inalámbrico y establece la velocidad de los motores. Otras placas de desarrollo también podrían usarse (NodeMCU, Firebeetle, etc.), y los principios presentados aquí pueden aplicarse a otros modelos de robots y gadgets.
Previamente diseñé un tanque robótico controlado por Blynk. Se conecta a una red Wi-Fi y recibe comandos del servidor Blynk. Se usó un smartphone con la app Blynk como mando a distancia, con diferentes métodos de entrada: botones, barras deslizantes e incluso el acelerómetro del smartphone. Más info: enlace
También hice experimentos con comandos de voz. Útil para controlar un robot remotamente sin usar las manos, o hacerlo accesible para personas con movilidad reducida. Se usó un kit robótico DIY junto con Adafruit.io, IFTTT y Arduino IDE. Instrucciones completas: enlace
Puedes usar diferentes kits o incluso diseñar tus propios robots con materiales simples, sin necesidad de impresoras 3D ni corte láser. Ejemplo: enlace




Paso 1: Herramientas y materiales

Ver tabla de componentes arriba. Los enlaces son solo sugerencias; siéntete libre de buscar en tu tienda local u online favorita.
Paso 2: Montaje del robot
La primera parte fue ensamblar la estructura del robot. En proyectos previos desarrollé mi propia estructura con materiales accesibles (sin herramientas complejas). Ver: enlace
Luego probé un kit robótico de tienda online: enlace al chasis. Lo usé en otros dos tutoriales. Al principio parecía complejo, ¡pero el kit me sorprendió! Todas las piezas son de buena calidad e incluyen repuestos (tornillos extra), lo cual es excelente para principiantes. Incluye todas las herramientas necesarias (llaves Allen y destornillador).
Como punto negativo: falta de documentación. El manual (hoja de cálculo en chino) no es muy amigable y hay pocos tutoriales online para este tanque. Por eso documenté el proceso de montaje en el video. Ojo: la base es de aluminio, lo que puede causar cortocircuitos si los pines de las placas tocan el chasis. Usé lámina de goma EVA entre placas y chasis para evitarlo.


Paso 3: Cableado del circuito

El pack de tres baterías 18650 se instaló en la parte trasera. Proporciona 11.1V (3 × 3.7V), suficiente para los motores DC de 12V.
Se usó un H-Bridge dual L298N para controlar los motores. Recibe señales de 5V del Arduino y entrega voltajes mayores a los motores. Permite girar en ambas direcciones según la combinación de señales de entrada.

Lista de conexiones de pines:
Arduino Uno (entradas/salidas):
- Pin digital 3 → H-Bridge ENA
- Pin digital 5 → H-Bridge IN1
- Pin digital 4 → H-Bridge IN2
- Pin digital 8 → H-Bridge IN3
- Pin digital 7 → H-Bridge IN4
- Pin digital 6 → H-Bridge ENB
- Pin 5V → H-Bridge 5V
- Pin GND → H-Bridge GND
- Pin digital 10 → Receptor PS2 pin 6
- Pin digital 11 → Receptor PS2 pin 2
- Pin digital 12 → Receptor PS2 pin 1
- Pin digital 13 → Receptor PS2 pin 7
- Pin 3.3V → Receptor PS2 pin 5
- Pin GND → Receptor PS2 pin 4
H-Bridge (entradas/salidas):
- ENA → Arduino pin 3
- IN1 → Arduino pin 5
- IN2 → Arduino pin 4
- IN3 → Arduino pin 8
- IN4 → Arduino pin 7
- ENB → Arduino pin 6
- 5V → Arduino 5V
- GND → Arduino GND
- GND → Cable negativo pack baterías
- 12V → Cable positivo pack baterías
- OUT1 → Motor derecho cable negativo
- OUT2 → Motor derecho cable positivo
- OUT3 → Motor izquierdo cable positivo
- OUT4 → Motor izquierdo cable negativo
Receptor PS2:
- Pin 1 (data) → Arduino pin 12
- Pin 2 (command) → Arduino pin 11
- Pin 4 (ground) → Arduino GND
- Pin 5 (power) → Arduino 3.3V
- Pin 6 (attention) → Arduino pin 10
- Pin 7 (clock) → Arduino pin 13


Paso 4: Configurar Arduino IDE

- Descargar e instalar Arduino IDE última versión desde arduino.cc
- Añadir librerías: Usamos librería Arduino PS2X. Descargar en GitHub, descomprimir y copiar carpetas a libraries/tools de Arduino IDE.
Paso 5: Librería PS2 Wireless Controller explicada

Un mando PS2 inalámbrico es una gran herramienta para robótica: 20 botones digitales y 2 joysticks analógicos. Usé la librería PS2X de Bill Porter (GitHub) para interconectar el mando con Arduino Uno.
Define una clase PS2X con métodos para leer entradas analógicas y digitales. Se crea un objeto:
PS2X ps2x;
Y se vincula a pines I/O de Arduino:
error = ps2x.config_gamepad(clock, command, attention, data, pressure?, rumble?);
Funciones principales:
- Leer botón digital:
ps2x.Button(button)- Devuelve true/false - Leer valor analógico (0-255):
ps2x.Analog(stick_axis)
Mapeo de botones:
Direccionales (D-pad): PSB_PAD_UP, PSB_PAD_DOWN, PSB_PAD_LEFT, PSB_PAD_RIGHT
Botones de acción: PSB_GREEN/PSB_TRIANGLE (triángulo verde), PSB_RED/PSB_CIRCLE (círculo rojo), PSB_BLUE/PSB_CROSS (X azul), PSB_PINK/PSB_SQUARE (cuadrado rosa)
Gatillos: PSB_L1, PSB_R1, PSB_L2, PSB_R2
Joysticks (pulsación): PSB_L3, PSB_R3
Menú: PSB_SELECT, PSB_START
Ejes analógicos:
- PSS_LY = posición Y joystick izquierdo
- PSS_LX = posición X joystick izquierdo
- PSS_RY = posición Y joystick derecho
- PSS_RX = posición X joystick derecho
Paso 6: Sketch #1 - Botones D-pad

Emula controles de videojuegos clásicos (SEGA, SNES). Botones direccionales binarios (on/off) para movimientos básicos: adelante, atrás, girar izquierda/derecha. Motores a velocidad fija (máxima). Al girar, motores giran en direcciones opuestas para rotar sobre su eje.

Código Arduino (extracto clave):
#include <PS2X_lib.h>
#define ENA 3
#define MOTORA_1 4
#define MOTORA_2 5
#define MOTORB_1 8
#define MOTORB_2 7
#define ENB 6
PS2X ps2x;
int error = 0;
byte type = 0;
byte vibrate = 0;
void setup() {
pinMode(ENA, OUTPUT); pinMode(MOTORA_1, OUTPUT); pinMode(MOTORA_2, OUTPUT);
pinMode(ENB, OUTPUT); pinMode(MOTORB_1, OUTPUT); pinMode(MOTORB_2, OUTPUT);
digitalWrite(ENA,0); digitalWrite(ENB,0);
Serial.begin(57600);
error = ps2x.config_gamepad(13,11,10,12, true, true);
// ... manejo de errores y tipo de mando ...
}
void loop() {
if(error == 1) return;
ps2x.read_gamepad(false, vibrate);
if(ps2x.Button(PSB_PAD_UP)) { // ADELANTE
digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,HIGH);
digitalWrite(MOTORB_1,HIGH); digitalWrite(MOTORB_2,LOW);
analogWrite(ENB, 1023); analogWrite(ENA, 1023);
}
if(ps2x.Button(PSB_PAD_RIGHT)) { // DERECHA
digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,LOW);
digitalWrite(MOTORB_1,HIGH); digitalWrite(MOTORB_2,LOW);
analogWrite(ENB, 1023); analogWrite(ENA, 1023);
}
if(ps2x.Button(PSB_PAD_LEFT)) { // IZQUIERDA
digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,HIGH);
digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,HIGH);
analogWrite(ENB, 1023); analogWrite(ENA, 1023);
}
if(ps2x.Button(PSB_PAD_DOWN)) { // ATRÁS
digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,LOW);
digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,HIGH);
analogWrite(ENB, 1023); analogWrite(ENA, 1023);
}
if (!ps2x.Button(PSB_PAD_DOWN) && !ps2x.Button(PSB_PAD_UP) &&
!ps2x.Button(PSB_PAD_RIGHT) && !ps2x.Button(PSB_PAD_LEFT)) {
analogWrite(ENB, 0); analogWrite(ENA, 0);
}
delay(50);
}
Paso 7: Sketch #2 - Joystick analógico + botones L2/R2

Configuración estilo juegos de carreras (Mario Kart): joystick analógico izquierdo para dirección, botones L2/R2 como acelerador/freno-reversa. R2 = adelante, L2 = reversa, dirección según eje X joystick izquierdo.

Lógica principal:
int nJoyL = ps2x.Analog(PSS_LX); // leer joystick izq eje X
nJoyL = map(nJoyL, 0, 255, 1023, -1023);
int motor_right_speed = 1023;
int motor_left_speed = 1023;
if (nJoyL < 0) motor_right_speed += nJoyL;
if (nJoyL > 0) motor_left_speed -= nJoyL;
if(ps2x.Button(PSB_R2)) { // ADELANTE
digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,HIGH);
digitalWrite(MOTORB_1,HIGH); digitalWrite(MOTORB_2,LOW);
analogWrite(ENA, motor_right_speed); analogWrite(ENB, motor_left_speed);
}
if(ps2x.Button(PSB_L2)) { // REVERSA
digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,LOW);
digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,HIGH);
analogWrite(ENA, motor_right_speed); analogWrite(ENB, motor_left_speed);
}
if(!ps2x.Button(PSB_L2) && !ps2x.Button(PSB_R2)) {
analogWrite(ENA, 0); analogWrite(ENB, 0);
}
Paso 8: Sketch #3 - Dos joysticks analógicos (tracción diferencial)

Mi forma favorita: ambos joysticks controlan cada oruga independientemente. Izquierdo → oruga izquierda, derecho → oruga derecha. Sensación de controlar máquina real.

Lógica principal:
int nJoyL = ps2x.Analog(PSS_LY); // joystick izq eje Y
int nJoyR = ps2x.Analog(PSS_RY); // joystick der eje Y
nJoyL = map(nJoyL, 0, 255, 1023, -1023);
nJoyR = map(nJoyR, 0, 255, -1023, 1023);
// Motor A (derecho)
if(nJoyR > 50) { digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,LOW); analogWrite(ENA, 1023); }
if(nJoyR < -50) { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,HIGH); analogWrite(ENA, 1023); }
if(abs(nJoyR) < 50) analogWrite(ENA, 0);
// Motor B (izquierdo)
if(nJoyL > 50) { digitalWrite(MOTORB_1,HIGH); digitalWrite(MOTORB_2,LOW); analogWrite(ENB, 1023); }
if(nJoyL < -50) { digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,HIGH); analogWrite(ENB, 1023); }
if(abs(nJoyL) < 50) analogWrite(ENB, 0);
Paso 9: Sketch #4 - Solo joystick analógico izquierdo

Un solo joystick controla todo. Óptimo en recursos (botones libres para otras acciones), pero más difícil de dominar. Velocidad de cada oruga depende de ejes X e Y. Código derivado de: impulseadventure.com

Paso 10: Consideraciones finales
Puse mucho esfuerzo para que sea claro y educativo. Si te gustó, dale a "me gusta" y compártelo. Tu apoyo es muy importante.
Otros tutoriales de robótica:
Código completo
Los 4 sketches completos están disponibles en la sección de código del proyecto original.
Esquemas


Proceso de manufactura
- Construya un robot con streaming de vídeo controlado por Internet con Arduino y Raspberry Pi
- Unopad: Controlador MIDI Arduino para Ableton Live sin complicaciones
- Robot evasor de obstáculos con servo: Construcción con Arduino y HC-SR04
- Controla tu Roomba Create 2 con Arduino y Android: Guía Completa
- Brazo Robótico de 6 Grados de Libertad Controlado por Nunchuk con Arduino
- Controla Dos Motores Paso a Paso con Arduino Nano y Joystick - Tutorial Sencillo
- Construye un volante joystick personalizado con Arduino para gaming
- Crea un Robot de Batalla Controlado a Distancia con un Mando PS2
- Controla tu brazo robótico Arduino con app Android dedicada
- Robot comedero con Arduino Nano: Guía paso a paso
- Robot de 4 Ruedas con Arduino Controlado por App Dabble