Skip to Content

Tutorial sensore di distanza resistente alle intemperie MaxBotix MB7389

Tutorial sensore di distanza resistente alle intemperie MaxBotix MB7389

Il MaxBotix MB7389 HRXL-MaxSonar-WR è un sensore di distanza a ultrasuoni resistente alle intemperie con un intervallo da 30 a 500 cm e una risoluzione di 1 mm. Questo sensore è ideale per applicazioni esterne come la misurazione del livello di serbatoi d’acqua o contenitori. Ha un angolo del fascio molto stretto e può essere utilizzato anche per applicazioni robotiche. Sebbene questo tutorial sia scritto per il MB7389, può essere utilizzato anche con altri sensori MaxBotix.

In questo tutorial imparerai come funziona il sensore e come utilizzarlo con un Arduino. Ho incluso 3 esempi con schemi di collegamento che mostrano il funzionamento base del sensore. Esamineremo le diverse uscite del sensore e ti mostrerò la differenza tra la modalità free-run e la modalità triggered.

Dopo ogni esempio, spiegherò come funziona il codice, così non avrai problemi a modificarlo secondo le tue esigenze.

Materiali

Componenti hardware

MB7389-100 HRXL-MaxSonar-WRMT × 1 Amazon
Arduino Uno Rev 3Arduino Uno Rev3 × 1 Amazon
Breadboard × 1 Amazon
Jumper wires ~ 10 Amazon
Header pins (opzionale) × 7 Amazon
momentary-push-buttonMomentary push button × 1 Amazon
USB cable type A/B × 1 Amazon

Software

Arduino IDEArduino IDE

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

Come funziona un sensore a ultrasuoni?

Un sensore di distanza a ultrasuoni funziona emettendo onde ultrasoniche. Queste onde vengono riflesse da un oggetto e il sensore le rileva. Misurando il tempo trascorso tra l’emissione e la ricezione delle onde sonore, è possibile calcolare la distanza tra il sensore e l’oggetto.

Distanza (cm) = Velocità del suono (cm/µs) × Tempo (µs) / 2

Dove Tempo è il tempo tra l’emissione e la ricezione delle onde sonore in microsecondi. A 20 °C la velocità del suono è circa 343 m/s o 0,034 cm/µs.

How does an ultrasonic distance sensor work
Principio di funzionamento dei sensori di distanza a ultrasuoni. Fonte:  https://www.maxbotix.com/

Nota che devi dividere il risultato per due. Questo perché le onde sonore viaggiano dal sensore all’oggetto e poi di ritorno dall’oggetto al sensore. Quindi la distanza tra sensore e oggetto è solo la metà della distanza percorsa dalle onde sonore.

Per maggiori informazioni su come funzionano i sensori a ultrasuoni, puoi consultare il mio articolo su HC-SR04. In questo articolo i principi di funzionamento di un sensore di distanza a ultrasuoni sono spiegati in modo più dettagliato.

Informazioni sul sensore

Il MaxBotix MB7389 HRXL-MaxSonar-WR è un sensore di distanza a ultrasuoni prodotto da MaxBotix Inc. MaxBotix è un produttore statunitense specializzato in sensori a ultrasuoni. Producono sensori per ogni tipo di applicazione, sia per uso interno che esterno.

MaxBotix non definisce i propri sensori come “impermeabili”, ma i sensori sono adeguatamente testati e classificati con una certificazione di resistenza alle intemperie IP67. Puoi trovare la definizione di questa classificazione su Wikipedia.

Quello che potresti non sapere è che la velocità del suono dipende fortemente dalla temperatura e dall’umidità dell’aria. La velocità del suono nell’aria aumenta di circa 0,6 metri al secondo per ogni grado centigrado. A differenza di molti altri sensori, il MB7389 dispone di compensazione interna della temperatura a bordo. Questo significa che il sensore compensa automaticamente le variazioni della velocità del suono e continua a fornire misurazioni accurate. Puoi anche installare un sensore di temperatura esterno per una compensazione ancora più precisa.

Ulteriori specifiche del sensore sono riportate nella tabella sottostante.

Specifiche MB7389 HRXL-MaxSonar-WR

