Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédenteDernière révisionLes deux révisions suivantes |
materiels:capteurs:distance:distus [2021/06/18 09:46] – [1. Généralités] phil | materiels:capteurs:distance:distus [2024/06/25 18:30] – [2.3 HC-SR04P (GPIO - I2C - UART)] phil |
---|
| [[materiels:accueilmateriels|{{ :iconemaison.jpg?nolink&30|Sommaire Matériels}}]] |
| |
| ===== Capteurs - Distance - Ultrasons ===== |
| |
| [Mise à jour le 3/5/2024] |
| |
| * **Lectures connexes** |
| * <html><a href="http://guide.directindustry.com/fr/bien-choisir-un-capteur-de-proximite/" target="_blank">Bien choisir un capteur de proximité</a></html> |
| * <html><a href="https://www.eeca.eu/meilleur-capteur-ultrason/" target="_blank">Comment choisir le meilleur capteur à ultrason</a></html> |
| * Vidéo - <html><a href="https://www.youtube.com/watch?time_continue=143&v=Ht4lavMyy3E&feature=emb_logo" target="_blank">Exemples d'applications</a></html> |
| |
| ==== 1. Généralités ==== |
| {{ :materiels:capteurs:ultrasons.png?nolink&100|}} |
| L'ultrason est une onde mécanique et élastique, qui se propage au travers de supports fluides, solides, gazeux ou liquides. La gamme de fréquences des ultrasons se situe entre **16 000 et 10 000 000 Hertz**. |
| |
| Le nom vient du fait que leur fréquence est trop élevée pour être audible pour l'oreille humaine (le son est trop aigu : la gamme de fréquences audibles par l'homme se situe entre **20 et 20 000 Hertz**. Ces seuils sont cependant variables avec l'âge), de la même façon que les infrasons désignent les sons dont la fréquence est trop faible pour être perceptible par l'oreille humaine. Lorsque la fréquence est audible pour l'oreille humaine, on parle tout simplement de son. |
| |
| Les ultrasons sont utilisés dans l'industrie ainsi que dans le domaine médical. <html><a href="https://fr.wikipedia.org/wiki/Ultrason" target="_blank">Wikipédia</a></html> |
| |
| {{ :materiels:capteurs:wikiversite.jpg?nolink&50|}} |
| * // **Ressources** // |
| * <html><a href="https://fr.wikiversity.org/wiki/Rudiments_d%27acoustique/Quelques_d%C3%A9finitions" target="_blank">Rudiments d'acoustique : Quelques définitions</a></html> |
| |
| <callout type="tip" title="Principe de fonctionnement des capteurs HC-SR0x" icon="true">Voir l'article sur le "Carnet du maker" <html><a href="https://www.carnetdumaker.net/articles/mesurer-une-distance-avec-un-capteur-ultrason-hc-sr04-et-une-carte-arduino-genuino/" target="_blank"><b>ici</b></a></html> </callout> |
| ==== 2. Capteurs numériques ==== |
| |
| === 2.1 HC-SR04 (GPIO) === |
| {{ :materiels:capteurs:hc-sr04.png?nolink&150|HC-SR04}} |
| |
| == 2.1.1 Présentation == |
| * //**Source**// : <html><a href="https://www.gotronic.fr/pj2-hc-sr04-utilisation-avec-picaxe-1343.pdf" target="_blank">pdf</a></html> |
| |
| <callout type="info" icon="true">Ce module permet d’évaluer les distances entre un objet mobile et les obstacles rencontrés. Il suffit d'envoyer une impulsion de 10 µs en entrée et le capteur renvoie une largeur d'impulsion proportionnelle à la distance.</callout> |
| |
| * //**Distributeur**// : <html><a href="https://www.gotronic.fr/art-module-de-detection-us-hc-sr04-20912.htm" target="_blank">Gotronic</a></html> |
| |
| * //**Caractéristiques**// |
| * Alimentation: 5 Vcc |
| * Consommation: 15 mA |
| * Fréquence: 40 kHz |
| * Portée: de 6...10 cm à 4 m |
| * Déclenchement: impulsion TTL positive de 10µs |
| * Signal écho: impulsion positive TTL proportionnelle à la distance. |
| * Calcul: distance (cm) = impulsion (µs) / 58 |
| * Dimensions: 45 x 21 x 18 mm |
| |
| {{ :materiels:capteurs:acrobate.gif?nolink&30|}} |
| * //**Documentation**// |
| * Fichier Acrobat Reader à télécharger <html><a href="https://www.gotronic.fr/pj2-hc-sr04-utilisation-avec-picaxe-1343.pdf" target="_blank">ici</a></html> |
| |
| * //**Programmation d'une carte Arduino Mega 2560**// |
| * // Bibliothèques à installer dans l'IDE // : aucune |
| * // Connexion à un shield // <html><a href="https://webge.fr/doc/wikis/pdf/TinkerkitMegaV2.pdf" target="_blank">Tinkerkit Mega v2</a></html>. {{ :materiels:capteurs:hc-sr04.jpg?nolink&600 |}} |
| * // Un premier exemple // {{ :materiels:capteurs:distance:arduinoico.png?nolink&30|}} |
| |
| <code cpp HCSR04.cpp> |
| /* |
| * Code d'exemple pour un capteur à ultrasons HC-SR04. |
| * Carte Arduino Mega 2560 |
| */ |
| |
| /* Constantes pour les broches */ |
| const byte TRIGGER_PIN = 2; // Broche TRIGGER |
| const byte ECHO_PIN = 4; // Broche ECHO |
| |
| /* Constantes pour le timeout */ |
| const unsigned long MEASURE_TIMEOUT = 25000UL; // 25ms = ~8m à 340m/s |
| |
| /* Vitesse du son dans l'air en mm/us */ |
| const float SOUND_SPEED = 340.0 / 1000; |
| |
| /** Fonction setup() */ |
| void setup() { |
| |
| /* Initialise le port série */ |
| Serial.begin(115200); |
| |
| /* Initialise les broches */ |
| pinMode(TRIGGER_PIN, OUTPUT); |
| digitalWrite(TRIGGER_PIN, LOW); // La broche TRIGGER doit être à LOW au repos |
| pinMode(ECHO_PIN, INPUT); |
| } |
| |
| /** Fonction loop() */ |
| void loop() { |
| |
| /* 1. Lance une mesure de distance en envoyant une impulsion HIGH de 10µs sur la broche TRIGGER */ |
| digitalWrite(TRIGGER_PIN, HIGH); |
| delayMicroseconds(10); |
| digitalWrite(TRIGGER_PIN, LOW); |
| |
| /* 2. Mesure le temps entre l'envoi de l'impulsion ultrasonique et son écho (si il existe) */ |
| long measure = pulseIn(ECHO_PIN, HIGH, MEASURE_TIMEOUT); |
| |
| /* 3. Calcul la distance à partir du temps mesuré */ |
| float distance_mm = measure / 2.0 * SOUND_SPEED; |
| |
| /* Affiche les résultats en mm, cm et m */ |
| Serial.print(F("Distance: ")); |
| Serial.print(distance_mm); |
| Serial.print(F("mm (")); |
| Serial.print(distance_mm / 10.0, 2); |
| Serial.print(F("cm, ")); |
| Serial.print(distance_mm / 1000.0, 2); |
| Serial.println(F("m)")); |
| |
| /* Délai d'attente pour éviter d'afficher trop de résultats à la seconde */ |
| delay(500); |
| } |
| </code> |
| |
| |
| {{ :arduino:uc:platformioico.png?nolink&50|}} |
| |
| <callout type="tip" icon="true"><html><a href="https://webge.fr/doc/wikis/code/Arduino/ARD_PIO_MEGA2560_HCSR04_.zip" target="_blank">Télécharger</a></html> le projet PlatformIO pour VSCode.</callout> |
| |
| |
| ---- |
| |
| |
| === 2.2 HC-SR05 (GPIO) === |
| {{ :materiels:capteurs:hc-scr05.png?nolink&150|VMA306}} |
| |
| == 2.2.1 Présentation == |
| * //**Source**// : <html><a href="https://www.velleman.eu/downloads/29/vma306_a4v01.pdf" target="_blank">pdf</a></html> |
| |
| <callout type="info" icon="true">Ce module est basé sur un capteur à ultrasons HC-SR05 et permet d’évaluer les distances entre un objet mobile et les obstacles rencontrés.</callout> |
| |
| * //**Distributeur**// : <html><a href="https://www.gotronic.fr/art-capteur-a-ultrasons-vma306-26096.htm" target="_blank">Gotronic</a></html> |
| |
| * //**Caractéristiques**// |
| * Alimentation: 4,5 à 5,5 Vcc |
| * Consommation: |
| * mini: 10 mA |
| * maxi: 40 mA |
| * Fréquence: 40 kHz |
| * Portée: de 2 cm à 4,5 m |
| * Déclenchement: impulsion TTL positive de 10µs |
| * Signal écho: impulsion positive TTL proportionnelle à la distance. |
| |
| {{ :materiels:capteurs:acrobate.gif?nolink&30|}} |
| * //**Documentation**// |
| * Manuel d'utilisation du capteur à ultrasons VMA306 à télécharger <html><a href="https://www.gotronic.fr/pj2-35191-vma306-ultrasonic-1512.pdf" target="_blank">ici</a></html> |
| |
| * //**Programmation d'une carte Arduino Uno R3**// |
| * //Bibliothèques à installer dans l'IDE// : aucune |
| * //Connexion à un shield// <html><a href="https://webge.fr/doc/wikis/pdf/TinkerkitV2.pdf" target="_blank">Tinkerkit v2</a></html>. {{ :materiels:capteurs:hcsr05.jpg?nolink&600 |}} |
| * // Un premier exemple // {{ :materiels:capteurs:distance:arduinoico.png?nolink&30|}} |
| <code cpp HCSR05.cpp> |
| /////////////////////////////////////////////// |
| // Programme test pour capteur HC-SR05 // |
| // Go Tronic 2017 // |
| /////////////////////////////////////////////// |
| #define trigPin 10 // Tinkerkit O1 |
| #define echoPin 11 // Tinkerkit O0 |
| |
| long duration, distance; |
| |
| void setup() |
| { |
| Serial.begin(9600); |
| pinMode(trigPin, OUTPUT); |
| pinMode(echoPin, INPUT); |
| Serial.println("== Debut du programme =="); |
| } |
| void loop() |
| { |
| // Envoie de l'onde |
| digitalWrite(trigPin, LOW); |
| delayMicroseconds(2); |
| digitalWrite(trigPin, HIGH); |
| delayMicroseconds(10); |
| digitalWrite(trigPin, LOW); |
| // Réception de l'écho |
| duration = pulseIn(echoPin, HIGH); |
| |
| // Calcul de la distance |
| distance = (duration / 2) / 29.1; |
| if (distance >= 400 || distance <= 0) |
| { |
| Serial.println("Hors plage"); |
| } |
| else |
| { |
| Serial.print("distance = "); |
| Serial.print(distance); |
| Serial.println(" cm"); |
| } |
| delay(500); // délai entre deux mesures |
| } |
| </code> |
| |
| |
| {{ :arduino:uc:platformioico.png?nolink&50|}} |
| <callout type="tip" icon="true"><html><a href="https://webge.fr/doc/wikis/code/Arduino/ARD_PIO_UNO_HCSR05.zip" target="_blank">Télécharger</a></html> le projet PlatformIO pour VSCode.</callout> |
| |
| |
| ---- |
| |
| === 2.3 HC-SR04P (GPIO - I2C - UART) === |
| {{ :materiels:capteurs:distance:hc-sr04p.png?nolink&150|JOY-IT HC-SR04P}} |
| |
| == 2.3.1 Présentation == |
| <callout type="info" icon="true">Ce transducteur ultrason à base de HC-SR04P délivre un signal proportionnel à la distance qui le sépare d'un obstacle. Le signal pourra être récupérer directement via des **GPIO**, une interface **UART** ou **I2C**. Ce qui le rend compatible avec la plupart des microcontrôleurs (Arduino® ou compatible, Raspberry Pi, etc...).</callout> |
| |
| * //**Distributeur**// : <html><a href="https://www.lextronic.fr/capteur-ultrasons-hc-sr04p-64393.html" target="_blank">Lextronic</a></html> |
| |
| * //**Caractéristiques**// |
| * Capteurs: <html><a href="https://www.gotronic.fr/pj2-hc-sr04-utilisation-avec-picaxe-1343.pdf" target="_blank" title="pdf">HC-SR04</a></html> |
| * Tension d'alimentation: 3 Vcc à 5,5 Vcc |
| * Interface: GPIO / UART / I2C (**SLA** = **0x57**) |
| * Niveau logique: 3,3 Vcc / 5Vcc |
| * Consommation: 15 mA (< 3mA au repos) |
| * Angle de mesure: < 15° |
| * Portée de détection: 2 à 450 cm |
| * Précision: 0,3 cm |
| * Connecteur mâle 4 broches coudé pré-soudé (pas 2,54 mm): Vcc/Trig/Echo/GND |
| * Dimensions: 45,5 x 20,3 x 15,5 mm |
| |
| * //**Configuration**// de M1 et M2 sur le CI (1 : R=10k à ajouter) \\ **M1 M2** \\ 0 0 : GPIO \\ 1 0 : I2C \\ 1 1 : 1-wire \\ 0 1 : UART \\ |
| |
| {{ :materiels:capteurs:acrobate.gif?nolink&30|}} |
| * //**Documentation**// |
| * A télécharger <html><a href="https://webge.fr/doc/projets/datasheets/SEN-US01.pdf" target="_blank"><b>ici</a></b></html> |
| |
| {{ :materiels:capteurs:environnement:iconechronogrammes.png?nolink&50|}} |
| * //**Chronogrammes**// |
| * Relevé des signaux du bus I2C. A télécharger <html><a href="https://webge.fr/doc/wikis/img/Mesures_HCSR04.zip" target="_blank"><b>ici</b></a></html>. |
| |
| \\ |
| |
| {{ :materiels:capteurs:environnement:code.png?nolink|}} |
| == 2.3.2 Exemples de code == |
| <tabs> |
| * [[#tab-hcsr04pduinogpio_1|Arduino UNO (GPIO)]] |
| * [[#tab-hcsr04pduinoi2c_1|Arduino UNO (I2C)]] |
| * [[#tab-hcsr04pduinouart_1|Arduino UNO (UART)]] |
| * [[#tab-hcsr04pico_1|Rpi Pico (µPython)]] |
| |
| <pane id="tab-hcsr04pduinogpio_1"> |
| * //**Ressources**// |
| * <html><a href="https://www.arduino.cc/reference/en/language/functions/digital-io/pinmode/" target="_blank">pinMode()</a></html> | <html><a href="https://www.arduino.cc/reference/en/language/functions/advanced-io/pulsein/" target="_blank">pulseIn()</a></html> | <html><a href="https://www.arduino.cc/reference/en/language/functions/communication/serial/" target="_blank">serial</a></html> |
| * //**Fiche guide**// pour l'étude d'une chaîne d'information comprenant un **HCSR04P** <html><a href="https://webge.fr/doc/projets/tsin/0_Fiches guide TSIN/TSIN_FGA_HCSR04P.zip">[Télécharger]</a></html> |
| |
| * //**Connexion**// à une <html><a href="https://wiki.seeedstudio.com/Base_Shield_V2/" target="_blank">Base Shield V2</a></html> montée sur une Arduino Uno \\ <html><span style="color:red">A venir</span></html> |
| |
| * //**Exemple** utilisant les **GPIO** pour tester le capteur// |
| <code cpp *.cpp> |
| // Arduino MKR sur Arduino MKR Connector |
| // Connexion sur le connecteur D5 D6B |
| const int echo = 6; |
| const int trigger = 5; |
| |
| float distance, duration; |
| |
| void setup() { |
| Serial.begin(9600); |
| pinMode(echo, INPUT); |
| pinMode(trigger, OUTPUT); |
| } |
| |
| void loop() { |
| digitalWrite(trigger, HIGH); // Mesure de la distance en utilisant une impulsion de 10us |
| delayMicroseconds(10); |
| digitalWrite(trigger, LOW); |
| duration = pulseIn(echo, HIGH); |
| distance = duration * 340 / 2 / 10000; |
| Serial.println("distance: " + String(distance) + " cm"); // Affichage dans la console |
| delay(3000); // Attente entre 2 mesures |
| } |
| </code> |
| </pane> |
| |
| <pane id="tab-hcsr04pduinoi2c_1"> |
| * //**Ressources**// |
| * <html><a href="https://www.arduino.cc/reference/en/language/functions/communication/wire/" target="_blank">Wire</a></html> |
| {{ :materiels:capteurs:intensite:doc.gif?nolink|}} |
| |
| * //**Exemple** utilisant l'**I2C** pour tester le capteur// |
| <code cpp *.cpp> |
| // Arduino MKR sur Arduino MKR Connector |
| // Connexion sur le connecteur TWI |
| #include <Wire.h> |
| |
| int address = 0x57; // i2c address of SEN-US01 |
| float distance; |
| long int bytes[3]; |
| |
| void setup(){ |
| Serial.begin(9600); |
| Wire.begin(); |
| } |
| |
| void loop(){ |
| Wire.beginTransmission(0x57); // Start measurement |
| Wire.write(0x01); |
| Wire.endTransmission(); |
| |
| delay(200); // Wait 200 ms |
| |
| Wire.requestFrom(0x57,3); // Read 3 bytes from sensor |
| int i = 0; |
| while(Wire.available()){ |
| bytes[i++] = Wire.read(); |
| } |
| |
| distance = ((bytes[0] << 16) + (bytes[1] << 8) + bytes[2]) / 10000; // Calculate distance based on received bytes |
| |
| if (false){ // Checking whether measured value is within the permissible distance |
| Serial.println("distance is outside of the measuring range"); // If not, an error message is output |
| } |
| else{ |
| Serial.println("distance: " + String(distance) + " cm"); // The calculated distance is output to the console |
| } |
| delay(3000); // Pause between the individual measurements |
| } |
| </code> |
| </pane> |
| |
| <pane id="tab-hcsr04pduinouart_1"> |
| * //**Ressource**// : <html><a href="https://docs.arduino.cc/learn/built-in-libraries/software-serial/" target="_blank">SoftwareSerial Library</a></html> |
| |
| * //**Exemple** utilisant l'**UART** pour tester le capteur// |
| <code cpp *.cpp> |
| // Arduino MKR sur Arduino MKR Connector |
| // Connexion sur le connecteur SERIAL |
| |
| #include <SoftwareSerial.h> |
| |
| SoftwareSerial ser(A4,A5); // initialize a serial connection (software) |
| float distance; |
| long int bytes[3]; |
| |
| void setup(){ |
| Serial.begin(9600); // start serial connection to computer |
| ser.begin(9600); // start serial connection to sensor |
| } |
| |
| void loop(){ |
| ser.flush(); // clear communication |
| ser.write(0xA0); // start measurement |
| delay(200); // Wait 200 ms |
| |
| for (int i = 0; i < 3; i++) bytes[i] = ser.read(); // Read 3 bytes from sensor |
| |
| distance = ((bytes[0] << 16) + (bytes[1] << 8) + bytes[2]) / 10000; // Calculate distance based on received bytes |
| |
| if (false){ // Checking whether measured value is within the permissible distance |
| Serial.println("distance is outside of the measuring range"); // If not, an error message is output |
| } |
| else{ |
| Serial.println("distance: " + String(distance) + " cm"); // The calculated distance is output to the console |
| } |
| delay(3000); // Pause between the individual measurements |
| } |
| </code> |
| </pane> |
| |
| <pane id="tab-hcsr04pico_1"> |
| A venir |
| </pane> |
| </tabs> |
| |