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
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.
Así queda después de la mejora realizada.

Y el circuito completo de la mejora realizada
Descripción de la
mejora realizada.
Principalmente la mejora consiste en proporcionarles un
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.
 Las conexiones con Arduino y el display de
16X2 se puede ver en la siguiente imagen.

El LCD de 16X2 me muestra
información textual, un resumen de la carrera realizada.
·        
El color del 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.

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.

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){
   
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.
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.
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.
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.
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.
duracion =
pulseIn(pinEcho,HIGH);
 // Ejemplo de cálculo: duración 70
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
 // La onda sónica va a una velocidad de
343m/s= 1cm/29,2us
 // ahora hacemos una regla de tres para
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.
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).
if((distancia1
<= 5)&&(distancia1 > 2)){
    Serial.println(«Pasó el coche
blanco»);
}
   else if (distancia1 == 11){
    Serial.println(«Pasó el coche
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().
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.
Código del Arduino MASTER, el que está al lado derecho en el
circuito al inicio de la memoria.
#include
<LiquidCrystal.h>
int
contador1 = 0;
int
contador2 = 0;             
int
tiempoActual = 0;
int
tiempo;
int
segundos = 0;
int
minutos = 0;
int
horas = 0;
int
paraRele = 9;
int
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
//
pines
void
setup() {
 // Los pines analógicos no los declaro porque
no es necesario declarar
 lcd.begin(16,2); // Aquí definimos el tipo de
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
tiempo=millis();
 
  while((contador1 < 4) &&
(contador2 < 4)){
  //Sensor1
  int valor1 = digitalRead(A0);// Si lo
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
    }
 
   if(valor2 == LOW){
      contador2++;// Este me va ir acumulando
las vueltas que va dar el coche rojo
       
    }
  }
//
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
                delay(5000);// Esperamos 3
segundos
                lcd.setCursor(0,1);//
Posicionamos el cursor en la columna 0 y fila 1
                lcd.print(«El coche
Blanco»);
                delay(5000);
                lcd.clear(); // Limpiamos la
pantalla
                delay(1000);
                lcd.blink(); // Hacemos que
parpadee el cursor
                delay(1000);
                lcd.noBlink(); // apagamos el
parpadeo
                String h =
String(«0″+String(horas)+»:0″+String(minutos)+»:»+String(segundos));
               
lcd.print(«Con
un tiempo de:»);
                delay(5000);
                lcd.clear(); // lo
limpiamos  la pantalla
                lcd.setCursor(0,1);// Pongo el
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
                delay(5000);// Esperamos 3
segundos
                lcd.setCursor(0,1);//
Posicionamos el cursor en la columna 0 y fila 1
                lcd.print(«El coche
Rojo»);
                delay(5000);
                lcd.clear(); // Limpiamos la
pantalla
                delay(1000);
                lcd.blink(); // Hacemos que
parpadee el cursor
                delay(3000);
                lcd.noBlink(); // apagamos el
parpadeo
                String h =
String(«0″+String(horas)+»:0″+String(minutos)+»:»+String(segundos));
               
lcd.print(«Con
un tiempo de:»);
                delay(5000);
                lcd.clear(); // lo
limpiamos  la pantalla
                lcd.setCursor(0,1);// Pongo el
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
//
Este programa manipula el sensor ultra sonido
//
Primero me declaro las constantes
int
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*/
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
 //pinMode(pinTrig2, OUTPUT);
 // No es necesario iniciarlos aquí los pines
analógicos pinMode(pinEcho2, INPUT); // En este pin recibiremos información del
ultrasónico
 // pinMode(pinEcho2, INPUT);
 //
pinMode(pinArduino2,INPUT);
}
void loop() {
  int
valor = analogRead(A5);
  valor = valor/4;
 
  if(valor > 200){
 // Nos aseguramos que los pines del display
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
          long duracion1; 
          long distancia1;
 // Para evitar ruidos y valores basura
apagamos el pin pinTrig
        digitalWrite(pinTrig1,LOW); // Valor
bajo en pinTrig
        delayMicroseconds(4);
        digitalWrite(pinTrig1,HIGH);// Lo
activamos para que emita un sonido
        delayMicroseconds(10);// Lo mantenemos
emitiendo durante 10 microsegundos
  // Ahora tenemos que esperar que el sonido
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
 // Por tanto duración/2 es el tiempo que tardó
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
 // ahora hacemos una regla de tres para
calcular la duración
        duracion1 = duracion1/2;
        distancia1 = duracion1/29;
  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){
   
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
https://www.youtube.com/watch?v=c6Omj78oojo&t=47s

También te podría gustar...

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *