Lire un capteur ultrason HC-SR04 avec un Raspberry Pi
Bonjour à tous,
Aujourd’hui, pour mon grand retour après les vacances, un tutos un peu plus orienté robotique. On va utiliser un capteur ultrason HC-SR04 avec notre raspberry chéri pou enregistrer une distance.
Présentation du capteur
Voici donc notre capteur :
Comme d’habitude, je vous conseille de commencer ce tutoriel en faisant un tour du coté de la fiche technique du capteur. C’est ici.
On notera surtout les points suivants :
- Distance de lecture de 2 à 450cm
- Tension d’entrée : 5V
- Angle de lecture : 15° maximum
- Signal d’initialisation : 10uS
- Signal de sortie : fonction de la distance 🙂
Voila pour les données de base de ce petit bébé.
Le matériel
- Un raspberry Pi, évidemment
- Un capteur ultrason HC-SR04 (données techniques ci dessus)
- Une planche de prototypage (ou breadboard)
- Quelques fils M/F et M/M
- 1 résistance de 470 ohm
- 1 résistance de 330 ohm
Ces deux dernières résistances sont particulièrement importante !
En effet, la tension délivrée en sortie par ce capteur sera de 5V. Sachant que notre petite bestiole ne supporte pas le 5V mais uniquement le 3,3V, les résistances nous permettront alors de diviser la tension de sortie pour protéger le Raspberry Pi. C’est donc important, sauf si vous avez un stock conséquent de Raspberry Pi que vous voulez utiliser comme un goret.
« Où trouver le capteur ? » allez vous me dire … c’est facile ! C’est un capteur assez courant en robotique, donc soit vous passez par un vendeur en ligne de matériel robotique (pololu, alpha crucis, adafruit, etc … ) ou alors passez par ebay. Personnellement, la plupart du temps, je passe par ebay, parce que les capteurs sont beaucoup moins chers sur ebay, même si les temps de livraison peuvent monter jusqu’à 4 semaines (venir de Chine par bateau, ça prend du temps … ).
Si je suis pressé, je passe par un site US ou français (même si j’ai eut une mauvaise expérience avec alpha crucis), et je fais une commande de plusieurs éléments pour essayer de rentabiliser un peu les frais de transport.
Les branchements
Le schéma de montage est le suivant :
Niveau branchement, rien de bien compliqué. Il n’y a qu’un point crucial à respecter : protéger le Raspberry Pi de la tension de sortie du capteur en utilisant les 2 résistances listées plus haut.
- On branche le pin VCC sur le 5V sur le pin 5V du raspberry
- Le pin trigger du capteur va sur un pin de data du raspberry pi (dans mon cas le pin 16 – GPIO 23)
- On place une résistance de 330 ohms entre le pin echo et un pin du raspberry pi (ici le 18 – GPIO24)
- On relit le Ground du capteur à celui du raspberry pi, en ajoutant une liaison avec le pin echo via une résistance de 470 ohms
Et voila.A part ce double système de résistances pour protéger le raspberry pi, rien de bien compliqué les amis.
Tests de fiabilité
Avant de vous donner mon code, j’ai fait des tests pour voir un peu la fiabilité du bidule. J’avais pas mal d’à-prioris, me disant que vu que c’était de l’ultrason, ce n’était pas super fiable (ce n’est pas comme si des animaux s’en servait pour se déplacer hein … si ? ). Erreur. dans l’ensemble, c’est pas mal du tout.
J’ai testé son efficacité entre 2 et 140 cm. Vous trouverez ci dessous un tableau des valeurs que j’ai pu récolter (10 mesures pour chaque point de contrôle).
Voila, un bon tableau indigeste en cadeau. miam !
Comme vous pouvez le voir, on a globalement des résultats pas mal pour un capteur de cette qualité (il ne coûte pas des milles et des cents) testé dans ces superbes conditions scientifiques.
Ces tests nous apportent au moins une information intéressante : la plupart du temps, on pourra se contenter de quelques mesures, de supprimer la plus petite, la plus grande, et d’utiliser une moyenne des autres, cela afin d’éviter les rares valeurs parasites qui peuvent fausser le résultat.
Voila voila, j’espère que ces tests vous ont servis un peu.
Le code
Et oui, fini les tests, voici donc le code que j’utilise avec ce capteur. Heureusement le site RaspberryPi-Spy.co.uk nous fournit une source tout à fait valable. Il fournit notamment un tuto bien pratique. Voici le code à utiliser pour afficher une fois la distance :
#!/usr/bin/python #+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ #|R|a|s|p|b|e|r|r|y|P|i|-|S|p|y|.|c|o|.|u|k| #+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ # # ultrasonic_1.py # Measure distance using an ultrasonic module # # Author : Matt Hawkins # Date : 09/01/2013 # Import required Python libraries import time import RPi.GPIO as GPIO # Use BCM GPIO references # instead of physical pin numbers GPIO.setmode(GPIO.BCM) # Define GPIO to use on Pi GPIO_TRIGGER = 23 GPIO_ECHO = 24 print "Ultrasonic Measurement" # Set pins as output and input GPIO.setup(GPIO_TRIGGER,GPIO.OUT) # Trigger GPIO.setup(GPIO_ECHO,GPIO.IN) # Echo # Set trigger to False (Low) GPIO.output(GPIO_TRIGGER, False) # Allow module to settle time.sleep(0.5) # Send 10us pulse to trigger GPIO.output(GPIO_TRIGGER, True) time.sleep(0.00001) GPIO.output(GPIO_TRIGGER, False) start = time.time() while GPIO.input(GPIO_ECHO)==0: start = time.time() while GPIO.input(GPIO_ECHO)==1: stop = time.time() # Calculate pulse length elapsed = stop-start # Distance pulse travelled in that time is time # multiplied by the speed of sound (cm/s) distance = elapsed * 34000 # That was the distance there and back so halve the value distance = distance / 2 print "Distance : %.1f" % distance # Reset GPIO settings GPIO.cleanup()
Pour exécuter, il faut exécuter la commande suivante :
sudo python votrefichier.py
On a alors un affichage de ce genre :
Annexe 1 : mettre à jour RPi.GPIO
Un petit tuyau pour certains.
J’ai grave galéré pour réussir à faire fonctionner le script sans erreur. Pourquoi ? A cause de la toute dernière ligne du script :
# Reset GPIO settings GPIO.cleanup()
Lorsque j’executais le script, j’obtenais ceci :
pi@raspberrypi /var/www/ultrasonic $ sudo python ultrasonic_1.py Ultrasonic MeasurementDistance : 4.4 Traceback (most recent call last): File "ultrasonic_1.py", line 61, in <module> GPIO.cleanup() AttributeError: 'module' object has no attribute 'cleanup'
Pas top hein ?
En fait, cette erreur est liée à la bibliothèque python RPi.GPIO. Car, surprise… elle n’est pas définitive la dite bibliothèque. La version installée via aptitude est la 0.3.1a-1, et elle n’est pas complète.
Solution 1 : mettez à jour votre distribution :
apt-get update apt-get dist-upgrade
Solution 2 : bidouillez
Si comme moi vous êtes un blaireau et vous n’avez pas / ne pouvez pas mettre à jour votre distribution , alors heureusement, il existe une méthode de mise à jour.
Allez sur le site de la bibliothèque : https://pypi.python.org/pypi/RPi.GPIO et récupérez l’adresse de la dernière version. Ensuite, il faut la ramener sur le Raspberry Pi. Par exemple :
wget https://pypi.python.org/packages/source/R/RPi.GPIO/RPi.GPIO-0.5.2a.tar.gz
Il faut ensuite déziper puis aller dans le dossier qui vient d’être créé :
tar zxf RPi.GPIO-0.5.2a.tar.gz cd RPi.GPIO-0.5.2a/
et là, hop, la petite commande d’installation :
sudo python setup.py install
Et voila, on a mis à jour RPi.GPIO, et surtout, on a corrigé l’erreur bloquante au dessus.
Mais rappelez vous : privilégiez la solution 1 ! c’est plus propre.
Un grand merci à Arnaud Boudou pour son retour à ce sujet.
Annexe 2 : Lisser les valeurs
Comme indiqué plus haut, il peut être utile de relever d’affiler plusieurs valeurs pour diminuer l’impact d’éventuelles erreurs de mesure. (un robot qui croit qu’il lui reste 1m avant le mur alors qu’il ne lui reste que 10 cm… ça peut poser quelques problèmes).
On va donc mesurer 5 valeurs d’affiler, supprimer la plus grande et la plus petite, puis faire la moyenne des 3 valeurs restantes. Cela devrait suffire, si ce n’est pas le cas, n’hésitez pas à faire plus de mesure si nécessaire pour obtenir un résultat le juste possible. Tout dépendra évidemment de la précision recherchée par rapport au temps de mesure demandée. Si votre capteur est fixe, pas de problèmes. Si votre capteur est embarqué sur un robot, là.. il vous faudra une mesure rapidement, donc avec moins de sous mesures.
Je suis encore en train d’améliorer le code pour cette annexe, donc revenez rapidement 🙂
Laisser un commentaire