Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Ordenador de Bordo Mega2560 PDF
Ordenador de Bordo Mega2560 PDF
Proyecto:
Ordenador de a bordo
(visualización de velocidad, distancia, temperatura...)
CURSO 2011-2012
Índice de contenidos
1.3.2.- Gráfico explicativo de la selección del número de niveles en la fase 3 1/2 .................... 3
1.3.3.- Gráfico explicativo de la selección del número de niveles en la fase 3 2/2 .................... 4
4.3.1. Figura de las conexiones con los sensores de distancia (Fritzing) .................................... 15
En esta fase se añadirá al Arduino Mega un módulo GPS, a través del cual se
obtendrán tanto la velocidad del automóvil, como la hora actual.
Una vez que se recojan estos datos, se reestructurará el formato en el que se
muestra la información a través de la pantalla, comenzando a utilizar la posibilidad que
ofrece de introducir parámetros a través de ella, al ser táctil.
Por lo tanto se va a poder elegir entre tres modos de funcionamiento, los cuales
tienen en común la información sobre la temperatura y la hora en un tamaño de fuente
menor a los datos característicos de cada uno de los modos, que serán explicados a
continuación:
1
1.- Modo distancia: se basa en el funcionamiento explicado para la primera
tarea, en el apartado 1.1, indicando así la distancia del parachoques trasero con respecto
al objeto más próximo a él, tal y como se comentó anteriormente. Además se recuerda
que al pasar cada uno de los límites establecidos para los niveles, se comunicarán estos
hechos de forma acústica y visual según se explicó previamente.
2.- Modo velocidad: el funcionamiento es análogo al caso anterior, solo que esta
vez el dato mostrado será la velocidad del automóvil recogida por el módulo GPS. De
nuevo vuelve a notificarse si se sobrepasan tres límites de velocidad, los cuales se han
establecido en 90, 100 y 110 kilómetros por hora. Por lo tanto al superar dichas
velocidades de nuevo se encenderán las luces correspondientes en la pantalla y también
el zumbador funcionará del mismo modo que en el caso de la distancia.
3.- Modo automático: este será el modo que aparecerá por defecto. En él se
mostrará la velocidad del automóvil, siempre y cuando ésta sea superior a los 10
kilómetros por hora, mientras que se mostrará la distancia calculada a partir de los datos
de los sensores colocados en el parachoques trasero en caso contrario. Se ha elegido
dicha velocidad ya que para realizar la maniobra de aparcamiento no se suele superar
ese dato (una persona normal suele andar a 5-6 km/h y no se suele ir mucho más deprisa
al aparcar). Además puede ser interesante saber esta distancia en paradas, como pasos
de cebra o semáforos, ya que si es una parada con pendiente hacia arriba es conveniente
saber la distancia al objeto que se tenga detrás.
102 km/h
30 º
22 %
De tal forma que las tres ‘cajas’ que se sitúan en la parte superior de la pantalla,
se utilizarán de modo que el usuario, al pulsar en una de ellas, cambie fácilmente entre
los modos explicados anteriormente. A su vez, el modo activo estará resaltado de un
color distinto a los otros dos para que el usuario sepa cuál es el que está visualizando en
todo momento.
2
1.3.- MODIFICACIÓN DE LOS LÍMITES DE NOTIFICACIONES
Por último, ya que se cuenta con una pantalla táctil, que permite la introducción
de datos, se le va a permitir al usuario que establezca los valores límites en cuanto a la
velocidad y a la distancia que desee.
Se va a poder elegir cada uno de los tres límites, tanto para la velocidad, como
para la distancia, y de esta forma modificarlo.
Una vez que se acceda mediante la pantalla táctil a la modificación bien de los
límites de la velocidad, o bien de los límites de la distancia, se le pedirá al usuario que
señale qué nivel de límite desea establecer, como se ha comentado anteriormente. A
continuación se le mostrará por la pantalla un teclado numérico, con las opciones de
borrar y aceptar límite actual.
Para ello se ha pensado añadir un par de opciones más a la interfaz de usuario
que se mostró para la segunda fase:
102 km/h
30 º
22 %
Conf. Velocidad Conf. Distancia
Por lo tanto se crean así otras dos ‘cajas’, que el usuario podrá pulsar para
cambiar los niveles de la velocidad y la distancia. Al pulsar una de ellas se cambiaría
todo el formato por el siguiente:
1 2 3
Volver
Es bastante intuitivo que hay que pulsar sobre la opción que se desea escoger.
La caja de debajo será para volver directamente a la pantalla principal sin
realizar ningún cambio.
3
Por último, para establecer el valor de los niveles que se hayan escogido, la
interfaz de usuario tendrá el siguiente formato:
1 2 3 4 5
6 7 8 9 0
Borrar Aceptar
Las opciones que permite realizar serán la de borrar, que elimina el último dígito
introducido, aceptar, que intentará establecer el límite introducido, y evidentemente la
pulsación de cada dígito, lo irá cargando en la pantalla.
En caso de error, debido a que la distancia o velocidad introducida no sean
válidas (ya sea por incompatibilidades con otros niveles o porque se salga del rango
establecido), se le notificará dicho error al usuario.
El resultado final de cada una de estas pantallas que se han ido explicando en los
apartados anteriores es el siguiente:
4
1.4.2.- Distancia que supera el tercer nivel
5
1.4.4.- Selección del nivel de configuración de velocidad
6
2.- REVISIÓN DE PROYECTOS SIMILIARES
2.- https://www.youtube.com/watch?v=z6KUMyk15ng
En él simplemente se muestra la distancia en centímetros respecto al único
sensor del que consta.
3.- https://www.youtube.com/watch?v=ams-hrPQ90k&feature=related
En el cual se informa sobre la distancia tanto con seis leds de colores verdes,
amarillos y rojos, como mediante una pantalla de dos filas de caracteres. En la superior
colocan información en función de la distancia, como: Estás lejos, Un poco más, Le vas
a dar… y en la inferior se informa de la distancia en centímetros.
7
Esto tiene algo más de parecido con nuestro proyecto, pero sigue habiendo
varias diferencias:
- De nuevo hay un único sensor, mientras que se van a utilizar dos, como ya se
comentó anteriormente.
- La pantalla en la que se mostrará la información tendrá más datos que la que
aparece en dicho vídeo, además de agruparlos de una mejor forma.
- Los niveles en los que se le notificará al usuario tanto gráficamente, como
acústicamente, podrán ser modificados por el propio usuario, interactuando con la
pantalla táctil.
1.- https://www.youtube.com/watch?v=PbA_bOO2mMw
Se muestra un proyecto realizado al conectar el Arduino al Bus Can del
automóvil, del que adquieren, entre otros datos, las revoluciones por minuto y la
velocidad del mismo. En el caso del proyecto que se pretende realizar, la velocidad se
tomará del módulo GPS.
2.- https://www.youtube.com/watch?v=QNlG-Zp_zwM
En este vídeo se muestra un cuadro sacado de un BMW E36, en el que se
mueven las agujas de la velocidad y las revoluciones mediante un Arduino Mega. Pero
de nuevo el proyecto que se va a realizar no sigue dicho formato.
3.- https://www.youtube.com/watch?v=TZWaF-xe6H0&feature=related
Aquí se muestra el funcionamiento de un reloj al conectarlo a un módulo GPS.
Esta es una de las muchas funcionalidades de las que se va a dotar al proyecto que se
realizará.
4.- https://www.youtube.com/watch?v=XX3L3sadiDM
Y por último aquí se muestra la velocidad recogida del módulo GPS. De nuevo
es uno de los datos que se mostrarán en el proyecto, recogiéndolo de la misma forma
que en el vídeo mostrado, pero dotándole de más aspectos.
8
3.- MATERIAL NECESARIO Y PRESUPUESTO
Producto Precio
13 x Resistencia de 10 k 1.30 €
9
La imagen correspondiente a todo este material utilizado es la siguiente:
10
4.- DIAGRAMAS, CONEXIONES E IMÁGENES
11
GND 37
36
5V 35
38 34
3,3 V 39 33
32
22 31
23 30
24 21
25 20
26 19
27
28 18
29 17
40
41
13
4.2.- MÓDULO GPS
9 8
GND 5V
14
4.2.3.- Imagen con las conexiones de la pantalla táctil 2/2
15
La imagen de las conexiones sobre los sensores de distancia reales es la
siguiente:
50 - 51 52 - 53
5V
GND
16
4.4.- ZUMBADOR
El zumbador llevará una simple conexión a tierra y otra al pin digital 5, tal y
como se puede observar en la siguiente figura realizada con Fritzing:
GND
17
Para acoplar este zumbador al Arduino Mega, se ha conectado simplemente su
pata más corta a tierra (con el cable azul), mientras que la otra se ha llevado al pin
digital 5 (con el cable naranja), tal y como se puede apreciar en la siguiente imagen:
GND
5 k
5V 2
18
También se ha realizado su representación mediante el programa Fritzing de la
siguiente forma:
20
5.- ELEMENTOS ADICIONALES
21
5.2.- Resistencias de 10 k
Para evitar soldar cables y realizar las conexiones más fácilmente se ha utilizado
la siguiente placa de conexiones:
22
Para realizar las conexiones con los sensores de distancia, se han utilizado
clemas de conexión y punteros, que aparecen en la siguiente imagen:
Se han utilizado cables de seis metros para hacer estas conexiones y las
siguientes cajas de chapa para cubrir los sensores de distancia:
24
6.- IMPLEMENTACIÓN DEL CÓDIGO
25
//Librerias
#include <ITDB02_Touch.h>
#include <LB_GPS.h>
#include <Ultrasonic.h>
#include <DHT.h>
#include <UTFT.h>
#include <stdlib.h>
//Constantes
#define PIN_TEMP 2
#define PIN_TRIGER_SENSOR_2 52
#define PIN_ECHO_SENSOR_2 53
#define PIN_TRIGER_SENSOR_1 50
#define PIN_ECHO_SENSOR_1 51
#define RS 38
#define WR 39
#define CS 40
#define RST 41
#define TCLK 21
#define TCS 20
#define TDIN 19
#define TDOUT 18
#define IRQ 17
#define BUZZER 5
//Pantalla y Tactil
UTFT myLCD(ITDB28,RS,WR,CS,RST);
ITDB02_Touch myTouch(TCLK,TCS,TDIN,TDOUT,IRQ);
26
//Ajuste de los pines de los componentes
void setup() {
//Ajuste de sensor de temperatura
Serial.begin(9600);
dht.begin();
//Ajuste de la pantalla
myLCD.InitLCD(LANDSCAPE);
myLCD.clrScr();
myTouch.InitTouch(LANDSCAPE);
myTouch.setPrecision(PREC_MEDIUM);
myLCD.setFont(BigFont);
//Ajuste piezoelectrico
pinMode(BUZZER,OUTPUT);
GPS.init();
delay(100);
}
27
//Botones de Auto, Velocidad y Distancia
void options_buttons(){
if(mode_auto){
myLCD.setBackColor(255,0,0);
myLCD.setColor(255, 0, 0);
}else{
myLCD.setBackColor(0,0,255);
myLCD.setColor(0, 0, 255);
}
myLCD.fillRoundRect (0, 0, 60, 30);
myLCD.setColor(255, 255, 255);
myLCD.drawRoundRect (0, 0, 60, 30);
myLCD.print("Aut", 5, 8);
if(mode_speed){
myLCD.setBackColor(255,0,0);
myLCD.setColor(255, 0, 0);
}else{
myLCD.setBackColor(0,0,255);
myLCD.setColor(0, 0, 255);
}
myLCD.fillRoundRect (61, 0, 121, 30);
myLCD.setColor(255, 255, 255);
myLCD.drawRoundRect (61, 0, 121, 30);
myLCD.print("Vel", 66, 8);
if(mode_distance){
myLCD.setBackColor(255,0,0);
myLCD.setColor(255, 0, 0);
}else{
myLCD.setBackColor(0,0,255);
myLCD.setColor(0, 0, 255);
}
myLCD.fillRoundRect (122, 0, 182, 30);
myLCD.setColor(255, 255, 255);
myLCD.drawRoundRect (122, 0, 182, 30);
myLCD.print("Dst", 127, 8);
}
//Pantalla principal
void screen_one(){
int pulso_correcto=0;
myLCD.clrScr();
//Dibujamos botones de la pantalla inicial
options_buttons();
//Botones de ajuste
myLCD.setBackColor(0,0,255);
myLCD.setColor(0, 0, 255);
myLCD.fillRoundRect (183, 0, 319, 30);
myLCD.setColor(255, 255, 255);
myLCD.drawRoundRect (183, 0, 319, 30);
myLCD.setColor(0,0,0);
myLCD.fillCircle(210,15,10);
myLCD.setColor(255,255,255);
myLCD.drawCircle(210,15,10);
28
myLCD.setColor(0,0,0);
myLCD.fillCircle(250,15,10);
myLCD.setColor(255,255,255);
myLCD.drawCircle(250,15,10);
myLCD.setColor(0,0,0);
myLCD.fillCircle(290,15,10);
myLCD.setColor(255,255,255);
myLCD.drawCircle(290,15,10);
myLCD.setBackColor(0,0,255);
myLCD.setColor(0, 0, 255);
myLCD.fillRoundRect (0, 179, 91, 239);
myLCD.setColor(255, 255, 255);
myLCD.drawRoundRect (0, 179, 91, 239);
myLCD.print("Conf.", 5, 191);
myLCD.print("Dist", 5, 215);
myLCD.setBackColor(0,0,255);
myLCD.setColor(0, 0, 255);
myLCD.fillRoundRect (92, 179, 183, 239);
myLCD.setColor(255, 255, 255);
myLCD.drawRoundRect (92, 179, 183, 239);
myLCD.print("Conf.", 97, 191);
myLCD.print("Veloc", 97, 215);
while(pulso_correcto==0){
//Aqui se actualizan los valores (Cada 2 segundos)
update_time=millis()/1000;
if((update_time>0) && (update_time%2==0)){
update();
}
//Si se presiona un punto de la pantalla se activa
if (myTouch.dataAvailable())
{
myTouch.read();
x=myTouch.getX();
y=myTouch.getY();
29
mode_auto=false;
mode_speed=false;
mode_distance=true;
waitForIt(122, 0, 182, 30);
//Cambiar color a la distancia
options_buttons();
}
}else if((y>=179) && (y<=239)){
if((x>=0) && (x<=91)){
pulso_correcto=1;
waitForIt(0,179,91,239);
}else if((x>=92) && (x<=183)){
pulso_correcto=2;
waitForIt(92,179,183,239);
}
}
}
}
//Para modificar los niveles de Distancia
if(pulso_correcto==1) screen_two(1);
//Para modificar los niveles de velocidad
else screen_two(2);
}
30
myLCD.print("Volver", 118, 152);
31
//Pantalla para escribir valores, es un teclado tactil
void screen_three(int modo, int nivel){
myLCD.clrScr();
//Modo 1 distancia, 2 velocidad;
myLCD.setColor(0, 0, 255);
myLCD.setBackColor(0, 0, 255);
//Dibujamos los botones de los numeros
for (x=0; x<5; x++)
{
myLCD.setColor(0, 0, 255);
myLCD.fillRoundRect (10+(x*60), 10, 60+(x*60), 60);
myLCD.setColor(255, 255, 255);
myLCD.drawRoundRect (10+(x*60), 10, 60+(x*60), 60);
myLCD.printNumI(x+1, 27+(x*60), 27);
}
//Dibujamos los botones centrales
for (x=0; x<5; x++)
{
myLCD.setColor(0, 0, 255);
myLCD.fillRoundRect (10+(x*60), 70, 60+(x*60), 120);
myLCD.setColor(255, 255, 255);
myLCD.drawRoundRect (10+(x*60), 70, 60+(x*60), 120);
if (x<4)
myLCD.printNumI(x+6, 27+(x*60), 87);
}
myLCD.print("0", 267, 87);
//Dibujamos los botones de abajo
myLCD.setColor(0, 0, 255);
myLCD.fillRoundRect (10, 130, 150, 180);
myLCD.setColor(255, 255, 255);
myLCD.drawRoundRect (10, 130, 150, 180);
myLCD.print("Clear", 40, 147);
myLCD.setColor(0, 0, 255);
myLCD.fillRoundRect (160, 130, 300, 180);
myLCD.setColor(255, 255, 255);
myLCD.drawRoundRect (160, 130, 300, 180);
myLCD.print("Enter", 190, 147);
myLCD.setBackColor (0, 0, 0);
//Empieza la pantalla tactil
while (true)
{
if (myTouch.dataAvailable())
{
myTouch.read();
x=myTouch.getX();
y=myTouch.getY();
32
waitForIt(70, 10, 120, 60);
updateStr('2');
}
if ((x>=130) && (x<=180)) // Boton: 3
{
waitForIt(130, 10, 180, 60);
updateStr('3');
}
if ((x>=190) && (x<=240)) // Boton: 4
{
waitForIt(190, 10, 240, 60);
updateStr('4');
}
if ((x>=250) && (x<=300)) // Boton: 5
{
waitForIt(250, 10, 300, 60);
updateStr('5');
}
}
33
myLCD.setColor(0, 0, 0);
myLCD.fillRect(0, 224, 319, 239);
}
if ((x>=160) && (x<=300)) // Boton: Enter
{
waitForIt(160, 130, 300, 180);
if (stCurrentLen>0)
{
for (x=0; x<stCurrentLen+1; x++)
{
stLast[x]=stCurrent[x];
}
stCurrent[0]='\0';
stCurrentLen=0;
myLCD.setColor(0, 0, 0);
myLCD.fillRect(0, 208, 319, 239);
myLCD.setColor(0, 255, 0);
myLCD.print(stLast, LEFT, 208);
int answer= atoi(stLast);
if (modo==1){//distancia
if (nivel==1){
if (answer > level_d2 && answer < 200){
level_d1=answer;
break;
}else{
error_message("Distancia incorrecta");
}
}else if (nivel==2){
if (answer > level_d3 && answer < level_d1){
level_d2=answer;
break;
}else{
error_message("Distancia incorrecta");
}
}else if (nivel==3){
if (answer < level_d2 && answer > 2){
level_d3=answer;
break;
}else{
error_message("Distancia incorrecta");
}
}
}else if (modo==2){//velocidad
if (nivel==1){
if (answer < level_v2 && answer > 50){
level_v1=answer;
break;
}else{
error_message("Velocidad incorrecta");
}
}else if (nivel==2){
if (answer > level_v1 && answer < level_v3){
level_v2=answer;
break;
}else{
error_message("Velocidad incorrecta");
34
}
}else if (nivel==3){
if (answer > level_v2 && answer<250){
level_v3=answer;
break;
}else{
error_message("Velocidad incorrecta");
}
}
}
}
else
{
error_message("Texto vacio");
}
}
}
}
}
screen_two(modo);
}
35
tone(BUZZER,500);//Aviso sonoro
delay(500);
noTone(BUZZER);
}else{
myLCD.setColor(0,0,0);
myLCD.fillCircle(290,15,10);
}
}
myLCD.printNumI(dist,10,100);
myLCD.setFont(BigFont);
myLCD.print("CM ", 110, 100);
if(dist<=level_d1){ //Semaforo Verde
myLCD.setColor(0,255,0);
myLCD.fillCircle(210,15,10);
}else{
myLCD.setColor(0,0,0);
myLCD.fillCircle(210,15,10);
}
if(dist<=level_d2){ //Semaforo Ambar
myLCD.setColor(255,127,0);
myLCD.fillCircle(250,15,10);
tone(BUZZER,500);//Aviso sonoro
delay(500);
noTone(BUZZER);
}else{
myLCD.setColor(0,0,0);
myLCD.fillCircle(250,15,10);
}
if(dist<=level_d3){ //Semaforo Rojo
myLCD.setColor(255,0,0);
myLCD.fillCircle(290,15,10);
tone(BUZZER,500);//Aviso sonoro
delay(500);
noTone(BUZZER);
tone(BUZZER,500);//Aviso sonoro
delay(500);
noTone(BUZZER);
}else{
myLCD.setColor(0,0,0);
myLCD.fillCircle(290,15,10);
}
}
36
//Funcion para sacar la hora
void print_Time(char *horatotal){
int index=0,count=0;
char time[30],hora[5],minute[5];
while (*horatotal!=(char)0 && index==0){
if (index==0){
if (*horatotal!=(char)46)
{
time[count++] = *horatotal;
}
else {
time[count] = (char)0;
count=0 ;
index++ ;
}
}
horatotal++;
}
index=0;
count=0;
int contador=0;
while(index<4){
if (index<=1){
hora[count++]=time[index];
}else{
minute[contador++]=time[index];
}
index++;
}
hora[count]='\0';
minute[contador]='\0';
int hour=atoi(hora)+2;
myLCD.print(" ",200,80);
myLCD.printNumI(hour, 200, 80);
myLCD.print(":", 230, 80);
myLCD.print(minute, 245, 80);
}
37
}
if (distance>300){
distance=300;
}
if (velocity>200){
velocity=200;
}else if (velocity<0){
velocity=0;
}
void loop()
{
screen_one();
}
38
7.- RESULTADO FINAL DEL PROYECTO
39
7.3.- Componentes en el interior de la caja de madera 1/2
40
7.5.- Pruebas de distancia
41
8.- VALORACIÓN, DIFICULTADES Y COMENTARIOS
Una vez que tuvimos todos los componentes, comenzamos la prueba de cada
uno de ellos por separado, encontrando en algunos de ellos bastantes más dificultades
que en otros:
El zumbador ha sido el elemento más sencillo de probar, ya que
estábamos familiarizados con su uso.
42
En cualquier caso la alimentación apropiada para que todos los componentes
funcionen correctamente es la que recibe al mismo tiempo tanto del cable con
terminación USB, como el que termina en la conexión del mechero en el coche.
43
9.- HOJAS DE CARACTERÍSTICAS DE LOS COMPONENTES
44
http://iteadstudio.com/store/images/produce/Display/TFT/TFTLCD_ITBD02_2.
8/ILI9325DS_V0.29_2007-08-21-15-12-29-179.pdf
http://iteadstudio.com/store/images/produce/Display/TFT/TFTLCD_ITDB02_2.
2/TSC2046_DS.pdf
http://www.henningkarlsen.com/electronics/library.php?id=38
http://www.henningkarlsen.com/electronics/library.php?id=35
http://www.henningkarlsen.com/electronics/library.php?id=37
http://iteadstudio.com/application-note/show-images-and-different-fonts-on-
itdb02-series-lcd/
1 Buzzer (DC5V):
http://iteadstudio.com/store/index.php?main_page=product_info&cPath=10_14
&products_id=169
http://www.cooking-hacks.com/index.php/jumper-wires-f-m.html
45