Maqueta de Circuito de Carrera de Coches controlado con Arduino SEyTR_GII_Mostoles_2016-17
Asignatura de SEyTR Campus Móstoles
Profesor:
José Ignacio Martínez Torre
Profesor:
José Ignacio Martínez Torre
Proyecto
Circuito de Carrera de Coches controlado por Arduino.
Realizado el grupo 15.
Integrante del grupo:
Ulises Augusto Huamán Atusparia
Idea inicial.
La idea fundamental para realizar este proyecto, es mejorar un
juguete de carrera de coches que carecía
de automatismo y detalles. Esto hacía que fuera muy aburrido jugar con ello, como
se puede ver en la siguiente imagen.
juguete de carrera de coches que carecía
de automatismo y detalles. Esto hacía que fuera muy aburrido jugar con ello, como
se puede ver en la siguiente imagen.
Así queda después de la mejora realizada.
Y el circuito completo de la mejora realizada
Descripción de la
mejora realizada.
mejora realizada.
Principalmente la mejora consiste en proporcionarles un
automatismo a un juguete mecánico y analógico.
automatismo a un juguete mecánico y analógico.
Principales mejoras.
La mejora en parte física ha
consistido en habilitar un punto de partida con un arco que en la parte
superior tiene un display LCD donde me muestra un resumen de la carrera que se
ha producido (el coche ganador, el tiempo que ha durado la carrera), además un
display de 7 segmentos que me indica el coche que pasa por un determinado
lugar.
consistido en habilitar un punto de partida con un arco que en la parte
superior tiene un display LCD donde me muestra un resumen de la carrera que se
ha producido (el coche ganador, el tiempo que ha durado la carrera), además un
display de 7 segmentos que me indica el coche que pasa por un determinado
lugar.
Las conexiones con Arduino y el display de
16X2 se puede ver en la siguiente imagen.
16X2 se puede ver en la siguiente imagen.
El LCD de 16X2 me muestra
información textual, un resumen de la carrera realizada.
información textual, un resumen de la carrera realizada.
·
El color del coche ganador
El color del coche ganador
·
El tiempo de ese coche ganador
El tiempo de ese coche ganador
Dicha información se la
proporciona dos sensores Infrarrojo SFH506
que se muestra en la siguiente imagen, suelto y ya acoplado. Estos sensores se
le han calibrado para que detecten cualquier cosa en un rango de 1 a 3
centímetros, de esa forma si pasa un coche a su alcance lo detecta, de esta
forma sabremos qué coche ha pasado y distinguir uno del otro con dos sensores
del mismo tipo.
proporciona dos sensores Infrarrojo SFH506
que se muestra en la siguiente imagen, suelto y ya acoplado. Estos sensores se
le han calibrado para que detecten cualquier cosa en un rango de 1 a 3
centímetros, de esa forma si pasa un coche a su alcance lo detecta, de esta
forma sabremos qué coche ha pasado y distinguir uno del otro con dos sensores
del mismo tipo.
También se le ha puesto un sensor
de proximidad para detectar en un punto concreto , para detectar qué coche ha
pasado y en un display de 7 segmentos mostrar dicha información. Dicha información
se muestra por un display de 7
segmentos, mostrando el número asignado (6 o 7) a cada coche. Este sensor está
calibrado para que mande información de uno u otro coche, principalmente se ha
jugado con la distancia. Si pasa muy cerca será un coche y si es más lejos será
el otro coche. Como se puede ver en el siguiente código.
de proximidad para detectar en un punto concreto , para detectar qué coche ha
pasado y en un display de 7 segmentos mostrar dicha información. Dicha información
se muestra por un display de 7
segmentos, mostrando el número asignado (6 o 7) a cada coche. Este sensor está
calibrado para que mande información de uno u otro coche, principalmente se ha
jugado con la distancia. Si pasa muy cerca será un coche y si es más lejos será
el otro coche. Como se puede ver en el siguiente código.
if((distancia1 <= 5)&&(distancia1 > 2)){
Serial.println(«Pasó el coche blanco»);
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
delay(200);
digitalWrite(a,LOW);
digitalWrite(b,LOW);
digitalWrite(c,LOW);
}
else if (distancia1
== 11){
== 11){
Serial.println(«Pasó el coche rojo»);
digitalWrite(a,HIGH);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(e,HIGH);
delay(200);
digitalWrite(a,LOW);
digitalWrite(f,LOW);
digitalWrite(g,LOW);
digitalWrite(c,LOW);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
}
Componentes
Precio
Problemas y soluciones
Problema
El problema que he tenido en
hacer la práctica es principalmente con el tiempo de reacción de Arduino y sus
componentes. Por ejemplo los sensores de obstáculos (sensores Infrarrojo SFH506) al ponerles muy cerca dan lecturas erróneas.
hacer la práctica es principalmente con el tiempo de reacción de Arduino y sus
componentes. Por ejemplo los sensores de obstáculos (sensores Infrarrojo SFH506) al ponerles muy cerca dan lecturas erróneas.
Solución
La solución principalmente ha
consistido es desplazar los sensores para que no estén en la misma línea y calibrarlos a una distancia mínima de
sensibilidad.
consistido es desplazar los sensores para que no estén en la misma línea y calibrarlos a una distancia mínima de
sensibilidad.
Problemas
Otro de los problemas es la
precisión o tiempo de reacción de los
sensores, son muy lentos o son muy rápidos, por lo que emiten una ráfaga de
valores censados. Concretamente en el proyecto que he podido realizar los
Sensores Infrarrojo SFH506, cuando pasa
un coche manda ráfagas de valores LOW, con lo que alteran la realidad.
precisión o tiempo de reacción de los
sensores, son muy lentos o son muy rápidos, por lo que emiten una ráfaga de
valores censados. Concretamente en el proyecto que he podido realizar los
Sensores Infrarrojo SFH506, cuando pasa
un coche manda ráfagas de valores LOW, con lo que alteran la realidad.
Solución.
Le he proporcionado un tiempo
para que los sensores estén activos, pero con la consecuencia de que al
añadirle un tiempo si el otro coche pasa tan junto como el primero, o bien lo
detecta o no, porque también hay tiempos de tolerancia en los otros sensores.
para que los sensores estén activos, pero con la consecuencia de que al
añadirle un tiempo si el otro coche pasa tan junto como el primero, o bien lo
detecta o no, porque también hay tiempos de tolerancia en los otros sensores.
Problema.
Y
uno de los problemas que he tenido también es con los sensores de distancia ultrasonico HC-SR04,
emite muchos valores cuando se le lee con analogicRead(pin), porque la
distancia se calcula con esos valores como se puede ver en la siguiente fórmula.
uno de los problemas que he tenido también es con los sensores de distancia ultrasonico HC-SR04,
emite muchos valores cuando se le lee con analogicRead(pin), porque la
distancia se calcula con esos valores como se puede ver en la siguiente fórmula.
duracion =
pulseIn(pinEcho,HIGH);
pulseIn(pinEcho,HIGH);
// Ejemplo de cálculo: duración 70
microsegundos eso es el tiempo de ida y vuelta del sonido
microsegundos eso es el tiempo de ida y vuelta del sonido
// Por tanto duración/2 es el tiempo que tardó
en ir la onda sónica asía el obtáculo
en ir la onda sónica asía el obtáculo
// La onda sónica va a una velocidad de
343m/s= 1cm/29,2us
343m/s= 1cm/29,2us
// ahora hacemos una regla de tres para
calcular la duración
calcular la duración
duracion = duracion/2;
distancia = duracion/29;
Concretamente el valor alto(HIGH)
no es 5 voltios como uno esperase, porque
hay caída de voltaje en el propio Arduino(no recibe ni manda 5 voltios)
, por lo que los valores calculados son erróneos.
no es 5 voltios como uno esperase, porque
hay caída de voltaje en el propio Arduino(no recibe ni manda 5 voltios)
, por lo que los valores calculados son erróneos.
Solución
En distintas pruebas he ido
calibrando las distancias, pero estos números no son medidas reales en
centímetros, solo es una referencia (son menos
de 5 o 11 centímetros).
calibrando las distancias, pero estos números no son medidas reales en
centímetros, solo es una referencia (son menos
de 5 o 11 centímetros).
if((distancia1
<= 5)&&(distancia1 > 2)){
<= 5)&&(distancia1 > 2)){
Serial.println(«Pasó el coche
blanco»);
blanco»);
}
else if (distancia1 == 11){
Serial.println(«Pasó el coche
rojo»);
rojo»);
}
Problema
Otro de los problemas aún más
difíciles de solucionar y en mi caso imposible es el bucle de la función
loop(). Es repetitivo y además no es
concurrente, no podemos tener los sensores trabajando en segundo plano, como si
se puede en los ordenadores. Por lo que tenemos el problema de que en una
pasada se ejecuta, activa o desactiva
los sensores y si en ese tiempo pasa un
coche el sensor puede detectar o no. Puede que estén ejecutándose otras partes
de la función loop().
difíciles de solucionar y en mi caso imposible es el bucle de la función
loop(). Es repetitivo y además no es
concurrente, no podemos tener los sensores trabajando en segundo plano, como si
se puede en los ordenadores. Por lo que tenemos el problema de que en una
pasada se ejecuta, activa o desactiva
los sensores y si en ese tiempo pasa un
coche el sensor puede detectar o no. Puede que estén ejecutándose otras partes
de la función loop().
Solución
Con un intento de frenar el ciclo
de la función LOOP() he introducido un bucle WHILE dentro de la función LOOP().
De esta forma nos permite controlar las vueltas que hacen los coches y cuando
llegan al número de vueltas preestablecida nos muestra el mensaje por la
pantalla LCD, en otro caso, lo que pasaría es que en ciclo de LOOP() necesitaríamos presionar otra vez el botón
encender.
de la función LOOP() he introducido un bucle WHILE dentro de la función LOOP().
De esta forma nos permite controlar las vueltas que hacen los coches y cuando
llegan al número de vueltas preestablecida nos muestra el mensaje por la
pantalla LCD, en otro caso, lo que pasaría es que en ciclo de LOOP() necesitaríamos presionar otra vez el botón
encender.
Código del Arduino MASTER, el que está al lado derecho en el
circuito al inicio de la memoria.
circuito al inicio de la memoria.
#include
<LiquidCrystal.h>
<LiquidCrystal.h>
int
contador1 = 0;
contador1 = 0;
int
contador2 = 0;
contador2 = 0;
int
tiempoActual = 0;
tiempoActual = 0;
int
tiempo;
tiempo;
int
segundos = 0;
segundos = 0;
int
minutos = 0;
minutos = 0;
int
horas = 0;
horas = 0;
int
paraRele = 9;
paraRele = 9;
int
arduino2 = 10;
arduino2 = 10;
LiquidCrystal
lcd(1,2,4,5,6,7); // Crea un Objeto LC. Con parámetros: (rs,enable,
d4,d5,d6,d7) y definimos los
lcd(1,2,4,5,6,7); // Crea un Objeto LC. Con parámetros: (rs,enable,
d4,d5,d6,d7) y definimos los
//
pines
pines
void
setup() {
setup() {
// Los pines analógicos no los declaro porque
no es necesario declarar
no es necesario declarar
lcd.begin(16,2); // Aquí definimos el tipo de
LCD que queremos usar(número de columnas y filas)
LCD que queremos usar(número de columnas y filas)
pinMode(arduino2,OUTPUT);
pinMode(paraRele, OUTPUT);
}
void loop() {
if(digitalRead(A5) == HIGH){
delay(200);
// Encendemos el relé y el Arduino 2
analogWrite(paraRele,255);
analogWrite(arduino2,255);
// De aquí en adelante iniciamos la carrera de
coches
coches
tiempo=millis();
while((contador1 < 4) &&
(contador2 < 4)){
(contador2 < 4)){
//Sensor1
int valor1 = digitalRead(A0);// Si lo
hubieramos puesto analogicRead me leería un montorn de valores
hubieramos puesto analogicRead me leería un montorn de valores
delay(200);
//Sensor2
int valor2 = digitalRead(A1);
delay(200);
if(valor1 == LOW){
contador1++; // Este me indicando las
vueltas que va dando el coche blanco
vueltas que va dando el coche blanco
}
if(valor2 == LOW){
contador2++;// Este me va ir acumulando
las vueltas que va dar el coche rojo
las vueltas que va dar el coche rojo
}
}
//
Aquí apagamos tanto al relé como a al segundo Arduino
Aquí apagamos tanto al relé como a al segundo Arduino
analogWrite(paraRele,0);
analogWrite(arduino2,0);
tiempoActual = tiempo – tiempoActual;
segundos = tiempoActual/1000;
minutos = segundos/60;
horas = minutos/60;
if(contador1 == 4){
lcd.clear();
delay(100);
lcd.print(«El ganador es:
«);// Imprimimos un mesaje en el display
«);// Imprimimos un mesaje en el display
delay(5000);// Esperamos 3
segundos
segundos
lcd.setCursor(0,1);//
Posicionamos el cursor en la columna 0 y fila 1
Posicionamos el cursor en la columna 0 y fila 1
lcd.print(«El coche
Blanco»);
Blanco»);
delay(5000);
lcd.clear(); // Limpiamos la
pantalla
pantalla
delay(1000);
lcd.blink(); // Hacemos que
parpadee el cursor
parpadee el cursor
delay(1000);
lcd.noBlink(); // apagamos el
parpadeo
parpadeo
String h =
String(«0″+String(horas)+»:0″+String(minutos)+»:»+String(segundos));
String(«0″+String(horas)+»:0″+String(minutos)+»:»+String(segundos));
lcd.print(«Con
un tiempo de:»);
delay(5000);
lcd.clear(); // lo
limpiamos la pantalla
limpiamos la pantalla
lcd.setCursor(0,1);// Pongo el
cursor otra vez en la columna 0 y fila 1
cursor otra vez en la columna 0 y fila 1
lcd.print(h);
delay(5000);
lcd.clear();
delay(2000);
contador1 = 0;
contador2 = 0;
tiempoActual = 0;
segundos = 0;
minutos = 0;
horas = 0;
}
if(contador2 == 4){
// Imprimimos el mensaje
/*——————————————————-*/
lcd.clear();
delay(100);
lcd.print(«EL GANADOR
ES:»);// Imprimimos un mesaje en el display
ES:»);// Imprimimos un mesaje en el display
delay(5000);// Esperamos 3
segundos
segundos
lcd.setCursor(0,1);//
Posicionamos el cursor en la columna 0 y fila 1
Posicionamos el cursor en la columna 0 y fila 1
lcd.print(«El coche
Rojo»);
Rojo»);
delay(5000);
lcd.clear(); // Limpiamos la
pantalla
pantalla
delay(1000);
lcd.blink(); // Hacemos que
parpadee el cursor
parpadee el cursor
delay(3000);
lcd.noBlink(); // apagamos el
parpadeo
parpadeo
String h =
String(«0″+String(horas)+»:0″+String(minutos)+»:»+String(segundos));
String(«0″+String(horas)+»:0″+String(minutos)+»:»+String(segundos));
lcd.print(«Con
un tiempo de:»);
delay(5000);
lcd.clear(); // lo
limpiamos la pantalla
limpiamos la pantalla
lcd.setCursor(0,1);// Pongo el
cursor otra vez en la columna 0 y fila 1
cursor otra vez en la columna 0 y fila 1
lcd.print(h);
delay(5000);
lcd.clear();
delay(2000);
contador1 = 0;
contador2 = 0;
tiempoActual = 0;
segundos = 0;
minutos = 0;
horas = 0;
}
}
lcd.clear();
}
Código del Arduino
ESLAVE, que está al lado izquierdo
ESLAVE, que está al lado izquierdo
//
Este programa manipula el sensor ultra sonido
Este programa manipula el sensor ultra sonido
//
Primero me declaro las constantes
Primero me declaro las constantes
int
pinTrig1 = 11;
pinTrig1 = 11;
//int pinEcho1 = A0;
int pinTrig2 = 12;
int contador1 = 0;
int contador2 = 0;
/*Aquí
comenzamos las declaración de los pines para el display de 7 segmentos*/
comenzamos las declaración de los pines para el display de 7 segmentos*/
int a = 2;
int b = 3;
int c = 4;
int d = 5;
int e = 6;
int f = 7;
int g = 8;
void setup() {
Serial.begin(9600);
pinMode(a,OUTPUT);
pinMode(b,OUTPUT);
pinMode(c,OUTPUT);
pinMode(d,OUTPUT);
pinMode(e,OUTPUT);
pinMode(f,OUTPUT);
pinMode(g,OUTPUT);
pinMode(pinTrig1, OUTPUT); // Este pin va
controlar el sensor ultrasonico
controlar el sensor ultrasonico
//pinMode(pinTrig2, OUTPUT);
// No es necesario iniciarlos aquí los pines
analógicos pinMode(pinEcho2, INPUT); // En este pin recibiremos información del
ultrasónico
analógicos pinMode(pinEcho2, INPUT); // En este pin recibiremos información del
ultrasónico
// pinMode(pinEcho2, INPUT);
//
pinMode(pinArduino2,INPUT);
pinMode(pinArduino2,INPUT);
}
void loop() {
int
valor = analogRead(A5);
valor = analogRead(A5);
valor = valor/4;
if(valor > 200){
// Nos aseguramos que los pines del display
esten apagados antes que pasen los coches
esten apagados antes que pasen los coches
digitalWrite(a,LOW);
digitalWrite(b,LOW);
digitalWrite(c,LOW);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(f,LOW);
digitalWrite(g,LOW);
// Me defino variables para
acumular distancia y la duración
acumular distancia y la duración
long duracion1;
long distancia1;
// Para evitar ruidos y valores basura
apagamos el pin pinTrig
apagamos el pin pinTrig
digitalWrite(pinTrig1,LOW); // Valor
bajo en pinTrig
bajo en pinTrig
delayMicroseconds(4);
digitalWrite(pinTrig1,HIGH);// Lo
activamos para que emita un sonido
activamos para que emita un sonido
delayMicroseconds(10);// Lo mantenemos
emitiendo durante 10 microsegundos
emitiendo durante 10 microsegundos
// Ahora tenemos que esperar que el sonido
vuelva y lo almacenamos en la variable
vuelva y lo almacenamos en la variable
duracion1 = pulseIn(A0,HIGH);
//duracion2 = pulseIn(A1,HIGH);
// Ejemplo de calculo: duración 70 microsegundos
eso es el tiempo de ida y vuelta del sonido
eso es el tiempo de ida y vuelta del sonido
// Por tanto duración/2 es el tiempo que tardó
en ir la onda sónica asía el obtáculo
en ir la onda sónica asía el obtáculo
// La onda sónica va a una velocidad de
343m/s= 1cm/29,2us
343m/s= 1cm/29,2us
// ahora hacemos una regla de tres para
calcular la duración
calcular la duración
duracion1 = duracion1/2;
distancia1 = duracion1/29;
if((distancia1 <= 5)&&(distancia1
> 2)){
> 2)){
Serial.println(«Pasó el coche
blanco»);
blanco»);
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
delay(200);
digitalWrite(a,LOW);
digitalWrite(b,LOW);
digitalWrite(c,LOW);
}
else
if (distancia1 == 11){
if (distancia1 == 11){
Serial.println(«Pasó el coche rojo»);
digitalWrite(a,HIGH);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(e,HIGH);
delay(200);
digitalWrite(a,LOW);
digitalWrite(f,LOW);
digitalWrite(g,LOW);
digitalWrite(c,LOW);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
}
}
}
En este enlace se puede encontrar tanto la Memoria, Transparencia de presentación,Vídeo y el Código fuente.
Otra forma de ver el proyecto terminado se puede ver aquí:
Bibliografía y
referencias
referencias
https://www.youtube.com/watch?v=c6Omj78oojo&t=47s