Módulo 11

Control de brazo robótico con ESP32 + Joystick

Aplicaciones en Mecatrónica

ESP32 Mecatrónica IoT UNAM

Introducción a Control Robótico

La robótica moderna ha revolucionado la industria manufacturera y la automatización, permitiendo la precisión y eficiencia en tareas complejas que requieren movimiento controlado y coordinado.

ESP32 Controller

Microcontrolador de bajo costo y alta eficiencia que integra Wi-Fi y Bluetooth, ideal para control de sistemas robóticos complejos.

Control Intuitivo

Los joysticks proporcionan una interfaz humana natural para controlar brazos robóticos con precisión y facilidad.

Servomotores

Actuadores de precisión que permiten control angular exacto para cada articulación del brazo robótico.

Aplicaciones Industriales
Manufactura y Ensamblaje

Los brazos robóticos controlados por ESP32 se utilizan en líneas de producción para tareas de ensamblaje, soldadura, pintura y manipulación de materiales con alta precisión.

Laboratorios y Medicina

Control preciso para manipulación de muestras, cirugía asistida y aplicaciones donde la precisión y repetibilidad son críticas.

Fundamentos Técnicos

El ESP32, como sistema en chip (SoC) de doble núcleo corriendo hasta 240 MHz, ofrece la capacidad de procesamiento necesaria para control robótico en tiempo real con comunicación inalámbrica integrada.

Arquitectura del ESP32

El ESP32 integra una CPU de doble núcleo Xtensa LX6 con memoria RAM y Flash significativa, permitiendo el almacenamiento y ejecución de algoritmos de control complejos para sistemas robóticos multi-eje.

1
Señales PWM para Servomotores

Los temporizadores internos del ESP32 generan señales PWM precisas (50Hz) necesarias para controlar la posición angular de los servomotores con resolución de 180 grados.

2
Lectura de Joystick Analógico

Los convertidores analógico-digitales (ADC) del ESP32 leen las posiciones X e Y del joystick con resolución de 12 bits, proporcionando control suave y preciso.

3
Mapeo y Calibración

Los valores analógicos del joystick (0-4095) se mapean a ángulos de servo (0-180°) mediante funciones de interpolación lineal para control intuitivo.

Arduino C++
#include 

// Definición de pines
#define JOYSTICK_X_PIN 36
#define JOYSTICK_Y_PIN 39
#define SERVO_BASE_PIN 18
#define SERVO_ARM_PIN 19

// Objetos servo
Servo servoBase;
Servo servoArm;

// Variables para suavizar movimiento
int targetAngleBase = 90;
int targetAngleArm = 90;
int currentAngleBase = 90;
int currentAngleArm = 90;

void setup() {
    Serial.begin(115200);
    
    // Configurar servos
    servoBase.attach(SERVO_BASE_PIN);
    servoArm.attach(SERVO_ARM_PIN);
    
    // Posición inicial
    servoBase.write(90);
    servoArm.write(90);
    delay(1000);
}

void loop() {
    // Leer joystick
    int joystickX = analogRead(JOYSTICK_X_PIN);
    int joystickY = analogRead(JOYSTICK_Y_PIN);
    
    // Mapear valores a ángulos de servo
    targetAngleBase = map(joystickX, 0, 4095, 0, 180);
    targetAngleArm = map(joystickY, 0, 4095, 0, 180);
    
    // Suavizar movimiento
    currentAngleBase += (targetAngleBase - currentAngleBase) * 0.1;
    currentAngleArm += (targetAngleArm - currentAngleArm) * 0.1;
    
    // Controlar servos
    servoBase.write(currentAngleBase);
    servoArm.write(currentAngleArm);
    
    // Debug
    Serial.printf("Joy: X=%d, Y=%d | Servo: Base=%d, Arm=%d\n", 
                  joystickX, joystickY, currentAngleBase, currentAngleArm);
    
    delay(20);
}

Ejercicios Prácticos

1
Control Básico de Servomotor
Básico 30-40 min

Objetivo: Implementar control directo de un servomotor usando entrada analógica del joystick.

Materiales:
  • ESP32 DevKit
  • Joystick analógico
  • Servomotor SG90
  • Protoboard y cables
2
Control Dual de Servomotores
Intermedio 60-80 min

Objetivo: Controlar dos servomotores simultáneamente con ejes X e Y del joystick para movimiento bidimensional.

Materiales:
  • ESP32 DevKit
  • Joystick analógico XY
  • 2x Servomotor SG90
  • Fuente de alimentación externa
3
Brazo Robótico Completo
Avanzado 120-150 min

Objetivo: Implementar control completo de un brazo robótico multi-eje con joystick y funciones avanzadas.

Materiales:
  • ESP32 DevKit
  • Joystick con botón
  • Kit brazo robótico 6DOF
  • Driver de servos PCA9685

Proyecto Aplicado

Brazo Robótico para Ensamblaje Automatizado

Sistema completo de control robótico que integra sensores de proximidad, actuadores lineales y control de agarre para aplicaciones industriales de precisión.

Objetivos del Proyecto
  • Implementar control multi-eje con 6 grados de libertad
  • Integrar sensores ultrasónicos para detección de obstáculos
  • Desarrollar sistema de agarre adaptativo con sensor de fuerza
  • Crear interfaz de monitoreo en tiempo real vía WiFi
  • Implementar secuencias de movimiento programables
ESP32
6x Servos
Sensores HC-SR04
Gripper
Arduino C++ - Proyecto Completo
#include 
#include 
#include 

// Configuración WiFi
const char* ssid = "TU_WIFI";
const char* password = "TU_PASSWORD";

