Joy-PI Leçon #09 : Mesurer des distances

Cette leçon va aborder le capteur à ultrason, de type HC-SR04, que l’on trouve dans presque tous les kits de robotique. De nombreuses voitures utilisent la même méthode pour mesurer les distances et signaler les obstacles.
Ce capteur est placé en bas à droite de la platine Joy-Pi, il est facilement reconnaissable par les deux grands cercles. Il suffit de déplacer une main au-dessus du capteur pour mesurer la distance.


Le capteur de distance fonctionne avec deux GPIO, une entrée et une sortie. C’est en quelque sorte un sonar, un signal d’une durée de 10 uS (trigger) est émis, et on mesure le temps avant le retour (écho).
Note : Le constructeur recommande un cycle de 60 ms entre 2 mesures pour éviter les chevauchements d’échos.

Commutateurs :

Tous les interrupteurs des deux blocs de commutateurs doivent être placé sur OFF (en direction de la poignée).

Un peu de maths..

La formule qui détermine la vitesse, lorsque l’on connaît la distance et le temps, est :

vitesse=\frac{distance}{temps}

La vitesse du son, dans l’air est de 343 m/s à 20°C. Dans notre cas, nous devons tenir compte de l’aller retour, la distance est doublée.

vitesse=\frac{distance*2}{temps}=343 m/s = 34300 cm/s

On divise tout par 2 :

17150 = \frac{distance}{temps}

Et on déduit la distance :

distance = 17500 * temps

Le pseudo-code :

  • Importation des librairies
  • Définition des constantes
  • Dans une boucle infinie (fin avec CTRL-C)
    • Envoi d’un trigger (10 uS)
    • Attend le signal de retour
    • Calculer le temps écoulé
    • Afficher la distance
  • Nettoyage des GPIO utilisés

En python :

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BOARD)

TRIG = 36 
ECHO = 32 
SPEED = 17150
ROUND = 2

print ("Distance measurement in progress.")

GPIO.setup(TRIG,GPIO.OUT)
GPIO.setup(ECHO,GPIO.IN)
GPIO.output(TRIG, False)

time.sleep(1)

try:
    while True :
        GPIO.output(TRIG, True)
        time.sleep(0.00001)
        GPIO.output(TRIG, False)

        while GPIO.input(ECHO)==0:
            pulse_start = time.time()
        while GPIO.input(ECHO)==1:
            pulse_end = time.time()

        pulse_duration = pulse_end - pulse_start 
        distance = pulse_duration * SPEED 
        distance = round(distance, ROUND )

        print ("Distance:",distance,"cm")
        time.sleep(1) 
        
except KeyboardInterrupt:
    GPIO.cleanup()

Laisser un commentaire