Collegare più sensori ultrasuoni ad Arduino Uno

Salve a tutti,
sono un laureando in Design, stò preparando la mia tesi su un progetto che integra Arduino. Premetto che per me è un campo nuovo sia Arduino che l'elettronica. Ho cercato di imparare il più possibile in questi pochi giorni.

Come da titolo mi chiedo se sia possibile collegare più di un sensore ultrasuoni SR04 ad Arduino Uno. Ho cercato in giro ma non ho trovato nulla. Sono riuscito a rilevare la distanza con un sensore, poi ho cercato di modificare il codice aggiungendo i vari pin, ma alla fine nel monitor seriale mi confonde i dati rilevati! Non mi risultano 2 distanze differenziate, ma fa confusione, prima rileva una distanza e poi quella dell'altro sensore!
Qualcuno sà aiutarmi? Vi allego il codice, così potete controllare se ho sbagliato a modificarlo, dato che sono le prime volte che uso arduino. Grazie.


// setup variabili primo sensore
const int numOfReadingsA = 10; // numero di letture su cui fare la media
int readingsA[numOfReadingsA]; // creo un array apposito per conservare le letture
int arrayIndexA = 0; // inizializzo l'indice dell'array corrente
int totalA = 0; // conterrà il totale cumulativo
int averageDistanceA = 0; // conterrà la media calcolata
// setup variabili secondo sensore
const int numOfReadingsB = 10; // numero di letture su cui fare la media
int readingsB[numOfReadingsB]; // creo un array apposito per conservare le letture
int arrayIndexB = 0; // inizializzo l'indice dell'array corrente
int totalB = 0; // conterrà il totale cumulativo
int averageDistanceB = 0;
// setup dei pins
int echoPinA= 2; // SRF05 echo su pin (digital 2)
int initPinA= 3; // SRF05 trigger su pin (digital 3)
int echoPinB = 10; // SRF05 echo su pin (digital 10)
int initPinB= 9; // SRF05 trigger su pin (digital 9)
// Calcolo distanza sensore A
unsigned long pulseTimeA = 0; // conterrà il tempo intercorso in us
unsigned long distanceA = 0; // conterrà la distanza (in cm)
// Calcolo distanza sensore A
unsigned long pulseTimeB = 0; // conterrà il tempo intercorso in us
unsigned long distanceB = 0; // conterrà la distanza (in cm)
void setup() {
pinMode(initPinA, OUTPUT); // sett il pin 3 come output
pinMode(echoPinA, INPUT); // setto il pin 2 come input per l'eco
pinMode(initPinB, OUTPUT); // sett il pin 9 come output
pinMode(echoPinB, INPUT); // setto il pin 10 come input per l'eco
// creiamo la struttura che serve a riempire l'array A
for (int thisReading = 0; thisReading < numOfReadingsA; thisReading++) {
readingsA[thisReading] = 0;
}
// creiamo la struttura che serve a riempire l'array B
for (int thisReading = 0; thisReading < numOfReadingsB; thisReading++) {
readingsB[thisReading] = 0;
}
// Inizializziamo la porta seriale che ci mostrerà le letture

Serial.begin(9600);
}
// Programma primo sensore
void loop() {
digitalWrite(initPinA, HIGH); // manda un impulso di 10 microsecondi
delayMicroseconds(10); // attende 10 microsecondi prima di andare a low
digitalWrite(initPinA, LOW); // Piedino low, stop impulso
pulseTimeA = pulseIn(echoPinA, HIGH); // Attendi in ascolto l'impulso di rimbalso e cattura il tempo impiegato
distanceA = pulseTimeA/58; // Distance = pulse time / 58 to convert to cm.
totalA= totalA - readingsA[arrayIndexA]; // applichiamo la formula
readingsA[arrayIndexA] = distanceA; // aggiungiamo la lettura all array
totalA= totalA + readingsA[arrayIndexA]; // aggiungiamo la lettura al totale
arrayIndexA = arrayIndexA + 1; // posizioniamoci sul prossimo elemento dell'array
// alla fine dell' array (10 oggetti) inizia da capo
if (arrayIndexA >= numOfReadingsA) {
arrayIndexA = 0;
}
// Programma secondo sensore
digitalWrite(initPinB, HIGH); // manda un impulso di 10 microsecondi
delayMicroseconds(10); // attende 10 microsecondi prima di andare a low
digitalWrite(initPinB, LOW); // Piedino low, stop impulso
pulseTimeB = pulseIn(echoPinB, HIGH); // Attendi in ascolto l'impulso di rimbalso e cattura il tempo impiegato
distanceB = pulseTimeB/58; // Distance = pulse time / 58 to convert to cm.
totalB= totalB - readingsB[arrayIndexB]; // applichiamo la formula
readingsB[arrayIndexB] = distanceB; // aggiungiamo la lettura all array
totalB= totalB + readingsB[arrayIndexB]; // aggiungiamo la lettura al totale
arrayIndexB = arrayIndexB + 1; // posizioniamoci sul prossimo elemento dell'array
// alla fine dell' array (10 oggetti) inizia da capo
if (arrayIndexB >= numOfReadingsB) {
arrayIndexB = 0;
}

averageDistanceA = totalA / numOfReadingsA; // fai la media delle distanze A
averageDistanceB = totalB / numOfReadingsB; // fai la media delle distanze B
Serial.println(averageDistanceA, DEC); // stampiamo sul serial monitor il valore letto
Serial.println(averageDistanceB, DEC); // stampiamo sul serial monitor il valore letto
delay(100); // attesa di 100 milli prima del prossimo loop
}

