Robot evasor de obstáculos con servo: Construcción con Arduino y HC-SR04
Componentes y suministros
| Arduino UNO | 1 |
| Motor micro-servo SG90 | 1 |
| Sensor ultrasónico SparkFun HC-SR04 | 1 |
| Kit chasis robot 2WD con motores DC | 1 |
| Cables jumper (genéricos) | 1 |
| Arduino Motor Shield Rev3 | 1 |
Herramientas necesarias
- Soldador (genérico)
Aplicaciones y servicios online
- Arduino IDE
Sobre el proyecto
Soy estudiante de Diseño de Artes Multimedia en la Universidad Multimedia, Cyberjaya, Malasia. Este es mi tercer año estudiando Artes Multimedia; la asignatura de Diseño de Interacción enseña a los estudiantes cómo usar componentes de Arduino y cómo funcionan. Para mi trabajo final, elegí un robot evasor de obstáculos como proyecto personal para aprender el funcionamiento de cada componente.
Paso 1: Preparar y construir el chasis del robot
Dentro del paquete vienen varios componentes: chasis, dos motores, dos ruedas, una rueda delantera, un portapilas, algunos tornillos, un interruptor y cables jumper.

Paso 2: Probar componentes y soldar cables a los motores
Antes de soldar los cables jumper a ambos motores, recomiendo probar cada componente para asegurar su correcto funcionamiento: ambos motores DC, placa Arduino, Motor Shield, servo y sensor ultrasónico. Luego soldaremos los cables rojo y negro en ambos motores.

Paso 3: Preparar portapilas e interruptor
Cortamos a la mitad el cable negro del portapilas y soldamos un lado en un orificio y el otro cable negro en el otro orificio. ¡Nuestro interruptor está listo!
Paso 4: Apilar Arduino y Motor Shield
Apilamos la placa Motor Shield sobre la placa Arduino.

Paso 5: Conectar motores al Motor Shield
El Motor Shield proporciona energía a los motores y al servo; puede suministrar hasta 600 mA por motor. Soldamos/fijamos los cables de los motores DC al Motor Shield. Si los cables no alcanzan, usamos cables jumper externos (cortamos la punta para exponer el cobre) y los soldamos a los cables de los motores.

Conectamos el motor izquierdo al conector M1 y el derecho al M3 del Motor Shield.

Paso 6: Conectar batería e interruptor al Motor Shield

Preparamos cables jumper macho y hembra para soldarlos a 5V, GND, Pin Analógico 4 y Pin Analógico 5. Usamos cables del mismo color para identificar fácilmente cada conexión: blanco para 5V, negro para GND, naranja para Pin Analógico 5, marrón para Pin Analógico 4.

Paso 7: Fijar placas al chasis
Usamos cinta de doble cara o pistola de silicona caliente para fijar ambas placas al chasis.
Paso 8: Conectar sensor ultrasónico
Conectamos los cables preparados: blanco (5V) a VCC, negro (GND) a GND, marrón (Pin Analógico 4) a Echo, naranja (Pin Analógico 5) a TRIG.

Paso 9: Conectar servo
Conectamos el servo al slot servo_2. Nota: existen varios tipos de servos; consulta online cómo conectar tu modelo específico.

Último paso: Código
Necesitamos 3 librerías: AFMotor para el Motor Shield, NewPing para el sensor ultrasónico y el propio Arduino IDE. Los enlaces de descarga están en el proyecto original.
El código completo se muestra a continuación. Cópialo y pégalo en el Arduino IDE y súbelo a tu placa.
#include <AFMotor.h>
#include <Servo.h>
#include <NewPing.h>
#define TRIG_PIN A4
#define ECHO_PIN A5
#define MAX_DISTANCE_POSSIBLE 1000
#define MAX_SPEED 150
#define COLL_DIST 20
#define TURN_DIST COLL_DIST+10
NewPing sonar(TRIG_PIN, ECHO_PIN, MAX_DISTANCE_POSSIBLE);
AF_DCMotor leftMotor(3, MOTOR12_8KHZ);
AF_DCMotor rightMotor(1, MOTOR12_8KHZ);
Servo neckControllerServoMotor;
int pos = 0;
int maxDist = 0;
int maxAngle = 0;
int maxRight = 0;
int maxLeft = 0;
int maxFront = 0;
int course = 0;
int curDist = 0;
String motorSet = "";
int speedSet = 0;
void setup() {
neckControllerServoMotor.attach(10);
neckControllerServoMotor.write(90);
delay(2000);
checkPath();
motorSet = "FORWARD";
neckControllerServoMotor.write(90);
moveForward();
}
void loop() {
checkForward();
checkPath();
}
void checkPath() {
int curLeft = 0;
int curFront = 0;
int curRight = 0;
int curDist = 0;
neckControllerServoMotor.write(144);
delay(120);
for(pos = 144; pos >= 36; pos-=18) {
neckControllerServoMotor.write(pos);
delay(90);
checkForward();
curDist = readPing();
if (curDist < COLL_DIST) {
checkCourse();
break;
}
if (curDist < TURN_DIST) {
changePath();
}
if (curDist > curDist) {maxAngle = pos;}
if (pos > 90 && curDist > curLeft) { curLeft = curDist;}
if (pos == 90 && curDist > curFront) {curFront = curDist;}
if (pos < 90 && curDist > curRight) {curRight = curDist;}
}
maxLeft = curLeft;
maxRight = curRight;
maxFront = curFront;
}
void setCourse() {
if (maxAngle < 90) {turnRight();}
if (maxAngle > 90) {turnLeft();}
maxLeft = 0;
maxRight = 0;
maxFront = 0;
}
void checkCourse() {
moveBackward();
delay(500);
moveStop();
setCourse();
}
void changePath() {
if (pos < 90) {lookLeft();}
if (pos > 90) {lookRight();}
}
int readPing() {
delay(70);
unsigned int uS = sonar.ping();
int cm = uS/US_ROUNDTRIP_CM;
return cm;
}
void checkForward() {
if (motorSet=="FORWARD") {leftMotor.run(FORWARD); rightMotor.run(FORWARD); }
}
void checkBackward() {
if (motorSet=="BACKWARD") {leftMotor.run(BACKWARD); rightMotor.run(BACKWARD); }
}
void moveStop() {leftMotor.run(RELEASE); rightMotor.run(RELEASE);}
void moveForward() {
motorSet = "FORWARD";
leftMotor.run(FORWARD);
rightMotor.run(FORWARD);
for (speedSet = 0; speedSet < MAX_SPEED; speedSet +=2) {
leftMotor.setSpeed(speedSet+MOTORS_CALIBRATION_OFFSET);
rightMotor.setSpeed(speedSet);
delay(5);
}
}
void moveBackward() {
motorSet = "BACKWARD";
leftMotor.run(BACKWARD);
rightMotor.run(BACKWARD);
for (speedSet = 0; speedSet < MAX_SPEED; speedSet +=2) {
leftMotor.setSpeed(speedSet+MOTORS_CALIBRATION_OFFSET);
rightMotor.setSpeed(speedSet);
delay(5);
}
}
void turnRight() {
motorSet = "RIGHT";
leftMotor.run(FORWARD);
rightMotor.run(BACKWARD);
delay(400);
motorSet = "FORWARD";
leftMotor.run(FORWARD);
rightMotor.run(FORWARD);
}
void turnLeft() {
motorSet = "LEFT";
leftMotor.run(BACKWARD);
rightMotor.run(FORWARD);
delay(400);
motorSet = "FORWARD";
leftMotor.run(FORWARD);
rightMotor.run(FORWARD);
}
void lookRight() {rightMotor.run(BACKWARD); delay(400); rightMotor.run(FORWARD);}
void lookLeft() {leftMotor.run(BACKWARD); delay(400); leftMotor.run(FORWARD);}
Esquemáticos
Proceso de manufactura
- Simple Pi Robot: Construye un Rover Autónomo 2‑WD con Raspberry Pi
- Robot Seguidor de Línea Autónomo con Arduino UNO: Guía Paso a Paso
- Controla tu Roomba Create 2 con Arduino y Android: Guía Completa
- Control Preciso de Servo con Arduino y MPU6050 (SG90 / MG996R)
- Robot Asistente Doméstico Autónomo "O'nine" – Integración ROS, Alexa y Brazo Robótico
- Brazo Robótico Arduino Controlado por Gestos Manuales – Construcción Paso a Paso
- Controla tu brazo robótico Arduino con app Android dedicada
- Robot comedero con Arduino Nano: Guía paso a paso
- Kit de Robot de Navegación Interior Inteligente para Proyectos Arduino
- Motores servo: funcionamiento, tipos y por qué son importantes
- Maximizando la precisión: Acoplamiento de reductores con servomotores