Pages: [1]   Go Down
Author Topic: Sensore di Distanza SR04 (Valori Strani)  (Read 943 times)
0 Members and 1 Guest are viewing this topic.
Catania
Offline Offline
Newbie
*
Karma: 0
Posts: 28
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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 smiley-sad
Sapete aiutarmi ??
Logged

0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10106
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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 smiley-razz
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9185
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Catania
Offline Offline
Newbie
*
Karma: 0
Posts: 28
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10106
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Catania
Offline Offline
Newbie
*
Karma: 0
Posts: 28
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley 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..
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10106
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@oiram92 caro mario(giusto?  smiley-razz 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.
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Pages: [1]   Go Up
Jump to: