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.
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.
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.
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.
#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
Objetivo: Implementar control directo de un servomotor usando entrada analógica del joystick.
Materiales:
- ESP32 DevKit
- Joystick analógico
- Servomotor SG90
- Protoboard y cables
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
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
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
#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
AltoEl servomotor no se mueve o tiene movimientos erráticos cuando se controla con el joystick.
Pasos de solución:
- Verificar conexiones PWM del ESP32 al servo
- Comprobar alimentación externa (5V, 2A mínimo)
- Validar frecuencia PWM (50Hz) en código
- Probar servo con código de prueba simple
Joystick descalibrado
MedioLos valores del joystick no corresponden correctamente a los movimientos del servo.
Pasos de solución:
- Leer valores en reposo del joystick (Serial Monitor)
- Ajustar función
map()
según rangos reales - Implementar zona muerta central (deadzone)
- Suavizar lectura con promedio móvil
Consumo excesivo de corriente
AltoEl sistema se reinicia o los servos se comportan de manera inestable por falta de alimentación.
Pasos de solución:
- Usar fuente externa mínimo 5V/3A
- Separar alimentación ESP32 y servos
- Añadir capacitores de filtrado (1000µF)
- Limitar velocidad de movimiento simultáneo
Interferencia en comunicación
MedioPérdida de conexión WiFi o lecturas erráticas de sensores durante operación de servos.
Pasos de solución:
- Separar cables de potencia de señales
- Usar cables blindados para señales críticas
- Añadir ferrites en cables de alimentación
- 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