Blog Search

Recent Articles

Robot autónomo esquiva objetos

Robot autónomo esquiva objetos

Robot autónomo esquiva objetos.


En esta ocasión os traemos un post para desarrollar tu propio robot capaz de esquivar objetos. Este robot es una opción estupenda para los que quieran iniciarse en el mundo de la robótica ya que usa motores de corriente continua, controlador de motores, Arduino y sensor de distancia por ultrasonidos. Despues de terminar este proyecto se abrirán las puertas de muchos otros proyectos más complejos.

Material necesario

Arduino Leantec -Arduino UNO Rev3. 
HC-SR04 Leantec -Sensor de distancia HC-SR04.
adaptador leantec -Adaptador LRE-A
L298N leantec -Controlador de motores L298N. 
robot leantec -Chasis de robot 2WD.
cables leantec -10 cables de 20cm macho-hembra.
cables leantec -10 cables de 20cm macho-macho.

Conociendo el sensor HC-SR04 y el controlador de motores L298N

Sensor HC-SR04

Este sensor mide la distancia a la que se encuentran los objetos calculando el tiempo que tarda una señal de ultrasonidos en ir y volver a un objeto.

Características:

-Tensión de funcionamiento: 5V.
-Distancia de detección: 1 a 500 cm.
-Ángulo de detección: 20º.
-4 pines (Vcc, Echo, Triger, Gnd.)

Esquema de conexión

hc-sr04 arduino leantec
Librería.

Para facilitar el uso de este sensor tenemos esta librería

descarga librería sensor HC-SR04

Programa de test.

Una vez que tengamos el sensor conectado, cargamos el siguiente código en nuestro Arduino y comprobamos que las medidas recogidas son las correctas.
// incluimos la librerias:
#include <Ultrasonic.h> 

Ultrasonic sensor(9,8,30000); // (Trig PIN,Echo PIN, microsegundos max "distancia máxima") 30000us = 5 metros

int distancia=0;//Declaramos la variable donde guardaremos la distancia


void setup() {
  
Serial.begin(9600);//Inicializamos el puerto serie    
  
}

void loop() {
  
  distancia=sensor.Ranging(CM);  // Medimos la distancia y la guardamos en la variable
  Serial.print("Distancia ");// Imprimimos la palabra distancia en el monitor serial
  Serial.print(distancia);// Imprimimos la variable distancia
  Serial.println(" cm");//Imprimimos las letras cm y saltamos de linea.
  delay (2000);//Esperamos 2 segundos para repetir el proceso.
  
    }

En la siguiente imagen tenemos un panatallazo del monitor serial cuando está corriendo el programa de test del sensor HC-SR04. En nuestro caso podemos comprobar como alternamos medidas más cortas y con otras más largas.

distancia hc-sr04 leantec

Controlador de motores L298N


Este controlador de motores permite manejar dos motores de corriente continua. Es una de las mejores soluciones que ofrece el mercado para el control de motores, ya que es capaz de controlar bastante potencia de forma segura y fácil.

Caracteristicas.

-Doble puente H.
-Alimentación de 6V a 48V
-Salida de 5V
-Intensidad por canal 2A.

Esquema de conexión.

l298n arduino leantec

Para facilitar en leantec desarrollamos esta librarría.


Nota: Visita nuestro Post COMO CONTROLAR DOS MOTORES DE CORRIENTE CONTINUA para aprender más sobre este controlador.

Programa de test

Una vez que tengamos el driver conectado, cargamos el siguiente código en nuestro Arduino y comprobamos que los motores giren en el sentido esperado.
#include <LEANTEC_ControlMotor.h>//Incluimos la librería control de motores 
// Configuramos los pines que vamos a usar
ControlMotor control(2,3,7,4,5,6); // MotorDer1,MotorDer2,MotorIzq1,MotorIzq2,PWM_Derecho,PWM_Izquierdo

int velocidad=150;//Declaramos una variable para guardar la velocidad. 150 es la velocidad en la que empezará.

void setup() 
{ //En esta ocasión no necesitamos configurar pines ya que la librería lo hace.
} 
 
void loop() 
{//Un motor gira en sentido horario y el otro antihorario
//Si estuvierán montados en un robot el robot avanzaria. 
 while(velocidad<254){
 velocidad++;
 control.Motor(velocidad,1); 
 delay (200);}
//Un motor gira en sentido horario y el otro antihorario
//Si estuvierán montados en un robot el robot retrocedería. 
  control.Motor(-180,1);
  delay(3000);
//Los dos motores giran en sentido horario.
//Si estuvieran montados en un robot este giraria a la derecha. 
  control.Motor(200,100);
  delay(3000);
//Los dos motores giran en sentido antihorario.
//Si estuvieran montados en un robot este giraria a la derecha.  
  control.Motor(200,-100);
  delay(3000);
//Los motores se paran.
  control.Motor(0,1);
  delay(3000);
  
  velocidad=150;//Reseteamos la velocidad
  }

Montaje del chasis.

Una vez que ya hemos conocido los principales componentes de nuestro robot, empezamos con el montaje.
El primer paso, sería montar el chasis de dos ruedas 2WD. Como anotación, decir, que este robot tambien podría ser montado sobre el chasis de cuatro ruedas 4WD.

Vídeo-tutorial.

Despues montamos la electrónica sobre el chasis de forma que todo quede ordenado y accesible, para que así resulte más fácil localizar y resolver cualquier fallo si este apareciera.
Para instalar la electónica sobre el driver hemos usado silicona caliente para pegar el driver y el portapilas.(Se podría usar tambien cinta de doble cara) No usamos los agujeros que tiene el chasis por que estos son muy stadars y no queda la electróncia tan ordenada como deseamos. Estos agujeros los usamos solo para instalar Arduino.

En la siguiente imagen podemos ver como hacer la instalación con silicona caliente. Basta con aplicar un pequeño punto de silicona en el centro del componete que vayamos a instalar.


portapilas robot

Portapilas ya instalado.

portapilas

En el caso de Arduino, como hay agujeros que nos son utiles para su instalación, los usamos.

arduino leantec

En nuestro caso, pusimos unos separadores metálicos, aunque a alguno de ellos no se le puede roscar la tuerca por que los pines de Arduino están muy próximos.

arduino leantec

Esquema de conexión.

El siguiente esquema de conexión muestra como se conectan las diferentes placas que componen nuestro robot entre si.

conexión L298N leantec robot


 

Código.

En este proyecto hemos desarrollado dos códigos.
El código nº1 es más sencillo. Con este código cuando el robot este a una distancia de X centímetros de un objeto, se parará y girará en un sentido para así esquivarlo.

#include <LEANTEC_ControlMotor.h>//Incluimos la libreria para el control de motores.
// Configuramos los pines que vamos a usar.
ControlMotor control(2,3,7,4,5,6); // MotorDer1,MotorDer2,MotorIzq1,MotorIzq2,PWM_Derecho,PWM_Izquierdo.

#include <Ultrasonic.h>//Incluimos la libreria para el control del sensor HC-SR04.
Ultrasonic sensor(9,8,30000); // (Trig PIN,Echo PIN, microsegundos max "distancia máxima") 30000us = 5 metros.

int velocidad_de_medida=5;//Variable para ajustar la velocidad de medida del sensor.
long int distancia=0;//Variable para almacenar la distancia medida. 
int aleatorio=0;//Variable para guardar un valor aleatorio. 

void setup() 
{ 
Serial.begin(9600);//Iniciamos el puerto serie
 
} 
 
void loop() 
{ 
 
  
  control.Motor(150,1);//El robot avanza en linea recta a una velocidad de 150.  
  distancia=sensor.Ranging(CM);//Medimos la distancia y la guardamos en la variable

  delay(velocidad_de_medida);//Delay para controlar la velocidad de medida.
 
 //Las siguientes lineas de código son para hacer comprobaciones de que todo esta bien.
 Serial.print("No obstaculo ");//Imprime la palabra No obstaculo.
 Serial.println(distancia);//Imprime la distancia.
 Serial.print("aleatorio ");//Imprime la palabra aleatorio
 Serial.println(aleatorio);//Imprime la variable aleatorio

 aleatorio=random (2);//Funcion aleatoria para hacer que el robot no gire siempre en el mismo sentido.
  
  
  while(distancia<30){//Mientras la distancia sea menor que 30 se mantiene en este bucler
        
  
  delay(velocidad_de_medida);//Delay para controlar la velocidad de medida.
  control.Motor(0,1);//El robot se para durante un segundo                 
  distancia=sensor.Ranging(CM);
  delay(1000);

  if(aleatorio==0){//Si la variable aleatorio vale 0 entra en este bucle.
 Serial.print("dentro 0");//Imprime dentro 0 para comprobar que entro.
 Serial.println(distancia);//Imprime la variable distancia
 Serial.print("aleatorio ");//Imprime la palabra aleatorio.
 Serial.println(aleatorio);//Imprime la variable aleatorio.
 
  control.Motor(170,100);//El robot gira a la derecha durante medio segundo.
  delay(500);}
  
  if (aleatorio==1){//Si la variable aleatorio vale 1 entra en este bucle.
 Serial.print("dentro 1");//Imprime dentro 1 para comprobar que entro.
 Serial.println(distancia);//Imprime la variable distancia
 Serial.print("aleatorio ");//Imprime la palabra aleatorio.
 Serial.println(aleatorio);//Imprime la variable aleatorio.
 
  control.Motor(170,-100);//El robot gira a la izquierda durante medio segundo.
  delay(500);}
  }
} 

El código nº2, es un poco más complejo. En este código el robot mide constantemente la distancia de los objetos que lo rodean, para así ir variando y girando las ruedas paulatinamente y evitar el objeto sin casi la necesiadad de parar.

/*Codigo desarrollado por Leantec Robotics&Electronics. Queda permitido el uso de este código por cualquier usuario sin animo de lucro. 
Queda totalmete prohibido el uso de este código con fines comerciales o con animo de luro.*/

// Incluimos la librería de los motores
#include <LEANTEC_ControlMotor.h>
// Configuramos los pines que vamos a usar
ControlMotor control(2,3,7,4,5,6); // MotorDer1,MotorDer2,MotorIzq1,MotorIzq2,PWM_Derecho,PWM_Izquierdo

// Agregamos la librería del ultrasonido.
// Se puede descargar de http://www.ardublog.com/library-for-arduino-ultrasonic-ranging-hc-sr04/
#include <Ultrasonic.h>
// Configuramos los pones y el delay máximo (Distancia)
Ultrasonic sensor(9,8,30000);   // (Trig PIN,Echo PIN, microsegundos max "distancia máxima") 30000us = 5 metros


// Declaramos las variables
long distancia=0;                // Almacenamos la distancia en esta variable
int sentido=1;                   // Sentido en el que va girar el robot.

// Esta función se usa para parar los motores, mas que nada para ahorrar espacio y no poner tantas veces el mismo código.
// Se llama a la función indicando el tiempo que quiere que estén los motores parados
void parada(uint16_t tiempo){
  control.Motor(0, 0);  // Para los motores
  delay(tiempo);        // Espera el tiempo que se le indique.
}

//----------------------------- Configuramos Ardunio ---------------------------------------
//------------------------------------------------------------------------------------------
void setup(void){
  sentido=1;                   // Iniciamos sentido en positivo
}
//--------------------------- Arrancamos el programa ---------------------------------------
//------------------------------------------------------------------------------------------
void loop(void)
{

  distancia=sensor.Ranging(CM);  // Guardamos la distancia en la variable
  
  //--------------------------------------------- Si hay mas de 1,5 metros -------------------------------------------
  if(distancia > 150){          
    sentido *= -1;          // Invertimos el sentido para usarlo cuando haya menos de 1 mentro (1 x -1 = -1) o (-1 x -1 = 1)
    control.Motor(255, 0);  // Avanzamos en línea recta a máxima potencia
  }
  //----------------------------------------- Si hay entre 1 metro y 1,5 metros ---------------------------------------
  else if(distancia > 100) {// Avanzamos pero no cambiamos el sentido ya en esta función
    control.Motor(255, 0);  // Avanzamos en línea recta a máxima potencia
  }
  //-------------------------------------------- Si hay entre 80 cm y 1 metro -----------------------------------------
  else if(distancia > 80) {
    control.Motor(220, 20*sentido);  // Avanzamos un poco mas lento y vamos girando 20% en el sentido que esté memorizado 
  }
  //--------------------------------------------- Si hay entre 50 cm y 80 cm ------------------------------------------
  else if(distancia > 50) {
    control.Motor(200, 60*sentido);  // Avanzamos un poco mas lento y vamos girando 60% en el sentido que esté memorizado 
  }
  //--------------------------------------------- Si hay entre 10 cm y 50 cm ------------------------------------------
  else if(distancia > 10) {
     control.Motor(150, 100*sentido);delay(300); // Giramos sobre el eje del robot durante 300 ms en el sentido que esté memorizado a una velocidad de 150
     parada(200);     // Paramos el robot unos 200ms para que le de tiempo al ultrasonido de reacciona
  }
  //----------------------------------------------- Si hay menos de 10 cm ---------------------------------------------
  else{
    control.Motor(-200, 0);delay(300);            // Damos marcha atras en línea recta a una velocidad de 200 durante 300 ms
    control.Motor(200, 100*sentido);delay(200);   // Giramos sobre el eje a una velocidad de 200 con el sentido memorizado durante 200 ms
    parada(200);     // Paramos el robot unos 200ms para que le de tiempo al ultrasonido de reacciona                               
  }
 
}


Imágenes del montaje.


robot leantec

robot leantec

robot leantec arduino

Vídeo de muestra.

23Comentarios

    • Avatar
      Jonathan
      may 12, 2015

      Hola, acabo de recibir un robot 2WD, y los archivos que me descargo no puedo leerlos por que dice que están dañados. Un saludo

      • Avatar
        Antonio
        jun 13, 2015

        Efectivamente, no permite abrir los archivos, pero sí funcionan los del área general de descargas aquí: http://www.leantec.es/tienda/content/10-descargas

    • Avatar
      Antonio
      jun 21, 2015

      Tras montar el robot esquiva objetos, sólo se mueve la rueda izquierda y con muy poca fuerza (tengo que hacerla girar con la mano para que arranque y si pongo el robot en el suelo no tiene fuerza para moverse). La rueda derecha no llega a girar. Las tensiones medidas son 0.52V y 0.078V en las salidas hacia los motores izdo. y dcho.. He cambiado las entradas en el L298N pero la única rueda que sigue girando es la izquierda. He alimentado directamente los motores y ambos giran correctamente. ¿Creen que pueda ser un fallo en la placa del L298N?

      • Avatar
        Leantec Robotics&Electronics
        jun 23, 2015

        Hola Antonio, ¿Qué tal? Le he hecho llegar su incidencia a nuestro Servicio Técnico. Como desde aquí no podemos acceder a su email y para una solución más personal, nos han comentado que le hagas llegar una copia de este mensaje desde su email a la dirección tuproyecto@leantec.es (Servicio Técnico Leantec.es). Ellos ya están informados de la situación. Esperamos sus noticias. Un saludo, At. al Cliente Leantec.es

    • Avatar
      Miriam
      jun 27, 2015

      Hola! Existe alguna manera de controlar la velocidad del robot cuando avanza recto??

      • Avatar
        Leantec Robotics&Electronics
        jul 14, 2015

        Hola, si, si usas nuestra librería, en esta función: control.Motor(150,1);//El robot avanza en linea recta a una velocidad de 150. Solo hay que poner un 1 en el segundo hueco. El primer número indica la velocidad a la que se mueve el robot y el segundo el giro que hace. Para el giro solo hay que poner valores comprendidos entre -100 y 100, siendo -100 giro en un sentido y 100 giro en sentido contrario.

    • Avatar
      SERGIO
      feb 3, 2016

      Hola buenas, he montado un robot el cual tiene 4 ruedas en lugar de dos como los que muestran en las imágenes para un proyecto de robotica. Le he añadido el puente H sensor de proximidad y pantalla LCD, he realizado el conexionado en paralelo pero los motores no funcionan... esta alimentado a 9 v en puente en H y 5 v en arduino. Podrían decirme que puede suceder? Gracias

      • Avatar
        Manuel
        mar 12, 2016

        ¿ conseguiste solucionarlo ?

    • Avatar
      Manuel
      feb 5, 2016

      Las ruedas no giran en ningún sentido. Reviso código, cableado y alimentación y no consigo que hagan nada.

      • Avatar
        Leantec Robotics&Electronics
        mar 15, 2016

        Buenas Manuel. ¿Alimentas Arduino y el controlador de motores con dos baterías diferentes? Si es así, ten en cuenta que tienes que unir GND de Arduino con GND del controlador. Un saludo. Servicio técnico Leantec

    • Avatar
      Francisco
      feb 16, 2016

      En el esquemas conectas el pin del sensor HC-SR04 VCC al GND y el GND al 5V del arduino. Entiendo que esto es un fallo del esquema. Por favor aclararlo.

      • Avatar
        Leantec Robotics&Electronics
        mar 15, 2016

        Buenas Francisco. Como bien indicas, si es un fallo, lo solucionaremos. Muchas gracias por la indicación. Un saludo Servicio técnico Leantec

    • Avatar
      jesus
      jul 20, 2016

      Hola, ante todo gracias por vuestro tutorial, a ver si os puedo explicar el problema que tengo, utilizo una arduino yun, no se si será ese el problema por que todo va bien, pruebo el sensor OK, pero tengo problemas con el controlador de motores, no hace nada, todos los pines están bien conectados, corrientes diferentes en controlador y arduino pero conectadas con GND, le llega corriente y enciende el piloto rojo pero no hace nada cuando subo el codigo??? en que estoy fallando, estará mal el controlador de motores???

    • Avatar
      jesus
      jul 21, 2016

      Hola, de nuevo yo, ya he solucionado el problema, era una tontería, por cierto he visto que sois paisanos mio, el próximo pedido os lo pido a vosotros. Es posible poner más sensores de ultrasonido??

    • Avatar
      Alejandro
      oct 27, 2016

      hola, solo una pregunta, bueno 2, la primera es si puedo utilizar una bateria recargable de 9,6 v que quiero reciclar, y la otra cuestion es sobre el cableado, seria posible enchufar la bateria a la toma de corriente de la placa y de la placa sacar las salidas para el driver de los motores y para el sensor

    • Avatar
      Tony
      ene 11, 2017

      Hola,buenos días. He realizado el montaje del esquiva objetos pero uno de los dos motores gira con muy poca fuerza, incluso se queda trabado y he de empujarlo para que comience a andar. ¿Qué puede ser?

    • Avatar
      agustín
      mar 9, 2017

      ¿lo puedo hacer con 2 puente h l298n y 2 sensores de distancia? si es así, ¿tendrías un esquema y código?

    • Avatar
      Juan
      may 5, 2017

      Buenas, tengo un controlador de motores HG7881 en lugar del L298N. Puedo hacer el robot aun así?

    • Avatar
      Juan Laguna
      may 23, 2017

      Cuelgo este post para agradecer a Leantec, y a su impagable servicio técnico, la ayuda prestada por ellos a la hora del montaje y programación de un kit que les compré. Con una atención al cliente semejante, únicamente puedo decir que Leantec es una empresa muy seria y responsable. Muchas gracias por todo.

    • Avatar
      Gonzalo
      may 29, 2017

      Hola buenas, tengo el robot pero con 4 motores y tenia la duda de si el mismo codigo que se utiliza para los motores en este tutorial se puede utilizar para programar los 4 motores. Si no es posible, ¿me podriais decir un tutorial para 4 ruedas y con el sensor también? Muchas gracias y muy buen tutorial.

    • Avatar
      carlos
      jun 29, 2017

      el programa no me compila ya que me idica exit status 1 'class Ultrasonic' has no member named 'Ranging'

    • Avatar
      Sherlyn Euceda
      sep 29, 2017

      solo lo armo y ya ? de verada quiero que funciones

    • Avatar
      fernando
      oct 17, 2017

      hola buena tarde disculpa y tendras algun codigo para que tambuen se pueda controlar manual desde mi celuar y a la vez tenga un boton para que sea autonomo

Leave a Reply

* Name:
* E-mail: (Not Published)
   Website: (Site url withhttp://)
* Comment:
Type Code