piu sensori ad ultrasuoni con un solo pin "trigger"

ciao a tutti!!

per un progetto devo utilizzare due (forse 3) sensori ad ultrasuoni, del tipo HC-SR04.
come sapete, ognuno di tali sensori richiede 2 pin, piu l'alimentazione, percui se devo utilizzare 3 sensori avrò bisogno di 6 pin.

per risparmiare pin mi chiedevo se sia possibile utilizzare un solo pin trigger, quindi avere un unico pin per l'impulso comune a tutti i sensori. inquesto modo si risparmierebbero un bel po di pin.

allego un immaginetta per chiarire cosa intendo.

ho provato a vedere se funziona, e rilevo alcuni problemi.

utilizzando due sensori con due trigger (uno a sensore), non rilevo problemi, e i sensori fanno il loro dovere. ma provando ad utilizzare un trigger comune ad entrambi, ed utilizzando questo codice

#define ECHO1_PIN 13 
#define ECHO2_PIN 12 
#define TRIG1_PIN 11 

void setup() {

  Serial.begin(9600);
  pinMode(ECHO1_PIN,INPUT);
  pinMode(TRIG1_PIN,OUTPUT);
  pinMode(ECHO2_PIN,INPUT);
  digitalWrite(TRIG1_PIN,LOW);

}

void loop() {
  
  digitalWrite(TRIG1_PIN,HIGH);
  delayMicroseconds(20);
  digitalWrite(TRIG1_PIN,LOW);
    
  float time_micro1 = pulseIn(ECHO1_PIN,HIGH);
  float time_milli1 = time_micro1/1000;
  float distance1 = time_milli1*0.173;

  digitalWrite(TRIG1_PIN,HIGH);
  delayMicroseconds(20);
  digitalWrite(TRIG1_PIN,LOW);
  
  float time_micro2 = pulseIn(ECHO2_PIN,HIGH);
  float time_milli2 = time_micro2/1000;
  float distance2 = time_milli2*0.173;
  
  Serial.println();
  Serial.print("Distanza 1 \tDistanza 2");
  Serial.println();
  Serial.print("\t");
  Serial.print(distance1);
  Serial.print("\t");
  Serial.print("\t");
  Serial.print(distance2);
  Serial.println();

  delay(2000);
  
}

ottengo dei funzionamenti anomali sul sensore 2.

ho fatto delle prove con ostacoli a diverse distanze:

PROVA 1

ostacolo dal sensore 1 = 25 cm
ostacolo dal sensore 2 = 25 cm

in questo caso i sensori funzionano entrambi

PROVA 2

ostacolo dal sensore 1 = 25 cm
ostacolo dal sensore 2 = 5 - 10 cm

in questo caso i sensori funzionano entrambi

PROVA 1

ostacolo dal sensore 1 = 5 - 10 cm
ostacolo dal sensore 2 = 25 cm

in questo caso il sensore 1 funziona bene, il sensore 2 rileva ZERO.

come mai? secondo voi è possibile modificare il codice in modo da avere un solo trigger comune a tutti i sensori?

Grazie!

tommaso

Immagine.png

Questo tipo di sistema funziona sono se i sensori sono compatibili con un bus e sono ad esso collegati, in tal caso vengono identificati univocamente e li puoi interrogare chiamandoli per nome; p.es. ti puoi documentare sul buc I2C per capire cosa intendo. Nel tuo caso è un miracolo che ne funzioni uno, non puoi pensare di sovrapporre dei segnali e leggerli distintamente facendo due letture; l'unico che sa a quale dei due ti riferisci sei tu, il micro non ti può esaudire leggendoti nel pensiero, purtroppo...ha bisogno di info chiare che nello specifico non puoi fornire. Una soluzione potrebbe essere quella di ricorrere ad un multiplexer esterno, collegando le uscite dei sensori agli ingressi del mux e prelevando l'unica uscita da mandare ad un pin del micro, almeno per quanto riguarda il segnale di ritorno, penso che potrei fare la stessa cosa in uscita dal micro, col segnale di trigger.

Oltre a quello che ha detto il buon Michele aggiungerei una cosa importante: non è una buona cosa far funzionare in contemporanea quei sensori, poiché le emissioni soniche di uno (burst) possono alterare la ricezione dell'altro.

E' vero che gli ultrasuoni sono abbastanza direttivi, ma non lo sono i rimbalzi!

Non puoi metterli in paralello. Si disturbano l'uno l'altro.
IL modello HC-SR05. ha la possibilitá di avere un pin triggere e uno di segnale oppure uno un pin che fa entrambe le cose.

Ciao Uwe

Grazie mille!

io speravo che l'impulso "trigger" potesse essere universale, e poi poter rilevare l'eco volta per volta dai singoli sensori.

dovrò trovare un modo per risparmiare pin, a questi punti

mi siete stati di grande aiuto, ciao!

Tommaso

Quindi, l unico modo di risparmiare pin con questi sensori è con un interfaccia i2c master-slave giusto?
ho un po cercato su internet ed ho trovato questo tutorial che spiega come gestirne uno con questa logica

tra l altro devo dire che non è che ci abbia capito gran che....
Sapreste indicarmi qualche pagina o tutorial che spieghi come fare?

grazie, ciao

tommaso

Certo che puoi usare lo stesso comando di trigger per più sensori però ti devi scrivere tu il codice senza usare la libreria esistente , il pin echo và High devi cominciare misurare il tempo finchè torna a Low, un oggetto a 10cm ti darà un tempo di circa 588 uSec, puoi farlo senza scomodare un pin_expander in I2C