Construcción de un coche con Arduino.

Material Necesario

Arduino Uno o Mega

Shield Motores

Bluetooth HC_06

2 Motores de cc

1 Servomotor

1 Ultrasonidos

1 Rueda loca

Chasis del coche

Móvil. Instalar la aplicación Bluetooth Electronics

Pinchar en la imagen para ir a la página de Bluetooth Electronics, donde podeís aprender a usarlo.

Coche con Arduino Mega

Bluetooth

Cambiar nombre al bluetooth

Montar el siguiente circuito

Por defecto, el nombre del bluetooth de fábrica es HC-06

Vamos a crear un programa para cambiar el nombre.

El comando a usar es: AT+NAMENuevoNombre, donde vamos a cambiar NuevoNombre por vuestro nombre e inicial de vuestro primer apellido.

Ejemplo: AT+NAMECarlosV

Guardar el programa como: p1.ino

/* Cambiar nombre al  Bluetooth  HC_06
 
Conexion del Modulo Bluetooth HC-06 y el Arduino
ARDUINO    Bluetooth HC-06
 19 (RX1)       TX
 18 (TX1)       RX
 5V           VCC
 GND          GND
 
*/

void setup()  {
  Serial1.begin(9600);
  Serial1.write("AT+NAMENuevoNombre");
 }

void loop()  {

}

Cargar el programa al arduino

Activar el bluetooth en el móvil y emparejar con vuestro bluetooth.

Contraseña a poner: 1234

Encender y apagar el led 13

Configurar el bluetooth para que cuando desde el móvil se mande:

Caracter Función
a Enciende el led 13
b Apaga el led 13

Desde el móvil conectado al Bluetooth vamos a enviar un carácter y, dependiendo de cual mandemos, haremos una función u otra.

La forma de recibir datos en el Arduino Mega es a través del puerto serie 1 (Serial1).

En el programa habrá un apartado a la espera de recibir datos ( Serial1.available ), meteremos el valor recibido en una variable y, usando la instrucción Switch Case, determinaremos la función para cada carácter recibido.

Guardar el programa como: p2.ino

/* Encender y apagar el led 13. El carácter "a" enciende el led 13 y el "b" lo apaga.
 
  Conexion del Modulo Bluetooth HC-06 y el Arduino
  ARDUINO    Bluetooth HC-06
  19 (RX1)       TX
  18 (TX1)       RX
  5V           VCC
  GND          GND
 
*/

char recibido; // variable encargada de almacenar el carácter recibido desde el móvil
int led13 = 13;

void setup()  {
  Serial1.begin(9600);
  pinMode(led13, OUTPUT);
}

void loop()  {
  if (Serial1.available()) {
    recibido = Serial1.read();

    switch (recibido) {
      case 'a': digitalWrite(led13, HIGH);
        break;
      case 'b': digitalWrite(led13, LOW);
        break;

    }
  }
}

Ejercicio a realizar:

Modificar el código para que nos muestre en el monitor el caracter recibido.

Guardar el programa como: p3.ino

Descargar la librería de la shield controladora de motores

AFMotor.7z

Dicha librería la vamos a descomprimir dentro de la carpeta “libraries”, que esta dentro de la carpeta “Arduino”, normalmente estará en vuestra carpeta de Documentos.

Controlar Motor 1

Conectar el motor de cc a la salida M1 de la shield (motor1).

Desde el móvil se manda:

Caracter Función
c Giro derecha del motor 1
d Giro izquierda del motor 1
e Paro del motor 1

Guardar el programa como: p4.ino

char recibido; // variable encargada de almacenar el carácter recibido desde el móvil

#include <AFMotor.h> // cargamos la libreria de la shield l293d
AF_DCMotor motor1(1); // 1 para M1
int vm1 = 200; // velocidad motor 1 (de 0 a 255)


void setup() {
  Serial1.begin(9600);   // usado para conectar con el bluetooth
  motor1.setSpeed(vm1); // usado para poner la velocidad en el motor1 (no se mueve el motor)
}

void loop()  {
  if (Serial1.available()) {
    recibido = Serial1.read();

    switch (recibido) {
      case 'c':
        motor1.run(FORWARD); // el motor1 va hacia adelante (Si va hacia atras, cambiar el orden
        // de los cables conectados a M1)
        break;
      case 'd': motor1.run(BACKWARD); // el motor1 va hacia atras
        break;
      case 'e': motor1.run(RELEASE);  // el motor1 se para
        break;
    }
  }
}

Controlar Motor 2

Conectar otro motor de cc a la salida M2 de la shield (motor2).

Desde el móvil se manda:

Caracter Función
f Giro derecha del motor 2
g Giro izquierda del motor 2
h Paro del motor 2

Ejercicio a realizar:

Modificar el código para añadir el motor2.

Llamarlo: p5.ino

Control de velocidad del motor de cc

Desde el móvil se manda:

Caracter Función
i+valor Control de velocidad del motor 1
j+valor Control de velocidad del motor 2

valor es un número entre 0 y 255 (siendo 255 la velocidad máxima)

Añadir este código a vuestro programa.

Guardar el programa como: p6.ino

switch (recibido) {
      case 'i': vm1 = Serial1.parseInt();// en vm1 almaceno el valor recibido desde el móvil
        motor1.setSpeed(vm1); // pongo el motor1 a la velocidad recibida
        break;
      case 'j': // Añadir vuestro código aquí para en control de velocidad del motor2
        break;
    }

Ejercicio a realizar:

Montar el coche con 2 motores de continua y una rueda loca. Probar a controlar la velocidad de los motores para ir recto, girar a la derecha y a la izquierda. Más rápido y más lento.

Ejercicio a realizar (Opcional):

Controlar el coche con el acelerómetro del móvil.

Llamarlo: p7.ino

Ejercicio a realizar (Opcional):

Programar una secuencia, que al pulsar un botón en el móvil, el coche haga un recorrido automático en el que dibuje un 8.

Llamarlo: p8.ino

Servomotor y Ultrasonidos

Vamos a montar en la parte superior delantera un servomotor que controle el módulo de ultrasonidos

Servomotor

Programa para controlar el servomotor

Llamarlo: p9.ino

#include <Servo.h>
Servo servo1;
int posServo1;

char recibido; // datos recibidos del bluetooth

void setup() {
  Serial1.begin(9600);
}

void loop() {
  servo1.detach();

  if (Serial1.available()) {
    recibido = Serial1.read();

    switch (recibido) {
       case 'k':
        servo1.attach(9);
        posServo1 = Serial1.parseInt();
        if (posServo1 >= 45 && posServo1 <= 135) {
          servo1.write(posServo1);
          delay(20);
        }

    }

  }
  delay(10);

}

Ultrasonidos

Programa para controlar el servomotor

Llamarlo: p10.ino

#define MEDIA_VELOCIDAD_SONIDO 0.017175 // Mitad de la velocidad del sonido a 20 °C expresada en cm/µs
#define PIN_TRIGGER A2
#define PIN_ECHO A3
#define ESPERA_ENTRE_LECTURAS 1000 // tiempo entre lecturas consecutivas en milisegundos
#define TIMEOUT_PULSO 25000 // la espera máxima de es 30 ms o 30000 µs

float distancia;
unsigned long tiempo;
unsigned long cronometro;
unsigned long reloj=0;

void medirDistancia(){
  cronometro=millis()-reloj;
  if(cronometro>ESPERA_ENTRE_LECTURAS)
  {
    digitalWrite(PIN_TRIGGER,HIGH); // Un pulso a nivel alto…
    delayMicroseconds(10); // …durante 10 µs y
    digitalWrite(PIN_TRIGGER,LOW); // …volver al nivel bajo
    tiempo=pulseIn(PIN_ECHO,HIGH,TIMEOUT_PULSO); // Medir el tiempo que tarda en llegar un pulso
    distancia=MEDIA_VELOCIDAD_SONIDO*tiempo;
    Serial.print(distancia);
    Serial.println(" cm");
    reloj=millis();
  }
}

void setup() {
  Serial1.begin(9600);

  pinMode(PIN_ECHO,INPUT);
  pinMode(PIN_TRIGGER,OUTPUT);
  digitalWrite(PIN_TRIGGER,LOW); // Para «limpiar» el pulso del pin trigger del módulo
  delayMicroseconds(2);
}

void loop() {
  medirDistancia();
  Serial1.print("*D"+String(distancia,1)+"*");
}

Ejercicio a realizar:

Modificar el coche de tal forma que al darle al botón de marcha esté avanzando y evitando obstáculos hasta que al pulsar otro botón se pare.

El servo moverá el módulo de ultrasonidos, haciendo un barrrido.

Llamarlo: p11.ino