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 Completo2.- 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.
Aquí está claramente explicado como subir un software
de APP Inventor al celular, es aplicable a todos los proyectos que
presentamos en este Blog.
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
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