Introducción

En este tutorial daremos un paso más y explicaremos el procedimiento para crear nuestro primer robot móvil con Arduino usando nuestros conocimientos previos adquiridos tras la lectura de los correspondientes artículos publicados en este blog, sobre el sensor de ultrasonidos HC-SR04 (ver artículo) y sobre los motores de corriente continua (ver artículo) para crear un interesante robot móvil en el que usaremos los 2 componentes de manera sincronizada. Este es un diseño básico sobre el que se han realizado mejoras que pueden seguirse en el artículo Arduino: "Robot esquiva obstáculos (posibles mejoras)"
El objetivo de nuestro proyecto será crear un robot móvil que avance recto mientras no detecte la presencia de un obstáculo. En caso de detectar algún obstáculo en su camino debe ir girando sobre sí mismo hasta que esquive el osbtáculo y pueda seguir su camino. El sensor HC-SR04 nos permitirá percibir la presencia de un obstáculo y con el control de los motores de corriente continua podremos accionar nuestro robot para avanzar y girar ante los obstáculos.
sensor ultrasonico explicacionrobotesquivaobstaculos

Material necesario

Nombre Imagen Descripción
Plataforma universal robótica chasisrobotica

La plataforma que nos permitirá conseguir el movimiento de nuestro robot está compuesta por los siguientes elementos:

  • 2 motores de corriente continua (motor CC) acoplados a ruedas neumáticas se encargan de dar tracción
  • Una rueda loca central permitirá que pueda girar.
  • El portapilas de 4 pilas AA nos permitirá alimentar nuestro dispositivo.
  • Una base de contrachapado hará de chasis
Placa Arduino Uno arduino uno large comp Placa Arduino Uno (o cualquier otra versión) 
Protoboard, breadboard o placa de conexiones protoboard Placa de conexiones o protoboard que usaremos en el montaje de circuitos eléctrico-electrónico para ahorrar y simplificar el cableado. Para aprender algo más sobre el uso de este dispositivo pulsa aquí
1 driver L298n
driverl298n

El driver L298n nos permitirá gobernar los motores de corriente continua con las ruedas acopladas y, por tanto, gobernar el movimiento de nuestro vehículo. Se recomienda leer el artículo para más información.

1 sensor de ultrasonidos HC-SR04 HCSR04 El sensor de ultrasonidos nos permitirá detectar la presencia de un objeto a una determinada distancia lo que será usado como sensor de distancia que permita a nuestro robot detectar los obstáculos para, con posterioridad, poder esquivarlos. Se recomienda leer el artículo para más información sobre el funcionamiento de este sensor.
Cables de conexiones entre los componentes, la placa de pruebas y Arduino cables Estos cables nos permiten conectar de manera sencilla todos los elementos del circuito.

Circuito eléctrico (diagrama de conexiones)

Dado que en otras sesiones ya trabajamos con el driver L298n para controlar 2 motores de corriente contínua y con el sensor de ultrasonidos HC-SR04 para detectar la presencia de osbtáculos, combinaremos la circuitería de ambos circuitos para crear nuestro proyecto conjunto.

A continuación realizaremos el esquema en el que alimentaremos el driver L298n y los motores con una fuente de alimentación externa (en nuestro caso 4 pilas AA que nos proporcionan un voltaje de 6 V aunque existirían mejores y más caras opciones (leer artículo sobre alimentación de la placa Arduino)) por lo que. nuestro vehículo se podría mover sin tener que estar conectado a la red. A continuación se muestran 2 versiones con la diferencia de que en la segunda se usará la placa de pruebas para poder introducir en el futuro más sensores o actuadores.

robotcircuitocompleto
RobotEsquivaCircuitoCompletoPlaca

Código programa Arduino

En este primer ejemplo usaremos un código muy sencillo que no usa librerías externas y que solo usa las funciones nativas de la IDE de Arduino y dejaremos el uso de programas más complejos para siguientes ocasiones.

/*
  Nombre: Robot esquivaobstáculos
  Autor: Daniel Pascual Gallegos
  Fecha: Noviembre 2016
  Funcionalidad: Este subproyecto forma parte de la construcción de nuestro robot autónomo.
  En este subproyecto usaremos el driver L298n para gobernar 2 motores de CC que realizarán
  la parte mecánica de nuestro robot móvil.
  En este subproyecto nuestro robot irá recto y cuando encuentre un obstáculo a menos de 5 cm
  girará en sentido horario hasta que esquive el obstáculo y siga su camino 
*/
// Definición de variables y constantes relacionadas con el motor izquierdo
const int IN1 = 13;  // Pin digital 13 para controlar sentido giro motor izquierdo
const int IN2 = 12;  // Pin digital 12 para controlar sentido giro motor izquierdo

// Definición de variables y constantes relacionadas con el motor derecho
const int IN3 = 11;  // Pin digital 11 para controlar sentido giro motor izquierdo
const int IN4 = 10;  // Pin digital 10 para controlar sentido giro motor izquierdo