Tensione di funzionamento 2,7 – 5,5 V
Corrente di funzionamento 3,1 mA in media a 5 V (98 mA picco)
Intervallo 30* – 500 cm
Angolo/forma del fascio See here
Protezione IP67
Risoluzione 1 mm
Frequenza 42 kHz
Frequenza di lettura 6,66 Hz
Uscite del sensore Tensione analogica, larghezza impulso, RS232
Dimensioni complessive 22,1 x 19,9 x 25,11 mm
Temperatura di funzionamento -40 – +65 °C
Vantaggi Compatto, leggero, fascio stretto, calibrazione automatica (tensione, umidità, rumore ambientale), filtraggio firmware, resistente alle intemperie (IP67), compensazione temperatura, facile da usare
Prodotto in USA
Costo Check price

*Il sensore ha praticamente nessuna zona morta, gli oggetti più vicini di 30 cm vengono segnalati come 30 cm.

Per maggiori informazioni, puoi consultare il datasheet qui:

Dimensioni del sensore

Le dimensioni esatte del sensore sono riportate nell’immagine sottostante:

MB7389 Ultrasonic Distance Sensor dimensions
Sensore di distanza a ultrasuoni MB7389

Uscite sensore MaxBotix

Come avrai visto nella tabella delle specifiche sopra, i sensori MaxBotix della famiglia MaxSonar hanno diverse uscite: tensione analogica, larghezza impulso e seriale RS232 (I2C sensori sono anche disponibili). In questo tutorial esamineremo sia l’uscita a tensione analogica che quella a larghezza impulso.

Tensione analogica

Questa è probabilmente la modalità più semplice per leggere la distanza misurata dal sensore. L’uscita a tensione analogica fornisce una tensione lineare che aumenta all’aumentare della distanza del bersaglio dal sensore.

136_AnalogVoltage_lg
Uscita a tensione analogica. Fonte: https://www.maxbotix.com/

Possiamo leggere questa uscita con un microcontrollore come Arduino e calcolare la distanza moltiplicando la lettura per un fattore di scala costante (questo fattore dipende dal tipo esatto di sensore, vedi datasheet).

Larghezza impulso

Un’altra opzione è usare l’uscita a larghezza impulso. Questo pin fornisce una rappresentazione della distanza tramite la larghezza di un impulso. Puoi usare la  pulseIn()  funzione nel codice Arduino per leggere la durata di questo impulso in microsecondi (µs). Per ottenere la distanza, devi moltiplicare questa lettura per un fattore di scala costante. Per il MB7389, il fattore di scala è 1 µs/mm. Quindi puoi semplicemente moltiplicare la lettura TOF per 1 per ottenere la distanza in millimetri.

PW-Output
Uscita a larghezza impulso. Fonte: https://www.maxbotix.com/

Per altri tipi di sensori, puoi trovare i fattori di scala nei datasheet.

Collegamenti – Connessione MaxBotix MB7389 ad Arduino UNO

Come accennato nell’introduzione, i sensori MaxBotix possono essere utilizzati in diverse modalità. Gli schemi di collegamento qui sotto mostrano come collegare il sensore MB7389 all’Arduino per l’uso con uscita a tensione analogica o a larghezza impulso.

Puoi saldare i fili direttamente al sensore, oppure installare dei pin header o un connettore.

MaxBotix-MB7389-ultrasonic-distance-sensor-with-Arduino-UNO-analog-voltage-wiring-diagram-schematic
Schema di collegamento per uscita a tensione analogica

I collegamenti sono anche riportati nella tabella seguente:

Collegamenti MB7389 – Tensione analogica

Sensore MaxBotix MB7389 Arduino
GND GND
V+ 5 V
Pin 3 A0
MaxBotix-MB7389-ultrasonic-distance-sensor-with-Arduino-UNO-pulse-width-wiring-diagram-schematic
Schema di collegamento per uscita a larghezza impulso

Collegamenti MB7389 – Larghezza impulso

Sensore MaxBotix MB7389 Arduino
GND GND
V+ 5 V
Pin 2 Pin 2

Quale uscita usare dipende dall’applicazione. Una differenza importante è che l’uscita a tensione analogica mostra la distanza con una risoluzione di 5 mm, mentre l’uscita a larghezza impulso offre una risoluzione di 1 mm.

Esempio di codice Arduino MaxBotix MB7389 – Tensione analogica

Con il seguente esempio di codice puoi leggere la distanza dall’uscita analogica del sensore e visualizzarla sul monitor seriale. Come puoi vedere, il codice è molto semplice ma sotto trovi alcune spiegazioni sul suo funzionamento.

/* Arduino example code for MaxBotix MB7389 HRXL-MaxSonar-WR 
   weather resistant ultrasonic distance sensor: 
   analog voltage output. 
   More info: www.www.makerguides.com */

#define sensorPin A0

int distance = 0;

void setup() {
  Serial.begin(9600);
}

void read_sensor() {
  distance = analogRead(sensorPin) * 5;
}

void print_data() {
  Serial.print("distance = ");
  Serial.print(distance);
  Serial.println(" mm");
}

void loop() {
  read_sensor();
  print_data();
  delay(1000);
}

Dovresti vedere il seguente output sul Monitor Seriale (Ctrl + Shift + M).

MaxBotix MB7389 Analog voltage serial monitor output
Output Monitor Seriale MB7389

Come funziona il codice

Il primo passo è definire il pin di collegamento. L’istruzione  #define  viene usata per assegnare un nome a un valore costante. Quando il programma viene compilato, il compilatore sostituirà ogni riferimento a questa costante con il valore definito. Quindi ovunque menzioni  sensorPin, il compilatore lo sostituirà con A0 durante la compilazione.

#define sensorPin A0

Successivamente, dobbiamo creare una variabile per memorizzare la distanza misurata.

int distance = 0;

Nel setup, inizializziamo la comunicazione seriale a 9600 baud. Successivamente visualizzeremo la distanza misurata nel monitor seriale, accessibile con Ctrl + Shift + M o Tools > Serial Monitor. Assicurati che anche il monitor seriale sia impostato a 9600 baud.

void setup() {
  Serial.begin(9600);
}

Dopodiché ho creato due funzioni:  read_sensor  e  print_data.

Nella funzione read_sensor, leggiamo semplicemente l’uscita a tensione analogica del sensore con la funzione  analogRead(pin). Le schede Arduino contengono un convertitore analogico-digitale multicanale a 10 bit. Questo significa che mapperà la tensione di ingresso tra 0 e la tensione di alimentazione in valori interi tra 0 e 1023. Su un Arduino Uno, questo corrisponde a 5 volt / 1024 unità, ovvero 4,9 mV per unità.

Il MB7389 usa un fattore di scala di (Vcc/5120) per 1 mm o 0,98 mV/mm usando un’alimentazione a 5 V. Questo rende molto semplice convertire il valore analogRead in mm, puoi semplicemente moltiplicare il risultato per 5. Nota che questo significa che l’uscita a tensione analogica mostra la distanza con una risoluzione di 5 mm.

void read_sensor() {
  distance = analogRead(sensorPin) * 5;
}

Nella funzione print_data, stampiamo la distanza misurata sul monitor seriale.

void print_data() {
  Serial.print("distance = ");
  Serial.print(distance);
  Serial.println(" mm");
}

Nel loop, chiamiamo prima la funzione read_sensor per ottenere la distanza e poi la funzione print_data per inviarla al monitor seriale. Ho aggiunto un ritardo di 1000 millisecondi, ma potresti ridurlo a 150 se vuoi. La frequenza di lettura del MB7389 è 6,66 Hz, quindi puoi effettuare 6,66 letture al secondo.

void loop() {
  read_sensor();
  print_data();
  delay(1000);
}

Esempio di codice Arduino MaxBotix MB7389 – Larghezza impulso

In questo esempio useremo l’altra uscita del sensore: l’uscita a larghezza impulso.

/* Arduino example code for MaxBotix MB7389 HRXL-MaxSonar-WR weather resistant ultrasonic distance sensor: pulse width output. More info: www.www.makerguides.com */

#define sensorPin 2

long distance = 0;
long duration = 0;

void setup() {
  pinMode(sensorPin, INPUT);
  Serial.begin(9600);
}

void read_sensor() {
  duration = pulseIn(sensorPin, HIGH);
  distance = duration;
}

void print_data() {
  Serial.print("distance = ");
  Serial.print(distance);
  Serial.println(" mm");
}

void loop() {
  read_sensor();
  print_data();
  delay(1000);
}

Spiegazione del codice

Dopo aver definito il pin di collegamento, ho creato due variabili:  duration  e  distance. Duration memorizza la durata dell’impulso inviato dal sensore. La variabile distance serve a memorizzare la distanza calcolata.

long distance = 0;
long duration = 0;

Nel setup, oltre a inizializzare la comunicazione seriale, dobbiamo impostare sensorPin come INPUT. Per questo usiamo la funzione  pinMode(pin, mode).

void setup() {
  pinMode(sensorPin, INPUT);
  Serial.begin(9600);
}

La funzione read_sensor è diversa dall’esempio precedente. Ora non misureremo la tensione analogica, ma la durata dell’impulso inviato dal sensore. Per questo usiamo la funzione  pulseIn(pin, value). Questa funzione aspetta che il pin passi da LOW a HIGH, inizia il conteggio, poi aspetta che il pin torni LOW e ferma il conteggio. Restituisce la durata dell’impulso in microsecondi.

Dopodiché possiamo calcolare la distanza in mm. Per il sensore MB7389, il fattore di scala è semplicemente 1 μs/mm, quindi distanza = durata. Per altri sensori MaxBotix, puoi trovare questo fattore di scala nel datasheet.

void read_sensor() {
  duration = pulseIn(sensorPin, HIGH);
  distance = duration;
}

Il resto del codice è uguale all’esempio precedente.

Se prevedi di usare il sensore per il monitoraggio/misurazione del livello di contenitori, ti consiglio di effettuare più letture consecutive e poi calcolare la media. Nel mio setup, le letture oscillavano di ± 3 mm.

Funzionamento in modalità trigger

Tutti i sensori MaxSonar funzionano di default in modalità free-running. Questo significa che il sensore continua a misurare finché è alimentato. Emette venti onde a 42 kHz ogni 150 ms (frequenza di lettura 6,66 Hz per MB7389, vedi datasheet per altri sensori).

Questa è generalmente la modalità più semplice per usare il sensore, perché non devi attivarlo manualmente e puoi semplicemente leggere la tensione analogica o la larghezza impulso per ottenere la distanza.

Per alcune applicazioni, come l’uso del sensore alimentato a batteria, può essere meglio usare la modalità trigger. Questo significa che puoi far partire un ciclo di misurazione solo quando lo desideri. In questo modo puoi controllare il picco di corrente del sensore, che si verifica quando trasmette un impulso sonar.

Per usare il sensore in modalità trigger, useremo un collegamento aggiuntivo tra il pin 4 del sensore e l’Arduino. Se non colleghi nulla a questo pin, come negli esempi precedenti, il sensore misura alla frequenza di aggiornamento indicata nel datasheet.

Per attivare il sensore quando serve, devi portare il pin 4 a livello logico basso. Quando vuoi effettuare una lettura, devi portare il pin 4 alto per almeno 20 μs. Il sensore inizierà così un ciclo di misurazione.

In questo esempio useremo un pulsante momentaneo per attivare il sensore. Collega una delle gambe a massa e la gamba diagonalmente opposta al pin 4 di Arduino.

I collegamenti sono riportati anche nella tabella sottostante.

Collegamenti MB7389 – Modalità trigger

Pin Arduino
GND GND
V+ 5 V
Pin 2 Pin 2
Pin 4 Pin 3
Pulsante pin 1 Pin 4
Pulsante pin 2 GND

Esempio di codice Arduino MaxBotix MB7389 – Trigger con pulsante

Puoi usare questo sketch di esempio per controllare il sensore con un trigger. In questo caso, il sensore effettuerà una lettura quando premi il pulsante e mostrerà la distanza sul Monitor Seriale. Puoi anche chiamare la funzione read_sensor quando vuoi effettuare una lettura.

/* Arduino example code for MaxBotix MB7389 HRXL-MaxSonar-WR 
   weather resistant ultrasonic distance sensor with push button. 
   More info: www.www.makerguides.com */

#define readPin 2
#define triggerPin 3
#define buttonPin 4

long distance = 0;
long duration = 0;

int buttonState = HIGH;
int previous = HIGH;
long time = 0;
long debounce = 200;

void setup() {
  pinMode(readPin, INPUT);
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(triggerPin, OUTPUT);
  digitalWrite(triggerPin, LOW);
  Serial.begin(9600);
  delay(3000);
  Serial.println("Sensor is ready, waiting for button press!");
}

