Auto Bluetooth (T2)

Vehículo controlado con Bluetooth
volver
     Este proyecto consiste en un vehículo con dos motorcitos con caja reductora en cada una de sus ruedas traseras, la energía la entregan 6 pilas. Para el manejo y control de los motores ocupamos el Driver L298N y para el mando remoto un módulo de Bluetooth, que es controlado por un sistema Android de un celular o tablet. Por supuesto Arduino Nano está presente coordinando los sistemas. 
1.- Video Proyecto Completo
2.- Subir Software al Celular
3.- Programación Android
4.- Programación Arduino
5.- Driver L298N
6.- Circuito
7.- Demo



Modelo en tres versiones diferentes

     En este video que viene a continuación, podrán ver un demo del auto, como funciona el driver L298N, el diseño del circuito y la programación del software Arduino y Android. Al final de esta página encontrarán este video separado en 5 capítulos, para ver puntualmente la parte que les interese.

Video Proyecto Completo (volver)

 

     Aquí está claramente explicado como subir un software de APP Inventor al celular, es aplicable a todos los proyectos que presentamos en este Blog.

Subir Software al Celular (volver)

 
    
     Para complementar el video, pueden revisar toda la información que hemos publicado en este Blog, comenzaremos explicando el funcionamiento esquemático del auto BT. Enviamos con el celular a través del Bluetooth cualquier número entre 1 y  8, esta señal la recibe el módulo bluethoot que está en el vehículo y Arduino Nano los traduce en movimiento de las ruedas a través del módulo L298N.

     Para los diferentes movimientos, el programa del celular envía 8 números:

1 = adelante 
2 = atrás 
3 = izquierda 
4 = derecha 
5 = Stop 
6 = Arriba rueda izquierda
8 = Arriba rueda derecha
7 = Arriba rueda derecha



     La gran pregunta es ¿Cómo enviamos con el celular la información?... Lo primero que tenemos que hacer es entrar a la aplicación App Inventor que provee en forma gratuita el Instituto Tecnológico de Massachusetts, basta escribir en Google: "App Inventor" y uno ingresa a la página. Esta aplicación tiene múltiples tutoriales y en Youtube hay una gran cantidad de fanáticos explicando el tema, que es como yo aprendí lo básico para desarrollar el programa para mi celular. En el video presentado más arriba, está paso a paso explicado el software Arduino y Android.


Circuito Esquemático

Software Arduino

#include <SoftwareSerial.h> // Transforma pines Arduino en seriales
#define RxD 8 // Pin 8 de Arduino como Rx (recepción)
#define TxD 9 // Pin 9 de Arduino como Tx (transmisión)
SoftwareSerial BTSerial(RxD, TxD); // Indica al Serial BT cual es Rx (recepción) y Tx (transmisión)

#include <Servo.h> // Incluímos librería de Servos
Servo Servo1; // Creamos un Servo Servo1
Servo Servo2; // Creamos un Servo Servo2


int ENA = 11; // el Pin 11 de Arduino se llamará ENA
int ENB = 3; // el Pin 3 de Arduino se llamará ENB
int IN1 = 13; // el Pin 13 de Arduino se llamará IN1
int IN2 = 12; // el Pin 12 de Arduino se llamará IN2
int IN3 = 4; // el Pin 4 de Arduino se llamará IN3
int IN4 = 2; // el Pin 2 de Arduino se llamará IN4

int estado; // Variable para almacenar valores llegados del celular

void setup() {
Serial.begin(9600); // Iniciamos Serial a 9600 Baudios
Serial.println("-----------------------------------");
Serial.println(" Sistema Listo");
Serial.println("-----------------------------------");

pinMode(ENA, OUTPUT); // Seteamos Pin 11 como salida
pinMode(ENB, OUTPUT); // Seteamos Pin 3 como salida
pinMode(IN1, OUTPUT); // Seteamos Pin 13 como salida
pinMode(IN2, OUTPUT); // Seteamos Pin 12 como salida
pinMode(IN3, OUTPUT); // Seteamos Pin 4 como salida
pinMode(IN4, OUTPUT); // Seteamos Pin 2 como salida

BTSerial.flush(); // limpiamos serial BT
delay(500); // esperamos medio segundo
BTSerial.begin(9600); // Iniciamos Serial BT a 9600 Baudios
delay(500); // esperamos medio segundo

Servo1.attach(5); // Asignamos pin 5 de Arduino para Servo 1
Servo2.attach(6); // Asignamos pin 6 de Arduino para Servo 2

//........................... poner servos en descanso
Serial.println ("Servos en descanso"); // imprimimos información de servos
Servo1.write(90); // Servo 1 = 90° en posición horizontal (descanso)
Servo2.write(0); // Servo 2 = 0° en posición horizontal (descanso)
}

