Coche Teledigirido «FRALANCAR»
COCHE TELEDIRIGIDO ARDUINO
«FRALANCAR»
Álvaro Botia Ortiz, Blanca Aledo Ayllón y Francisco José Franco Benito
Sistemas Empotrados y de Tiempo Real
Curso 2016/2017
Introducción
El objetivo de este proyecto es la construcción de un coche
teledirigido que controlaremos utilizando un Smartphone. Nuestro objetivo es la
construcción del coche a través de distintas piezas, como son un Arduino UNO,
un controlador de motores, o un Bluetooth, entre otras. Además, crearemos la
propia aplicación Software necesaria para el control del dispositivo y le
añadiremos un Sensor en la parte trasera, para que, cuando vaya a chocarse
contra cualquier obstáculo, este lo evite parando el coche.
teledirigido que controlaremos utilizando un Smartphone. Nuestro objetivo es la
construcción del coche a través de distintas piezas, como son un Arduino UNO,
un controlador de motores, o un Bluetooth, entre otras. Además, crearemos la
propia aplicación Software necesaria para el control del dispositivo y le
añadiremos un Sensor en la parte trasera, para que, cuando vaya a chocarse
contra cualquier obstáculo, este lo evite parando el coche.
De entrada, a partir de nuestro chasis, hemos ido montando
los motores e incorporando ruedas. Una vez puestos los motores, nos centraremos
en hacer un coche que haga funcionar los motores, y posteriormente
incorporaremos nuestro módulo Bluetooth, finalmente añadiremos un sensor de
distancia, e iremos monotorizando para poder ir haciendo pruebas.
los motores e incorporando ruedas. Una vez puestos los motores, nos centraremos
en hacer un coche que haga funcionar los motores, y posteriormente
incorporaremos nuestro módulo Bluetooth, finalmente añadiremos un sensor de
distancia, e iremos monotorizando para poder ir haciendo pruebas.
Figura 1. Materiales iniciales.
Esquema Hardware – Software
En el siguiente esquema Hw-Sw, podemos observar que en el
montaje de nuestro coche, hemos utilizado:
montaje de nuestro coche, hemos utilizado:
–
Conexiones eléctricas
Conexiones eléctricas
–
Placa Arduino UNO
Placa Arduino UNO
–
ProtoBoard
ProtoBoard
–
Módulo controlador de Motores L298N
Módulo controlador de Motores L298N
–
Placa Bluetooth
Placa Bluetooth
–
Sensor de distancia
Sensor de distancia
–
Motores
Motores
–
Bateria externa / pilas
Bateria externa / pilas
Figura 2. Circuito final.
Hemos evitado soldar algunas patillas con el soldador,
puesto que al estar muy juntas, se podría producir un cortocircuito. Además
para el sensor de distancia, hemos empleado un Protoboard para evitar que las
conexiones se salgan de la patilla.
puesto que al estar muy juntas, se podría producir un cortocircuito. Además
para el sensor de distancia, hemos empleado un Protoboard para evitar que las
conexiones se salgan de la patilla.
Componentes y Precios
La mayoría de
los componentes han sido pedidos en Amazon,
junto con los materiales proporcionados por la universidad.
los componentes han sido pedidos en Amazon,
junto con los materiales proporcionados por la universidad.
Material |
Precios |
Pack con Ruedas, 2 Motores y Chasis |
15 € |
Placa Bluetooth |
8 € |
Sensor de Ultrasonido (pack x3) |
9 € |
Módulo controlador de Motores L298N |
7 € |
Kit Cables |
Proporcionado por la URJC |
Arduino UNO |
Proporcionado por la URJC |
Bateria Externa |
12,49 € |
Pilas |
6,51 € |
Total |
58,00 € |
Problemas y Soluciones:
- En un principio no éramos capaces de controlar
el coche a través del Bluetooth, y
pensamos que sería un problema con las conexiones de este. Sin embargo, nos
dimos cuenta de que el coche no funcionaba si no estaba conectado al ordenador,
es decir, el problema real era una escasez
de potencia, lo que conseguimos solucionar añadiendo una Batería Externa a
nuestro sistema, que junto a las pilas proporcionarían la potencia necesaria. - Serios problemas con las conexiones entre el
Bluetooth y el Arduino, lo que provocaba muchos cortocircuitos. En un
principio, tratamos como solución la de soldar los cables a estos Sistemas,
pero nos dimos cuenta de que era una tarea muy compleja, y decidimos unirlo
todo con paciencia, con el fin de evitar cortocircuitos. - A la hora de programar los sensores de
Ultrasonido, y juntar estas líneas de programación en Arduino al resto, hemos
tenido serios problemas hasta que el coche ha funcionado correctamente, ya que
o se chocaba sin que el sensor sirviese para nada, o el Botón de “Atrás”
quedaba inutilizado una vez se paraba antes de chocarse. Al final, hemos
conseguido ponerle solución monotorizando en pantalla la distancia calculada
con el sensor, viendo que a veces, era problema del código el que no funcionase
correctamente el sensor. - Los cables de los motores estaban conectados de
manera incorrecta, lo que provocaba que la señal de llegada diera una reacción
incorrecta, por lo que tuvimos que volver a colocarlos. - Nos ha costado distribuir el Hardware para que
el coche quede compacto. - A la hora de la creación de nuestra aplicación,
como podemos ver en las siguientes imágenes, hemos tenido que crear dos
aplicaciones totalmente diferentes, ya que la primera de ellas no conseguimos
que funcionase.
Aplicación Fallida, aquí podemos encontrar el Código utilizado y la Pantalla
de Inicio:
de Inicio:
Figura 3. Aplicación fallida.
Aplicación Correcta, aquí podemos observar el
Logo de nuestra aplicación, la Pantalla de Inicio que se observaría al abrir la
misma, y dos imágenes resultantes de la Programación de nuestra aplicación:
Logo de nuestra aplicación, la Pantalla de Inicio que se observaría al abrir la
misma, y dos imágenes resultantes de la Programación de nuestra aplicación:
Figura 4. Aplicación.
Trabajo de cada integrante:
El trabajo ha sido llevado a cabo en conjunto.
- Compra e investigación de posibles materiales y
componentes para el proyecto. - Montaje de los componentes, con la previa
búsqueda de información para hacerlo de manera correcta. - Pruebas con el código.
- Realización de la aplicación.
- Pruebas sobre la utilización de nuestra
aplicación. - Preparar elementos para la presentación,
memoria, blog, etc.
Código Fuente
#include
<SoftwareSerial.h>
<SoftwareSerial.h>
SoftwareSerial
BT(2, 3);
BT(2, 3);
int
duracion;
duracion;
int distancia;
//
Motor A
Motor A
int
ENA = 6;
ENA = 6;
int
IN1 = 13;
IN1 = 13;
int
IN2 = 12;
IN2 = 12;
//
Motor B
Motor B
int
ENB = 5;
ENB = 5;
int
IN3 = 11;
IN3 = 11;
int
IN4 = 10;
IN4 = 10;
int
trigPin = 7;
trigPin = 7;
int
echoPin =4;
echoPin =4;
void
setup()
setup()
{
BT.begin(9600) ;
// Declaramos todos los pines como salidas
pinMode (ENA, OUTPUT);
pinMode (ENB, OUTPUT);
pinMode (IN1, OUTPUT);
pinMode (IN2, OUTPUT);
pinMode (IN3, OUTPUT);
pinMode (IN4, OUTPUT);
Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
void
loop()
loop()
{
int
vel = BT.parseInt() ;
vel = BT.parseInt() ;
if
(BT.read() == ‘n’){
(BT.read() == ‘n’){
digitalWrite(trigPin, LOW); // Nos aseguramos de que el trigger está
desactivado
desactivado
delayMicroseconds(2); // Para estar seguros de que el trigger
esta LOW
esta LOW
digitalWrite(trigPin, HIGH); // Activamos el pulso de salida
delayMicroseconds(10); // Esperamos 10µs. El pulso sigue active
este tiempo
este tiempo
digitalWrite(trigPin, LOW); // Cortamos
el pulso y a esperar el echo
el pulso y a esperar el echo
duracion = pulseIn(echoPin, HIGH) ;
distancia = duracion / 2 / 29.1 ;
Serial.println(String(distancia) + »
cm.»);
cm.»);
if (BT.available() && distancia >
20 ){
20 ){
switch (BT.read())
{
case ‘F’:
Adelante(vel);
break;
case ‘B’:
Atras(vel);
break;
case ‘R’:
Derecha(vel);
break;
case ‘L’:
Izquierda(vel);
break;
case ‘S’:
Parar();
break;
case ‘E’:
On();
break;
case ‘A’:
Off(vel);
break;
default :
Off(vel);
break;
}}else
if (distancia < 20 && distancia > 2){
if (distancia < 20 && distancia > 2){
Parar();
delay(1500);
Adelante(vel);
delay(1500);}
}
}
void
Adelante (int vel)
Adelante (int vel)
{
//Direccion motor A
digitalWrite (IN1, LOW);
digitalWrite (IN2, HIGH);
analogWrite (ENA, vel); //Velocidad motor A
//Direccion motor B
digitalWrite (IN3, LOW);
digitalWrite (IN4, HIGH);
analogWrite (ENB, vel); //Velocidad motor B
}
void
Atras (int vel)
Atras (int vel)
{
//Direccion motor A
digitalWrite (IN1, HIGH);
digitalWrite (IN2, LOW);
analogWrite (ENA, vel); //Velocidad motor A
//Direccion motor B
digitalWrite (IN3, HIGH);
digitalWrite (IN4, LOW);
analogWrite (ENB, vel); //Velocidad motor B
}
void
Derecha (int vel)
Derecha (int vel)
{
//Direccion motor A
digitalWrite (IN1, LOW);
digitalWrite (IN2, HIGH);
analogWrite (ENA, vel); //Velocidad motor A
//Direccion motor B
digitalWrite (IN3, HIGH);
digitalWrite (IN4, LOW);
analogWrite (ENB, vel); //Velocidad motor A
}
void
Izquierda (int vel)
Izquierda (int vel)
{
//Direccion motor A
digitalWrite (IN1, HIGH);
digitalWrite (IN2, LOW);
analogWrite (ENA, vel); //Velocidad motor A
//Direccion motor B
digitalWrite (IN3, LOW);
digitalWrite (IN4, HIGH);
analogWrite (ENB, vel); //Velocidad motor A
}
void
Parar ()
Parar ()
{
//Direccion motor A
digitalWrite (IN1, LOW);
digitalWrite (IN2, LOW);
analogWrite (ENA, 0); //Velocidad motor A
//Direccion motor B
digitalWrite (IN3, LOW);
digitalWrite (IN4, LOW);
analogWrite (ENB, 0); //Velocidad motor A
}
void
On ()
On ()
{
}
void
Off (int vel){
Off (int vel){
//Direccion motor A
digitalWrite (IN1, LOW);
digitalWrite (IN2, LOW);
analogWrite (ENA, 0); //Velocidad motor A
//Direccion motor B
digitalWrite (IN3, LOW);
digitalWrite (IN4, LOW);
analogWrite (ENB, 0); //Velocidad motor A
}
Presentación
https://drive.google.com/open?id=0B7Lydi7ycM80blNMTDIweGNPTVE
Memoria
https://drive.google.com/open?id=0B7Lydi7ycM80b3BXOGxoSlFSLWM