Mesurer une distance avec le HC-SR04

La mesure d’une distance dans le cadre d’un projet robotique est importante. Il faut cependant faire attention à plusieurs choses notamment quel type de capteur, sur système. Dnas tous les cas, la mise en place de ce capteur et l’utilisation est simple.

Dans cet article nous allons voir comment utiliser un capteur à ultrason HC-SR04 avec le raspberry. L’utilisation d’un tel capteur peut être utile :

  • un télémètre
  • une détection d’obstacle
  • un radar (très courte distance)
  • tout ce que votre cerveau peut imaginer

Présentation du HC-SR04

Ce capteur est un capteur à ultrason très peu couteux, idéal pour servir de test ou pour des montages basiques, sa mise en oeuvre est extrêmement simple que ce soit par le câblage ou le code (dans cet article, nous verrons en python).

Tout d’abord, voila la bête :

brochage hc-sr04
brochage hc-sr04

Pour ce qui est du fonctionnement :

HC-SR04
HC-SR04

Les broches :

  • Le capteur doit être alimenté en 5 volts entre les pins Vcc et GND, le raspberry peut fournir cette tension
  • Le pin Trigger correspond au signal émis par le HC-SR04, elle devra être connectée à un port GPIO
  • Le pin Echo fourni une impulsion dont la largeur correspond au temps de retour de l’echo, le signal sort en 5 volts, attention le Raspberry n’aime pas du tout cette tension sur ses pins, un diviseur de tension sera indispensable

Voici un lien vers la documentation du HC-SR04.

Mise en place du capteur HC-SR04

Câblage

Voila le câblage :

exemple câblage
exemple câblage

La patte trigger est connecté au GPIO#4 et la patte Echo va sur le diviseur de tension.
Petit rappel sur le diviseur de tension :

Pont Diviseur de tension
Pont Diviseur de tension

Plus qu’à tout branché.

Code python pour HC-SR04

Ce code est facile à mettre en place et surtout à comprendre :

#!/usr/bin/python
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time
import sys
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
#Choix des pins
TRIGG = 4
ECHO = 17
#configuration des I/O
GPIO.setup(TRIGG,GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(ECHO,GPIO.IN,pull_up_down=GPIO.PUD_DOWN)
GPIO.output(TRIGG,False)
#Démarrage de l'écho
i=0
global distance; distance= []
for i in range(10):#J'exécute la boucle dix fois pour lisser la distance
      #envoi du signal
      GPIO.output(TRIGG,True)
      time.sleep(0.00001)
      GPIO.output(TRIGG,False)
      while GPIO.input(ECHO) == 0:
           debut_echo = time.time()
      while GPIO.input(ECHO) == 1:
           fin_echo = time.time()
     duree = fin_echo - debut_echo
     distance.append(duree * 340.29 / 2)
i=0
total=0
for i in range(10):
     total = total + distance[i]
moyenne = total /10
print moyenne,' m'
i = 0
for i in range(10):
      print distance[i]
#Remise à zéro des I/O
GPIO.cleanup()

Voila comment faire fonctionner votre nouveau capteur, en revanche il y a des soucis au niveau de la mesure, le raspberry ne fonctionne pas en temps réel (il exécute plusieurs taches en même temps), du coup, entre deux lignes de code qu’il exécute, il peut aller faire une autre tâche (gestion de l’interface graphique, souris, daemon en arrièle plan…), de ce faite le temps de début et fin peuvent être légèrement décalés d’où des différences dans les mesures effectuées.

Laisser un commentaire