// Definición de pines
#define JOYSTICK_X_PIN 36
#define JOYSTICK_Y_PIN 39
#define JOYSTICK_BTN_PIN 34
#define ULTRASONIC_TRIG_PIN 5
#define ULTRASONIC_ECHO_PIN 18

// Servomotores del brazo robótico
Servo servoBase, servoShoulder, servoElbow;
Servo servoWrist, servoGripper, servoRotation;

// Variables de control
struct RobotPosition {
    int base = 90, shoulder = 90, elbow = 90;
    int wrist = 90, gripper = 0, rotation = 90;
};

RobotPosition currentPos, targetPos;
WebServer server(80);

// Función para leer distancia ultrasónica
float readDistance() {
    digitalWrite(ULTRASONIC_TRIG_PIN, LOW);
    delayMicroseconds(2);
    digitalWrite(ULTRASONIC_TRIG_PIN, HIGH);
    delayMicroseconds(10);
    digitalWrite(ULTRASONIC_TRIG_PIN, LOW);
    
    long duration = pulseIn(ULTRASONIC_ECHO_PIN, HIGH);
    return (duration * 0.034) / 2;
}

// Control suave de servomotores
void smoothMove() {
    currentPos.base += (targetPos.base - currentPos.base) * 0.1;
    currentPos.shoulder += (targetPos.shoulder - currentPos.shoulder) * 0.1;
    currentPos.elbow += (targetPos.elbow - currentPos.elbow) * 0.1;
    
    servoBase.write(currentPos.base);
    servoShoulder.write(currentPos.shoulder);
    servoElbow.write(currentPos.elbow);
}

// Página web de control
void handleRoot() {
    String html = "Robot Control";
    html += "

Control del Brazo Robótico

"; html += "

Posición Base: " + String(currentPos.base) + "°

"; html += "

Distancia: " + String(readDistance()) + " cm

"; html += ""; server.send(200, "text/html", html); } void setup() { Serial.begin(115200); // Configurar servos servoBase.attach(13); servoShoulder.attach(12); servoElbow.attach(14); servoWrist.attach(27); servoGripper.attach(26); servoRotation.attach(25); // Configurar pines de sensor pinMode(ULTRASONIC_TRIG_PIN, OUTPUT); pinMode(ULTRASONIC_ECHO_PIN, INPUT); pinMode(JOYSTICK_BTN_PIN, INPUT_PULLUP); // Conectar WiFi WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Conectando a WiFi..."); } Serial.println("IP: " + WiFi.localIP().toString()); // Configurar servidor web server.on("/", handleRoot); server.begin(); // Posición inicial smoothMove(); } void loop() { server.handleClient(); // Leer joystick int joyX = analogRead(JOYSTICK_X_PIN); int joyY = analogRead(JOYSTICK_Y_PIN); bool joyBtn = !digitalRead(JOYSTICK_BTN_PIN); // Mapear a ángulos de servo targetPos.base = map(joyX, 0, 4095, 0, 180); targetPos.shoulder = map(joyY, 0, 4095, 0, 180); // Control de gripper con botón if (joyBtn) { targetPos.gripper = 180; // Cerrar } else { targetPos.gripper = 0; // Abrir } // Verificar obstáculos float distance = readDistance(); if (distance < 10) { // Si hay obstáculo < 10cm Serial.println("¡OBSTÁCULO DETECTADO!"); // Detener movimiento hacia adelante } else { smoothMove(); } // Debug Serial.printf("Joy: X=%d Y=%d Btn=%d | Dist=%.1fcm\n", joyX, joyY, joyBtn, distance); delay(50); }

Troubleshooting y Diagnóstico

Servomotor no responde
Alto

El servomotor no se mueve o tiene movimientos erráticos cuando se controla con el joystick.

Pasos de solución:
  1. Verificar conexiones PWM del ESP32 al servo
  2. Comprobar alimentación externa (5V, 2A mínimo)
  3. Validar frecuencia PWM (50Hz) en código
  4. Probar servo con código de prueba simple
Joystick descalibrado
Medio

Los valores del joystick no corresponden correctamente a los movimientos del servo.

Pasos de solución:
  1. Leer valores en reposo del joystick (Serial Monitor)
  2. Ajustar función map() según rangos reales
  3. Implementar zona muerta central (deadzone)
  4. Suavizar lectura con promedio móvil
Consumo excesivo de corriente
Alto

El sistema se reinicia o los servos se comportan de manera inestable por falta de alimentación.

Pasos de solución:
  1. Usar fuente externa mínimo 5V/3A
  2. Separar alimentación ESP32 y servos
  3. Añadir capacitores de filtrado (1000µF)
  4. Limitar velocidad de movimiento simultáneo
Interferencia en comunicación
Medio

Pérdida de conexión WiFi o lecturas erráticas de sensores durante operación de servos.

Pasos de solución:
  1. Separar cables de potencia de señales
  2. Usar cables blindados para señales críticas
  3. Añadir ferrites en cables de alimentación
  4. Implementar reconexión automática WiFi

Criterios de Evaluación

Ensamblaje Mecánico
25%
  • Conexiones físicas correctas y seguras
  • Montaje estable del brazo robótico
  • Organización de cableado
  • Alimentación apropiada del sistema
Programación y Control
35%
  • Implementación correcta de señales PWM
  • Mapeo adecuado de joystick a servos
  • Suavizado de movimiento implementado
  • Código bien estructurado y documentado
Funcionalidad del Sistema
25%
  • Control preciso y responsivo
  • Rango completo de movimiento
  • Estabilidad durante operación
  • Integración de características adicionales
Análisis y Documentación
15%
  • Comprensión de principios técnicos
  • Identificación y solución de problemas
  • Documentación del proceso
  • Propuestas de mejora
Referencias y Documentación