Coche robot 4×4 autónomo

Hoy os presentamos un proyecto donde os enseñaremos a construir un coche robot que pueda moverse de forma autónomo evitando obstáculos.

Nosotros hemos utilizado uno de los muchos kits que se pueden encontrar por Internet con todas las piezas necesarias:

  • un chasis
  • 4 ruedas
  • 4 motores de continua
  • 1 portapilas de 6 pilas
  • tornillos y sujeciones necesarios
  • un sensor de distancia por ultrasonidos
  • un Arduino Motor Shield para controlar los motores. Este último es importante porque nuestro Arduino no va a ser capaz de gestionar la potencia de los 4 motores funcionando a la vez.

Suponemos que ya todos tenéis un Arduino Uno. Nosotros en esta ocasión, y para variar un poco, vamos a utilizar un Arduino Mega, que básicamente tiene lo mismo pero con más pines digitales y analógicos que poder utilizar para nuestros proyectos.

El orden de montaje y colocación de componentes sería el siguiente:

  1. Motores de continua en posición cercana a las ruedas
  2. Colocación de las 4 ruedas
  3. Arduino y shield de motores sobre Arduino. Es importante comentar que la shield nosotros la hemos montado sobre un Arduino Mega, y que va a utilizar los pines 3,4,5,6,7,8,9,10,11,12. Reservamos los pines 9 y 10 por si queremos incluir servos en caso de que los incluyamos  junto al ultrasonidos para que pueda girar en busca de obstáculos. También quedan libres los pines 2 y 13, así como el 0 y 1 que se usan para la comunicación serie con nuestro equipo. Los pines analógicos también estarían disponibles. En resumen sería lo siguiente:
    • Pin 1 Disponible
      Pin 2Disponible
      Pin D3 DC Motor #2 / Stepper #1
      Pin D4 Reservado para gobernar el Shift Register 74HC595
      Pin D5 DC Motor #3 / Stepper #2
      Pin D6 DC Motor #4 / Stepper #2
      Pin D7 Reservado para gobernar el Shift Register 74HC595
      Pin D8 Reservado para gobernar el Shift Register 74HC595
      Pin D9 Servo #1, Disponible si no se usa el servo
      Pin D10 Servo #2, Disponible si no se usa el servo
      Pin D11 DC Motor #1 / Stepper #1
      Pin D12 Reservado para gobernar el Shift Register 74HC595
      Pin D13 Disponible
      A0,A1,A2,A3,A4,A5 Disponibles. Recuerda que pueden usarse como digital
  4. Conectar los cables de alimentación y masa de los motores a sus respectivos bornes de la shield, que vienen marcados como M1, M2, M3 y M4 y conviene que al conectar sigas el mismo criterio en los bornes y en el Shield porque de lo contrario conseguirás que alguno de los motores gire al revés de lo que pretendes.
  5. Colocar el sensor de ultrasonidos dentro de la pieza especial diseñada en 3D para su montaje en la parte frontal del coche.

Podéis ver unas cuantas fotos de este proceso de montaje en la siguiente galería:

Con todo el montaje realizado, tenemos que crear código para ir probando los componentes. Para ello crearemos una serie de programas en el siguiente orden:

  1. Programar que las ruedas giran todas en el mismo sentido. Probar diferentes velocidades de giro.
  2. Programar una serie de movimiento básicos hacia delante y atrás.
  3. Programar el giro a izquierda y derecha.
  4. Hacer programa final añadiendo el ultrasonidos para que ante cierta distancia límite, nuestro coche haga un giro y siga su camino

Empezamos con el movimiento básico de las ruedas

Vamos a comprobar que es sencillo controlar los motores a través de los shield. Para ello tendremos en primer lugar que descargar e instalar una librería de Adafruit para manejar el Shield directamente, que nos permitirá abstraernos del detalle de pines. Para incluirla en nuestros programas deberemos utilizar la instrucción:

#include <AFMotor.h>

A continuación, vamos a comentar las instrucciones básicas que utilizaremos para dar movimiento:

AF_DCMotor Motor1(1); // creamos una instancia para gobernar un motor. Tenemos valores del 1-4, en este será caso el motor 1

Motor1.setSpeed(200);    // Definimos la velocidad de  Motor1. 255 es el máximo de revoluciones
Motor1.run(RELEASE); // dejamos el motor en punto muerto

Motor1.run(FORDWARD); //para avanzar
Motor1.run(BACKWARD); // para retroceder

Ya podemos probar el primer programa, que podéis descargar en este enlace. Y ya se sabe.. si sabes cómo programar un motor… serás capaz de programar lo necesario para configurar el movimiento adelante y atrás en los 4 motores y de esta forma quedarían todos probados. Si prefieres no discurrir.. puedes descargarte el software aquí.

Giro de las ruedas

El truco esta precisamente en hacer girar los motores de la derecha y parar los de la izquierda, si quieres girar a la izquierda. Y lo contrario si quieres girar a la derecha. Veamos por ejemplo el giro a la izquierda en la siguiente función:

void giroIzquierda()
{
SetVel( Vel, Vel, Vel, Vel) ;
Motor1.run(RELEASE) ;
Motor2.run(FORWARD);
Motor3.run(FORWARD);
Motor4.run(RELEASE);
}

Podéis descargar el código en siguiente enlace.

Añadimos el ultrasonidos

En primer lugar tendremos que añadir a lo ya existente la instrucción para incluir la librería NewPing.h, que es lo que nos va a dar las funciones necesarias para controlar el ultrasonidos.

No vamos a comentar aquí todo el código necesario para programar un ultrasonidos, puesto que como seguro sois asiduos lectores de la web, seguro ya visteis la explicación detallada que hicimos del sensor de ultrasonidos en esta entrada.

Nuestro robot estará leyendo distancias de forma continua, y en función de la distancia hará una cosa u otra.  Básicamente hará tres cosas en función de estos valores:

  • Si es mayor a 35cm avanzará
  • Si está por debajo de 15 cm, primero hará un retroceso y tras una pausa breve hará un giro a la izquierda
  • En cualquier otro caso hará un giro a la izquierda.

A continuación tienes esta parte del código detallada y el programa entero lo puedes descargar aquí:

// si la distancia es mayor a 35cm avanzamos
if (dist > 35 or dist==0 )
{
Avance() ;
}
// si la distancia es menor a 15 cm hacemos primero un retroceso, pausa de medio segundo, y hacemos un giro a la izquierda
else if ( dist < 15 or dist == 1)
{
Retroceso() ;
delay(500);
giroSobresi_izquierda() ;
delay(500);
}

//en cualquier otro caso, que será que el valor esté entre 15 y 30 haremos un giro a la izquierda
else
{
giroSobresi_derecha() ;
delay (400);
}

Especial atención a las funciones de giro, que en este caso hacen un giro completo, y eso incluyen que los motores de un lado giren hacia atrás, mientras que los del otro vayan hacia delante. Veamos el giro completo a la derecha como ejemplo:

void giroSobresi_derecha()
{
SetVel( Vel, Vel, Vel, Vel) ;
Motor1.run(FORWARD) ;
Motor2.run(BACKWARD);
Motor3.run(BACKWARD);
Motor4.run(FORWARD);
}

Para finalizar el proyecto, podréis ver tranquilamente a Manuel que os va a contar todo lo necesario: los componentes de los kits, y toda la programación, paso a paso.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *