En este proyecto construiremos un robot autónomo arduino que puede detectar automáticamente un obstáculo en frente de él y evitarlo girando en otra dirección.
Dificultad: Avanzada
Usaremos un Sensor Ultrasónico para censar los obstáculos en su paso calculando la distancia entre el robot y el obstáculo. Si el robot encuentra un objeto cambia su dirección y continúa moviéndose. Adicionalmente el sensor ultrasónico se encuentra instalado en una base que gira mediante un servo motor para poder aumentar el ángulo de visión del sensor.
Cómo usar el sensor ultrasónico para evitar obstáculos
Antes de comenzar a construir el robot, es importante entender cómo el sensor ultrasónico funciona ya que es una parte crucial para este proyecto. El principio básico detrás del funcionamiento del sensor es medir el tiempo que toma en transmitir un haz ultrasónico y recibir el mismo haz luego de rebotar en usa superficie. En este proyecto se utiliza el sensor ultrasónico HC-SR04, que es de costo accesible y gran disponibilidad en el mercado.
El funcionamiento básico, sin adentrarse en la parte más teórica, es el siguiente demostrado en el diagrama:
Aquí se puede observar que el Arduino envía una señal al sensor para emitir el haz ultrasónico, el mismo rebota en el objeto y lo escucha el sensor, devolviendo la señal al Arduino y éste, mediante una fórmula, calcula la distancia del objeto.
Utilizaremos una librería de Arduino para poder programar el funcionamiento del sensor.
Componentes necesarios:
- Kit de robótica de Arduino. En este kit está incluido el Arduino UNO, sensor ultrasónico, motores, ruedas, cables de conexión, acrílicos y tornillos y demás para el armado de chasis.
- Soldador de estaño y estañolin.
- Precintos.
Ensamblaje del chasis
En nuestro kit de robótica Arduino podemos encontrar un manual de instrucciones para el ensamblaje del chasis del auto.
PASO A PASO PARA EL ARMADO DEL ROBOT
COLOCAR MOTORES Y RUEDAS
Estos motores nos permitirán girar a la derecha y a la izquierda, avanzar y retroceder con la ayuda de la programación del Arduino y de la placa de drivers.
Colocar ruedas de tracción delantera.
Colocar pilares de bronce en rueda trasera. La rueda trasera tiene como propósito proporcionar un tercer punto de apoyo con el piso para proporcionar estabilidad en el auto. Esta rueda no tiene motor.
Sujetar rueda en chasis del auto con tornillos.
ARMAR BASE GIRATORIA CON SERVO MOTOR
Esta base en conjunto con el servo motor permitirá girar el ángulo del sensor ultrasónico, la programación está configurada para que cuando encuentre un objeto haga un giro observando izquierda y derecha para determinar el siguiente movimiento.
Tomar ambas piezas impresas en 3D, el sensor ultrasónico, el servomotor y los tornillos que se pueden observar en la foto.
Nota: Los soportes para el servomotor y el sensor ultrasónico son piezas impresas en 3D, por lo que pueden tener pequeñas imperfecciones como pequeños pedacitos de plásticos sobresalientes. Se recomienda quitar estos con un cutter o una lija.
Sujetar el soporte de sensor ultrasónico en el chasis acrílico con dos tornillos con tuercas.
El sensor ultrasónico se coloca deslizándolo en el soporte impreso en 3D. No necesita tornillos de sujeción.
COLOCAR PLACA ARDUINO UNO
La placa Arduino Uno es el cerebro de este proyecto. En esta placa cargaremos el código programado.
Primero colocamos los pilares separadores y luego sujetamos la placa con tornillos.
En caso de no tener los pilares de bronce se puede utilizar precintos.
COLOCAR SHIELD DE SENSORES EN ARDUINO UNO
Este shield sirve para facilitar el pinout del arduino uno y así facilitar la conexión con el sensor, servo motor, motores, etc.
Simplemente se enchufa el shield en el Arduino Uno, respetando el orden de los pines.
COLOCAR BOTON DE ENCENDIDO
Este botón nos servirá para apagar o prender nuestro robot, el mismo corta la corriente de alimentación de los motores, como se observará en el diagrama.
COLOCAR PLACA DRIVER DE MOTORES
La placa driver sirve para controlar la potencia que necesitan los motores, ya que no podemos conectar el motor directamente a la placa arduino.
COLOCAR PORTA PILAS
Este porta pilas sirve para colocar las pilas que serviran para alimentar los motores del robot.
CIRCUITO
Ahora podemos observar el diagrama de conexiones del robot:
Cabe destacar que algunas de las conexiones se deberán realizar con un soldador y estaño por ejemplo en los motores y botón de encendido.
Una vez realizadas las conexiones se recomienda revisar las polaridades y el orden correcto antes de encender el circuito.
¡TERMINAMOS! Te mostramos el robot con las conexiones realizadas y los cables organizados.
PROGRAMACION
A continuación, se muestra el código de programación, simplemente copiamos y pegamos en nuestro Arduino IDE:
O descárgalo del siguiente link: DESCARGAR
También adjuntamos el archivo de fuente para abrirlo directamente en tu Arduino IDE.
#include <Servo.h> //Librería del Servo motor. Esta es una librería estandar
#include <NewPing.h> //Librería para sensor ultrasónico, Esta librería se debe instalar previamente
//Pines de control para placa driver L298N
const int LeftMotorForward = 5;
const int LeftMotorBackward = 4;
const int RightMotorForward = 3;
const int RightMotorBackward = 2;
//Pines del sensor
#define trig_pin A1 //analog input 1
#define echo_pin A2 //analog input 2
#define maximum_distance 200
boolean goesForward = false;
int distance = 100;
NewPing sonar(trig_pin, echo_pin, maximum_distance); //sensor function
Servo servo_motor; //our servo name
void setup(){
pinMode(RightMotorForward, OUTPUT);
pinMode(LeftMotorForward, OUTPUT);
pinMode(LeftMotorBackward, OUTPUT);
pinMode(RightMotorBackward, OUTPUT);
servo_motor.attach(11); //our servo pin
servo_motor.write(90);
delay(2000);
distance = readPing();
delay(100);
distance = readPing();
delay(100);
distance = readPing();
delay(100);
distance = readPing();
delay(100);
}
void loop(){
int distanceRight = 0;
int distanceLeft = 0;
delay(50);
if (distance <= 20){
moveStop();
delay(300);
moveBackward();
delay(400);
moveStop();
delay(300);
distanceRight = lookRight();
delay(300);
distanceLeft = lookLeft();
delay(300);
if (distance >= distanceLeft){
turnRight();
moveStop();
}
else{
turnLeft();
moveStop();
}
}
else{
moveForward();
}
distance = readPing();
}
int lookRight(){
servo_motor.write(10);
delay(500);
int distance = readPing();
delay(100);
servo_motor.write(90);
return distance;
}
int lookLeft(){
servo_motor.write(170);
delay(500);
int distance = readPing();
delay(100);
servo_motor.write(90);
return distance;
delay(100);
}
int readPing(){
delay(70);
int cm = sonar.ping_cm();
if (cm==0){
cm=250;
}
return cm;
}
void moveStop(){
digitalWrite(RightMotorForward, LOW);
digitalWrite(LeftMotorForward, LOW);
digitalWrite(RightMotorBackward, LOW);
digitalWrite(LeftMotorBackward, LOW);
}
void moveForward(){
if(!goesForward){
goesForward=true;
digitalWrite(LeftMotorForward, HIGH);
digitalWrite(RightMotorForward, HIGH);
digitalWrite(LeftMotorBackward, LOW);
digitalWrite(RightMotorBackward, LOW);
}
}
void moveBackward(){
goesForward=false;
digitalWrite(LeftMotorBackward, HIGH);
digitalWrite(RightMotorBackward, HIGH);
digitalWrite(LeftMotorForward, LOW);
digitalWrite(RightMotorForward, LOW);
}
void turnRight(){
digitalWrite(LeftMotorForward, HIGH);
digitalWrite(RightMotorBackward, HIGH);
digitalWrite(LeftMotorBackward, LOW);
digitalWrite(RightMotorForward, LOW);
delay(500);
digitalWrite(LeftMotorForward, HIGH);
digitalWrite(RightMotorForward, HIGH);
digitalWrite(LeftMotorBackward, LOW);
digitalWrite(RightMotorBackward, LOW);
}
void turnLeft(){
digitalWrite(LeftMotorBackward, HIGH);
digitalWrite(RightMotorForward, HIGH);
digitalWrite(LeftMotorForward, LOW);
digitalWrite(RightMotorBackward, LOW);
delay(500);
digitalWrite(LeftMotorForward, HIGH);
digitalWrite(RightMotorForward, HIGH);
digitalWrite(LeftMotorBackward, LOW);
digitalWrite(RightMotorBackward, LOW);
}
Fuentes:
https://www.youtube.com/watch?v=4CFO0MiSlM8
https://circuitdigest.com/microcontroller-projects/arduino-obstacle-avoding-robot