// Este programa usará el sensor de ultrasonidos HCSR04 
// para medir la distancia a la que se encuentran // diferentes obstáculos en centímetros y mostrarlo por el puerto serie. const int triggerEmisor = 3; const int echoReceptor = 2; const int valorUmbral = 20; long tiempoEntrada; // Almacena el tiempo de respuesta del sensor de entrada float distanciaEntrada; // Almacena la distancia en cm a la que se encuentra el objeto // Función que se ejecuta una sola vez al cargar el programa void setup() { // Se declaran todos los pines como salidas pinMode (IN1, OUTPUT); pinMode (IN2, OUTPUT); pinMode (IN3, OUTPUT); pinMode (IN4, OUTPUT); pinMode(triggerEmisor,OUTPUT); // El emisor emite por lo que es configurado como salida pinMode(echoReceptor,INPUT); // El receptor recibe por lo que es configurado como entrada Serial.begin(9600); // Inicia el puerto de comunicaciones en serie } // Función que se repite de manera periódica void loop() { sensorUltrasonidos(); // Si el valor de la distancia es menor que 5 cm se para y sigue recto en caso contrario if(distanciaEntrada>valorUmbral) { robotAvance(); } else { robotDerecha (); } } /* Función sensorUltrasonidos: para medir la longitud del pulso entrante.
Mide el tiempo que transcurrido entre el envío del pulso ultrasónico
y cuando el sensor recibe el rebote,
es decir: desde que el pin echo empieza a recibir el rebote, HIGH,
hasta que deja de hacerlo, LOW, la longitud del pulso entrante. */ void sensorUltrasonidos() { // Se inicializa el sensor de infrasonidos digitalWrite(triggerEmisor,LOW); // Para estabilizar delayMicroseconds(10); // Comenzamos las mediciones // Se envía una señal activando la salida trigger durante 10 microsegundos digitalWrite(triggerEmisor, HIGH); // envío del pulso ultrasónico delayMicroseconds(10); tiempoEntrada=pulseIn(echoReceptor, HIGH); distanciaEntrada= int(0.017*tiempoEntrada); // Fórmula para calcular la distancia en cm Serial.println("El valor de la distancia es "); Serial.println(distanciaEntrada); delay(200); } /* Función robotAvance: esta función hará que ambos motores se activen a máxima potencia por lo que el robot avanzará hacia delante */ void robotAvance() { // Motor izquierdo // Al mantener un pin HIGH y el otro LOW el motor gira en un sentido digitalWrite (IN1, HIGH); digitalWrite (IN2, LOW); // Motor derecho // Al mantener un pin HIGH y el otro LOW el motor gira en un sentido digitalWrite (IN3, HIGH); digitalWrite (IN4, LOW); } /* Función robotRetroceso: esta función hará que ambos motores se activen a máxima potencia
en sentido contrario al anterior por lo que el robot avanzará hacia atrás */ void robotRetroceso() { // Motor izquierdo // Al mantener un pin LOW y el otro HIGH el motor gira en sentido contrario al anterior digitalWrite (IN1, LOW); digitalWrite (IN2, HIGH); // Motor derecho // Al mantener un pin LOW y el otro HIGH el motor gira en sentido contrario al anterior digitalWrite (IN3, LOW); digitalWrite (IN4, HIGH); } /* Función robotDerecha: esta función acccionará el motor izquierdo y parará el derecho por lo que el coche girará hacia la derecha (sentido horario) */ void robotDerecha() { // Motor izquierdo // Se activa el motor izquierdo digitalWrite (IN1, HIGH); digitalWrite (IN2, LOW); // Motor derecho // Se para el motor derecho digitalWrite (IN3, LOW); digitalWrite (IN4, LOW); } /* Función robotIzquierda: esta función acccionará el motor derecho y parará el izquierdo por lo que el coche girará hacia la izquierda (sentido antihorario) */ void robotIzquierda () { // Motor izquierdo // Se para el motor izquierdo digitalWrite (IN1, LOW); digitalWrite (IN2, LOW); // Motor derecho // Se activa el motor derecho digitalWrite (IN3, HIGH); digitalWrite (IN4, LOW); } /* Función robotParar: esta función parará ambos motores por lo que el robot se parará. */ void robotParar() { // Motor izquierdo // Se para el motor izquierdo digitalWrite (IN1, LOW); digitalWrite (IN2, LOW); // Motor derecho // Se para el motor derecho digitalWrite (IN3, LOW); digitalWrite (IN4, LOW); }

Código mBlock

En el siguiente programa mBlock se muestra la funcionalidad del proyecto. Puedes pinchar este enlace para descargar el programa (robotesquivaobstaculos.sb2)

robotesquivaobstaculosmBlockFinal
Física 2º Bachillerato
Apuntes propios y ejercicios de EvAU resueltos
Física y Química 1º Bachillerato
Apuntes propios y ejercicios resueltos
Física y Química 2º ESO
Apuntes propios y ejercicios resueltos
Física y Química 3º ESO
Apuntes propios y ejercicios resueltos
Física y Química 4º ESO
Apuntes propios y ejercicios resueltos
Robótica
Proyectos de robótica basados en Arduino
Tecnología y programación
Tutoriales, proyectos técnicos y mucho más.