nous allons voir ici comment faire une mesure de distance avec un capteur Ultrason.
nous examinerons 2 types de capteur , le capteur classique disponible dans tous les kit arduino, a savoir le HC-SR04 mais aussi un capteur un peu plus evolué , le capteur A02YY , qui est un capteur étanche a commande UART.
Capteur ULTRASON le principe
les capteur a ultrason sont des circuits électroniques comportant un Émetteur et un récepteur a Ultrasons.
l’émetteur envoie une impulsion sonore qui est réfléchie par les obstacles situés en face. le récepteur capte l’écho reçu en retour. on mesure le temps mis entre le départ du son et le retour, et connaissant la vitesse de propagation du son dans le milieu ou s’effectue la mesure on peut en déduire la distance.
Distance = (temps x vitesse du son) / 2
Le capteur HC-SR04
principe de commande:
le circuit du capteur est alimenté en 5V via ses broches Gnd et Vcc , il comporte une broche Trig (Trigger) permettant de commander l’envoi du signal , et une broche Echo permettant de détecter le signal du retour d’echo.
il suffit donc d’alimenter le capteur via le Gnd et le 5V de l’arduino et de brancher les broches Trig et Echo sur des sorties de l’arduino.
histoire de changer de l’éternel affichage dans le moniteur série , nous allons ici directement utiliser un petit écran Oled I2C 128×64 pixels pour afficher le résultat. le principe du Bus I2C est expliqué ici : Bus I2C
pour la gestion en I2C , nous utiliserons la librairie “Wire.h” et pour le petit écran Oled I2C nous utiliserons les librairies “Adafruit_SSD1306.h” et “Adafruit_GFX.h” . ces librairies seront a installer en préalable sur votre IDE arduino.
pour le pilotage globale , nous utiliserons un Arduino Nano ce qui permettra un ensemble très compact .
Cablage Arduino:
- la broche Trig du HC-SR04 est raccordée a la broche D7 de l’arduino nano
- la broche Echo du HC-SR04 est raccordée a la broche D6 de l’arduino nano
- la broche SCL de l’ecran OLED est raccordée a la broche A5 de l’arduino nano
- la broche SDA de l’ecran OLED est raccordée a la broche A4 de l’arduino nano
- les broches GND et Vcc des 2 composants sont a raccorder aux broches GND et 5V du Nano
- l’arduino Nano sera alimenté par le cable USB de telechargement du programme . pour un montage autonome , voir derniere photo en bas de page sur le cas du deuxieme capteur .
Programme:
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#define OLED_ADDR 0x3C // OLED display TWI address
Adafruit_SSD1306 display(-1);
#define ECHpin 6
#define TRIGpin 7
unsigned long duree ;
const float SOUND_SPEED = 343.00 / 1000;
float distance = 0.00;
void setup() {
pinMode(ECHpin, INPUT);
pinMode(TRIGpin, OUTPUT);
digitalWrite(TRIGpin, LOW);
Wire.begin( ); // démarre la communication I2C
display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR); // initialize l'ecran OLED
display.clearDisplay(); //efface l'affichage OLED
display.display();
}
void loop() {
digitalWrite(TRIGpin, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGpin, LOW);
// mesure du temps aller retour de l'impulsion US
duree = pulseIn(ECHpin, HIGH);
distance = duree * SOUND_SPEED / 2.0 ;
display.clearDisplay();
display.display();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(35,1);
display.print("DISTANCE" );
display.display(); // actually display all of the above
display.setTextSize(2);
display.setCursor(10,17);
display.print(distance);
display.setCursor(85,17);
display.print(" mm");
display.display();
delay(5000);
}
Résultat:
dans la photo ci dessous , le montage posé horizontalement sur une table, et qui mesure la hauteur au plafond en mm .
Nota: il faudra étalonner le montage en mesurant la cote réelle et modifier la vitesse du son en conséquence . il faut savoir que la vitesse du son dans l’air est fonction de la température et de la densité de l’air a l’endroit de la mesure. pour faire un appareil de mesure précis , il faudrait aussi mesurer la température et ajouter une table de correction …
.
Le capteur A02YY :
les differents Modeles :
dans la famille des capteurs A02YY , il existe 5 types dont voici un tableau récapitulatif des caractéristiques principales:
dans ce tutos , nous allons voir le modèle A02YYTW qui a l’avantage d’être commandable de la même façon que le capteur HC-SR04 et donc plus économe en énergie que par exemple le modèle UW qui lui est en émission réception constante et ou il faut récupérer les données a la volée.
brochage du câble du capteur
Principe de fonctionnement
ici la petite particularité par rapport au capteur HC-SR04, c’est que la carte electronique du A0221AT calcule directement la distance et l’envoie sous forme de chaine de 4 caractères sur le bus série avec un protocole de type Tx/Rx . dans le programme Arduino, il va donc falloir implémenter un protocole serie avec la bibliotheque “SoftwareSerial.h” et un protocole Myserial pour le bus serie du capteur , afin de lire les bits reçus du capteur et calculer la distance correspondante .
ci dessous un extrait de la data sheet du capteur qui explique cela pour les modules UART contrôlés.
Câblage Arduino:
il est similaire a celui du HC-RS04 plus haut avec :
- la broche Rx (cable jaune) du capteur (equivalent au Trig du HC-SR04) est raccordée a la broche D7 de l’arduino nano
- la broche Tx (cable blanc) du capteur (equivalent au Echo du HC-SR04) est raccordée a la broche D7 de l’arduino nano
- la broche SCL de l’écran OLED est raccordée a la broche A5 de l’arduino nano
- la broche SDA de l’écran OLED est raccordée a la broche A4 de l’arduino nano
- les broches GND et Vcc des 2 composants sont a raccorder aux broches GND et 5V du Nano
Programme:
#include <SoftwareSerial.h>
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#define OLED_ADDR 0x3C // OLED display TWI address
Adafruit_SSD1306 display(-1);
#define RXpin 6
#define TXpin 7
SoftwareSerial mySerial(RXpin,TXpin); // RX, TX connected to US sensor
unsigned char data[4]={};
float distance = 0.00;
void setup() {
pinMode(RXpin, INPUT);
pinMode(TXpin, OUTPUT);
Wire.begin( ); // démarre la communication I2C
Serial.begin(9600);
mySerial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR); // initialize
display.clearDisplay(); //and clear display
display.display();
}
void loop() {
mySerial.flush();
delay(30);
digitalWrite(TXpin,HIGH);
delay(30);
digitalWrite(TXpin,LOW);
delay(30);
digitalWrite(TXpin,HIGH);
delay(60);
for(int i=0;i<4;i++) {
data[i]=mySerial.read();
}
distance = (data[1]*256)+data[2];
display.clearDisplay();
display.display();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(35,1);
display.print("DISTANCE" );
display.display(); // actually display all of the above
display.setTextSize(2);
display.setCursor(10,17);
display.print(distance);
display.setCursor(85,17);
display.print(" mm");
display.display();
delay(5000);
}
voici ci dessous, une photo d’une adaptation du montage et du programme ci dessus pour calculer le volume d’eau residuel dans une cuve rectangulaire de camping car.
a partir de la distance entre le dessus de cuve et la surface de l’eau, on calcule le volume d’air supérieur de la cuve que l’on retranche au volume global de la cuve .
pour l’alimentation electrique , sont utilisées 2 pile Li-ion 18650 de 3,7 V en série connectées a la broche GND et Vin du Nano. ce qui rends le dispositif autonome.
il est parfaitement imaginable de faire de même dans un puits de section cylindrique .
NOTA: le capteur fonctionne sur une plage de distance de 3cm a 4,5 mètres .