khriss75:
Se sto immobile davanti al sensore ho misure stabili e precise, se ruoto il tronco a DX e SX (rimanendo però alla stessa distanza) le misure sballano alla grande:
Che possano variare è normale, e l'ho pure descritto nel post #1. Che possano variare così tanto mi pare un poco strano, ma se usi gli HC-SR04 che a me hanno sempre dato problemi di stabilità (vedi sempre il post #1... ma lo hai letto?) e da anni uso solo gli HY-SRF05 per cui ti consiglierei di inizare da questo.
Io a suo tempo creai per me una libreria (se vuoi te la mando, l'chiamata "SRF05" indovina perché?
) nella quale facevo questo:
...
digitalWrite( TrigPin, HIGH );
delayMicroseconds(10); // Ping width
digitalWrite( EchoPin, LOW );
long pulseDuration = pulseIn( EchoPin, HIGH, SRF_TIMEOUT);
if ( Unlock && pulseDuration == 0 ) {
// SR04 unlock
pinMode(EchoPin, OUTPUT);
digitalWrite(EchoPin, LOW);
delay(50);
pinMode(EchoPin, INPUT);
}
Distance = 0.034F * pulseDuration / 2;
A parte la if() per fare l'"unlock" (molti esemplari di SR04 ogni tanto si "bloccavano" dando sempre valori molto bassi fino a che non li si sbloccava resettandoli...), come vedi il codice ha prima dell'impulso da 10 us un "pull down" sul pin di trigger, che ti consiglio di aggiungere.
Poi alla pulseIn() ho aggiunto anche un timeout per "velocizzare" le letture quando non c'è alcun ostacolo entro il range prefissato (nel mio caso SRF_TIMEOUT vale 45000UL ossia 45 ms).
Detto questo, ho preso un sensore ed ho caricato il tuo sketch, ma non ho notato tutte le variazioni che hai mostrato tu.
180.62
192.44
181.41
192.42
85.92 <-- qui sono entrato per mettermi davanti al sensore
80.98
72.71
72.30
74.11
73.78
73.26
74.97
72.75 <-- qui ho iniziato a ruotare sul posto
74.93
82.58
83.49
181.34 <-- qui sono andato via
180.89
182.68
181.85
183.09
180.96
72.32 <-- qui ho messo un cuscino alla stessa distanza
70.70
71.42
70.70
68.30
80.60 <-- qui ho un poco ruotato il cuscino
85.30
69.52
71.91
59.67
31.25 <-- qui ho avvicinato il cuscino
28.16
28.95
92.33 <-- l'ho allontanato
75.21
34.53 <-- e riavvicinato
193.25 <-- poi ho tolto il cuscino
182.13
195.00
Come si vede, non ho particolari "salti" di misurazione, ed anche se le distanze variano un poco anche stando fermi (la precisione della misurazione non è assoluta soprattutot in ambiente aperto, considera sempre una variazione di almeno un paio di cm) e muovendomi o ruotando sul posto variano un po' di più.
Ma come detto, dipende dal materiale e dalla sua inclinazione: se metti un foglio o uno specchio a 45 gradi è come se non ci fosse. Se parliamo di una persona, allora si, potresti fare una "media" delle letture scartando quelle maggiori del limite che vuoi considerare, ma aumentando il numero di campioni al secondo e realizzando una media mobile ossia degli ultimi "n" valori acquisiti. Ovviamente l'intervallo tra letture moltiplicato per il numero di valori della media ti darà la "latenza".
Una cosa di questo tipo:
#define TRIG_PIN 10
#define ECHO_PIN 9
unsigned long tempo;
// Valori in centimetri
int distanza, media;
// Intervallo in ms tra letture
#define INTLETTURE 100
// Numero di letture per la media mobile
#define NUMLETTURE 10
int lettura[NUMLETTURE];
byte pos = 0;
void setup(){
Serial.begin(115200);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
digitalWrite(TRIG_PIN, LOW);
Serial.println("Started.");
}
void loop(){
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
tempo = pulseIn(ECHO_PIN, HIGH);
distanza = 0.03438F * tempo / 2.0;
if ( distanza <= 300 && distanza > 3 ) {
lettura[pos] = distanza; // Memorizzo la lettura
// Se sono all'ultima posizione
if ( pos == NUMLETTURE-1 ) {
// Calcolo la media
media = 0;
for (int i=0; i<NUMLETTURE; ++i) {
media += lettura[i];
if ( i>0 ) // Rotazione valori
lettura[i-1] = lettura[i];
}
media /= NUMLETTURE;
Serial.println(media);
} else
++pos;
}
delay(INTLETTURE);
}
Puoi giocare sul delay (INTLETTURE) e sul numero di campioni (NUMLETTURE).
PS: le capsule hanno una ampiezza dell'apertura del segnale di circa 15 gradi, se vuoi limitare eventuali "rumori" di altri oggetti e rendere più direzionale la rilevazione, puoi mettere le capsule, o almeno la capsula di ricezione, dentro a due tubetti in cartoncino di qualche centimetro. Dico in cartoncino perché è meglio se non sono superfici riflettenti, rende il tutto più direzionale.