Sensore ad ultrasuoni
HC-SR04

ultimo aggiornamento 29 luglio 2018


JLCPCB - 2$ per prototipi di PCB, di qualsiasi colore. Produzione in 24 ore!
L'Azienda di prototipi PCB più popolare, con oltre 700.000 clienti in tutto il mondo!
Recati presso la JLCPCB, riceverai regali e coupon gratuiti
presso Maker Faire Rome il 18-20 ottobre



Il sensore è in vendita sul sito Homotix

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.

OurPCB, your most reliable PCB and PCBA supplier.

Focusing on PCB Prototype and PCB Assembly Turnkey Services.

One-Stop Wire Harness & Cable Assemblies Solution

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);
}

Test con Multi Test Shield

Componenti utilizzati

 

Multi test Shield

Il Multi Test Shield è uno shield auto costruito realizzato per testare la serie di sensori contenuti nella confezione "37 in 1 Sensor Module Board Set" compatibile con la scheda Arduino UNO R3 originale e relativi cloni.
Sulla scheda sono disponibili molti connettori che risultano già opportunamente collegati con le porte digitali o analogiche di Arduino.
In realtà, la scheda, oltre ai sensori presenti nel kit "37 in 1 Sensor Module Board Set" permette di testare altri sensori, servo, ecc per un totale di oltre 50 tipi, la presenza di un connettore  bus I2C espande ulteriormente la tipologia di dispositivi che lo shield permette.
Sulla scheda è anche presente un connettore per il collegamento di un piccolo Display OLED da 0.95"risoluzione 96x64 pixel, 65536 Colori, su di esso potranno essere mostrati dei messaggio o i valori misurati dai sensori.

Posizionamento del modulo sullo Shield

Per l'utilizzo occorrerà semplicemente posizionare il sensore sul connettore JP5, facendo riferimento a quanto riportato sul PCB. In questo modo i pin del modulo risulteranno automaticamente collegati ai relativi pin: S al pin D2, il centrale a +5V e - a GND.

 

 

Programma di test del sensore

Il programma  accenderà in sequenza i tre led interni rosso, blu, verde in sequenza e poi simultaneamente per l'emissione della luce bianca.
Mostrerà sul display OLED le varie fasi di esecuzione del programma

 

 

 

 

 

Programma

shield_test_code_KY-009.ino

/
}

 

Elenco revisioni

29/07/2018

Inserito riferimento a Wemos D1 mini meter shield

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