Publié le 27 novembre 2014 - par

Mesure de distance par ultrasons avec le Raspberry Pi

capteur_ultrason_250pxLa mesure par ultrasons est un des moyens utilisés pour déterminer sans contact la distance d’un obstacle.
Un robot peut ainsi sonder son environnement, mais on peut aussi s’en servir pour mesurer le niveau d’un liquide dans une cuve par exemple.
Philippe a utilisé le module HC-SR04 sur le Raspberry Pi et il vous propose de découvrir sa réalisation.

Destiné aux utilisateurs avancés

Mesure de distance par ultrasons avec le Raspberry Pi

Le principe

anim_ultrasonUn émetteur d’ultrasons (Tx) envoie un train d’ondes sonores (8 impulsions à 40kHz). Les ondes se réfléchissent sur un obstacle et reviennent vers un récepteur (Rx). Connaissant la vitesse du son dans l’air (environ 340 m/s) il suffit de diviser par 2 le temps mis par les ondes pour faire l’aller-retour et on calcule facilement la distance.

Mesure de distance par ultrasons

La circuiterie du HC-SR04 facilite les choses à l’utilisateur, puisqu’elle délivre un créneau de tension 5V qui démarre juste après l’émission du train d’ondes ultrasonores, pour s’arrêter lorsque le récepteur détecte les ondes en retour.

timingIl reste à mesurer le temps que dure ce créneau pour déterminer la distance de l’obstacle…

capteur_ultrason_03

Je laisse la parole à Philippe (texte en bleu) :

La réalisation de Philippe

Les exemples trouvés sur le net pour utiliser ce capteur à ultrasons, mettent à disposition des exemples en Python mais jamais en C.
Je suis parti de mon programme pour le RTC DS1302 que j’ai adapté et amélioré.

capteur_ultrason_04
La mesure de la durée d’écho ainsi que les temporisations, sont faites grâce à la fonction nanosleep(), plus conforme à la norme POSIX que sleep().
Les exemples en C pour Raspberry font appel à la fonction setup_io() pour réserver la mémoire mais jamais ne la libèrent : j’ai donc ajouté la fonction close_io() pour fermer le programme proprement.

capteur_ultrason_02

Connexion du module

Les broches (toutes versions de Raspberry):

  • GPIO 23 : pin 16
  • GPIO 24 : pin 18
  • VCC 5V :  pin 4
  • GND : pin 6

GPIO

Diviseur de tension

Le module est alimenté en 5V et sa sortie fournit un créneau à cette tension. Le 5V ne peut pas être appliqué directement sur une entrée du GPIO sous peine de destruction de l’entrée, et même parfois plus grave, celle du SoC !

Il faut donc diminuer cette tension en utilisant un diviseur de tension, appelé également pont diviseur :

mesure_ultrasons_02La tension de sortie du HC-SR04 est envoyée sur Vin et Vout est appliquée au GPIO. La tension résultante est Vout = Vin (R2/(R1+R2)).

Si vous voulez en savoir plus sur ce montage : http://fr.wikipedia.org/wiki/Diviseur_de_tension

mesure_ultrasons_03

Le montage est identique à celui qui a été décrit dans The MagPi N°27 d’octobre 2014. Avec les résistances choisies la tension appliquée au GPIO est de  5V (2/1+2)) soit 3,3V, pile poil la tension qu’il faut 😉

mesure_ultrasons_01

Compilation et exécution

Le programme est disponible sur https://github.com/framboise314/HC-SR04

Ni erreur ni avertissement lors des compilations, mais il faut toujours avoir les droits de superutilisateur, d’où le « sudo ».

gcc ultrason-HC-SR04.c -Wall -lrt</span>
mv a.out ultrason-HC-SR04</span>
sudo ./ultrason-HC-SR04

Les mesures ne sont malheureusement pas plus justes qu’avec le programme en python mais Raspbian n’est pas un système temps réel et le capteur est assez imprécis.

 Conclusion

Merci à Philippe d’avoir mis ce programme à la disposition de tous ceux qui ont des mesures de distance à réaliser.

Philippe n’a pas pu tester pour cause de framboise à réinstaller, mais il suggère de tester

sudo nice -19 ./ultrason-HC-SR04

N’hésitez pas à laisser vos commentaires ci-dessous…

400 articles !

