Archives par mot-clé : NewPing

Mesure de distances avec un capteur ultrason et un Arduino

Capteur Ultrason Arduino XV4Y (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2013/04/100_3524 NULL.jpg)Pour un projet professionnel auquel je participe avec un ami (il lit ces lignes donc je précise ami, ça ne coûte rien), je dois réaliser tout un tas de mesures sur ce qu’on pourrait appeler un environnement industriel. Vitesse de moteurs, niveaux de cuves, ouverture de portes…

J’ai donc commandé quelques échantillons de capteurs histoire de voir comment causer avec, interpréter leurs données et surtout vérifier s’ils étaient adaptés aux mesures qu’on veut leur faire faire et à l’environnement particulier d’installation. Parmi ceux-ci un des moins chers et des plus simples à utiliser est un capteur ultrason pour mesurer des distances. Suivant le descriptif, il se commande par une broche se lit par une autre, répond vite, fait des mesures jusque 4,5m avec une précision de 3mm. Le signal est envoyé par un transducteur (un petit haut-parleur piezo) sur une fréquence d’environ 40 KHz et reçu un peu plus tard par un autre. Il s’alimente en 5V et la consommation est inconnue mais vraisemblablement faible.

Première remarque, les deux cellules émettrice et réceptrice étant séparée de quelques centimètres, il faut que vous soyez bien “parallèle” à l’objet à mesurer, surtout pour des mesures à courte distance. Deuxième remarque, le signal transmis est assez peu directif, et un objet passant dans un champs de 90° est vite détecté et vient parasiter vos mesures. Troisième remarque, pour des mesures en champ lointain, il faut que l’objet à mesurer soit plan sinon l’écho retransmis est trop faible.

A ceci, vient s’ajouter une confusion qui est souvent faite entre précision de la mesure et justesse (ou taux d’erreur). Le fait que ce capteur est vendu à un français par des chinois qui écrivent en anglais n’aide pas à se mettre d’accord sur les mots. Tout cela pour dire que si les mesures ont une précision de 3mm, l’erreur est elle vraisemblablement supérieure au centimètre pour la distance maximale (de l’ordre de 1% semble probable). Je tiens encore une fois à préciser que j’ai pris le capteur le moins cher et qu’il y a certainement mieux sur le marché, mais les grands principes sont les mêmes.

Dernier, point, contrôler et lire ces capteurs est donc très simple, et j’ai d’abord tenté de faire mes mesures “à la mimine” comme on le voit sur beaucoup d’exemple. Ceux qui font ça n’ont pas du beaucoup valider leurs résultats ensuite. Même après filtrage des valeurs incohérentes et calcul d’une moyenne, la qualité des mesures était mauvaise. Ensuite je suis passé par la librarie NewPing et là tout de suite c’est devenu plus exploitable (mais avec les restrictions données ci-dessus).

En conclusion, si vous êtes intéressés pour faire des mesures avec de tels capteurs, je vous conseille d’abord de commencer par un proto et de valider son fonctionnement dans vos conditions avant de vous lancer. Pour moi, l’application de tels capteurs est plutôt dans le cadre de détection d’approche, de radar de recul ou de détecteur de présence, mais pas vraiment dans la mesure. A noter que souvent ils sont présentés comme Ultrasonic Range Detection Sensor et non comme outil de mesure… mais la suite de la description joue sur les mots.

Je publie ci-dessous mon code en sachant qu’il n’apporte pas grand chose par rapport aux exemples donnés avec la librairie NewPing, mais ça peut toujours servir.

/*
Prototype mesures ultrason avec affichage LCD
By Yannick DEVOS - XV4Y
http://xv4y.radioclub.asia/

Copyright 2013 Yannick DEVOS under GPL 3.0 license
Any commercial use or inclusion in a kit is subject to author approval

====
The display is on a 16x2 LCD Display with HD44780 compatible driver, use the traditional 4 bits interface on pins 10, 9, 8, 7, 6, 5

In order to compile this program with Arduino 1.0.1, you will need to install 2 libraries :
- New LiquidCrystal
https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home
- NewPing ultrasound sensor library
https://code.google.com/p/arduino-new-ping/

====
Revision history :
v1.00    2013-04-11
         First release

====

*/

#include <Wire.h>
#include <LiquidCrystal.h>
#include <NewPing.h>

// ****
// Here some Parameters you may change
// ****

#define ULTRA_TRIGGER A2        // What pin we have connected the Ultrasonic range sensor Trigger pin
#define ULTRA_ECHO    A3        // What pin we have connected the Ultrasonic range sensor Echo pin
#define MAX_DISTANCE 350        // Maximum distance we want to ping for (in centimeters). Most sensor are rated at 400-500cm.

// Variables
unsigned long duration=0;
long int      distance=0;

LiquidCrystal lcd(5, 6, 7, 8, 9, 10);  // You can change this settings to your convenance, please see the library documentation
NewPing sonar(ULTRA_TRIGGER, ULTRA_ECHO, MAX_DISTANCE); // NewPing setup of pins and maximum distance.

void setup()
{
  lcd.begin(16,2);
  lcd.home ();

  lcd.print("Ultraçon");

  pinMode(ULTRA_TRIGGER, OUTPUT);
  pinMode(ULTRA_ECHO, INPUT);

  delay(1000);
  lcd.clear();
  lcd.setCursor ( 0, 0 );
  lcd.print("Distance"); 
}

void loop()
{

  // The speed of sound is 340 m/s or 29 microseconds per centimeter.
  // The ping travels out and back, so to find the distance of the
  // object we take half of the distance travelled.
    duration = sonar.ping_median(5);  // We do 5 measurements to have a good average and filter bad measurements
    distance = ((340 * duration) / 1000)/2;

    lcd.setCursor ( 0, 1 );
    lcd.print("              mm");
    lcd.setCursor ( 0, 1 );
    lcd.print(distance);
    delay(500);

}