Pages: [1]   Go Down
Author Topic: Cronometro carreras  (Read 1836 times)
0 Members and 1 Guest are viewing this topic.
Palma de Mallorca
Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Buenos días.

Estoy intentando hacer un cronometro deportivo para descensos de carretons (carreras tipo autos locos).
 La idea es tener en la salida un Arduino Uno que tendrá conectado: un semáforo para dar la salida (se accionara mediante relés lo más seguro, de momento Leds), tendrá un pulsador de cinta que colocaremos en la línea de salida y un APC 230 para comunicarse con el Arduino Mega que está situado en la línea de llegada (a un estoy pendiente de recibir el APC230).
 En la línea de llegada tenemos  un  Arduino Mega que será el encargado de calcular el tiempo (con la función millis() ), también tendremos conectado una pantalla LCD 16x2 para mostrar los tiempo y la velocidad media, un conjunto de LEDs para monitorizar el semáforo de salida, un pulsador de cinta que se colocara en la línea de meta (el cual parara el crono) y un APC 230 para comunicarse con el Arduino de la salida.
 Es mi primera incursión en el mundo de Arduino y no tengo mucha idea de programación, estado investigando un poco y este es el código que yo creo que funcionara.
Que os parece, hace aguas por algún sitio. De momento no lo he podido probar por falta de los APCs.

Un saludo y gracias

Code:
/********************************************************
 * Gestor Descensos Carretons - Modulo Linea de Llegada (Arduino 2)
 * v6.1 - 21/07/2012
 *
 * by
 * Rafael Martinez (c)2012, All Rights Reserved
 * rafaelmartinez32@gmail.com
 *
 * Plataforma:
 * Arduino MEGA
 * Antenas APC 230 conectado al pin RX1 y TX1
 * Un pulsador (LineaLlegada) conectado al pin 22 (con una resistencia de 10kohm entre tierra y el pulsador)
 * Un pulsador (reset) conectado al pin ...... (con una resistencia de 10kohm entre tierra y el pulsador)
 * Un pulsador (SecSalida) conectado al pin 24 (con una resistencia de 10kohm entre tierra y el pulsador)
 * 8 led rojos conectado al pin 31, 32, 33, 34 como monitores del semaforo de salida
 *
 * Description: Modulo Linea de Llegada "Gestor Descensos Carretons"
 * Controla semaforo salida
 * Muestra el tiempo del descenso y calcula la velocidad media Km/h
 *
 * Program free for use and redistribution. Please keep
 * this info when using and/or modifying the program.
 *
 *********************************************************/

#include <LiquidCrystal.h>


LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // Pines LCD
int LineaLlegada = 22; // define el pin 22 para el dispositivo de llegada
int SecSalida = 24; // define el pin 24 para el pulsador de la secuencia de salida
int SignalSecSalida = 3; //  enviamos via TX/RX el ASCII 3 que el receptor interpreta en decimal(51)
int SignalFinCarrera = 4; // enviamos via TX/RX el ASCII 4 que el receptor interpreta en decimal(52)
int startChrono; // Variable para saber el estado del cronometro
unsigned long startTime, stopTime, elapsed; // variables para el calculo de tiempos
unsigned long centitot1 = 0; // variable para centesimas en LCD
unsigned long secotot1 = 0; // variable para segundos en LCD
unsigned long minutot1 = 0; // variable para minutos en LCD
double segundos, kmhSpeed;  // variable para la velocidad
unsigned long distancia = 520; //AQUI COLOCAMOS LA DISTANCIA DEL RECORRIDO EN METROS
int rojo1 = 31; //Pin 31 led rojo 1
int rojo2 = 32; //Pin 32 led rojo 2
int rojo3 = 33; //Pin 33 led rojo 3
int rojo4 = 34; //Pin 34 led rojo 4
const int flasher = 500; // Retardo de 500 milisegundos
const int timer = 2500; // Retardo de 2.5 segundos



void setup()
{
  pinMode(rojo1, OUTPUT);
  pinMode(rojo2, OUTPUT);
  pinMode(rojo3, OUTPUT);
  pinMode(rojo4, OUTPUT);
  // Arranca la comunicacion TX/RX
  Serial1.begin(9600); // abre el puerto serie e inicia la comunicacion serie
  // Arranca el LCD && Escribe el mensaje inicial
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("Carretons Chrono");
  lcd.setCursor(0, 1);
  lcd.print("v6.1 - 21/07/12");
  delay(2000);
  lcd.setCursor(0, 0);
  lcd.print("by              ");
  lcd.setCursor(0, 1);
  lcd.print("Rafael Martinez");
  delay(2000);
  lcd.clear();
  lcd.print("Cargando...");
  delay(1000);

  // Initialize Variables
  startChrono = 0;
  elapsed = 0;
  segundos = 0;
  kmhSpeed = 0;

  // Print Ready Message
  lcd.setCursor(0, 0);
  lcd.print("Preparado...        ");

}

void semaforosalida()
{
  digitalWrite(rojo1, HIGH);
  delay(timer);
  digitalWrite(rojo2, HIGH);
  delay(timer);
  digitalWrite(rojo3, HIGH);
  delay(timer);
  digitalWrite(rojo4, HIGH);
  delay(timer);
  digitalWrite(rojo1, LOW);
  digitalWrite(rojo2, LOW);
  digitalWrite(rojo3, LOW);
  digitalWrite(rojo4, LOW);
}

void semaforocarrera()//aqui la secuencia del semaforo mientras dure el descenso
{
  digitalWrite(rojo1, HIGH);
  digitalWrite(rojo3, HIGH);
  delay(flasher);
  digitalWrite(rojo1, LOW);
  digitalWrite(rojo3, LOW);
  delay(flasher);
  digitalWrite(rojo2, HIGH);
  digitalWrite(rojo4, HIGH);
  delay(flasher);
  digitalWrite(rojo2, LOW);
  digitalWrite(rojo4, LOW);
  delay(flasher);
}

void loop()
{
  if(digitalRead(SecSalida) == HIGH && startChrono == 0)
  {
    Serial1.print(SignalSecSalida,BYTE);// enviamos un senal RF (valor 3) al otro arduino (arduino1 - emisor)
    semaforosalida();
  }
  // Arranca el contador via TX/RX
  if((Serial1.read() == 2) && startChrono == 0)
  {
    startTime = millis();  // Cuenta los milisegundos de salida
    startChrono = 1;       // Cambia el estado de la variable del cronometro
    lcd.clear();
    lcd.print("BAJANDO..");
    semaforocarrera(); //aqui la secuencia del semaforo mientras dure el descenso
  }  
  // Paro del contador y calculo de la velocidad
  if(digitalRead(LineaLlegada) == HIGH && startChrono == 1)
  {
    stopTime = millis();  // Cuenta los milisegundos de llegada
    startChrono = 0;      // Cambia el estado de la variable del cronometro
    elapsed = stopTime - startTime;  // Calcula el tiempo de la carrera (el uso del loop)

    centitot1 = (elapsed%1000)/10 ; //calcula las centesimas para el display
    secotot1 = (elapsed/1000)%60 ;  //calcula los segundos para el display
    minutot1 = (elapsed/1000)/60 ;  //calcula los minutos para el display

    segundos = elapsed/1000;
    kmhSpeed = (distancia/segundos)*3.6;    // Calcula la velocidad en KM/h

    digitalWrite(rojo1, LOW);//paro de la secuencia del semaforo (fin de carrera)
    digitalWrite(rojo2, LOW);
    digitalWrite(rojo3, LOW);
    digitalWrite(rojo4, LOW);
    Serial1.print(SignalFinCarrera,BYTE);

    // Print obtained values
    lcd.clear();
    lcd.print("Tiempo: ");
    //lcd.setCursor(9,0);            // Posicion del cursor en el LCD
    lcd.print(minutot1);
    //lcd.setCursor(10,0);           // Posicion del cursor en el LCD
    lcd.print(":");
    //lcd.setCursor(11,0);
    lcd.print(secotot1);
    //lcd.setCursor(13,0);
    lcd.print(":");
    //lcd.setCursor(14,0);
    lcd.print(centitot1);
    lcd.setCursor(0, 1);  // Posicion del cursor en el LCD
    lcd.print("Km/h: ");
    lcd.print(kmhSpeed);    
  }
}
« Last Edit: August 14, 2012, 05:40:00 am by ramamo » Logged

Palma de Mallorca
Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Aquí esta el código del otro Arduino.
Deseando tener los APC para ver si realmente funciona y si tiene un buen alcance.
Un saludo

Code:
/********************************************************
 * Gestor Descensos Carretons - Modulo Linea de Salida (Arduino 1)
 * v4.1 - 21/07/2012
 *
 * by
 * Rafael Martinez (c)2012, All Rights Reserved
 * rafaelmartinez32@gmail.com
 *
 * Plataforma:
 * Arduino UNO.
 * Antenas APC 230 conectado al pin RX0 y TX0
 * Un led conectado al pin digital 13 asociado a la LineaSalida
 * Un pulsador (LineaSalida) conectado al pin 12 (con una resistencia de 10kohm entre tierra y el pulsador)
 * 4 led rojos conectado al pin 2, 3, 4, 5 como semaforo
 *
 * Description: Modulo Linea de Salida "Gestor Descensos Carretons"
 * Controla semaforo salida tipo F1 y activa el cronometro de llegada
 *
 *
 * Program free for use and redistribution. Please keep
 * this info when using and/or modifying the program.
 *
 *********************************************************/
int signalGo = 2;//  enviamos via TX/RX el ASCII 2 que el receptor interpreta en decimal(50)
int byte_entrada = 0; // valor referencia recibido via RF del transmisor
const int LineaSalida = 12; // selecciona el pin de entrada para el disparador salida
const int led = 13; // define "led" en el pin digital 13
const int rojo1 = 2; // LED 1 conectado al pin digital 2
const int rojo2 = 3; // LED 2 conectado al pin digital 3
const int rojo3 = 4; // LED 3 conectado al pin digital 4
const int rojo4 = 5; // LED 4 conectado al pin digital 5
const int flasher = 500; // Retardo de 500 milisegundos
const int timer = 2500; // Retardo de 1.5 segundos
int carrera; //variable para saber el estado de la carrera
int peligro; //variable para saber el estado de la carrera
int estadoBoton = 0; // variable para ver el estado del boton


void setup()
{
  Serial.begin(9600); //inicia la comunicacion serie, solo usada para debgugging
  pinMode(led, OUTPUT); // Asigna el led como salida
  pinMode(LineaSalida, INPUT); // Asigna el boton como entrada
  pinMode(rojo1, OUTPUT);
  pinMode(rojo2, OUTPUT);
  pinMode(rojo3, OUTPUT);
  pinMode(rojo4, OUTPUT);
  carrera = 0;
  peligro = 0;
}
void semaforosalida()//secuencia del semaforo de salida
{
  digitalWrite(rojo1, HIGH);
  delay(timer);
  digitalWrite(rojo2, HIGH);
  delay(timer);
  digitalWrite(rojo3, HIGH);
  delay(timer);
  digitalWrite(rojo4, HIGH);
  delay(timer);
  digitalWrite(rojo1, LOW);
  digitalWrite(rojo2, LOW);
  digitalWrite(rojo3, LOW);
  digitalWrite(rojo4, LOW);
}

void semaforocarrera()//secuencia del semaforo mientras dure el descenso
{
  digitalWrite(rojo1, HIGH);
  digitalWrite(rojo3, HIGH);
  delay(flasher);
  digitalWrite(rojo1, LOW);
  digitalWrite(rojo3, LOW);
  delay(flasher);
  digitalWrite(rojo2, HIGH);
  digitalWrite(rojo4, HIGH);
  delay(flasher);
  digitalWrite(rojo2, LOW);
  digitalWrite(rojo4, LOW);
  delay(flasher);
}

void loop() // bucle continuo, el siguiente fragmento de codigo se ejecuta continuamente,
{
  if (Serial.available()) // lee el puerto RX buscando la '3' que active el semaforo
  {
    if (Serial.read() == 3)
    {
      semaforosalida();
      carrera = 1; //cambia el estado de carrera a activado
    }
  }
  estadoBoton = digitalRead(LineaSalida); // lee si el pulsador esta suelto 0 o pulsado 1
  if (estadoBoton == HIGH && carrera ==1) // si el boton esta pulsado y la secuencia del semaforo esta verde, ejecutar el codigo entre { }
  {
    digitalWrite(led, HIGH); // enciende el led (pin13) si se presiona el pulsador
    Serial.print(signalGo,BYTE);// enviamos un senal RF (valor 2) al otro arduino (arduino2 - receptor)
    peligro = 1;
    carrera = 0;
    delay(1000); //espera un segundo, para que no se pueda presionar el sensor dos veces seguidas
  }
  else // si no se active el pulsador
  {
    digitalWrite(led, LOW); // apaga el led (pin13) del arduino 1-el transmisor
  }
  if(carrera == 0 && peligro == 1) //aqui la secuencia del semaforo mientras dure el descenso
  {
    semaforocarrera();
  }
  if(carrera = 0 && peligro == 1 && (Serial.read() == 4))//paro de la secuencia del semaforo (fin de carrera)
  {
    digitalWrite(rojo1, LOW);
    digitalWrite(rojo2, LOW);
    digitalWrite(rojo3, LOW);
    digitalWrite(rojo4, LOW);
    peligro = 0;
  }

}
Logged

Pages: [1]   Go Up
Jump to: