Sensore ad ultrasuoni
HC-SR04

ultimo aggiornamento 29 luglio 2018


 

Indice

Descrizione

Il sensore ad ultrasuoni HC-SR04 qui mostrato è prodotto dalla ELECROW codice SOD00201S, ma può essere trovato di altri modelli e fornitori.  Il sensore ha un campo di misura che si estende da due centimetri a quatto metri e la precisione arriva a 1 cm. Il modulo comprende il trasmettitore a ultrasuoni, il ricevitore e il circuito di controllo.
Questi sensori ad ultrasuoni non misurano direttamente la distanza, ma forniscono il tempo impiegato da un segnale sonoro per raggiungere un ostacolo e ritornare di nuovo al sensore.

homotix

PCBA

OurPCB

Quando Arduino setta a 1 il Pin Trigger, il sensore invia 8 impulsi ad ultrasuoni. Quando questi poi sono ricevuti, il sensore setta a 1 il pin Echo, viene quindi misurato il tempo che passa tra l’attivazione del pin Trigger ed il settaggio del pin Echo.  Infine, nota la velocità del suono, converte il tempo misurato in una lunghezza e ricava quindi la distanza dell’ostacolo.

Link Utili

Caratteristiche

Tensione di alimentazione

5V

Frequenza ultrasuoni

40 kHz

Distanza massima di lettura

400 cm

Distanza minima di lettura

2 cm

Risoluzione

1 cm

Angolo di misura:

< 30°

Dimensioni

43x20x15 millimetri

Circuito elettrico

 

Foto del sensore

Collegamento base ad Arduino

Per il collegamento del sensore HC-SR04 è sufficiente collegare il modulo come illustrato in figura alla scheda Arduino UNO, i valori della distanza saranno mostrati attivando il Monitor Seriale dell' IDE.


Schema e simbolo Modulo sonar HC-SR04

Listato del programma di prova

Per testare il modulo HC-SR04, per prima cosa è necessario importare la libreria in modo che l'IDE la riconosca. Il modo più semplice è l'importazione tramite l'IDE stesso:

A questo punto sotto File Esempi apparirà la Libreria Ultrasonic, e si potrà caricare il demo UltrasonicSimple. Una volta caricato il programma in memoria, sarà necessario aprire il monitor seriale per vedere la misura della distanza dell'ostacolo dal sensore.

Oppure potete caricarla con il metodo classico utilizzando il file zip


sketch HC-SR04_base.ino

Libreria sensore sonar.

 

#include <Ultrasonic.h>

Ultrasonic ultrasonic(12, 13); //(trig, echo)

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

void loop() {
  Serial.print("Distance in cm: ");
  Serial.println(ultrasonic.distanceRead());
  delay(1000);
}

Lettura della distanza su display OLED (Wemos D1 mini)

Questo secondo esempio mostra come visualizzare i valori letti su un display OLED, in questo caso un display con una diagonale di soli 0,49" e una risoluzione di 64x32 pixel. Come modulo di comando si è utilizzato un modulo Wemos D1 mini.

 


sketch HC-SR04_OLED.ino

/*
  HC-SR04_OLED.ino
  Lo sketch legge il valore della distanza dell'oggetto posto di fronte
  al sensore e mostra il valore misurato su un display OLED collegato
  tramite I2C.

  Sono utilizzati i seguenti pin
  Pin +5V           -> Alimentazione Sonar e display
  Pin GND           -> GND Sonar e display
  GPIO4 -> D2       -> SDA modulo I2C LCD
  GPIO5 -> D1       -> SCL modulo I2C LCD
  Pin Digitale D8   -> echoPin
  Pin Digitale D3   -> trigPin

  Creato il 30/04/2018 da Adriano Gandolfo
  Sito web http://www.adrirobot.it
  Blog http://it.emcelettronica.com/author/adrirobot
  Pagina Facebook https://www.facebook.com/Adrirobot-318949048122955
  Istagram https://www.instagram.com/adrirobot/
  This example code is in the public domain.
*/

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 0  // GPIO0
Adafruit_SSD1306 display(OLED_RESET);

//Definizione pin a cui è collegato il sonar
#define echoPin D8 // Echo Pin
#define trigPin D3 // Trigger Pin
long duration, distance; // Duration used to calculate distance

void setup()
{
  Serial.begin (9600);
  //Impostazione HC-SR04
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);

  // Impostazione modulo display con indirizzo I2C addr 0x3C
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  // Cancellazione schermo e buffer
  display.clearDisplay();
  // Messaggio iniziale
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  display.println(" ADRIROBOT");
  display.setTextColor(BLACK, WHITE); // Inverte il colore del testo
  display.println(" LETTURA  ");
  display.println(" HC-SR04  ");
  display.display();
  delay(2000);
}

void loop()
{
  /* The following trigPin/echoPin cycle is used to determine the
       distance of the nearest object by bouncing soundwaves off of it. */
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  //Calculate the distance (in cm) based on the speed of sound.
  distance = duration / 58.2;
  Serial.println(distance);

  display.clearDisplay();   // clears the screen and buffer
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  display.print(distance); display.println(" cm");
  display.display();
  //Delay 50ms before next reading.
  delay(500);
}

 

Lettura della distanza su display OLED (Arduino Nano)

In questo esempio per visualizzare i valori letti dal sensore HC-SR04 si utilizza sempre il display OLED, ma la scheda di controllo è un Arduino Nano oppure un Arduino Nano Clone


sketch HC-SR04_NANO_OLED.ino

/*
  HC-SR04_NANO_OLED.ino
  Lo sketch legge il valore della distanza dell'oggetto posto di fronte
  al sensore e mostra il valore misurato su un display OLED collegato
  tramite I2C, la scheda di controllo è un Arduino Nano.

  Sono utilizzati i seguenti pin
  Pin +5V  -> Alimentazione Sonar e display
  Pin GND  -> GND Sonar e display
  Pin A4   -> SDA modulo I2C LCD
  Pin A5   -> SCL modulo I2C LCD
  Pin D3   -> trigPin
  Pin D8   -> echoPin

  Creato il 01/05/2018 da Adriano Gandolfo
  Sito web http://www.adrirobot.it
  Blog http://it.emcelettronica.com/author/adrirobot
  Pagina Facebook https://www.facebook.com/Adrirobot-318949048122955
  Istagram https://www.instagram.com/adrirobot/
  This example code is in the public domain.
*/

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 0  // GPIO0
Adafruit_SSD1306 display(OLED_RESET);

//Definizione pin a cui è collegato il sonar
#define echoPin 8 // Echo Pin
#define trigPin 3 // Trigger Pin
long duration, distance; // Duration used to calculate distance

void setup()
{
  Serial.begin (9600);
  //Impostazione HC-SR04
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);

  // Impostazione modulo display con indirizzo I2C addr 0x3C
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  // Cancellazione schermo e buffer
  display.clearDisplay();
  // Messaggio iniziale
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  display.println(" ADRIROBOT");
  display.setTextColor(BLACK, WHITE); // Inverte il colore del testo
  display.println(" LETTURA  ");
  display.println(" HC-SR04  ");
  display.display();
  delay(2000);
}

void loop()
{
  /* The following trigPin/echoPin cycle is used to determine the
       distance of the nearest object by bouncing soundwaves off of it. */
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  //Calculate the distance (in cm) based on the speed of sound.
  distance = duration / 58.2;
  Serial.println(distance);

  display.clearDisplay();   // clears the screen and buffer
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  display.print(distance); display.println(" cm");
  display.display();
  //Delay 50ms before next reading.
  delay(500);
}

Lettura distanza con shield su Wemos D1 mini

Lettura della distanza utilizzando uno shield montato su un Wemos D1 mini, il progetto completo può essere trovato a questa pagina


sketch "Wemos D1 mini meter shield.ino"

Sketch testato con versione IDE 1.8.5

/*####################################################################
  FILE: Wemos D1 mini meter shield.ino
  VERSION: 1.0
  Descrizione: Programma per gestione metro sonar con Wemos D1 mini

  Creato il 29/7/2018 da Adriano Gandolfo
  Sito web http://www.adrirobot.it
  Blog http://it.emcelettronica.com/author/adrirobot
  Pagina Facebook https://www.facebook.com/Adrirobot-318949048122955
  Istagram https://www.instagram.com/adrirobot/
  This example code is in the public domain.
  #################################################################### */

#define echoPin D8 // Echo Pin
#define trigPin D3 // Trigger Pin

long duration, distance; // Duration used to calculate distance

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 0  // GPIO0
Adafruit_SSD1306 display(OLED_RESET);

//Definizione pin acui è collegato il sonar
#define echoPin D8 // Echo Pin
#define trigPin D3 // Trigger Pin

void setup()
{
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);

  // Impostazione modulo display con indirizzo I2C addr 0x3C
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  // Cancellazione schermo e buffer
  display.clearDisplay();

  // Messaggio iniziale
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  display.println(" ADRIROBOT");
  display.setTextColor(BLACK, WHITE); // Inverte il colore del testo
  display.println("   SONAR  ");
  display.println("   METER  ");
  display.display();
  delay(2000);
  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  display.print("Value");
  display.display();
}

void loop()
{
  /* The following trigPin/echoPin cycle is used to determine the
    distance of the nearest object by bouncing soundwaves off of it. */
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  //Calculate the distance (in cm) based on the speed of sound.
  distance = duration / 58.2;
  Serial.println(distance);
  display.fillRect(0, 18, 64, 15, BLACK);
  display.setCursor(0, 18);
  display.print(distance); display.println(" cm");
  display.display();
  //Delay 50ms before next reading.
  delay(50);
}

 

Elenco revisioni

29/07/2018

Inserito riferimento a Wemos D1 mini meter shield

01/05/2018

Inserito programma lettura distanza su display OLED tramite Arduino Nano

30/04/2018

Aggiornato pagina, inserito programma lettura distanza su display OLED

02/06/2016

Emissione preliminare
Private Policy Cookie Policy Termini e Condizioni