La 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
Au sommaire :
Mesure de distance par ultrasons avec le Raspberry Pi
Le principe
Un é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.
Il reste à mesurer le temps que dure ce créneau pour déterminer la distance de l’obstacle…
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é.
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.
Connexion du module
Les broches (toutes versions de Raspberry):
- GPIO 23 : pin 16
- GPIO 24 : pin 18
- VCC 5V : pin 4
- GND : pin 6
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 :
La 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
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 😉
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.
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.
Si vous cherchez un OS temps-réel, patchez un noyau avec Xenomai. Christophe Blaess en a fait un article en 2012 (http://www.blaess.fr/christophe/2012/08/27/xenomai-sur-raspberry-pi/).
En plus, c’est en partie Français!
Félicitations pour le 400ème article et bonne continuation.
Bonjour Sylvain
merci pour l info
cordialement
François
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
Bonjour Nico
faites nous un retour après les tests…
cordialement
François
Ca m’intéresse fortement pour monitorer l’activité de ma pompe de relevage.
Bonjour,
j’avais fait ce tutoriel il y a un peu plus d’un an, et notamment une batterie de test pour estimer la fiabilité d’un tel capteur.
Pour accéder directement à ce test de fiabilité, c’est par ici
Yaug
Bonjour
merci pour cette info !
Bonne journée
Cordialement
François
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…
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.
Bonjour,
As-tu trouvé d’où venait ton problème?
Merci.
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 .
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é !
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 . 😉
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 .
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 .
Ping : Une histoire de pont… | Framboise 314, le Raspberry Pi à la sauce française….
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.
Bonsoir,
Vous pouvez le flag -o avec gcc pour spécifier le nom du fichier de sortie.
Ex: gcc ultrason-HC-SR04.c -Wall -lrt -o ultrason-HC-SR04
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.
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
une petite question quel est le poids et la taille de cette sonde ?
l’intérêt est pour un drone télécommandé
Bonjour
avec un peu de retard
le module pèse 7g et mesure 45 x20 mm pour une épaisseur de 15mm
Cordialement
François
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
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
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.
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
Ping : Mesure de distances –> HC-SR04 – Strofe, expérimentations à la Française
Ping : Raspberry Pi 2 : prise en main et capteur ultrasonique
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.
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
Bonjour tout le monde!
Si certains sont intéressés, j’ai créer une librairie très simple d’utilisation pour contrôler le HC-SR04 sur Raspberry Pi en C++.
Voici le lien de mon tutoriel: https://causeyourestuck.io/2016/04/15/hc-sr04-raspberry-pi-c/
Happy coding! ; )