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 :

Le capteur de face

Le capteur de dos

 

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 :

Schéma du montage

Schéma du montage

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.

Tests ultra scientifiques pour évaluer la fiabilité du capteur

Tests ultra scientifiques pour évaluer la fiabilité du capteur

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).

Les résultats obtenus

Les résultats obtenus

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 :

Et hop, magieeeee

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

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

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>