¿Cómo hacer un coche controlado por bluetooth con Arduino?
| Actualizado:
Comentarios: 4

En este tutorial construiremos un robot móvil controlado por Bluetooth desde nuestro móvil a través de una aplicación de Android.
El montaje y la puesta en funcionamiento de este pequeño coche es sencillo puesto que es el resultado de la combinación de dos tutoriales que ya hemos visto: funcionamiento del módulo controlador de motores L298N y tutorial básico de uso del módulo bluetooth HC-06 en Arduino. Aconsejamos que reviséis esos dos proyectos para conocer anticipadamente el funcionamiento del controlador de motores L298N y cómo conectar el módulo de bluetooth y configurarlo.
Material necesario:
- Placa Arduino
- Chasis rueda loca.
- 2 ruedas.
- 2 motores reductores TT de doble eje.
- Módulo controlador de motores L298N.
- Módulo bluetooth HC-06.
- Interruptor ON/OFF de 2 pines.
- Portapilas para la alimentación de la placa de Arduino y 4 pilas AA.
- Pila de 9V para el controlador y motores.
- Cables. Tornillos y tuercas.
Esquema:

Montaje
Paso 1. Conectamos los cables en los motores y los sujetamos al chasis. Primero conectamos los cables rojos y negros a los dos motores que tenemos. Los podemos soldar a los bornes metálicos de los motores o utilizar cinta aislante, asegurándonos de que el contacto con el borne es correcto. Para sujetar los motores en el chasis utilizamos las piezas rectangulares y los tornillos.

Paso 2. Montamos la rueda loca y el soporte para las pilas. La rueda loca es una rueda sin tracción que gira libremente; el soporte de pilas lo utilizaremos para colocar las cuatro pilas AA encargadas de alimentar la placa Arduino.

Paso 3. Colocamos el interruptor. El interruptor lo usaremos para el módulo controlador de motores L298N. Podemos insertarlo en el hueco que hay en medio del chasis.

Paso 4. Colocar la placa de Arduino.

Paso 5. Colocar el módulo controlador de motores L298N en la zona trasera del chasis. Una vez colocado, unimos los cables de los motores a los correspondientes pines del módulo.

Paso 6. Colocamos la pila de 9V que alimentará al módulo controlador.

Utilizaremos la pila de 9 V como fuente de alimentación del módulo L298N; el cable rojo irá a la entrada de alimentación del módulo y el cable de tierra al GND del controlador y al GND de la placa Arduino.
Paso 7. Conectamos la placa de Arduino con el módulo controlador L298N.
Los pines van conectados en el siguiente orden:
- ENA –> Pin 10 (cable verde en la imagen). Debemos recordar que los pines ENA y ENB son los que controlan la velocidad de giro.
- ENB –> Pin 5 (cable verde)
- IN1 –> Pin 9 (cable naranja)
- IN2 –> Pin 8 (cable azul)
- IN3 –> Pin 7 (cable azul)
- IN4 –> Pin 6 (cable naranja)

Paso 8. Probamos los motores. Una vez que tenemos en el chasis: la placa de Arduino, el controlador L298N, la pila de 9V para alimentar el controlador, el portapilas de 4 pilas para alimentar el Arduino, los motores con sus respectivas ruedas y el interruptor montado; podemos probar los motores y si el giro de las ruedas es el correcto.

Este código para probar el giro de los motores no incluye la biblioteca, sin embargo, si preferís utilizar la biblioteca, mirad el tutorial funcionamiento del módulo controlador de motores L29.
// Motor 1
int ENA = 10;
int IN1 = 9;
int IN2 = 8;
// Motor 2
int ENB = 5;
int IN3 = 7;
int IN4 = 6;
void setup() {
pinMode (ENA, OUTPUT);
pinMode (ENB, OUTPUT);
pinMode (IN1, OUTPUT);
pinMode (IN2, OUTPUT);
pinMode (IN3, OUTPUT);
pinMode (IN4, OUTPUT);
}
void loop() {
Adelante();
delay(5000);
Atras();
delay(5000);
Derecha();
delay(5000);
Izquierda();
delay(5000);
Parar();
delay(5000);
}
void Adelante (){
//Dirección motor A
digitalWrite (IN1, LOW);
digitalWrite (IN2, HIGH);
analogWrite (ENA, 100); //Velocidad motor A
//Dirección motor B
digitalWrite (IN3, HIGH);
digitalWrite (IN4, LOW);
analogWrite (ENB, 100); //Velocidad motor B
}
void Derecha (){
//Dirección motor A
digitalWrite (IN1, HIGH);
digitalWrite (IN2, LOW);
analogWrite (ENA, 255); //Velocidad motor A
//Dirección motor B
digitalWrite (IN3, HIGH);
digitalWrite (IN4, LOW);
analogWrite (ENB, 255); //Velocidad motor A
}
void Izquierda (){
//Dirección motor A
digitalWrite (IN1, LOW);
digitalWrite (IN2, HIGH);
analogWrite (ENA, 255); //Velocidad motor A
//Dirección motor B
digitalWrite (IN3, LOW);
digitalWrite (IN4, HIGH);
analogWrite (ENB, 255); //Velocidad motor A
}
void Atras (){
//Dirección motor A
digitalWrite (IN1, HIGH);
digitalWrite (IN2, LOW);
analogWrite (ENA, 255); //Velocidad motor A
//Dirección motor B
digitalWrite (IN3, LOW);
digitalWrite (IN4, HIGH);
analogWrite (ENB, 255); //Velocidad motor B
}
void Parar (){
//Dirección motor A
digitalWrite (IN1, LOW);
digitalWrite (IN2, LOW);
analogWrite (ENA, 0); //Velocidad motor A
//Dirección motor B
digitalWrite (IN3, LOW);
digitalWrite (IN4, LOW);
analogWrite (ENB, 0); //Velocidad motor A
}
Cada función de movimiento está separada, hay que ir probándolas y comprobando si se corresponden con el movimiento que deseamos, en caso de que no sea así, habría que probar cambiando los cables de conexión del motor o la sección de código correspondiente. IN1 e IN2 son los responsables del giro del motor. Si IN1 está configurado como HIGH e IN2 como LOW, para cambiar el sentido de giro, invertimos la configuración, IN1 cambia a LOW e IN2 a HIGH.
Paso 9. Conectamos el módulo de bluetooth.

Realizamos las conexiones entre la placa y el módulo de bluetooth:
- VCC –> al pin de 5V de Arduino (cable rojo en la imagen)
- GND –> al pin GND de la placa (cable negro)
- TXD –> al pin 4 digital de la placa (cable amarillo)
- RXD –> al pin 2 digital de la placa (cable blanco)
Antes de probar el módulo bluetooth, configuramos la aplicación. La aplicación que vamos a utilizar ya ha sido usada anteriormente en el tutorial: Tutorial básico de uso del módulo bluetooth HC-06 en Arduino. La descargamos de Google Play si no la tenemos instalada: Arduino bluetooth controller. Para configurar la aplicación, primero vinculamos el móvil al módulo, abrimos la aplicación, y veremos:

Aparecerá en la pantalla el nombre del dispositivo, por defecto será HC-06 si estáis utilizando el mismo que en el tutorial. En este caso concreto, aparece mibluetooth puesto que yo he cambiado la configuración. La contraseña por defecto es 1234. Una vez conectado, escogemos el modo «Controller mode».

Para controlar nuestro coche utilizaremos las flechas de la izquierda, habrá que configurarlas, para ello presionamos sobre el icono de la rueda en la zona superior derecha y se abrirá una ventana donde podremos ir configurando cada flecha con las letras que corresponden con la imagen de la derecha. En este caso lo he configurado con las letras: i, izquierda, a, avance, d, derecha, r, retroceso y p parada.
Añadimos el código necesario para controlar el módulo de bluetooth, utilizamos la librería SoftwareSerial para tener libres los pines digitales 0 y 1 de la placa Arduino:
#include "SoftwareSerial.h"
SoftwareSerial BT(4,2);
En la función setup() iniciamos la comunicación serial y con el puerto BT:
Serial.begin(9600);
BT.begin(9600);
Y modificamos la función loop() para controlar nuestro coche. Según el botón que presionemos en nuestro móvil, Arduino realizará el movimiento correspondiente:
void loop() {
if (BT.available()){
char dato=BT.read();
switch(dato){
case 'a':
Adelante();
break;
case 'r':
Atras();
break;
case 'd':
Derecha();
break;
case 'i':
Izquierda();
break;
case 'p':
Parar();
break;
}
}
}
El código completo sería:
#include "SoftwareSerial.h"
SoftwareSerial BT(4,2); // RX, TX recorder que se cruzan
// Motor 1
int ENA = 10;
int IN1 = 9;
int IN2 = 8;
// Motor 2
int ENB = 5;
int IN3 = 7;
int IN4 = 6;
void setup() {
Serial.begin(9600);
BT.begin(9600);
pinMode (ENA, OUTPUT);
pinMode (ENB, OUTPUT);
pinMode (IN1, OUTPUT);
pinMode (IN2, OUTPUT);
pinMode (IN3, OUTPUT);
pinMode (IN4, OUTPUT);
}
void loop() {
if (BT.available()){
char dato=BT.read();
switch(dato){
case 'a':
Adelante();
break;
case 'r':
Atras();
break;
case 'd':
Derecha();
break;
case 'i':
Izquierda();
break;
case 'p':
Parar();
break;
}
}
}
void Adelante (){
//Dirección motor A
digitalWrite (IN1, LOW);
digitalWrite (IN2, HIGH);
analogWrite (ENA, 255); //Velocidad motor A
//Dirección motor B
digitalWrite (IN3, HIGH);
digitalWrite (IN4, LOW);
analogWrite (ENB, 255); //Velocidad motor B
}
void Derecha (){
//Dirección motor A
digitalWrite (IN1, HIGH);
digitalWrite (IN2, LOW);
analogWrite (ENA, 255); //Velocidad motor A
//Dirección motor B
digitalWrite (IN3, HIGH);
digitalWrite (IN4, LOW);
analogWrite (ENB, 255); //Velocidad motor A
}
void Izquierda (){
//Dirección motor A
digitalWrite (IN1, LOW);
digitalWrite (IN2, HIGH);
analogWrite (ENA, 255); //Velocidad motor A
//Dirección motor B
digitalWrite (IN3, LOW);
digitalWrite (IN4, HIGH);
analogWrite (ENB, 255); //Velocidad motor A
}
void Atras (){
//Dirección motor A
digitalWrite (IN1, HIGH);
digitalWrite (IN2, LOW);
analogWrite (ENA, 255); //Velocidad motor A
//Dirección motor B
digitalWrite (IN3, LOW);
digitalWrite (IN4, HIGH);
analogWrite (ENB, 255); //Velocidad motor B
}
void Parar (){
//Dirección motor A
digitalWrite (IN1, LOW);
digitalWrite (IN2, LOW);
analogWrite (ENA, 0); //Velocidad motor A
//Dirección motor B
digitalWrite (IN3, LOW);
digitalWrite (IN4, LOW);
analogWrite (ENB, 0); //Velocidad motor A
}