samedi 11 octobre 2014

Sonde à ultrasons HC-SR04 et Raspberry Pi

Cet article a été mis à jour le 21 décembre 2020 (compatibilité Python 3).

Le télémètre à ultrasons HC-SR04 permet de détecter la présence d'un obstacle et de déterminer à quelle distance il se trouve. Voici comment utiliser ce capteur avec un Raspberry Pi et un script en langage Python.

Principe de fonctionnement de la sonde HC-SR04

La sonde HC-SR04 est à la fois un émetteur et un récepteur d'ultrasons (des sons dont la fréquence est trop élevée pour être perçus par l'oreille humaine).

La broche "Trig" du HC-SR04 est une entrée: lorsqu'on soumet brièvement cette entrée à une tension de 5 V (ou 3,3 V), la sonde émet une brève impulsion ultrasonore.  Si un objet se trouve devant la sonde, une partie des ultrasons sera réfléchie vers la sonde.  Lorsque la sonde détecte cet écho, la sortie "Echo" (qui est habituellement à une tension de 0 V) prend la valeur 5 V pendent une durée égale au temps écoulé entre l'émission de l'ultrason et la réception de l'écho.

Branchements



Notre sonde comporte 4 broches:
  • Vcc sert à alimenter le circuit du HC-SR04, il doit être à une tension de 5 V, nous le brancherons donc à la broche numéro 2 du Raspberry Pi.
  • Trig est l'entrée qui nous permet de déclencher l'émission d'un ultrason. Nous la brancherons directement à la broche 8 (GPIO 14) du Raspberry Pi (les 3,3 V produits par cette broche sont suffisants pour faire réagir la sonde).
  • Echo est la sortie qui se met à 5 V pendant une durée égale à l'aller-retour de l'ultrason, et ici les choses se compliquent un peu:  soumettre une broche GPIO du Raspberry Pi à une tension de 5 V ne serait pas du tout une bonne idée!   Vous devez impérativement abaisser cette tension à 3,3 V avant de la transmettre à la broche 10 (GPIO 15) du Raspberry Pi.
  • Gnd, sans surprise, sera branché à une des nombreuses broches Gnd du Raspberry Pi.
Il va sans dire que les broches 8 (GPIO 14) et 10 (GPIO 15) ne comportent aucune caractéristique spéciale qui aurait favorisé leur choix:  vous pouvez les remplacer par n'importe quelle autre broche GPIO, à la condition de modifier en conséquence le script ci-dessous.

Pour abaisser la tension de la broche "echo" 5 V à 3,3 V,  ont peut envisager deux solutions:  un diviseur de tension constitué de deux résistances en série, ou un circuit intégré spécialement conçu pour la conversion de niveaux logiques, comme le CD4050.

Utilisation d'un diviseur de tension

Avec le diviseur de tension illustré ci-dessous, la tension à la broche 10 (GPIO 15) du Raspberry Pi sera d'environ 3,3 V lorsque celle de la pin "Echo" du HC-SR04 sera à 5 V:

 
Vous pourriez être tenté d'utiliser des résistances plus grandes, comme par exemple 10K et 18K:  je le déconseille car j'ai remarqué que leur utilisation engendre une moins grande précision dans la mesure de la distance (c'est lié à la constante de temps "RC" des condensateurs). 

J'ai placé le HC-SR04 face à un mur situé à une distance d'environ 25 cm, et j'ai pris la mesure de la distance à 10 reprises (voir le script plus bas).

Avec un diviseur de tension constitué d'une résistance de 10K et d'une résistance de 18K, j'ai obtenu une différence de 7 mm entre la mesure la plus basse et la mesure la plus haute.

Avec un diviseur de tension constitué d'une résistance de 1K et d'une résistance de 1,8K, la différence entre la mesure la plus basse et la mesure la plus élevée n'était plus que de 3 mm.

Les résultats sont encore meilleurs si on remplace le diviseur de tension par un CD4050:  la différence entre la mesure la plus petite et la mesure la plus grande n'est plus que de 2 mm.

Utilisation du circuit intégré CD4050


Si vous optez pour l'utilisation du CD4050, vous branchez sa broche 1 à la broche 1 du Raspberry Pi (pour alimenter le circuit intégré avec une tension de 3,3 V) et vous reliez sa broche 8 à une des broches GND du Raspberry Pi.  La broche 10 (GPIO 15) est branchée à la broche 2 du CD4050, et la broche 3 du CD4050 est branché à la broche "Echo" du HC-SR04.

En principe, votre CD4050 aura un comportement plus fiable si vous branchez à la masse toutes ses entrées inutilisées.  J'ai omis de le faire, et ça fonctionnait très bien malgré tout.

Je vous réfère à ce précédent article pour plus de détails concernant l'utilisation du CD4050.


Script en Python

Chaque fois que nous désirons mesurer la distance de l'obstacle situé devant le HC-SR04, notre programme doit soumettre la broche "Trig" à une tension de 3,3 V pendant une fraction de seconde (ce qui déclenche l'émission de l'ultrason), puis mesurer le temps pendant lequel la broche "Echo" est à 3,3 V.

Ensuite, ce temps doit être converti en distance, sachant que la vitesse du son (340 m/s) est égale au double de la distance, divisé par la durée de l'aller-retour.

L'exemple ci-dessous effectue 10 mesures de distances espacées d'une seconde. Pour une mesure plus précise, ça peut être une bonne idée de faire la moyenne de plusieurs mesures consécutives.

- -

Références

Cet article du blog ModMyPi m'a servi de point de départ.

À lire également

Le télémètre laser VL53L1X constitue une autre option pour mesurer une distance au moyen du Raspberry Pi.

Vous trouverez aussi sur ce blog des conseils pour utiliser le télémètre HC-SR04 avec un Arduino Uno,  avec un ATTiny85,  avec une carte STM32 Nucleo programmée avec mbedavec un microcontrôleur PIC et avec un micro:bit.

Je vous invite également à consulter mes autres projets impliquant le Raspberry Pi.

Yves Pelletier (Twitter:  @ElectroAmateur)

3 commentaires:

  1. Ces capteurs sont ultra pratiques a manipuler depuis un arduino mais comme je suis pas doué en electronique, j'ai toujours eu peur de griller mon raspi.
    Merci du coup pour le tuto orienté raspberry ;-)

    RépondreSupprimer
  2. Bonjour, jusqu'à maintenant votre programme fonctionnait parfaitement, mais maintenant je ne sais pas pourquoi mais la console me renvoie "NameError : debutImpulsion is not defined". Pourriez-vous m'aider ? Je n'arrive pas à régler ce problème et je ne comprends pas pourquoi cela ne fonctionne plus, je n'ai pourtant pas modifié le programme depuis sa dernière utilisation.

    RépondreSupprimer
  3. Peut etre est-ce du a une màj Python ? En avez vous fait une ?

    RépondreSupprimer