Arduino, mesurer une distance avec une sonde HC-SR04

Dans le cadre d’un projet domotique ou robotique, la mesure d’une distance est souvent nécessaire pour déterminer une distance entre le robot et un obstacle ou détecter un passage. La sonde à ultrason HC-SR04 est là pour ça (entre autre).

Mesurer une distance dans un projet est très souvent utile, nous avons vu comment mesurer une distance avec un HC-SR04 et un raspberry, mais le fonctionnement du raspberry montre ses limites (problème de temps avec le fonctionnement des différentes fonctions du raspberry en tâche d’arrière fond). L’avantage de l’arduino est que celui-ci exécute seulement son programme.

Le choix du capteur HC-SR04 est principalement son prix, il faut tout de même noter que ce n’est pas la meilleur solution pour avoir une mesure précise, mais elle fait partie des moins coûteuse.

Le capteur peut être trouvé sur amazon.

Présentation du HC-SR04

Voici une petite présentation de ce fameux capteur :

brochage hc-sr04
brochage hc-sr04

Il est un peu gros pour des montages qui nécessite un encombrement minimum, mais fera très bien l’affaire pour des montages ou le capteur n’a pas besoin d’un caché.

Il faut retenir que le capteur ne pourra pas être placé derrière un écran pour le cacher, il fonctionne, en envoyant un signal, il va mesurer le délai nécessaire pour le retour de ce même signal.

Voici un schéma pour montrer son fonctionnement :

HC-SR04
HC-SR04

De manière simplifiée, voilà comment il fonctionne :

fonctionnement HC-SR04
fonctionnement HC-SR04

Son alimentation se fait entre 5V et le GND.

Sa plage de mesure est entre 2cm et 4m avec un angle de 15°.

La documentation est disponible sur cette page.

Câblage du HC-SR04 avec un arduino

C’est un composant très simple à connecter :

  • La broche VCC à la sortie 5V de l’arduino
  • La broche GND au GND de l’arduino
  • La broche Trig à une broche digitale (ici D12)
  • La broche Echo à une autre broche digital (ici D11)

Code arduino pour le HC-SR04

Pour le code, aucune difficulté :

/* Utilisation du capteur Ultrason HC-SR04 */

// définition des broches utilisées 
int trig = 12; 
int echo = 11; 
long lecture_echo; 
long cm;

void setup() 
{ 
  pinMode(trig, OUTPUT); 
  digitalWrite(trig, LOW); 
  pinMode(echo, INPUT); 
  Serial.begin(9600); 
}

void loop() 
{ 
  digitalWrite(trig, HIGH); 
  delayMicroseconds(10); 
  digitalWrite(trig, LOW); 
  lecture_echo = pulseIn(echo, HIGH); 
  cm = lecture_echo / 58; 
  Serial.print("Distance : "); 
  Serial.println(cm); 
  delay(1000); 
}

Pourquoi divise t-on par 58

On voit dans la documentation qu’il faut diviser par 58, l’explication est la suivante :

distance = (TEMPS_MESURE  x (34000 cm / 1 000 000 μs) )  / 2 (en cm)
distance = TEMPS_MESURE  x 17000 / 1 000 000  (en cm)
distance = TEMPS_MESURE  x 17 / 1000 (en cm)

Cela s’explique parce que multiplier par 17/1000 revient à diviser par 1000/17 qui vaut 58.8235.

On va simplement écrire sur le moniteur série de l’arduino, la distance mesurée par le capteur.

La formule provient de la documentation constructeur.

Test de précision

Afin de voir l’exactitude des mesures prises, j’ai procédé comme suit, devant un obstacle de 50cm, j’ai reculé de manière régulière en suivant un trait perpendiculaire à l’obstacle et en plaçant le caractère sur la médiatrice du coté de l’obstacle (tout ça à peu près), j’ai modifié le code comme suit pour l’afficher sur un écran LCD (pour l’utilisation, voir cet article):

/* Utilisation du capteur Ultrason HC6SRO4 */
#include "LiquidCrystal.h" //ajout de la librairie

LiquidCrystal lcd(2,3,4,5,6,7);

//définition des broches
int trig =12;
int echo = 11;
long lecture_echo;
long cm;

void setup()
{
  pinMode(trig,OUTPUT);
  digitalWrite(trig,LOW);
  pinMode(echo,INPUT);
  lcd.begin(20,4);
  lcd.clear();
  lcd.setCursor(0,0);
}

void loop()
{
  lcd.clear();
  lcd.setCursor(0,0);
  digitalWrite(trig,HIGH);
  delayMicroseconds(10);
  digitalWrite(trig,LOW);
  lecture_echo = pulseIn(echo,HIGH);
  cm = lecture_echo /58;
  lcd.print(cm);
  delay(1000);
}

Voici une photo de ma platine de test connectée à une pile 9V.

A venir

Le relevé de mesure :

[table id=13 /]

On constate que la précision n’est pas terrible, durant le test, j’ai du décaler légèrement le capteur afin de trouver la valeur max qu’il était capable de mesurer.

Je n’ai pas effectué le test avec plus capteur et j’ai attendu que le système mesure plusieurs valeurs.

 

Laisser un commentaire