Go Down

Topic: Sensore di Distanza SR04 (Valori Strani) (Read 1 time) previous topic - next topic

Oiram92

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 è :
Code: [Select]

#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 :(
Sapete aiutarmi ??

lesto

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:
Code: [Select]

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 :P
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

astrobeed


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.

Oiram92

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
Code: [Select]

#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  :smiley-eek:
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..  :(
Quale può essere il problema?

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
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Go Up