C'è una nuova libreria per i sensori ad ultrasuoni tipo hc-sr04. Non l'ho ancora provata ma dicono sia veramente ottima. Ecco il link:
http://arduino.cc/forum/index.php/topic,106043.0.html

ciao, grazie per la risposta.
il problema mio non è quello della libreria..potrei anche usarla, ma la cosa principale è il dover fare un codice per più sensori. Volevo una mano su questo, perchè ho provato a modificare un codice, ma non ci sono riuscito come ho detto mi fa confusione nel serial monitor.

Ah..grazie..non avevo visto che parlavano di una possibilità di collegare più sensore!scusami!:wink: ora leggo tutto..poi vi faccio sapere se ci sono riuscito o se ci sonno problemi!:wink:

se hai presente come funzionano i sensori, sei sicuro che siano messi in modo tale che non si disturbino a vicenda? se non sai come funzionano vai su wikipedia e guarda come funziona un sonar (o un radar). Fondamentalmente ogni sensore emette un onda sonora e rileva il tempo in cui torna indietro (l'eco!). quindi può funzionare solo un sensore alla volta, a meno che non ci sia un ottimo isolamento acustico tra i 2 sensori.

grazie per l'informazione! Sapevo più o meno come funzionavano..ma non c'avevo pensato ad un disturbo acustico! Ma si crea il disturbo anche se sono fuori dal loro campo acustico?!mi sembra 45° se non mi ricordo male..

immaginati il sensore come una cassa che fa un suono, e poi un microfono che misura dopo quanto tempo arriva il suono di ritorno (quindi un microfono mooolto sensibile).
Ora immagina di stare dietro a una cassa.. il suono, anche se più basso, lo senti lo stesso!

l'unica è far una misurazione alla volta. considerando il tempo del suono, in un secondo dovresti tranquillamente fare qualche centinaio di letture (sto andando a spanne, niente conti), considera che per ingannare l'essere umano 30 letture al secondo bastano....

ah..allora và più che bene! io penso di dover usare 6/9 sensori ad ultrasuoni..e anche se ritardano di mezzo secondo il movimento dei servi non è la fine del mondo! grazie..vediamo se adesso ci riesco!:wink:

sono riuscito a far funzionare i 2 sensori. Ho modificato il codice che usa la libreria New_ping.
Per comodità ho tolto i "cm" e avevo tolto anche la scritta "Ping: " perchè devo usare il risultato della distanza con il programma FireFly!
Ora per fare un test ho reinserito la scritta Ping per differenziare il risultato dei 2 sensori.
Tutto torna..ho messo un delay tra una lettura e l'altra come consigliato prima, per non creare interferenza tra i 2 sensori.
Però c'è qualcosa che non torna! perchè il risultato che mi compare nel serial monitor sono identici tra i 2 sensori..ho la brutta impressione che continua a leggere solo un sensore! ecco il risultato che mi viene:

PingB: 11
PingA: 11
PingB: 11
PingA: 10
PingB: 10
PingA: 10
PingB: 10
PingA: 10
PingB: 35
PingA: 36
PingB: 36
PingA: 36
PingB: 10
PingA: 10
PingB: 10
...

Questo è il codice che ho usato:

#include <NewPing.h>

#define TRIGGER_PINa 12 // Arduino pin tied to trigger pin on ping sensor.
#define ECHO_PINa 13 // Arduino pin tied to echo pin on ping sensor.
#define TRIGGER_PINb 10 // Arduino pin tied to trigger pin on ping sensor.
#define ECHO_PINb 11 // Arduino pin tied to echo pin on ping sensor.
#define MAX_DISTANCE 200 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.

NewPing sonarA(TRIGGER_PINa, ECHO_PINa, MAX_DISTANCE); // NewPing setup of pins and maximum distance.
NewPing sonarB(TRIGGER_PINa, ECHO_PINa, MAX_DISTANCE); // NewPing setup of pins and maximum distance.

byte pingSpeed = 50; // How frequently are we going to send out a ping (in milliseconds). 50ms would be 20 times a second.
unsigned long pingTimer = pingSpeed; // Holds the next ping time.

void setup() {
Serial.begin(115200); // Open serial monitor at 115200 baud to see ping results.
}

void loop() {
// Notice how there's no delays in this sketch to allow you to do other processing in-line while doing distance pings.

// Lettura primo sensore.
if (millis() >= pingTimer) { // pingSpeed milliseconds since last ping, do another ping.
pingTimer += pingSpeed; // Set the next ping time.
Serial.print("PingA: ");
int cm = sonarA.ping_cm(); // Send out the ping, get the results in centimeters.
Serial.print(cm); // Print the result (0 = outside the set distance range, no ping echo)
Serial.println(" ");
}

delay (pingTimer); // Attendi prima di partire col prossimo sensore.

// Lettura secondo sensore.
if (millis() >= pingTimer) { // pingSpeed milliseconds since last ping, do another ping.
pingTimer += pingSpeed; // Set the next ping time.
Serial.print("PingB: ");
int cm = sonarB.ping_cm(); // Send out the ping, get the results in centimeters.
Serial.print(cm); // Print the result (0 = outside the set distance range, no ping echo)
Serial.println(" ");

delay (pingTimer); // Attendi prima di partire col prossimo sensore.
}
}

ok..come non detto..ho risolto tutto!:wink:
per chi interessa questo è il codice corretto!:wink: grazie per l'aiuto!


#include <NewPing.h>

#define TRIGGER_PINa 12 // Arduino pin tied to trigger pin on ping sensor.
#define ECHO_PINa 13 // Arduino pin tied to echo pin on ping sensor.
#define TRIGGER_PINb 10 // Arduino pin tied to trigger pin on ping sensor.
#define ECHO_PINb 11 // Arduino pin tied to echo pin on ping sensor.
#define MAX_DISTANCE 200 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.

#include <NewPing.h>

NewPing sonar1(TRIGGER_PINa, ECHO_PINa, MAX_DISTANCE); // Sensor 1: trigger pin, echo pin, maximum distance in cm
NewPing sonar2(TRIGGER_PINb, ECHO_PINb, MAX_DISTANCE); // Sensor 2: same stuff

#define pingSpeed 1000 // Ping frequency (in milliseconds), fastest we should ping is about 35ms per sensor
unsigned long pingTimer1, pingTimer2;
int in1, in2;

void setup() {
Serial.begin(9600);
pingTimer1 = millis() + pingSpeed; // Sensor 1 fires after 1 second (pingSpeed)
pingTimer2 = pingTimer1 + 35; // Sensor 2 fires 35ms later
}

void loop() {
if (millis() >= pingTimer1) {
pingTimer1 += pingSpeed; // Make sensor 1 fire again 1 second later (pingSpeed)
in1 = sonar1.ping_in();
}
if (millis() >= pingTimer2) {
pingTimer2 = pingTimer1 + 35; // Make sensor 2 fire again 35ms after sensor 1 fires
in2 = sonar2.ping_in();
// Both sensors pinged, process results here
Serial.print(in1);
Serial.print(" - ");
Serial.println(in2);
}
// Do other stuff here, notice how there's no delays in this sketch, so you have processing cycles to do other things :slight_smile:
}

Occhio a non confondere pollici e centimetri, pare che sia cascato perfino un satellite per questo motivo.

Inoltre il codice lo puoi racchiudere tra i tag [ code ] e [ /code ] premendo il # sopra le faccine.

ah..ok scusatemi..la prossima volta lo metto come codice..non lo sapevo.
Comunque sono cm quelli che escono dalla lettura..purtroppo non lo posso lasciare nella lettura perchè altrimenti firefly non me lo riconosce come un numero..ma lo riconosce come una parola!:slight_smile:

Salve a tutti ho 15 anni e sono un appassionato di elettronica.. nono tantissima esperienza con arduino.. Ho un problema urgente e che mi fa innervosire tantissimo... sto costruendo un robot che dispone di 4 sensori ad ultrasuoni, a seconda della distanza rilevata da ognuno di esso, i 2 motori si comportano in un certo modo ( utilizzo la Adafruit motorschield per comandarli), qualcuno mi sa dire come posso integrare la libreria Newpin con quella di AFMotor? Ho provato e cercato dappertutto e non ci sono riuscito.. c'è qualcuno che è disposto ad aiutarmi..?

Pitt02:
Salve a tutti ho 15 anni e sono un appassionato di elettronica..

Ciao, complimenti per l'interesse per l'elettronica alla tua giovane età, ma prima che te lo dica un amministratore vorrei sottolinearti due cose:

  1. nel rispetto del regolamento devi presentarti IN QUESTO THREAD spiegando bene quali conoscenze hai di elettronica e di programmazione.

  2. Dopo che lo avrai fatto, leggi con MOLTA attenzione il REGOLAMENTO, perché oltre alla presentazione, si dice anche che non bisogna riaprire thread più vecchi di 9-12 mesi (e questo era di oltre 5 anni fa!): apri un TUO nuovo thread impostando un oggetto significativo (evita cose generiche come "Aiuto" o "Ho un problema") e nel testo spiegando il problema (se utile, puoi inserire un link al vecchio thread se vuoi far riferimento a risposte o soluzioni).

Fino a che non avrai fatto queste DUE cose, mi spiace ma non potrà nessuno risponderti, per cui SBRIGATI! :slight_smile: