Go Down

Topic: Gestor de carreras de Scalextric (Read 5 times) previous topic - next topic

Esog Enaug

Jul 22, 2010, 03:52 pm Last Edit: Jul 22, 2010, 04:18 pm by Esog_Enaug Reason: 1
Os presento mi primer proyecto.
Es un gestor de carreras para mi pista de scalextric. Aún está verde, especialmente la parte electrónica. Aunque me está valiendo para aprender (hasta que empecé no tenia ni idea de electrónica ni casi de programación).

Lo que pretendo es que se puedan definir el número de vueltas, se encienda un semáforo como el de la F1 y que de la salida. Una vez dadas las vueltas definidas se muestra el tiempo de vuelta mas rápida y vuelta a empezar.

Pues sin alargarme mas, aquí os dejo el código y el esquema eléctrico que estoy usando para hacer pruebas:



Y este es el código:

Code: [Select]

/*
Cuentavueltas y crono

*/

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int Nvueltas = 1; //Numero de vueltas
int control = 10; //Pin de control (Boton A)
int control2 = 5; //Pin ANALOGICO de control 2 (Boton B)
int rojo1 =  6; //Pin led rojo 1
int rojo2 =  7; //Pin led rojo 2
int rojo3 =  8; //Pin led rojo 3
int verde =  9; //Pin led verde
int intervalo =  1000; //Intervalo de la secuencia
int paso = 13; //Pin de paso de vuelta
int vuelta = 0; //Contador de vueltas
unsigned long tiempoF = 0; // Tiempo de fin de vuelta
unsigned long tiempoS = 0; //Tiempo de salida de vuelta
unsigned long tiempoV = 0; //Tiempo de vuelta
unsigned long tiempoR = 99999; //Vuelta rapida



void setup()    {
 pinMode(rojo1, OUTPUT);
 pinMode(rojo2, OUTPUT);
 pinMode(rojo3, OUTPUT);
 pinMode(verde, OUTPUT);
 pinMode (paso, INPUT);
 pinMode (control, INPUT);
// set up the LCD's number of rows and columns:
 lcd.begin(16, 2);
 lcd.print("Vuelta:");
 lcd.setCursor(0, 1);
 lcd.print("Tiempo:");
}

void semaforo()
 {
   digitalWrite(rojo1, HIGH); //Encendido secuencial de los rojos
   delay(intervalo);
   digitalWrite(rojo2, HIGH);
   delay(intervalo);
   digitalWrite(rojo3, HIGH);
   delay(intervalo);
 
   digitalWrite(rojo1, LOW); //Apaga los leds rojos
   digitalWrite(rojo2, LOW);
   digitalWrite(rojo3, LOW);
   digitalWrite(verde, HIGH); // Enciende el verde
   delay(intervalo*2);
   digitalWrite(verde, LOW);  //Apaga verde
   tiempoS = millis();
 }

void pasoDEvuelta(){
   vuelta = vuelta + 1; //Conteo de vuelta
   tiempoF = millis(); //Calculo de tiempo de vuelta
   tiempoV = tiempoF - tiempoS;
   tiempoS = tiempoF; //Pone el tiempo de salida nuevo
   if (tiempoR > tiempoV) {
     tiempoR = tiempoV;
   }
   delay(250); //Espera para para no contar varias veces por paso
}

void pantalla(){
 //Mostrar el numero de vuelta y tiempo
 lcd.clear();
 lcd.print("Vuelta:");
 lcd.setCursor(0, 1);
 lcd.print("Tiempo:");
 lcd.setCursor(10, 0); //Situar el cursor
 lcd.print(vuelta);
 lcd.setCursor(10, 1); //Situar el cursor
 lcd.print("   ");
 lcd.setCursor(10, 1); //Situar el cursor
 lcd.print(tiempoV/1000);
}

void fin() {
 //Muestra vuelta rapida
 lcd.clear();
 lcd.print("Vuelta rapida:");
 lcd.setCursor(0, 1);
 lcd.print(tiempoR / 1000);
 delay(5000);
 Nvueltas = 1;

}

void numeroDEvueltas() {
  lcd.clear();
  lcd.print("Cuantas vueltas?");
  lcd.setCursor(0, 1);
  lcd.print(Nvueltas);
 
 //Definir el numero de vueltas de carrera
 
while(analogRead(control2) < 256) {


  if (digitalRead(control) == HIGH ) {
    ++Nvueltas;
    lcd.setCursor(0, 1);
    lcd.print("   ");
    lcd.setCursor(0, 1);
    lcd.print(Nvueltas);
    delay(250);
  }
}

lcd.clear();
lcd.print("Preparados?");
lcd.setCursor(0,1);
lcd.print("A");
while(digitalRead(control) == 0) {
delay(5);
}
delay(5);
}
 
void loop()  {
 lcd.clear();
 lcd.print("     BUENA");
 lcd.setCursor(0, 1);
 lcd.print("    CARRERA!");
 delay(3000);
 numeroDEvueltas();
 semaforo();
 vuelta = 0;
 //Cuenteo de vueltas y tiempos
 

while(vuelta < Nvueltas){
 if (digitalRead(paso) == HIGH ) {
   pasoDEvuelta();
   pantalla();
   }
   }
 
 fin();


Los planes de futuro incluyen mejorar la parte electrónica, cambiando el pulsador de paso de vuelta por un sistema de led + resistencia fotoelectrica, implementar el corte de corriente a la pista, añadir un segundo corredor y un sistema de simulacion de repostaje. Tambien le añadiré comunicacion con el PC por el puerto serie para usar programas de gestion de carreras. Y si se me ocurre algo mas tambien irá cayendo.

Gracias por leerlo y espero vuestros comentarios.

PD: Cuando pueda pongo un video del funcionamiento.
La electrónica y el slot (o esos cochecitos)
http://www.juanjofrancia.es/arduslot

ICEMAN

Hola, veo que no soy el único que intenta hacer algo parecido!!!...

Yo también estoy liado en algo parecido..... si quieres ver algo o compartir información aquí me tienes.

PD. Te pongo un enlace a mi Blog: http://www.iceslot.tk  o http://ice-slot.blogspot.com

Saludos!!!!

Esog Enaug

Realmente me inspiré en tu trabajo, pero lo que realmente mas me motivo fue tu última frase:

"ahora estoy liado con el programa para hacer el marcador autónomo, es decir, que no haga falta un PC para controlarlo."

Me dije a mi mismo: ¿Y si lo hago al revés? Hacerlo totalmente autónomo y mas adelante implementar la comunicacion serie. Y eso es lo que estoy tratando de hacer.

Ahora estoy puliendo el codigo que ya está hecho para que quede bonito y comentándolo. Ya veremos.

Y lo mismo te digo, aunque poco te podre ayudar. Solo tengo buenas ideas.
La electrónica y el slot (o esos cochecitos)
http://www.juanjofrancia.es/arduslot

ICEMAN

Gracias!!!

Veo que alguien se mira mi blog, jejejeje

Pues yo lo hice al revés, primero con un PC (por puerto paralelo, hasta que se murió y me compré un portatil sin puerto paralelo, por eso hacerlo autónomo) y ahora autónomo.....

Ya sabes, cualquier cosa me envías un email o te pones en contacto conmigo y comentamos!!!

Un saludo y de nuevo gracias!!!

*

Os está quedando curioso, yo estoy pensando en hacer algo similar pero para robots de línea. Quizás os interese más utilizar un sensor de efecto hall para detectar el paso de los coches que el CNY70, ya que en éste puede influir bastante la luz ambiente, yo ando buscando que sensor utilizar.

Saludos.

Go Up