Sensore di Distanza SR04 (Valori Strani)

Salve a tutti, ho da poco iniziato con arduino (ho acquistato un kit con lcd e sensore di distanza).
Ho cercato online il funzionamento del sensore ed il codice da caricare su arduino, ma ottengo dei valori sballati (ad esempio metto un oggetto a circa 2-3 cm ed ottengo 3078, il che diciamo sarebbe "corretto" se la misura che ottengo fosse espressa in mm, ma invece questa dovrebbe essere in cm giusto?)

il codice è :

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

#define triggerPort 8     // Pin 8 di Arduino
#define echoPort 9        // Pin 9 di Arduino

void setup() {
  lcd.begin(16, 2);
  lcd.print("Sensore HC-SR04");
  pinMode(triggerPort, OUTPUT);
  pinMode(echoPort, INPUT);
}

void loop() {
  long duration, distance;
  digitalWrite(triggerPort, LOW);
  delayMicroseconds(2);
  digitalWrite(triggerPort, HIGH);
  delayMicroseconds(10);
  digitalWrite(triggerPort, LOW);
  duration = pulseIn(echoPort, HIGH);
  distance = duration / 58;

  lcd.setCursor(0, 1);
  lcd.print("Dist : ");
  lcd.print(distance);
  
  delay(1000);
}

Non capisco quale possa essere il problema..se fosse rotto non dovrebbe restituire nessun valore giusto ?
I collegamenti sono fatti bene..il display funziona quindi tralascio di scriverli, mentre quelli del sensore sono :

  • VCC -> +5V
  • Trig -> Pin 8 Arduino
  • Echo -> Pin 1 Arduino
  • GND -> Ground

Ho provato ad utilizzare l'echo anche sulle altre porte libere (6 - 7 - 9) ma il risultato non cambia..
Inizialmente (senza oggetti) viene visualizzato 3140 e poi lentamente (nel giro di dieci secondi) si stabilizza scendendo a 3081
Se piazzo un oggetto davanti (a distanza variabile) ottengo un oscillazione tra 3080 e 3081, ma sono valori ben lontani da quello reale :frowning:
Sapete aiutarmi ??

chi ha mai detto che quel sensore restituisce un valore in cm/mm? Queelo script ritorna la durata del segnale ALTO restituito dal sensore, che rappresenta la distanza, o meglio il tempo impiegato dall'onda sonora a colpire l'oggetto e tornare indietro. Quel valore lo dividi per 58, che non so da dove hai pescato, anzi a me risulta:

distance = time /29 / 2  ;     // Distance_CM  = ((Duration of high level)*(Sonic :340m/s))/2

il datasheet dice che tu ottieni un valore PROPORZIONALE, ovvero se un oggetto a 5cm restituisce 100, e a 10cm restituisce ((100/5)*10) = 200

poi

tu dici:

  • Trig -> Pin 8 Arduino
  • Echo -> Pin 1 Arduino

ma nel codice:

#define triggerPort 8 // Pin 8 di Arduino
#define echoPort 9 // Pin 9 di Arduino

decides! pim 8 e 9 o pin 8 e 1?

NON usare il pin 0 e 1 digitali, che son usati per la comunicazione via Serial con il PC.
Happy coding :stuck_out_tongue:

lesto:
Quel valore lo dividi per 58, che non so da dove hai pescato, anzi a me risulta:

Quel /58 non ha alcun senso, il modo corretto per convertire i us del tempo di volo è moltiplicarli per lo spazio che il suono percorre in tale tempo.
Prendendo il valore medio della velocità del suono a temperatura ambiente standard, ovvero 340 m/s, abbiamo 0.00034 m/us ovvero 0.34 mm/us, tenuto conto che dobbiamo considerare solo metà del tempo visto che la misura è relativa sia al tempo andata che di ritorno alla fine per ottenere il valore in mm basta moltiplicare il tempo in us per 0.17, p.e. se la lettura sono 500 us la distanza è 85 mm.
Se il calcolo viene fatto moltiplicando prima per 17 e poi dividendo per 100 è meglio perché si lavora solo con numeri interi invece di usare i float che richiedono molto più tempo cpu e per la loro natura sono meno precisi.

