El enfoque básico es hacer un controlador de interrupción que se invoque cada vez que el receptor IR reciba un pulso.
Cuando recibe cada pulso, captura el tiempo transcurrido desde el pulso anterior. Si el tiempo transcurrido es de 25 microsegundos, usted sabe que está en medio de recibir una ráfaga de pulsos, y debe contarlos. Si hay un intervalo de 346 microsegundos o más, sabes que estás en el intervalo de transmisión. Luego puedes contar los pulsos que has recibido. Si hay 8 pulsos, sabes que la bola está muy lejos, ya que solo recibiste los pulsos de mayor fuerza. Si hay 12 pulsos, está un poco más cerca. Del mismo modo, hasta que reciba 20 pulsos, lo que significa que es el más cercano a la pelota que puede medir.
Por supuesto, al estar en el mundo real, es posible que se pierda un pulso o dos por alguna razón, por lo que su método de conteo debería tenerlo en cuenta. Del mismo modo, el tiempo puede estar un poco apagado (ya sea el reloj o el reloj de la bola puede estar ligeramente apagado), por lo que también debería tenerse en cuenta. Si la bola no es visible en absoluto, no se leerán pulsos.
En el entorno de Arduino, usaríamos las funciones de interrupción y el código básico se vería así. Supongamos que la entrada está en el pin digital 7.
volatile int npulses = 0; // number of pulses received in this "set"
volatile unsigned long lasttime = 0; // timestamp of last pulse received
volatile int distance = 0;
void dopulse()
{
unsigned long now; // the current time in microseconds
now = micros();
elapsed = now - lasttime;
lasttime = now;
if (elapsed > 300) {
distance = npulses;
npulses = 1;
}
else {
npulses += 1;
}
}
void setup()
{
pinMode(7, OUTPUT);
attachInterrupt(7, dopulse, RISING);
...
}