Au passage il faut noter que cet article de Philippe est le 400ème publié sur le blog framboise314.fr. C’est symbolique et je suis vraiment content que ce soit un article élaboré par un membre de la communauté Raspberry Pi qui prennent ce numéro 400 !!! 🙂

Pour info il y a actuellement (27/11/2014 à 20h00) 4015 commentaires (les pings ne sont pas comptabilisés) suite à ces 400 articles. Encore merci de votre fidélité -et de votre participation- à ce blog.

Sources

À propos François MOCQ

Électronicien d'origine, devenu informaticien, et passionné de nouvelles technologies, formateur en maintenance informatique puis en Réseau et Télécommunications. Dès son arrivée sur le marché, le potentiel offert par Raspberry Pi m’a enthousiasmé j'ai rapidement créé un blog dédié à ce nano-ordinateur (www.framboise314.fr) pour partager cette passion. Auteur de plusieurs livres sur le Raspberry Pi publiés aux Editions ENI.

29 réflexions au sujet de « Mesure de distance par ultrasons avec le Raspberry Pi »

  1. Laurent F

    J’en ai acheté un il y a 2-3 semaines, mais je n’ai pas encore le temps de jouer avec. Cet article devrait m’aider ;). Donc merci beaucoup.

    Répondre
  2. Nico

    J’en ai un dans un puits et un dans une cuve à fioul mais celui pour le fioul est assez imprécis malgré une compensation due à la température ( la vitesse du son dans l’air dépends un peu de la température)! Prog écrit en python donc je vais tester celui en c.

    Merci pour cet article et les 399 autres

    Répondre
  3. linuxnico

    Bon apres test, j’ai un rpi B or ce prog est pour le rpi B+, j’ai mon capteur sur les pin 11 et 13 donc je change le 23/214 en 17/27 mais cela me donne 0,02cm, donc j’ai un soucis…
    pb de prog pas adapter au B?
    pb de numero de gpio?

    je continue a chercher et je vous tiens au courant…

    Répondre
    1. Auxonnais

      Bonjour,
      Il reste sûrement un problème: une fois sur dix, j’obtiens 6cm au lieu de 134cm.
      Je n’ai pas encore trouvé le remède mais je cherche aussi.

      Répondre
  4. msg

    Juste pour indiquer que la formule utilisée pour le schéma théorique est fausse , elle permet de calculer la tension aux bornes de R1 et pas aux bornes de R2 .

    Une astuce pour ne pas vous tromper dans ces calculs .

    1°)
    Vin est mesuré aux bornes de R1 et R2 .
    En série les résistances s’ajoutent , donc R1 + R2 est un ensemble que l’on va appeler Résistance Totale RT
    Le courant qui traverse ce circuit se calcule par : Vin / RT = I

    2°)
    Vout est mesuré aux bornes de R2
    Le courant qui traverse ce circuit se calcule par : Vout / R2 = I

    3°)
    Comme en série le courant est identique en tout point on peut mettre en égalité les deux formules :
    Vin / RT = Vout / R2
    On passe alors par une règle de trois pour sortir l’équation , voir explication sur le lien suivent :
    http://fr.wikipedia.org/wiki/R%C3%A8gle_de_trois

    On obtient : Vin x R2 / RT = Vout
    Soit la formule Vin x R2 / (R1 + R2) = Vout

    J’espère ne pas avoir froisser personne , un peu de culture ne fait pas de mal .

    Répondre
    1. François MOCQ Auteur de l’article

      bonjour msg
      tout a fait d’accord !
      tsss me suis planté sur un diviseur de tension
      j’ai honte 🙁
      et les sections d’électroniciens que j’ai formés (il y a longtemps) doivent être morts de rire !!!
      le calcul de tension est juste mais pas la formule…
      je rectifie tout de suite
      merci de me relire avec autant d’attention 😉
      cordialement
      François

      ps : et je ne suis même pas froissé !

      Répondre
      1. msg

        Vous auriez juste permuté les noms des deux résistances , la formule initiale était bonne .
        Comme quoi , il est facile de trébucher même sur un pont . 😉

        Répondre
  5. msg

    Je vais passer pour un casse pied … 🙂

    Dans le calcul pratique , il manque une parenthèse (une ouverte et deux fermées) .
    J’ai pas tiqué sur la première lecture .

    Pas top l’explication de Wikipédia .
    J’aurais une méthode mémo-technique à soumettre pour le calcul du pont de résistance .
    Il me faudrait que je mette un dessin en relation avec le schéma théorique déjà dessiné , mais je ne sais pas comment faire .
    Je donnerais l’explication du fonctionnement de cette méthode si ça intéresse quelqu’un .

    Répondre
    1. msg

      Le montage est identique à celui qui a été décrit dans The MagPi N°27 d’octobre 2014. Avec les résistances choisies la tension appliquée au GPIO est de 5V (2/ ( 1+2)) soit 3,3V, pile poil la tension qu’il faut 😉

      J’ai mis la parenthèse en Gras .
      Ça reste un détail pour celui qui ne refait pas le calcul .

      Cordialement .

      Répondre
  6. Ping : Une histoire de pont… | Framboise 314, le Raspberry Pi à la sauce française….

  7. Frederic

    Bonjours tous le monde ,
    Très bonne article, mais j’ai une question .dans le cadre de mon projet je suis à la recherche d’un script de mesure de distance sous webiopi de façon a avoir un contrôle permanent dans la boucle loop et surtout avoir la visualisation a la demande par un navigateur.
    Je serai contant d avoir des info si possible.

    Répondre
  8. Cédric

    Bonjour,

    Très bon tuto, j’ai testé avec le script python et le script c, avec le python c’est ok, avec le script c j’ai tout le temps 0.02cm. J’ai essayé avec une led et l’allumer en c et c’est ok. J’ai l’impression que l’attente ne fonctionne pas. Quelqu’un a-t-il déjà rencontré ce problème?

    Par avance merci.

    Répondre
  9. miranda

    Bonsoir François,

    Voila j’ai besoin d’aide!
    demain je passe mon oral d’isn mais j’ai eu un problème avec mon robot/site web.
    je n’arrive pas a transmettre les données de mon robot ( distance ect) sur mon site internet .. pouvez vous m’aider ?

    Merci d’avance

    Répondre
  10. Zimmer

    Bonjour

    Je souhaite mesurer l’épaisseur d’une plante par ultrason ce type de capteur peut-il convenir? (en positionnant le capteur directement sur la plante)

    Avec mes remerciement
    Christophe

    Répondre
    1. François MOCQ Auteur de l’article

      Bonjour
      oups à priori je dirai non… l’émetteur envoie une onde ultrasonore qui revient après avoir rencontré un obstacle
      je ne vois pas comment ça fonctionnerait dans votre cas
      vous voulez mesurer quoi ? les feuilles, les tiges ?
      Cordialement
      François

      Répondre
  11. gregouille

    Bonjour!!!
    serraitil possible de raccorder les capteur a d’autres pins que le 23 et 24, tout deux utilisé par mon raspi?
    Seconde question, nous cherchons a obtenir une tension de 3,3V, alors pourquoi ne pas la brancher directement sur le pin 3,3v au lieu du 5v accouplé a des resistances?
    Merci pour votre aide.

    Répondre
    1. François MOCQ Auteur de l’article

      Bonjour
      Q1 : Modifiez ces lignes dans le prog en C
      // Easy to change GPIOS
      #define GPIO_TRIG 23
      #define GPIO_ECHO 24

      Q2 : Non, le module ultrason fonctionne OBLIGATOIREMENT EN 5V !!
      il sort donc du 5V tension trop élevée pour le RasPi qui ne tolère pas plus de 3.3v sur les GPIO !
      d’où le pont diviseur qu’il faut donc impérativement conserver
      cordialement
      François

      Répondre
  12. Ping : Mesure de distances –> HC-SR04 – Strofe, expérimentations à la Française

  13. Ping : Raspberry Pi 2 : prise en main et capteur ultrasonique

  14. gregouille

    Bonjour, je cherche en vain a coder un petit script simple qui suivant une valeur émanant de la sonde ouvrirait un gpio.
    sauriez vous me conseillez ou m’apporter un peut d’aide?
    Merci par avance.

    Répondre
    1. François MOCQ Auteur de l’article

      Bonjour
      le plus simple à mon avis serait d’utiliser Python
      exemple : vous récupérez la valeur de la distance
      Si cette distance est inférieure à 50cm
      activer le GPIO
      Sinon ne rien faire
      cordialement
      François

      Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Complétez ce captcha SVP *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.