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);
}
Get measurement
VL53L0X_GetRangingMeasurementData() function returns the ranging data.
The function returns a buffer which contains the following:
RangeMilliMeter
RangeDMaxMilliMeter
SignalRateRtnMegaCps
AmbientRateRtnMegaCps
EffectiveSpadRtnCount
RangeStatus
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.
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?
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 ...
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 ...
... 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 ...
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.
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...
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?