per quanto riguarda il 58, deriva da http://www.xappsoftware.com/wordpress/2012/03/15/how-to-interface-the-hc-sr04-ultrasonic-ranging-module-to-arduino/
Per adesso ho deciso di stampare i risultati sul monitor seriale.
Il circuito è questo

Il codice è questo

#define triggerPort 8
#define echoPort 9

void setup() {
  Serial.begin(9600);
  pinMode(triggerPort, OUTPUT);
  pinMode(echoPort, INPUT);
}

void loop() {
  digitalWrite(triggerPort, LOW);
  delayMicroseconds(2);
  digitalWrite(triggerPort, HIGH);
  delayMicroseconds(10);
  digitalWrite(triggerPort, LOW);
  long duration = pulseIn(echoPort, HIGH);
  long distance = duration / 29 / 2;
  Serial.println(duration);
  delay(500);
}

Viene stampato un valore compreso tra 178000 - 179000 :astonished:
Questo significa che 178000 / 29 / 2 ~ 3000 cm = 30 metri
Se metto un oggetto i valori non cambiano, nonostante l'oggetto si trova a 4-5 cm.. :frowning:
Quale può essere il problema?

stampa i valori senza fare nessuna operazione matematica, e il fatto che essi non cambino... ricontrolla i collegamenti, usando un tester tra il pin arduino e il sensore, se c'è resistenza allora qualcosa non va

lesto:
stampa i valori senza fare nessuna operazione matematica, e il fatto che essi non cambino... ricontrolla i collegamenti, usando un tester tra il pin arduino e il sensore, se c'è resistenza allora qualcosa non va

Grazie per l'interesse :slight_smile: dunque, ieri sono stato da un elettricista (non possiedo un tester) ed ho portato tutto il circuito con arduino collegato al pc per farlo controllare..
ho chiesto come dicevi tu di controllare se vi fosse resistenza e lui ha risposto dicendo : "beh si in effetti un pò di resistenza c'è ma considerando che il circuito è a 5V , possiamo anche trascurarla"
Pensandoci adesso, non ho chiesto quale fosse il valore della resistenza che c'era (in modo da chiedervi se fosse davvero trascurabile)..Credo che oggi andrò a comprarne uno mio (tanto prima o poi dovrò acquistarlo) e vi darò i valori esatti..Nel frattempo qualcuno saprebbe analizzarmi il perchè l'elettricista sia giunto a questa conclusione? Dal mio parere (di ignorante, spero per poco) se in un circuito c'è resistenza dove non dovrebbe esserci, questo potrebbe causare una "perdita di potenza" variabile che fa sballare i risultati e quindi mi vengono restituiti questi valori strani..

Ciao il codice è giusto, poi volevo aggiungere che time/29/2 è uguale a time/58, a parte questa precisazione, ho provato il codice che hai postato e a me funziona perfettamente. Comunque io l'ho usato anche nel mio progetto e nella messa a punto posso dirti che l'oggetto di fronte se ha una superfice liscia deve essere perpendicolare altrimenti il segnale si perde e ti segna un numero elevato. Non credo sia un problema di resistenza dei fili che hai usato per collegarlo ad arduino, può essere anche uno dei trasduttori montati sul sensore con qualche difetto di saldatura, poi non ultimo, fai attenzione se usi delle librerie che fanno uso di interrupt, ma se l'ho hai provato con il secondo codice postato e ti da sempre lo stesso valore allora penso sia un problema al sensore.

myblog http://modom636.blogspot.com

@oiram92 caro mario(giusto? :stuck_out_tongue: era facile), tutto ciè che esiste ha una sua resistenza, conduttanza ed impedenza. A seconda di cosa dobbiamo fare una cosa può avere uno o più di questi valori esagerati, trascurabili, o da prendere in considerazione.