problemi di misurazione con HC-SR04 e input DFPlayer.

Buongiorno,

Descrivo brevemente il mio progetto: devo costruire un sistema di rilevamento con HC-SR04, quando un utente è a meno di una certa distanza si attiva la riproduzione di una traccia audio tramite DFPlayer.

Attraverso il pin BUSY posso sapere se il DFPlayer stia o meno riporoducendo l’audio. Succede però che quando l’audio smette di essere riprodotto, oltre a che senitirsi nelle cuffie un rumore secco come di disturbo, il sensore ad ultrasuoni rileva sempre una misura inferiore a quella messa nella condizione(ho provato con diverse misure), come si puo vedere dalla scheramta del monitor seriale allegata.

È possibile che cambiando di stato il pin BUSY del DFPlayer faccia disturbi la rilevazione del sensore? È solo un ipotesi che non riesco a verificare temo per le mie esigue competenze. Cosa potrebbe essere alternativamente ?

il link al datasheet del DFplayer:
https://www.dfrobot.com/wiki/index.php/DFPlayer_Mini_SKU:DFR0299

#include <DFRobotDFPlayerMini.h>
#include <SoftwareSerial.h>
#include <Arduino.h>


SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);


const int trigPin = 5;
const int echoPin = 6;

long duration;
int distance;
int stato;
int safetyDistance;




  
void setup()
{
  Serial.begin(9600);
  mySoftwareSerial.begin(9600);
  myDFPlayer.begin(mySoftwareSerial);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(4, INPUT);
  Serial.println(myDFPlayer.readState()); 


}




void loop() {

digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);

distance= duration*0.034/2;
safetyDistance = distance;
Serial.println(distance);
 
  
  if (safetyDistance <= 40 && digitalRead(4) == HIGH){
    
   myDFPlayer.volume(20);
   myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD);
   myDFPlayer.enableDAC();
   myDFPlayer.play(001);
   Serial.println(distance);
}
 delay(500);

}

Grazie mille per l’aiuto e la disponibilità.

Lo schema non è chiaro (non si vedono alcuni collegamenti come le alimentazioni del sensore e del player) ma comunque sia, la prima cosa che mi viene in mente è una interferenza. Sospetto che possa rientrare sul sensore quel “rumore” che senti e che dovrebbe corrispondere alla fine riproduzione, con l’output che torna a zero: essendo un’onda quadra, ha armoniche elevate quindi il sensore potrebbe interpretarle come il ping di ritorno e darti una misurazione errata.
Prova a non usare un altoparlante, ossia manda il suono in cuffia e vedi se fa la stessa cosa.

Grazie mille per la risposta.

Allora ho provato a sistemare lo schema.

Non sto usando uno speaker ma già le uscita dac connesse ad un jack da 3.5.

Potrebbe essere invece che sia un problema di velocità di trasmissione, del tipo che il palyer non sta al passo con il sensore ad ultrasuoni?Ho porvato a giocare con il delay a fine funzione, e impostandolo su 300 risulta maggiormente affidabile.

Beh il delay() è comunque sempre da evitare ove possibile, soprattutto se lo sketch deve fare più cose.

Quindi ti direi di toglierlo del tutto, e gestire con millis() l'intervallo di rilevamento. Poi ti consiglio (come dico sempre a tutti) di evitare come la peste gli SR04, preferendo i più affidabili SRF05. Se hai la possibilità prenditene uno o due...

Nel weekend se non riesci a venirne a capo posso provare io a vedere come funziona (se avrò tempo, non assicuro nulla;)), a casa ho ancora un player ed un sensore ultrasuoni (ma io ho ormai solo SRF05, non acquisto più SR04 dopo che ne ho buttati 4...).

wow!

Grazie mille per la disponibilità! Io intanto faccio delle prove con millis().

Mi sono messo alla ricerca di un sensore SRF05, mi sapresti indicare un sito(se non si violano le regole del forum) affidabile, o quanto meno un prezzo indicativo del sensore. Ne ho trovati a 25€, ci aggiriamo sui quei prezzi o se ne trovano anche di più abbordabili? Tenendo conto che ho urgenza di averli entro sabato 16 o al massimo martedi 19.

Grazie mille

Edit: ho trovato il sensore. Appena mi arriva faccio delle prove e aggiorno. Grazie mille

mesk_32:
Edit: ho trovato il sensore. Appena mi arriva faccio delle prove e aggiorno. Grazie mille

Spero tu non abbia preso quello a 25€ (ma per curiosità, dove l'hai trovato??), sicuramente sarà placcato argento o con decine di Swarowsky, ma anche se diventa più bello appesantiscono solo il sensore... :smiley:

Io questi componenti li prendo tutti da eBay (filtrando venditori solo italiani), ad esempio QUESTO.
Tra i venditori, QUESTO è quello da cui ho acquistato di più, seguito da QUESTO (ne avrei anche un terzo, ma non so perché non sta pubblicando altri annunci)

PS: no, non è vietato scambiare link di fornitori di componenti...

docdoc:
Spero tu non abbia preso quello a 25€ (ma per curiosità, dove l'hai trovato??), sicuramente sarà placcato argento o con decine di Swarowsky, ma anche se diventa più bello appesantiscono solo il sensore... :smiley:

no, non avrei mai speso una cifra del genere, ho trovato un altro fornitore sempre su ebay. :slight_smile:

Grazie ancora! Ti faccio sapere appena mi arriva.

Allora,
mi è arrivato il sensore nuovo, nessuna fortuna, mi da gli stessi errori. Sto cercando di pensare a soluzioni alternative. Per adesso ho messo un timeout con la funzione millis(); così da evitare che il momento in cui il player inizia e finisce di riprodurre(supponendo sia quello che faccia interferenza con il sensore).
Diciamo così che ho aggirato il problema ed evito di usare il pin Busy.

Qualcuno ha qualche altra idea?

Ecco il codice

#include <DFRobotDFPlayerMini.h>
#include <SoftwareSerial.h>
#include <Arduino.h>


SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);


const int trigPin = 5;
const int echoPin = 6;

boolean ripr = true;
long duration;
int distance;
int stato;
int safetyDistance;

unsigned long currentMillis = 0;
unsigned long previousMillis = 0; 
unsigned long interval = 12000; 

  
void setup()
{
  Serial.begin(9600);
  mySoftwareSerial.begin(9600);
  myDFPlayer.begin(mySoftwareSerial);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(13, INPUT);
  Serial.println(myDFPlayer.readState()); 


}

void loop() {
  
unsigned long currentMillis = millis();  
if(currentMillis - previousMillis > interval) {
  ripr=true;
  }
  
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);

distance= duration*0.034/2;
safetyDistance = distance;
Serial.println(distance);
 
  
  if (safetyDistance <= 40 && ripr == true){
     
   previousMillis = currentMillis;
   myDFPlayer.volume(20);
   myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD);
   myDFPlayer.enableDAC();
   myDFPlayer.play(001);
   Serial.println(distance);
   ripr = false;
  }
}