samedi 11 octobre 2014

Sonde à ultrasons HC-SR04 et Raspberry Pi

Nous avions déjà vu comment utiliser une sonde ultrasonore HC-SR04 avec l'Arduino afin de mesurer à quelle distance se situe un obstacle, et nous l'avons utilisé lors de la conception d'un robot éviteur d'obstacles.

Voici maintenant comment utiliser le HC-SR04 avec le 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 pin "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 pins:
  • Vcc sert à alimenter le circuit du HC-SR04, il doit être à une tension de 5 V, nous le brancherons donc à la pin 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 pin 8 (GPIO 14) du Raspberry Pi (les 3,3 V produits par cette pin 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 pin 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 pin 10 (GPIO 15) du Raspberry Pi.
  • Gnd, sans surprise, sera branché à une des nombreuses pins Gnd du Raspberry Pi.


Il va sans dire que les pins 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 pin GPIO, à la condition de modifier en conséquence le script ci-dessous.

Pour abaisser la tension de la pin "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 pin 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 pin 1 à la pin 1 du Raspberry Pi (pour alimenter le circuit intégré avec une tension de 3,3 V) et vous reliez sa pin 8 à une des pins GND du Raspberry Pi.  La pin 10 (GPIO 15) est branchée à la pin 2 du CD4050, et la pin 3 du CD4050 est branché à la pin "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 pin "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 pin "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. Si vous le sauvegardez sous la forme d'un fichier intitulé "ultrasons.py", vous pouvez l'exécuter en tapant "python ultrasons.py".

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.

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

Related Posts Plugin for WordPress, Blogger...