Lettura in microsecondi tra 2 impulsi da sensori analogici

Buongiorno a tutti, questo è il mio primo messaggio nel forum!

Sto cercando di fare un sistema, con Arduino UNO, che sia in grado di leggere il tempo, in microsecondi,
tra due impulsi dati da 2 sensori piezo.
Mi serve per leggere la velocità dell’impulso nei tronchi di legno.
avevo pensato ad una soluzione cosi

#define PIEZO_PIN1 A0
#define PIEZO_PIN2 A1
int vibP1;
int vibP2;
unsigned long T1;
unsigned long T2;
unsigned long Durata;


void setup(){
  Serial.begin(9600);
  vibP1 = analogRead(PIEZO_PIN1);
  vibP2 = analogRead(PIEZO_PIN2);

}

void loop(){
 vibP1 = analogRead(PIEZO_PIN1);
  while (vibP1< 10) {
    vibP1 = analogRead(PIEZO_PIN1);
    }
T1 = micros();
vibP2 = analogRead(PIEZO_PIN2);
while (vibP2 > 10) {
  T2 = micros();
  Durata = (T2-T1);
Serial.print("T1: ");Serial.println(T1);
Serial.print("T2: ");Serial.println(T2);

Serial.print("Durata: ");Serial.println(Durata);
delay (1000);
vibP2 = analogRead(PIEZO_PIN2);
  }
  
}

purtroppo così ricevo sempre lo stesso risultato…anche spostando i 2 sensori a distanze differenti!
avevo anche pensato a pulseIn(), ma, essendo sensori analogici non so se è la strada giusta
non mi serve una lettura superprecisa…
ho bisogno di una dritta…
dove sbaglio?

Grazie in anticipo!

Buongiorno,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. :wink:

gpb01:
Buongiorno,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. :wink:

Fatto e letto(quasi tutto!)! :slight_smile:

A dire il vero ho provato anche a modificare il codice in questo modo

void loop(){
 vibP1 = analogRead(PIEZO_PIN1);
  while (vibP1 < 10) {
    vibP1 = analogRead(PIEZO_PIN1);
    }
 T1 = micros();
 vibP2 = analogRead(PIEZO_PIN2);
 while (vibP2 < 10) {
    vibP2 = analogRead(PIEZO_PIN2);
  }
  T2 = micros();
  Durata = (T2-T1);
  Serial.print("T1: ");Serial.println(T1);
  Serial.print("T2: ");Serial.println(T2);

  Serial.print("Durata: ");Serial.println(Durata);
  delay (1000); 
  vibP2 = analogRead(PIEZO_PIN2);

così ottengo dei valori abbastanza simili con diverse letture…
ma non sono sicuro che il risultato sia veritiero, al momento non ho uno strumento
per verificare le letture…
Attendo suggerimenti, anche drastici! :slight_smile:

Quando si usano più ingressi analogici, cambiando pin è meglio fare una prima lettura a vuoto.

void loop()
{
    analogRead(PIEZO_PIN1);
    do {
        vibP1 = analogRead(PIEZO_PIN1);
    } while (vibP1 < 10);
    T1 = micros();

    analogRead(PIEZO_PIN2);
    do {
        vibP2 = analogRead(PIEZO_PIN2);
    } while (vibP2 < 10);
    Durata = micros() - T1;

    Serial.print("Durata: ");
    Serial.println(Durata);
    delay (1000);
}

‘micros’ ha un errore intrinseco di circa 4µs, quindi facendo la differenza tra due tempi potremmo avere già con questo 8µs di errore. Poi ci sono i tempi delle analogRead, che non ricordo quanto tempo richiedono per essere eseguite.

Se il segnale utile (l’intervallo tra i due rilevamenti) è molte volte più lungo di questi tempi, allora la precisione può essere buona, altrimenti no.

Forse vi sta sfuggendo un piccolo particolare ... ::slight_smile:

... la analogRead() NON è una digitalRead() e, come minimo, per come è fatta nel "core" Arduino, impiega circa 100µSec, se va bene, quindi ... cosa sperate di misurare con la micros() che solo le due analogRead() già si mangiano, da sole, minimo 200µSec ? ? ?

Guglielmo

Se si vuole fare una misura abbastanza precisa, occorre trasformare quel segnale analogico in un segnale digitale al superamento di una certa soglia ed usare gli interrupts ... ::slight_smile:

Guglielmo

gpb01:
Forse vi sta sfuggendo un piccolo particolare … ::slight_smile:

… la analogRead() NON è una digitalRead() e, come minimo, per come è fatta nel “core” Arduino, impiega circa 100µSec, se va bene, quindi … cosa sperate di misurare con la micros() che solo le due analogRead() già di mangiano, da sole, minimo 200µSec ? ? ?

Guglielmo

questo è quello che temevo!!!
Grazie comunque per le vostre considerazioni, proverò a convertire il segnale da analogico a digitale e riproverò!
(mi sa che tocca risfogliare le vecchie NE…)

grazie anche a Claudio_FF per aver riscritto il mio codice in maniera più elegante, c’è sempre da imparare…

Poi, per gli interrpupts…ho paura che ci risentiremo!!!

Grazie