Ignorer et passer au contenu

Livraison offerte à partir de 50€

Contents Menu Expand Light mode Dark mode Auto light/dark mode

Mesurer des distances avec le capteur ultrason HC-SR04 avec un ESP32 en MicroPython

../_images/hcsr04-esp32-boards-preview.jpg

Le capteur HC-SR04 permet de mesurer des distances par rapport à un obstacle en se basant sur des ondes ultrasons. Les modules disponibles sont constitués en général d’un émetteur et récepteur ultrason ainsi que d’une puce qui s’occupe de les piloter.

Astuce

Vérifiez que le module que vous avez est bien un HC-SR04. Il existe plusieurs modules ultrasons qui se ressemblent visuellement mais qui n’utilisent pas la même puce. Le HC-SR04 (généralement en bleu) fonctionne uniquement en 5V alors que par exemple le RCWL-1601 (généralement en vert) fonctionne également en 3.3V. Heureusement, ils se pilotent en général de la même manière.

Prendre en main le module HC-SR04

Fonctionnement d’un capteur ultrason

fonctionnement physique ultrason

Si vous voulez comprendre comment fonctionne en lui-même le module, je vous conseille de consulter l’article qui explique le fonctionnement physique détaillé du HC-SR04 .

Caractéristiques techniques du module HC-SR04

  • Alimentation : 5V. Le module est prévu pour être alimenté en 5V.

  • Consommation : Le capteur consomme autour de 20mA en fonctionnement.

  • Portée : Le module peut mesurer une distance comprise entre 3cm et 4m en théorie. En pratique, une distance comprise entre 10cm et 2.5m vous donnera les meilleurs résultats.

    Avertissement

    La surface de l’obstacle doit être bien plane pour avoir des mesures fiables.

  • Angle de mesure : < 15°.

  • Fréquence ultrasons : 40 kHz (inaudible à l’oreille)

Branchements du capteur HC-SR04

En plus des broches d’alimentation, 2 broches sont utilisées pour contrôler le module. On peut même en utiliser qu’une seule, si l’on manque de broches disponibles sur son ESP32. C’est tout de même plus pratique avec 2 broches.

Correspondance des broches

Module HC SR04

ESP32

TRIG

GPIO5

ECHO

GPIO18

GND

GND

VCC

5V

Note

Pour cet exemple, les broches 5 et 18 ont été choisies, mais vous pouvez prendre d’autres broches compatibles de l’ESP32 : une sortie pour TRIG et une entrée pour ECHO

Circuit avec le module HC-SR04 et une ESP32

../_images/breadboard-wiring-hc-sr04-2-pins-esp32-schematic.png

Circuit électrique à réaliser avec le HC-SR04

../_images/breadboard-wiring-hc-sr04-2-pins-esp32-example.jpeg

Circuit fait sur breadboard

L’alimentation du module : 5V ou 3.3V ?

En fait, le module HC-SR04 n’est pas le plus adapté pour les cartes ESP32 car il fonctionne en 5V (avec niveaux logiques de 5V) alors que les ESP32 fonctionnent en 3.3V. Il faudrait l’alimenter en 5V, et rajouter soit des levels shifters, soit des ponts diviseurs de tensions sur la broche ECHO . De cette manière, la broche de l’ESP32 GPIO18 recevra du 3.3V au lieu du 5V original. Mais cela complexifie un peu le circuit.

Astuce

En pratique, si c’est pour une utilisation temporaire, les broches de l’ESP32 peuvent supporter une tension de 5V. C’est sur le long terme, qu’elles risquent d’être abîmées et de ne plus fonctionner. C’est pourquoi dans ce tutoriel, par simplicité, ces précautions ont été omises.

Note

Certains internautes disent qu’ils réussissent à alimenter le module en 3.3V, et obtenir des mesures fiables en augmentant la durée de l’impulsion envoyée. Cependant, je n’ai pas réussi à faire fonctionner ceux que j’avais en ma possession avec une tension de 3.3V.

Si vous utilisez beaucoup de cartes qui fonctionnent en 3.3V (ESP8266, ESP32, Raspberry Pi Pico), je vous conseille d’utiliser un modèle équivalent qui est prévu pour fonctionner à cette tension : par exemple le module RCWL-1601.

Mesurer facilement une distance avec le HC-SR04 et un script MicroPython

Pour l’utiliser, il n’est pas nécessaire d’utiliser des librairies externes, car le fonctionnement est très simple. En fait, quand l’ESP32 envoie une impulsion sur la broche TRIG , le module renvoie une impulsion sur la broche ECHO dont sa largeur est proportionnelle à la distance de l’obstacle.

Il suffit d’implémenter le déclenchement d’une mesure, récupérer la valeur et appliquer la formule suivante (l’obtention de cette formule est détaillée dans l’article sur le fonctionnement d’un capteur ultrason) :

\[d_{obstacle}(cm) = \frac{T_{ultrason}(µs)\times v_{son}(m/s)\times 10^{-4}}{2}\]

C’est ce que fait le code ci-dessous :

from machine import Pin, time_pulse_us
import time

SOUND_SPEED=340 # Vitesse du son dans l'air
TRIG_PULSE_DURATION_US=10

trig_pin = Pin(5, Pin.OUT)
echo_pin = Pin(18, Pin.IN)

while True:
    # Prepare le signal
    trig_pin.value(0)
    time.sleep_us(5)
    # Créer une impulsion de 10 µs
    trig_pin.value(1)
    time.sleep_us(TRIG_PULSE_DURATION_US)
    trig_pin.value(0)

    ultrason_duration = time_pulse_us(echo_pin, 1, 30000) # Renvoie le temps de propagation de l'onde (en µs)
    distance_cm = SOUND_SPEED * ultrason_duration / 20000

    print(f"Distance : {distance_cm} cm")
    time.sleep_ms(500)

Le programme génère une impulsion de 10µs que l’on envoie sur le GPIO5 de l’ESP32.

La fonction time_pulse_us() bloque le programme tant qu’elle reçoit l’impulsion de réponse du HC-SR04 depuis la broche 18 . Ensuite le code calcule la distance à partir de la durée de l’onde ultrason. Le programme affiche la distance entre le module et un obstacle (ma main en l’occurrence 🙂) dans le moniteur série.

distance ultrason hcsr04 µpython

Note

Si vous obtenez des valeurs négatives proches de 0 (ex: Distance : -0.017 cm ), c’est que le module ultrason n’a pas reçu l’onde ultrasonore envoyée et que le timeout de la fonction time_pulse_us() a été atteint. La surface de l’obstacle doit être plane pour avoir de bonnes mesures.

Les librairies MicroPython pour le HC-SR04

Une libraire devient pratique surtout lorsqu’on veut gérer plusieurs capteurs ultrasons et masquer les calculs.

Librairie basique, avec des mesures bloquantes

Voici le code d’une librairie très simple pour piloter le capteur ultrason. Vous pouvez soit l’enregistrer dans un fichier séparé sur l’ESP32 (avec comme nom hcsr04.py ), ou bien l’inclure directement dans votre script principal :

import machine, time
from machine import Pin

class HCSR04:
            # © 2021 Roberto Sánchez Apache License 2.0

            
        
                            
                            
          
        
            
        

        
            

     
         
        
        
        
        
        
        
                
             
           
                
                 
             

     
        
          
              
         

     
        
          
              
         

Cette section est réservée aux abonnés. Il vous reste 93% à découvrir.

Devenir membre premium

Déjà abonné ? Connectez-vous

Nous utilisons des cookies pour que votre visite sur la boutique soit la plus agréable possible. Politique de confidentialité