dificultad con ATTACH INTERRUPT

Hola a todos, soy nuevo en el foro.
Los mouse viejos (con la bola abajo) tienen dos discos perforados ranurados. Cada uno de estos discos entre un LED infrarrojo y un receptor generando una onda cuadrada. Estoy utilizando ese sistema LED-RECEPTOR del mouse, pero hago girar entre ellos un disco con tres agujeros equidistantes a unas 6400 RPM como máximo, es decir genero una señal cuadrada de (6400/60)*3 = 320 Hz como máximo. El disco tiene unos 7cm de diametro y los agujeros, que están bien en la periferia , un diametro de unos 8mm. Me genera una señal entre 0 y 2,5V, teniendo 2,5V cuando el agujero coincide con el haz.

Deseo medir la aceleración de ese disco (Es para un proyecto de un banco de prueba para motos de rodillo inercial). Para ello, necesito saber en que momento pasa un agujero, en que momento pasa el siguiente,
, dejar pasar 13, y nuevamente saber en que momento pasa el catorceavo y luego el quinceavo. Luego tendría que hacer cálculos.

Pero el problema es que no me funciona el programa . Hago girar el disco a unas 2000RPM , y la diferencia de tiempo entre agujeros 1 y 2 es la esperable, pero entre 14 y 15 me da 28 microsegundos, y eso es imposible (es muy poco) , ademas noto que casi siempre, e independientemente de la velocidad a la que haga girar el disco, me da 28 micros el segundo tiempo. A continuación mando el programa.
Les agradecería si me pudieran orientar.

volatile byte a=0;

long unsigned t1=0;
long unsigned t2=0;
long unsigned t14=0;
long unsigned t15=0;

void setup() 
{
 Serial.begin(57600);
 attachInterrupt(0,interrupcion,FALLING);
}

void interrupcion()
{
  a++;
}

void loop()
{
  if (a==1)
     {t1=micros();}
  if (a==2)
     {t2=micros();}
  if (a==14)
     {t14=micros();}
  if (a==15)
     {t15=micros();
       
     Serial.print(t1);
     Serial.print("  ");
     Serial.print(t2);
     Serial.print("  ");
     Serial.print(t14);
     Serial.print("  ");
     Serial.println(t15);
        
     a=0;
     }      
}

[code]

Primero que nada ,hechale un ojo a las normas del foro donde se explica como postear el sketch correctamente y editalo.Sin entrar en los calculos que haces ,es posible que 2.5v sea poco voltaje para definir claramente si la señal es HIGH o LOW ,si nos ceñimos a lo que se dice en la referencia ,y digo posible porque no se si lo que dice la referencia es aplicable tambien a las interrupciones:

HIGH

The meaning of HIGH (in reference to a pin) is somewhat different depending on whether a pin is set to an INPUT or OUTPUT. When a pin is configured as an INPUT with pinMode(), and read with digitalRead(), the Arduino (Atmega) will report HIGH if:

a voltage greater than 3 volts is present at the pin (5V boards);
a voltage greater than 2 volts is present at the pin (3.3V boards);
A pin may also be configured as an INPUT with pinMode(), and subsequently made HIGH with digitalWrite(). This will enable the internal 20K pullup resistors, which will pull up the input pin to a HIGH reading unless it is pulled LOW by external circuitry. This is how INPUT_PULLUP works and is described below in more detail.

When a pin is configured to OUTPUT with pinMode(), and set to HIGH with digitalWrite(), the pin is at:

5 volts (5V boards);
3.3 volts (3.3V boards);
In this state it can source current, e.g. light an LED that is connected through a series resistor to ground.

LOW

The meaning of LOW also has a different meaning depending on whether a pin is set to INPUT or OUTPUT. When a pin is configured as an INPUT with pinMode(), and read with digitalRead(), the Arduino (Atmega) will report LOW if:

a voltage less than 3 volts is present at the pin (5V boards);
a voltage less than 2 volts is present at the pin (3.3V boards);
When a pin is configured to OUTPUT with pinMode(), and set to LOW with digitalWrite(), the pin is at 0 volts (both 5V and 3.3V boards). In this state it can sink current, e.g. light an LED that is connected through a series resistor to +5 volts (or +3.3 volts).

Ademas tambien estas usando FALLING ,que detecta cuando la entrada del pin pasa de HIGH a LOW ,pero si el voltaje lo tienes cuando se coincide con un agujero,quiza lo mas correcto seria usar RISING ,cuando se pasa de LOW a HIGH.

Me genera una señal entre 0 y 2,5V, teniendo 2,5V cuando el agujero coincide con el haz.

Yo creo que si esto es lo que mides en reposo o sea, haces girar manualmente la rueda y obtienes 2.5V? Ahi esta tu problema.
2.5V no es un HIGH para una entrada arduino. Esa entrada debes mejorarla o pasarla por un smitch trigger para que llegue a 5V, no es necesario exactos 5V pero si lo que es reconocido como un nivel TTL alto en 5V o sea unos 2.8V si mal recuerdo.

Asi que mejora eso y mejorará todo.
Tampoco me gusta tu código.
no interrumpes interrupciones en ningún momento. Pones a 0 y mientras imprimes por serial que eso demora muchos mseg.
Hay mucho para mejorar ahi.

surbyte:
2.5V no es un HIGH para una entrada arduino. Esa entrada debes mejorarla o pasarla por un smitch trigger para que llegue a 5V, no es necesario exactos 5V pero si lo que es reconocido como un nivel TTL alto en 5V o sea unos 2.8V si mal recuerdo.

No entiendo porque la señal es de 2,5v si lo alimentamos con 5v, a que se debe esto? Alguna solucion para que de mas tension?

Tu supones que lo alimenta con 5V.
Lo mediste con un multímetro?
No se como ha medido esos 2.5V y fue eso justamente lo que le pedí que responda. SI lo hizo moviendo rápido es normal obtener una lectura media entre 5 y 0v y por eso lograr 2.5V. Ahora si lo movió lentamente para lograr el estado HIGH y lee 2.5V es que algo no esta bien.

Hola, gracias por los comentarios!. A surbyte le contesto que alimento con 5V de la misma placa arduino. Lo que armé, lo tomé de acá:

Y que lo hice girar a mano e inclusive lo deje quieto con el haz coincidiendo con el agujero, y ahí medi entre GND de arduino y el cable de señal del sensor (el que está a la izquierda del sensor según la información del URL que adjunto, y que envio al pin 2 de arduino) y marca 2,5 V.

Tambien probé poniendo noInterrupts previo a la impresión e Interrupts al finalizar , del sig.modo:

if (a==15)
     {
      noInterrupts();
     
      t15=micros();
       
     Serial.print(t1);
     Serial.print("  ");
     Serial.print(t2);
     Serial.print("  ");
     Serial.print(t14);
     Serial.print("  ");
     Serial.println(t15);
        
     a=0;

     interrupts();
     }  
[code]

pero todo sigió igual. Claro que está el problema de base de los 2,5V. No importa , tenemos un sensor que da 4,8V, probaremos con él.

El arduino que usamos es arduino uno. 
No entiendo bien porque es mejor en este caso usar RISING que FALLING.
Perdón por la demora en escribir.
Gracias

Si es asi, entonces tienes mal polarizado el fototrasistor. Porque no pones el esquema, indicando los componentes que usas, valores de resistencias, etc.
no te compliques busca un dibujo de optoacoplador que se asemeje.

ejemplo en Google imagenes : optoacoplador rueda dentada. Seleccioné este

ahora dime los valores del optoacoplador, la R del diodo, y la R del fototransitor. y ademas el fototransitor o si es un conjunto que modelo usas.
O lo resuelves asi

Hola Surbyte, mira , esa imagen que te adjunto es parte del link ese que adjunté y donde dice como hacer lo que hice. En la imagen que adjunto ahora, falta el led emisor infrarrojo. Y dice que hay que tomar negativo del terminal negativo del capacitor que se ve en la imagen, positivo del terminal positivo del capacitor que se ve en la imagen, y la señal es el terminal izquierdo del fototransistor. en la imagen tambien se ve un conector con cuatro cables (anaranjado, rojo, azul y blanco) , vi que el terminal negativo del capacitor va al cable verde y el positivo al azul de ese conector, asi que conecte el verde a GND de arduino, el azul a 5V de arduino y solde un cable al terminal izquierdo del fototransistor y lo mande a pin2 para el attach interrupt . Espero explicarme bien. Y entonces utilicé la placa del mouse sin tocar nada, lo unico que hice fue soldar el cable al terminal izquierdo del fototransistor. Y entre el LED y el fototransistor hago girar el disco. Queda por lo tanto en la placa el otro sistema LED-fototransistor del la otra ruedita ranurada del mouse, que supongo recibe alimentación al haberlo conectado del modo que lo hice y ademas comento que no interpuse nada asi que llega todo el tiempo luz del LED al fototransistor. Me parece que los LEDS de los dos sistemas estan en serie. Talvez al estar en serie emitan menos luz y por eso de 2,5V en lugar de 5V? Gracias por escribir

Mira esta página a ver si te ayuda en algo.

Debe haber una resistencia atravesada por alli que le está tumbando el voltaje en el fotodiodo.

Gracias por ahora. Igual tenemos el otro sensor que entrega 4,8V ,pero todavia no probamos con el. Hasta pronto!