Misurare tempo di volo VL53L0X

Buongiorno a tutti, tutti gli sketch, ad esempio quello fornito qui https://jabolatorium.com/Projects/Lightspeed/lightspeed.html che ho visto per misurare la velocità della luce con VL53L0X
fanno questa operazione

 duration =0;                                                      // clear duration variable (variable to keep time in picoseconds)
    for (int i=1; i<=100; i++){                                       // repeat measurmens to increase precision (100 - YOU CAN CHANGE THIS VALUE)
      duration = duration + sensor.readRangeSingleMillimeters();      // accumulate results
    }
    duration = duration/100;                                          // divide by number of measurments (100 - IF YOU CHANGE REAPEAT - four lines above - YOU NEED CHANGE THIS AS WELL)
    duration=2*3.335640952*duration; //3.335640952                    // calculate value in picoseconds

In pratica, misurano la distanza (qui chiamata duration) tra il sensore e un ostacolo dopodichè calcolano il Tempo di volo applicando semplicemente la formuletta t= s/v , infatti quel coefficiente 3.335640952 deriva proprio da 1/c (dove c è la velocità della luce nel vuoto).

Fare questa operazione non è corretta se si vuole misurare la velocità della luce...perchè sta utilizzando il valore di velocità della luce (con quel coefficiente per calcolare il ToF) e quindi è normale che quando vado a fittare i valori di spazio in funzione del tempo il fit mi restituisce il valore di velocità della luce che ho inserito !

Mi chiedevo quindi se c'è un modo per misurare il ToF con questo sensore SENZA utilizzare il valore di c in letteratura. Un po' come questo codice fa per il suono con un normale HC-SR04. Come vedete in questo codice si misura il tempo di andata e ritorno dell'ultrasuono e non la distanza...quindi il codice che mi servirebbe una cosa analoga per il VL53L0X.

int trigPin = 7;
int echoPin = 8;
 int i = 0;
double t_sum = 0.;
 double t_sum_q = 0.;
double t = 0.;
 double sigma = 0.;
int N = 50;

void setup()
 {
Serial.begin(9600);
 pinMode(trigPin , OUTPUT);
pinMode(echoPin , INPUT);
 digitalWrite(trigPin , LOW);
  Serial.print("#Time (us)");
Serial.print(" ");
 Serial.println("#sigma_Time (us)");
}

void loop()
 {
t = 0;
 t_sum = 0;
t_sum_q = 0;
 for(i=1;i<=N;i++){
digitalWrite(trigPin , LOW);
 delayMicroseconds (10);
digitalWrite(trigPin , HIGH);
 delayMicroseconds (10);
digitalWrite(trigPin , LOW);
 long tUs = pulseIn(echoPin , HIGH);
t = tUs ; 
 t_sum +=  t;
t_sum_q += t*t;
delay(100);
 }
t = t_sum/N;
 sigma = sqrt(N*t_sum_q -t_sum*t_sum)/N;
  sigma/=sqrt(N);
 Serial.print(t/2);
Serial.print(" ");
 Serial.println(sigma/2);
}

Buongiorno

se leggi la scheda tecnica vedrai che l'API del sensore restituisce direttamente una distanza

https://www.st.com/resource/en/user_manual/um2039-world-smallest-timeofflight-range-and-gesture-detection-sensor-application-programming-interface-stmicroelectronics.pdf#page15

Get measurement
VL53L0X_GetRangingMeasurementData() function returns the ranging data.
The function returns a buffer which contains the following:
RangeMilliMeter
RangeDMaxMilliMeter
SignalRateRtnMegaCps
AmbientRateRtnMegaCps
EffectiveSpadRtnCount
RangeStatus

Ciao, innanzitutto grazie...per il mio scopo io non dovrei misurare la distanza...in pratica dovrei:

  1. Misurare la distanza con un metro
  2. Misurare il tempo impiegato dalla luce a colpire l'ostacolo e tornare indietro con il sensore...

Quindi, dici che non è possibile farlo?

