Medición de un objeto en caida libre

Hola a todos.

Estoy realizando un proyecto que consiste en medir los tiempos en los que ocurre un evento, es decir, tengo una torre de sensores lasers y dejo caer una bola que va cortando los lasers.

Debo medir los tiempos en los que ocurre dichos eventos para saber las velocidades en cada punto y las aceleraciones.

Para medir estos tiempos estoy haciendo uso de una interrupción hardware (uso un arduino mega) de manera que cada vez que detecto un corte en el sensor guardo en un vector el valor de micros() en ese momento.

El problema es que los tiempos que está midiendo son muy grandes, y teóricamente no deberían ser tan grandes y no encuentro el motivo por el cual me da esa medida errónea.

Otro problema que encuentro es que para dejar caer la bola utilizo un relé que funciona con 12v. Para activar dicho relé pulso un boton que genera un pulso y ese pulso lo detecto con la sentencia digitalRead(). Cuando pulso el botón, el relé se activa pero empieza a activarse y a desactivarse solo y sin motivo aparente.

Adjunto el código para ver si alguien puede ayudarme.

Un cordial saludo y gracias de antemano.

volatile int lasers = 8;
volatile int activar = 3;
volatile int inter0 = 2;
int estado = 0;
volatile int ctrrele = 9;


volatile unsigned long vect[6] = {0, 0, 0, 0, 0, 0};
volatile int i = 0;

void setup() {
  // put your setup code here, to run once:
    Serial.begin(9600);
    pinMode(lasers,OUTPUT);
    pinMode(ctrrele,OUTPUT);
    pinMode(activar,INPUT);
    
    pinMode(inter0,INPUT);
    
    attachInterrupt(0,medicion,FALLING);
     
    
    digitalWrite(ctrrele,LOW);
}

void loop() {
  // put your main code here, to run repeatedly:

  estado = digitalRead(activar);
  
  
  if(estado == 1 && i == 0){
    delay(500);
    digitalWrite(lasers,HIGH);
    delay(500);
    digitalWrite(ctrrele,HIGH);
    i++;
    estado = 0;
  }
  if(i == 6){
    mostrar();
  }

}

void medicion(){
  
  vect[i] = micros();
  i++;
  
}

void mostrar(){
  
 
    vect[1] = vect[2] - vect[1];
    vect[2] = vect[3] - vect[1];
    vect[3] = vect[4] - vect[1];
    vect[4] = vect[5] - vect[1];
    

    Serial.println(vect[0]);
    Serial.println(vect[1]);
    Serial.println(vect[2]);
    Serial.println(vect[3]);
    Serial.println(vect[4]);
    
    

    digitalWrite(lasers,LOW);
    digitalWrite(ctrrele,LOW);
    i = 0;
    vect[0] = 0;
    vect[1] = 0;
    vect[2] = 0;
    vect[3] = 0;
    vect[4] = 0;
}

Hi,
Creo que para poder ayadarte deberias de hacer un dibujo de como tienes todos los componentes alambrados.Segun tu descripcion del projecto tienes varios lasers. Sin embargo tienes solamente uno definido en tu sketch. No hace mucho alguien tenia un projecto parecido a este. Este es el mismo o es otro miembro del forum que tiene un projecto parecido al tuyo.

La misma observación estaba por hacerte.

Diagrama esquemático y hay muchos detalles mas como por ejemplo: para que defines todos los pines como volatiles int?

Deben ser const byte.

Solo usa volatile para aquellas variables que mantengas un intercambio entre interrupción y código. Como vector[] e i

Ahora la variable int i luego la usas o incrementas en el loop... otro error.

Edito: dibuja un croquis a mano alzada con los elementos. Intenta ser descriptivo. Luego le tomas una foto con el celular. Trabaja un poco. Lo subes como adjunto. Miras al final de las normas como se inserta la imagen adjunta y tendremos el diagrama.

Primero, muchas gracias por contestar y ayudarme. También me disculpo por no haber contestado antes pero he tenido unos días complicados y no he podido conectarme.

El problema lo he solucionado, el mal comportamiento del relé era debido a un cable que me generaba un efecto antena, una vez que lo cambié empezó a funcionar perfectamente.

Un saludo y de nuevo gracias.