void read_sensor() {
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(20);
  digitalWrite(triggerPin, LOW);
  duration = pulseIn(readPin, HIGH);
  distance = duration;
  delay(150);
}

void print_data() {
  Serial.print("distance = ");
  Serial.print(distance);
  Serial.println(" mm");
}

void loop() {
  buttonState = digitalRead(buttonPin);

  if (buttonState == LOW && previous == HIGH && millis() - time > debounce) {
    read_sensor();
    print_data();
    time = millis();
  }

  previous = buttonState;
}

Dovresti vedere il seguente output nel Monitor Seriale (Ctrl + Shift + M).

MB7389 trigger mode serial monitor output
Ci vogliono alcuni secondi prima che appaia il primo messaggio.

Come funziona il codice

Il primo passo è definire i collegamenti. Useremo l’uscita a larghezza impulso del sensore per leggere la distanza.

#define readPin 2
#define triggerPin 3
#define buttonPin 4

Oltre alle variabili duration e distance usate nell’esempio precedente, servono nuove variabili per memorizzare lo stato del pulsante. Le variabili time e debounce servono a  debounce  gestire l’input.

Puoi aumentare il tempo di debounce se ricevi falsi trigger.

long distance = 0;
long duration = 0;

int buttonState = HIGH;
int previous = HIGH;
long time = 0;
long debounce = 200;

Nel setup, impostiamo triggerPin come output e read e buttonPin come input. Nota che ho usato INPUT_PULLUP nella funzione pinMode. Ci sono resistenze di pullup da 20K integrate nel chip Atmega accessibili via software. Questa impostazione mantiene buttonPin HIGH quando il pulsante non è premuto e lo porta LOW quando lo premi.

Successivamente, impostiamo triggerPin LOW, così il sensore non inizierà a misurare.

Per stampare i dati del sensore, iniziamo la comunicazione seriale a 9600 baud.

void setup() {
  pinMode(readPin, INPUT);
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(triggerPin, OUTPUT);
  digitalWrite(triggerPin, LOW);
  Serial.begin(9600);
  delay(3000);
  Serial.println("Sensor is ready, waiting for button press!");
}

Dopodiché ho definito due funzioni, read_sensor e print_data.

Nella funzione read_sensor, vedrai che impostiamo triggerPin alto per 20 microsecondi. Questo dice al sensore di inviare un impulso sonar. Poi leggiamo la durata dell’impulso in uscita e la convertiamo in distanza (come nell’esempio precedente). Ho aggiunto un ritardo di 100 ms, che è il tempo minimo tra due letture.

La funzione print_data è uguale a quella degli esempi precedenti.

void read_sensor() {
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(20);
  digitalWrite(triggerPin, LOW);
  duration = pulseIn(readPin, HIGH);
  distance = duration;
  delay(150);
}

Nel loop, leggiamo prima lo stato del pulsante (premuto / non premuto) e lo memorizziamo in buttonState. La riga successiva verifica se hai premuto il pulsante (cioè se l’input è passato da HIGH a LOW) e se è passato abbastanza tempo dall’ultima pressione per ignorare eventuali disturbi.

Se è vero, chiama le funzioni read_sensor e print_data e resetta il timer.

void loop() {
  buttonState = digitalRead(buttonPin);

  if (buttonState == LOW && previous == HIGH && millis() - time > debounce) {
    read_sensor();
    print_data();
    time = millis();
  }

  previous = buttonState;
}

Infine, la variabile previous viene aggiornata con l’attuale buttonState.

CAD

MaxBotix fornisce file CAD gratuiti per tutti i loro sensori sul loro sito web. Questo rende molto semplice progettare parti o supporti personalizzati da usare con il sensore. Puoi scaricare un file zip con un modello 3D del sensore qui sotto (7 formati diversi). Altri modelli di sensori diversi sono disponibili sul loro Website.

Conclusione

In questo articolo ti ho mostrato come usare il sensore di distanza a ultrasuoni resistente alle intemperie MaxBotix MB7389 HRXL-MaxSonar-WR con Arduino. Spero che tu l’abbia trovato utile e informativo.

Se vuoi saperne di più su altri sensori di distanza, gli articoli qui sotto potrebbero esserti utili:

Se hai domande, lascia un commento qui sotto.