guardando rapidamente la scheda tecnica, non penso che tu possa effettivamente ottenere il tempo con questo sensore. Le informazioni sull'ora del volo sono nascoste nel chip e l'API ti fornisce solo una distanza.

potresti dare un'occhiata a quell'articolo

Ciao, ti ringrazio...questo articolo che hai riportato rimanda all'articolo (e quindi allo sketch) che ho riportato io nel primo messaggio cioè questo http://jabolatorium.com/Projects/Lightspeed/lightspeed.html

Nel paragrafo Equipmente, c'è infatti scritto

The diagram of the circuit connections and the software part can be found at this link: Jabolatorium , from which we took inspiration for the realization of this project.

Loro dicono di misurare la velocità della luce in quel modo...ma in realtà ottengono semplicemente il valore di velocità della luce che usano per misurare il tempo ...

Purtroppo, se non c'è un modo di misurare il tempo senza applicare la formuletta v=ds/dt questo sensore non è adatto allo scopo...
Per caso conosci qualche senosre simile con cui si possa misurare il tempo di andata e ritorno anzichè la distanza?

Non conosco nessun sensore che lo permetta

Il tempo di reazione di Arduino è probabilmente troppo lento per ottenere una misurazione corretta

C'è stata una lunga discussione su questo qualche tempo fa

NO, non c'è ed Arduino in grado di effettuare la misura che intendi fare ... sono tempi troppo brevi che richiedono hardware dedicati o MCU estremamente veloci ... fatti due conti, calcola il tempo di volo per fare la distanza andata/ritorno, anche sulla massima distanza che quei sensori raggiungono e ... te ne rendi conto da solo ... :roll_eyes:

Guglielmo

Immagino che fosse la domanda. Ne conosciamo qualcuno? io non.

Neanche io ... credo che vengano sviluppati appunto per creare chip come quelli usati nei vari VLxxxx e simili, che, effettuata la misura, restituiscono direttamente la distanza.

Non mi sono mai interessato al problema di misure con tempi <= al nsec. ... ma sicuramente esiste tutta una serie di componenti adatti, solo che ... non credo basti trovare i componenti adatti, ma occorre avere esperienza nel loro montaggio, nel disegno del circuito, ecc. ecc.

Quando stai con tempi del nsec ... anche le piste di uno stampato introducono ritardi ... :roll_eyes:

Guglielmo

... aggiungo che, probabilmente, la cosa diventa più fattibile utilizzando, invece che Arduino, una Teensy 4.0 o Teensy 4.1 che, di base viaggiano con un clock a 600 MHz ma che, con le dovute precauzioni ed il dovuto raffreddamento della MCU, possono essere portate in overclock sino ad 1GHz di clock, permettendo misure di precisione anche relative a tempi del nsec.

C'è poi ovviamente da vedere tutta l'elettronica di contorno ... :roll_eyes:

Guglielmo

Grazie a entrambi. In effetti, non avevo proprio tenuto conto del clock di Arduino.

Aggiornamento ... ho trovato QUESTO ed è fatto proprio per questo genere di misure. Il datasheet si trova QUI ... ha una risoluzione di 55 psec ed è in grado di misurare intervalli di tempo da 12 a 500 nsec oppure da 250 nsec a 8 msec. :wink:

Guglielmo

roba fresca!

Mikroe c'ha realizzato anche una clickboard standard MikroBus™, la trovi QUI :grin:

Guglielmo

Ciao, grazie...

  1. Se il minimo misurabile è 12ns, effettuarne la misura della velocità della luce in effetti comporterebbe misure in spazi aperti molto grandi...da un minimo di circa 3.6m...
  2. Anche se questo sensore è in grado di misurare tempi di 12ns, il tutto non viene comunque "rovinato" da arduino che ha un clock 16MHz e quindi il tempo è circa 63ns? Cioè...collegato ad Arduino, il tempo minimo misurabile sarebbe sempre circa 63ns o sbaglio?

NO, quello fa la misura e restituisce direttamente il tempo, non lo fa misurare ad Arduino.

Guglielmo