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.

Arduino Code
  1. /*
  2.   Nombre: Robot esquivaobstáculos
  3.   Autor: Daniel Pascual Gallegos
  4.   Fecha: Noviembre 2016
  5.   Funcionalidad: Este subproyecto forma parte de la construcción de nuestro robot autónomo.
  6.   En este subproyecto usaremos el driver L298n para gobernar 2 motores de CC que realizarán
  7.   la parte mecánica de nuestro robot móvil.
  8.   En este subproyecto nuestro robot irá recto y cuando encuentre un obstáculo a menos de 5 cm
  9.   girará en sentido horario hasta que esquive el obstáculo y siga su camino
  10. */
  11. // Definición de variables y constantes relacionadas con el motor izquierdo
  12. const int IN1 = 13; // Pin digital 13 para controlar sentido giro motor izquierdo
  13. const int IN2 = 12; // Pin digital 12 para controlar sentido giro motor izquierdo
  14.  
  15. // Definición de variables y constantes relacionadas con el motor derecho
  16. const int IN3 = 11; // Pin digital 11 para controlar sentido giro motor izquierdo
  17. const int IN4 = 10; // Pin digital 10 para controlar sentido giro motor izquierdo
  18.  
  19. // Este programa usará el sensor de ultrasonidos HCSR04
  20. // para medir la distancia a la que se encuentran
  21. // diferentes obstáculos en centímetros y mostrarlo por el puerto serie.
  22. const int triggerEmisor = 3;
  23. const int echoReceptor = 2;
  24. const int valorUmbral = 20;
  25. long tiempoEntrada; // Almacena el tiempo de respuesta del sensor de entrada
  26. float distanciaEntrada; // Almacena la distancia en cm a la que se encuentra el objeto
  27.  
  28. // Función que se ejecuta una sola vez al cargar el programa
  29. void setup()
  30. {
  31. // Se declaran todos los pines como salidas
  32. pinMode (IN1, OUTPUT);
  33. pinMode (IN2, OUTPUT);
  34. pinMode (IN3, OUTPUT);
  35. pinMode (IN4, OUTPUT);
  36.  
  37. pinMode(triggerEmisor,OUTPUT); // El emisor emite por lo que es configurado como salida
  38. pinMode(echoReceptor,INPUT); // El receptor recibe por lo que es configurado como entrada
  39. Serial.begin(9600); // Inicia el puerto de comunicaciones en serie
  40. }
  41. // Función que se repite de manera periódica
  42. void loop()
  43. {
  44. sensorUltrasonidos();
  45. // Si el valor de la distancia es menor que 5 cm se para y sigue recto en caso contrario
  46. if(distanciaEntrada>valorUmbral)
  47. {
  48.  
  49. robotAvance();
  50. }
  51. else
  52. {
  53. robotDerecha ();
  54. }
  55. }
  56. /*
  57.  Función sensorUltrasonidos: para medir la longitud del pulso entrante.
  58.  Mide el tiempo que transcurrido entre el envío del pulso ultrasónico
  59.  y cuando el sensor recibe el rebote,
  60.  es decir: desde que el pin echo empieza a recibir el rebote, HIGH,
  61.  hasta que deja de hacerlo, LOW, la longitud del pulso entrante.
  62. */
  63. void sensorUltrasonidos()
  64. {
  65. // Se inicializa el sensor de infrasonidos
  66. digitalWrite(triggerEmisor,LOW); // Para estabilizar
  67. delayMicroseconds(10);
  68.  
  69. // Comenzamos las mediciones
  70. // Se envía una señal activando la salida trigger durante 10 microsegundos
  71. digitalWrite(triggerEmisor, HIGH); // envío del pulso ultrasónico
  72. delayMicroseconds(10);
  73. tiempoEntrada=pulseIn(echoReceptor, HIGH);
  74. distanciaEntrada= int(0.017*tiempoEntrada); // Fórmula para calcular la distancia en cm
  75. Serial.println("El valor de la distancia es ");
  76. Serial.println(distanciaEntrada);
  77. delay(200);
  78. }
  79. /*
  80.   Función robotAvance: esta función hará que ambos motores se activen a máxima potencia
  81.   por lo que el robot avanzará hacia delante
  82. */
  83. void robotAvance()
  84. {
  85. // Motor izquierdo
  86. // Al mantener un pin HIGH y el otro LOW el motor gira en un sentido
  87. digitalWrite (IN1, HIGH);
  88. digitalWrite (IN2, LOW);
  89. // Motor derecho
  90. // Al mantener un pin HIGH y el otro LOW el motor gira en un sentido
  91. digitalWrite (IN3, HIGH);
  92. digitalWrite (IN4, LOW);
  93. }
  94. /*
  95.   Función robotRetroceso: esta función hará que ambos motores se activen a máxima potencia
  96.   en sentido contrario al anterior por lo que el robot avanzará hacia atrás
  97. */
  98. void robotRetroceso()
  99. {
  100. // Motor izquierdo
  101. // Al mantener un pin LOW y el otro HIGH el motor gira en sentido contrario al anterior
  102. digitalWrite (IN1, LOW);
  103. digitalWrite (IN2, HIGH);
  104. // Motor derecho
  105. // Al mantener un pin LOW y el otro HIGH el motor gira en sentido contrario al anterior
  106. digitalWrite (IN3, LOW);
  107. digitalWrite (IN4, HIGH);
  108. }
  109. /*
  110.   Función robotDerecha: esta función acccionará el motor izquierdo y parará el derecho
  111.   por lo que el coche girará hacia la derecha (sentido horario)
  112. */
  113. void robotDerecha()
  114. {
  115. // Motor izquierdo
  116. // Se activa el motor izquierdo
  117. digitalWrite (IN1, HIGH);
  118. digitalWrite (IN2, LOW);
  119. // Motor derecho
  120. // Se para el motor derecho
  121. digitalWrite (IN3, LOW);
  122. digitalWrite (IN4, LOW);
  123. }
  124. /*
  125.   Función robotIzquierda: esta función acccionará el motor derecho y parará el izquierdo
  126.   por lo que el coche girará hacia la izquierda (sentido antihorario)
  127. */
  128. void robotIzquierda ()
  129. {
  130. // Motor izquierdo
  131. // Se para el motor izquierdo
  132. digitalWrite (IN1, LOW);
  133. digitalWrite (IN2, LOW);
  134. // Motor derecho
  135. // Se activa el motor derecho
  136. digitalWrite (IN3, HIGH);
  137. digitalWrite (IN4, LOW);
  138. }
  139. /*
  140.   Función robotParar: esta función parará ambos motores
  141.   por lo que el robot se parará.
  142. */
  143. void robotParar()
  144. {
  145. // Motor izquierdo
  146. // Se para el motor izquierdo
  147. digitalWrite (IN1, LOW);
  148. digitalWrite (IN2, LOW);
  149. // Motor derecho
  150. // Se para el motor derecho
  151. digitalWrite (IN3, LOW);
  152. digitalWrite (IN4, LOW);
  153. }
  154.  

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