void loop() {
if (BTSerial.available()) { // si el serial del BT está habilitado
estado = BTSerial.read(); // almacenamos en variable 'estado' el valor enviado desde el celular

if (estado == '1') { // si el valor = '1'
adelante(); // ir a función 'adelante()'
}
if (estado == '2') {
atras();
}
if (estado == '3') {
izquierda();
}
if (estado == '4') {
derecha();
}
if (estado == '5') {
parar();
}
if (estado == '6') { // ir a función 'arriba_izquierdo()'
arriba_izquierdo();
}
if (estado == '7') {
arriba_derecho();
}
if (estado == '8') {
arriba_ambos();
}
}
}

//---------------------------- adelante
void adelante() { 
digitalWrite(IN1, LOW); // IN1 = 0V
digitalWrite(IN2, HIGH); // IN2 = 5V
analogWrite(ENA, 255); // enviamos al pin ENA del driver un ancho de pulso (PWM) del 100%, 
                                       // máxima velocidad
digitalWrite(IN4, LOW); // IN4 = 0V
digitalWrite(IN3, HIGH); // IN3 = 5V
analogWrite(ENB, 255); // enviamos al pin ENB del driver un ancho de pulso (PWM) del 100%, 
                                        // máxima velocidad
Serial.println("adelante"); // ponemos en pantalla información
}
//---------------------------- atrás
void atras() {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
analogWrite(ENA, 255);
digitalWrite(IN4, HIGH);
digitalWrite(IN3, LOW);
analogWrite(ENB, 255);
Serial.println("atrás");
}
//---------------------------- izquierda
void izquierda() {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
analogWrite(ENA, 100);
digitalWrite(IN4, LOW);
digitalWrite(IN3, HIGH);
analogWrite(ENB, 100); // disminuimos el ancho de pulso para menor velocidad en la curva
Serial.println("izquierda");
}
//---------------------------- derecha
void derecha() {
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
analogWrite(ENA, 100);
digitalWrite(IN4, HIGH);
digitalWrite(IN3, LOW);
analogWrite(ENB, 100); // disminuimos el ancho de pulso para menor velocidad en la curva
Serial.println("derecha");
}
//---------------------------- parar
void parar() { // detenemos motores 1 y 2
digitalWrite(IN1, LOW); // Todos los in en 0 v
digitalWrite(IN2, LOW);
analogWrite(ENA, 255); // Mantenemos el ancho de pulso máximo
digitalWrite(IN4, LOW);
digitalWrite(IN3, LOW);
analogWrite(ENB, 255);
Serial.println("parar"); // imprimimos información en pantalla
}
//---------------------------- arriba izquierdo
void arriba_izquierdo() {
Serial.println ("Levantar rueda izquierda"); // imprimimos información en pantalla
Servo2.write(90); // Servo2 lo ponemos en 90°
delay(500); // durante medio segundo
Serial.println ("Encender motor izquierda"); // imprimimos información en pantalla
digitalWrite(IN1, HIGH); // IN1 = 5v
digitalWrite(IN2, LOW); // IN2 = 0v
analogWrite(ENA, 255); // Máximo ancho de pulso, velocidad máxima
Serial.println("atrás"); // imprimimos información en pantalla
delay(2000); // durante 2 segundos
parar(); // ir a función 'parar()'
delay (500); // esperar medio segundo
Servo2.write(0); // motor 2 en posición horizontal de reposo
Serial.println ("Bajar Rueda derecha"); // imprimimos información en pantalla
}
//---------------------------- arriba derecho
void arriba_derecho() {
Serial.println ("Levantar rueda derecha");
Servo1.write(0);
delay(500);
Serial.println ("Encender motor derecho");
digitalWrite(IN4, HIGH);
digitalWrite(IN3, LOW);
analogWrite(ENB, 255);
Serial.println("atrás");
delay(2000);
parar();
delay (500);
Servo1.write(90);
Serial.println ("Bajar Rueda derecha");
}
//---------------------------- Levantar Ambas Ruedas
void arriba_ambos() {
Serial.println ("Levantar ruedas");
Servo1.write(0);
Servo2.write(90);
delay(500);
Serial.println ("Encender motor");
digitalWrite(IN2, LOW);
digitalWrite(IN1, HIGH);
analogWrite(ENA, 255);
digitalWrite(IN4, HIGH);
digitalWrite(IN3, LOW);
analogWrite(ENB, 255);
Serial.println("atrás");
delay(2500);
Serial.println ("Apagar motor");
parar(); delay (500);
Servo1.write(90);
Servo2.write(0);
Serial.println ("Bajar Ruedas");
}


Software Android - Interface Celular


Software Android - Bloques de Programación


Tarjeta para montar Bluetooth


Detalles de los Autos de Varios Ángulos





Ruedas cortadas en Trupán


Banda de goma para neumáticos


Chassis auto


Motores montados en chassis




Detalle engranajes 



Servos para levantar ruedas




Arduino Nano y Driver L298N






Fotos del modelo B con ruedas chinas













Cualquier duda, me pueden escribir a robot@tongas.cl

Programación Android (volver) Programación Arduino (volver) Driver L298N (volver) Circuito (volver) Demo (volver)