Mesure de distance avec un capteur à ultrasons

Ici on a utilisé un URM37 V4.0, un Arduino Uno et un écran lcd 1602.

Il n’y a rien à faire de spécial sur le capteur, la version 4.0 est très simple à utiliser. Plusieurs modes sont possibles, j’ai utilisé le mode dit « PWM ».
Deux Pins sont utilisées, l’une en OUTPUT pour lancer l’ordre de mesurer, l’autre en INPUT pour recueillir la mesure.

Ce n’est pas une tension que l’on mesure en INPUT mais on récupère directement une valeur numérique. Cette valeur est une durée en microsecondes. Plus précisément on mesure le temps durant lequel le signal passe à l’état bas. Ensuite il suffit de savoir qu’un cm correspond à 50 microsecondes.

Pour que cela fonctionne bien, on a intérêt à mettre en hauteur les deux capteurs.

Si votre capteur est en version 3.2, il y a des adaptations à faire (voir les programmes du wiki de DFRobot).


// UltrasonP2
// fonctionne pour la version 4.0 de l'URM37
// teste sur Arduino Uno

// Ecrit sur la base d'un programme
// Présent sur le wiki de DfRobot 
// (# Editor     : ZRH from DFRobot
// # Date       : 29.08.2014 
// # Product name: URM V4.0 ultrasonic sensor
// # Product SKU : SEN0001
// # Version     : 1.0 ) 

// Description:
// On utilise un capteur a ultrasons
// pour mesurer des distances
// La distance mesurée est affichee sur un écran LCD

// La plage de detection est de  3 à 200 cm 
// Le mode de detection choisi est le "PWM trigger pin" 


// # Connexions capteur
// # Cote  Arduino  //  Cote URM 37 Vv4.0

// #       Vcc     -> Pin 1 VCC 
// #       GND     -> Pin 2 GND 
// #       Pin 3   -> Pin 4 ECHO 
// #       Pin 5   -> Pin 6 COMP/TRIG 


// # Connexions écran LCD 1602 (DFR0063)
// # Cote  Arduino  //  Cote LCD

// #       Pin A4  -> SDA
// #       Pin A5  -> SCL
// #       Vcc     -> VCC
// #       GND     -> GND



#include <Wire.h> // librairie standard
#include <LiquidCrystal_I2C.h> // librairie à télécharger
 
// Parametrer l'adresse du LCD à 0x27 
// pour deux lignes de 16 caractères
 
LiquidCrystal_I2C lcd(0x27,16,2);  
 

// La pin URECHO de l'Arduino recoit le signal 
// qui code la mesure de distance
int URECHO = 3;         

// Quand la pin URTRIG de l'Arduino passe a l'état bas
// la mesure est lancee
int URTRIG = 5;         

// Distance mesuree en cm 
unsigned int DistanceMeasured= 0;
 
void setup() 

{
   lcd.init();     // initialiser le lcd 
   lcd.backlight(); // allumer écran
   lcd.print("Distance en cm :    "); // affichage fixe  
  
  // Pin de lancement de la mesure 
  pinMode(URTRIG,OUTPUT);      
  // Pin mise à l'état haut
  // Un futur passage à l'etat bas 
  // lancera la mesure  
  digitalWrite(URTRIG,HIGH);                 
  
  // Pin en attente du signal
  pinMode(URECHO, INPUT);                    
  delay(500);
 
 }
 
 
void loop()
{
  PWM_Mode();
  delay(200);
} 
 
void PWM_Mode()                              
{ 
 
  // On lance une mesure
  digitalWrite(URTRIG, LOW);  
  digitalWrite(URTRIG, HIGH);  

  // On recueille sur la Pin URECHO
  // le resultat de la mesure
  // sous la forme d'une duree : 
  // on compte le temps passe
  // a l'etat bas 
 
  unsigned long LowLevelTime = pulseIn(URECHO, LOW) ;
  
    // On prefère ne pas aller jusqu' a 500 cm
    if(LowLevelTime>= 10000)                 
    {
    // Mesure invalide  
    lcd.setCursor(0,1); // curseur début deuxième ligne
    lcd.print("    "); // effacer la mesure précédente
    lcd.setCursor(0,1); // curseur début deuxième ligne
    lcd.print("###");
        }
    else{
    // 44 microsecondes correspondent a 1 cm
    // 50 selon la doc mais 44 donne de meilleurs résultats
    DistanceMeasured = LowLevelTime /44;   
    
    // Afficher sur ecran lcd    
    lcd.setCursor(0,1); // curseur début deuxième ligne
    lcd.print("    "); // effacer la mesure précédente
    lcd.setCursor(0,1); // curseur début deuxième ligne
    lcd.print(DistanceMeasured);
    
  }
  
}

Une version simplifiée qui utilise le moniteur série du PC au lieu de l’écran LCD :


// UltrasonP1
// fonctionne pour la version 4.0 de l'URM37

// Ecrit sur la base d'un programme
// Présent sur le wiki de DfRobot 
// (# Editor     : ZRH from DFRobot
// # Date       : 29.08.2014 
// # Product name: URM V4.0 ultrasonic sensor
// # Product SKU : SEN0001
// # Version     : 1.0 ) 

// Description:
// On utilise un capteur a ultrasons
// pour mesurer des distances

// La plage de detection est de  3 à 500 cm 
// Le mode de detection choisi est le "PWM trigger pin" mode
// La distance mesurée est affichee sur le moniteur serie
// Il faut donc utiliser le cable USB pour relier PC et Arduino

// # Connexions:
// # Cote  Arduino  //  Cote URM 37 Vv4.0

// #       Vcc     -> Pin 1 VCC 
// #       GND     -> Pin 2 GND 
// #       Pin 3   -> Pin 4 ECHO 
// #       Pin 5   -> Pin 6 COMP/TRIG 

// La pin URECHO de l'Arduino recoit le signal 
// qui code la mesure de distance
int URECHO = 3;         

// Quand la pin URTRIG de l'Arduino passe a l'état bas
// la mesure est lancee
int URTRIG = 5;         

// Distance mesuree en cm 
unsigned int DistanceMeasured= 0;
 
void setup() 
{
  //Initialization port serie
  Serial.begin(9600);                        
  
  // Pin de lancement de la mesure 
  pinMode(URTRIG,OUTPUT);      
  // Pin mise à l'état haut
  // Un futur passage à l'etat bas 
  // lancera la mesure  
  digitalWrite(URTRIG,HIGH);                 
  
  // Pin en attente du signal
  pinMode(URECHO, INPUT);                    
  delay(500);
  
  Serial.println("Init the sensor");
 
 }
void loop()
{
  PWM_Mode();
  delay(100);
} 
 
void PWM_Mode()                              
{ 
  Serial.print("Distance Mesuree = ");
  // On lance une mesure
  digitalWrite(URTRIG, LOW);
  
  digitalWrite(URTRIG, HIGH);  

  // On recueille sur la Pin URECHO
  // le resultat de la mesure
  // sous la forme d'une duree : 
  // on compte le temps passe
  // a l'etat bas 
 
  unsigned long LowLevelTime = pulseIn(URECHO, LOW) ;
  
    if(LowLevelTime>=45000)                 
    {
      Serial.print("Invalide");
    }
    else{
    // 50 microsecondes correspondent a 1 cm
    DistanceMeasured = LowLevelTime /50;   
    Serial.print(DistanceMeasured);
    Serial.println(" cm");
  }
  
}