{"id":3086,"date":"2020-01-11T08:55:46","date_gmt":"2020-01-11T07:55:46","guid":{"rendered":"https:\/\/www.breizh56.fr\/crepp2024\/?page_id=3086"},"modified":"2020-01-11T08:55:46","modified_gmt":"2020-01-11T07:55:46","slug":"arduino-2019-5-distance-hs-cr04","status":"publish","type":"page","link":"https:\/\/www.breizh56.fr\/crepp2024\/arduino-2019-5-distance-hs-cr04\/","title":{"rendered":"Arduino 2019-5: mesure de distance HC-SR04"},"content":{"rendered":"<h1 class=\"western\" align=\"center\">Mesurer une distance avec un capteur \u00e0 ultrason HC-SR04 et une carte Arduino \/ Genuino<\/h1>\n<p><strong>Dans ce tutoriel, nous allons apprendre ensemble \u00e0 utiliser un capteur de distance \u00e0 ultrason de r\u00e9f\u00e9rence HC-SR04 avec une carte Arduino \/ Genuino. En bonus, nous testerons la pr\u00e9cision des mesures .<\/strong><\/p>\n<h3 class=\"western\"><span style=\"color: #000000;\"><b>Sommaire<\/b><\/span><\/h3>\n<h3 class=\"western\"><span style=\"color: #000000;\"><span style=\"font-size: medium;\">* Comment mesurer une distance<\/span><\/span><\/h3>\n<h3 class=\"western\"><span style=\"color: #000000;\"><span style=\"font-size: medium;\">* <\/span><\/span><span style=\"font-size: medium;\"><a href=\"https:\/\/www.breizh56.fr\/crepp2024\/hc-sr04\/\"><span style=\"color: #000000;\">Le capteur HC-SR04<\/span><\/a><\/span><\/h3>\n<p>* Principe de fonctionnement du capteur<\/p>\n<p>* Le montage<\/p>\n<p>* Le code<\/p>\n<p>* La pr\u00e9cision du capteur<\/p>\n<p>* Test en int\u00e9rieur avec un petit obstacle<\/p>\n<p>Parfois quand on r\u00e9alise un projet, on a besoin de mesurer des distances, d\u00e9tecter des obstacles, etc.<\/p>\n<p>En robotique par exemple, il est tr\u00e8s classique d&rsquo;avoir un capteur de distance sur l&rsquo;avant du robot pour \u00e9viter de se prendre un mur en pleine face.<\/p>\n<h3 class=\"western\"><a name=\"comment-mesurer-une-distance\"><\/a>Comment mesurer une distance<\/h3>\n<p>Pour mesurer des distances, il faut un capteur de distance. Il existe sur le march\u00e9 un grand nombre de capteurs de distance : infrarouge (r\u00e9flectif), laser (par temps de parcours ou par calcul d&rsquo;angle), physique (r\u00e8gles optiques absolues ou incr\u00e9mentielles), ou ultrason.<\/p>\n<ul>\n<li>Les capteurs infrarouges ont l\u2019avantage d\u2019\u00eatre bon march\u00e9, relativement pr\u00e9cis et disponibles \u00e0 peu pr\u00e8s partout. Malheureusement, ils sont assez complexes \u00e0 mettre en oeuvre du fait de leurs non-lin\u00e9arit\u00e9s. Il faut appliquer une formule complexe pour obtenir une mesure utilisable. De plus, ils sont tr\u00e8s sensibles \u00e0 la lumi\u00e8re ambiante et au coefficient de r\u00e9flexion lumineuse de la surface en face du capteur.<\/li>\n<li>Les (vrais) capteurs de distance laser sont extr\u00eamement pr\u00e9cis, mais aussi extr\u00eamement chers. Un capteur de distance laser (par mesure de temps de parcours) co\u00fbte facilement plus de 200\u20ac, mais fait des mesures \u00e0 plus de 30 m\u00e8tres sans probl\u00e8me pour certains mod\u00e8les. C&rsquo;est donc au final une question de budget \/ utilisation.<b>. <\/b>Les capteurs physiques, le plus souvent un duo comportant une r\u00e8gle gradu\u00e9e et un capteur optique, sont \u00e0 la fois bon march\u00e9 et tr\u00e8s pr\u00e9cis. Mais ils sont tr\u00e8s limit\u00e9s en distance mesurable et se retrouvent donc g\u00e9n\u00e9ralement dans des imprimantes.<\/li>\n<\/ul>\n<p>Reste les capteurs ultrasons, c&rsquo;est le sujet de cet article.<\/p>\n<p>Un capteur de distance \u00e0 ultrason utilise le m\u00eame principe qu\u2019un capteur laser, mais en utilisant des ondes sonores (inaudible) au lieu d\u2019un faisceau de lumi\u00e8re. Ils sont bien moins chers qu\u2019un capteur laser, mais aussi bien moins pr\u00e9cis. Cependant, contrairement aux capteurs \u00e0 infrarouge, la lumi\u00e8re ambiante et l\u2019opacit\u00e9 de la surface en face du capteur ne jouent pas sur la mesure.<\/p>\n<h3 class=\"western\"><a name=\"le-capteur-hc-sr04\"><\/a><span style=\"color: #000000;\"><b>Le capteur HC-SR04<\/b><\/span><\/h3>\n<p><a href=\"https:\/\/www.breizh56.fr\/crepp2024\/hc-sr04\/\">Capteur \u00e0 ultrason HC-SR04<\/a><\/p>\n<p><a href=\"https:\/\/www.breizh56.fr\/crepp2024\/wp-content\/uploads\/2020\/01\/HS-SR04.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2990\" src=\"https:\/\/www.breizh56.fr\/crepp2024\/wp-content\/uploads\/2020\/01\/HS-SR04.jpg\" alt=\"\" width=\"571\" height=\"382\" srcset=\"https:\/\/www.breizh56.fr\/crepp2024\/wp-content\/uploads\/2020\/01\/HS-SR04.jpg 571w, https:\/\/www.breizh56.fr\/crepp2024\/wp-content\/uploads\/2020\/01\/HS-SR04-300x201.jpg 300w, https:\/\/www.breizh56.fr\/crepp2024\/wp-content\/uploads\/2020\/01\/HS-SR04-90x60.jpg 90w\" sizes=\"(max-width: 571px) 100vw, 571px\" \/><\/a><\/p>\n<p>Le capteur qui nous int\u00e9resse dans ce tutoriel est un capteur \u00e0 ultrason , bien connu des amateurs de robotique et d&rsquo;Arduino : le HC-SR04 (aussi disponible sous d&rsquo;autres r\u00e9f\u00e9rences en fonction du vendeur).<\/p>\n<p>Le <a href=\"https:\/\/cdn.sparkfun.com\/datasheets\/Sensors\/Proximity\/HCSR04.pdf\">capteur HC-SR04<\/a> est un capteur \u00e0 ultrason low cost. Ce capteur fonctionne avec une tension d&rsquo;alimentation de 5 volts, dispose d&rsquo;un angle de mesure de 15\u00b0 environ et permet de faire des mesures de distance entre 2 centim\u00e8tres et 4 m\u00e8tres avec une pr\u00e9cision de 3mm (en th\u00e9orie, dans la pratique ce n&rsquo;est pas tout \u00e0 fait exact).<\/p>\n<p>&nbsp;<\/p>\n<h3 class=\"western\"><a name=\"principe-de-fonctionnement-du-capteur\"><\/a>Principe de fonctionnement du capteur<\/h3>\n<p>Illustration du signal TRIGGER et ECHO<\/p>\n<p>Le principe de fonctionnement du capteur est enti\u00e8rement bas\u00e9 sur <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Vitesse_du_son\">la vitesse du son<\/a>.<\/p>\n<p>Voil\u00e0 comment se d\u00e9roule une prise de mesure :<\/p>\n<ol>\n<li>On envoie une impulsion <code class=\"western\">HIGH<\/code> de 10\u00b5s sur la broche <code class=\"western\">TRIGGER<\/code> du capteur.<\/li>\n<li>Le capteur envoie alors une s\u00e9rie de 8 impulsions ultrasoniques \u00e0 40KHz (inaudible pour l&rsquo;\u00eatre humain, c&rsquo;est quand plus agr\u00e9able qu&rsquo;un biiiiiiiip).<\/li>\n<li>Les ultrasons se propagent dans l&rsquo;air jusqu&rsquo;\u00e0 toucher un obstacle et retourne dans l&rsquo;autre sens vers le capteur.<\/li>\n<li>Le capteur d\u00e9tecte l&rsquo;\u00e9cho et cl\u00f4ture la prise de mesure.<\/li>\n<\/ol>\n<p>Le signal sur la broche <code class=\"western\">ECHO<\/code> du capteur reste \u00e0 <code class=\"western\">HIGH<\/code> durant les \u00e9tapes 3 et 4, ce qui permet de mesurer la dur\u00e9e de l&rsquo;aller-retour des ultrasons et donc de d\u00e9terminer la distance.<\/p>\n<p><em>N.B. Il y a toujours un silence de dur\u00e9e fixe apr\u00e8s l&rsquo;\u00e9mission des ultrasons pour \u00e9viter de recevoir pr\u00e9matur\u00e9ment un \u00e9cho en provenance directement du capteur.<\/em><\/p>\n<hr \/>\n<p>Distance de l&rsquo;objet<\/p>\n<p>La distance parcourue par un son se calcule en multipliant la vitesse du son, environ 340 m\/s (ou 34&rsquo;000 cm\/1&rsquo;000&rsquo;000 \u03bcs) par le temps de propagation, soit :\u00a0d = v \u00b7 t\u00a0(distance = vitesse \u00b7 temps)<\/p>\n<p>Le HC-SR04 donne une dur\u00e9e d&rsquo;impulsion en dizaines de \u03bcs. Il faut donc multiplier la valeur obtenue par 10 \u03bcs pour obtenir le temps t. On sait aussi que le son fait un aller-retour. La distance vaut donc la moiti\u00e9.<\/p>\n<p>d = 34&rsquo;000 cm\/1&rsquo;000&rsquo;000 \u03bcs \u00b7 10us \u00b7 valeur \/ 2\u00a0en simplifiant\u00a0d =170&rsquo;000 \/1&rsquo;000&rsquo;000 cm \u00b7 valeur<\/p>\n<p>Finalement,\u00a0d = 17\/100 cm \u00b7 valeur<\/p>\n<p>La formule d = dur\u00e9e\/58 cm figure aussi dans le manuel d&rsquo;utilisation du HC-SR04 car la fraction 17\/1000 est \u00e9gale \u00e0 1\/58.8235. Elle donne cependant des r\u00e9sultats moins pr\u00e9cis.<\/p>\n<p>Note : A grande distance, la surface de l&rsquo;objet \u00e0 d\u00e9tecter doit mesurer au moins 0.5 m2<\/p>\n<p><a href=\"https:\/\/www.gotronic.fr\/pj2-hc-sr04-utilisation-avec-picaxe-1343.pdf\" target=\"_blank\" rel=\"noopener noreferrer\" data-saferedirecturl=\"https:\/\/www.google.com\/url?q=https:\/\/www.gotronic.fr\/pj2-hc-sr04-utilisation-avec-picaxe-1343.pdf&amp;source=gmail&amp;ust=1578815086443000&amp;usg=AFQjCNGlH8FS3jWjcxkbu4jV8DCVeyMmlA\">https:\/\/www.gotronic.fr\/pj2-<wbr \/>hc-sr04-utilisation-avec-<wbr \/>picaxe-1343.pdf<\/a><\/p>\n<p>&nbsp;<\/p>\n<p>&#8212;<\/p>\n<h3 class=\"western\"><a name=\"le-montage\"><\/a><span style=\"color: #000000;\">Le montage<\/span><\/h3>\n<p>Mat\u00e9riel n\u00e9cessaire<\/p>\n<p>Pour r\u00e9aliser ce premier montage, il va nous falloir :<\/p>\n<ul>\n<li>Une carte Arduino UNO (et son c\u00e2ble USB),<\/li>\n<li>Un capteur HC-SR04,<\/li>\n<li>Une plaque d&rsquo;essai et des fils pour c\u00e2bler notre montage.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>Vue prototypage du montage<\/p>\n<p>Le montage est d&rsquo;une simplicit\u00e9 d\u00e9concertante :<\/p>\n<ul>\n<li>L&rsquo;alimentation <code class=\"western\">5V<\/code> de la carte Arduino va sur la broche <code class=\"western\">VCC<\/code> du capteur.<\/li>\n<li>La broche <code class=\"western\">GND<\/code> de la carte Arduino va sur la broche <code class=\"western\">GND<\/code> du capteur.<\/li>\n<li>La broche <code class=\"western\">D2<\/code> de la carte Arduino va sur la broche <code class=\"western\">TRIGGER<\/code> du capteur.<\/li>\n<li>La broche <code class=\"western\">D3<\/code> de la carte Arduino va sur la broche <code class=\"western\">ECHO<\/code> du capteur.<\/li>\n<\/ul>\n<p>Le montage fini<\/p>\n<p>Vous pouvez choisir d&rsquo;utiliser d&rsquo;autres broches que <code class=\"western\">D2<\/code> et <code class=\"western\">D3<\/code> si vous le souhaitez. Il suffira <b>de mettre<\/b> <b>\u00e0 jour les num\u00e9ros de broches <\/b>dans le code du chapitre suivant.<\/p>\n<p><em>N.B. La plaque d&rsquo;essai est ici totalement optionnelle. Si vous avez des fils m\u00e2les \/ femelles, vous pouvez directement c\u00e2bler le capteur \u00e0 la carte Arduino.<\/em><\/p>\n<h3 class=\"western\"><a name=\"le-code\"><\/a><span style=\"color: #000000;\">Le code<\/span><\/h3>\n<p>Au final, le plus compliqu\u00e9 dans ce tutoriel, c&rsquo;est le code<\/p>\n<table width=\"668\" cellspacing=\"0\" cellpadding=\"2\">\n<colgroup>\n<col width=\"15\" \/>\n<col width=\"646\" \/><\/colgroup>\n<tbody>\n<tr>\n<td width=\"15\">\n<pre class=\"western\">1\r\n2\r\n3\r\n4\r\n5\r\n6\r\n7\r\n8\r\n9<\/pre>\n<\/td>\n<td width=\"646\">\n<pre class=\"western\"><span style=\"color: #408080;\"><i>\/* Constantes pour les broches *\/<\/i><\/span>\r\n<span style=\"color: #008000;\"><b>const<\/b><\/span> byte TRIGGER_PIN <span style=\"color: #666666;\">=<\/span> <span style=\"color: #666666;\">2<\/span>; <span style=\"color: #408080;\"><i>\/\/ Broche TRIGGER<\/i><\/span>\r\n<span style=\"color: #008000;\"><b>const<\/b><\/span> byte ECHO_PIN <span style=\"color: #666666;\">=<\/span> <span style=\"color: #666666;\">3<\/span>;    <span style=\"color: #408080;\"><i>\/\/ Broche ECHO<\/i><\/span>\r\n \r\n<span style=\"color: #408080;\"><i>\/* Constantes pour le timeout *\/<\/i><\/span>\r\n<span style=\"color: #008000;\"><b>const<\/b><\/span> <span style=\"color: #b00040;\">unsigned<\/span> <span style=\"color: #b00040;\">long<\/span> MEASURE_TIMEOUT <span style=\"color: #666666;\">=<\/span> <span style=\"color: #666666;\">25000UL<\/span>; <span style=\"color: #408080;\"><i>\/\/ 25ms = ~8m \u00e0 340m\/s<\/i><\/span>\r\n\r\n<span style=\"color: #408080;\"><i>\/* Vitesse du son dans l'air en mm\/us *\/<\/i><\/span>\r\n<span style=\"color: #008000;\"><b>const<\/b><\/span> <span style=\"color: #b00040;\">float<\/span> SOUND_SPEED <span style=\"color: #666666;\">=<\/span> <span style=\"color: #666666;\">340.0<\/span> <span style=\"color: #666666;\">\/<\/span> <span style=\"color: #666666;\">1000<\/span>;<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>On commence le code avec quatre constantes : deux constantes pour les broches <code class=\"western\">TRIGGER<\/code> et <code class=\"western\">ECHO<\/code> du capteur, une constante qui servira de <b>timeout<\/b> pour la prise de mesure et une constante pour d\u00e9finir la vitesse du son.<\/p>\n<p>Le timeout correspond au temps n\u00e9cessaire avant de consid\u00e9rer qu&rsquo;il n&rsquo;y a pas d&rsquo;obstacle, donc pas de mesure possible. On achoisi d&rsquo;utiliser une timeout de 25 millisecondes (4 m\u00e8tres aller-retour \u00e0 340m\/s).<\/p>\n<p><em>N.B. Vous remarquerez que <\/em><em>l&rsquo;on a<\/em><em> d\u00e9clar\u00e9 la vitesse du son en millim\u00e8tres par microseconde. Cela est n\u00e9cessaire, car la mesure du temps se fait en microsecondes et <\/em><em>on<\/em><em> souhaite avoir un r\u00e9sultat en millim\u00e8tres en sortie du calcul.<\/em><\/p>\n<table width=\"770\" cellspacing=\"0\" cellpadding=\"2\">\n<colgroup>\n<col width=\"24\" \/>\n<col width=\"738\" \/><\/colgroup>\n<tbody>\n<tr>\n<td width=\"24\">\n<pre class=\"western\"> 1\r\n 2\r\n 3\r\n 4\r\n 5\r\n 6\r\n 7\r\n 8\r\n 9\r\n10<\/pre>\n<\/td>\n<td width=\"738\">\n<pre class=\"western\"><span style=\"color: #b00040;\">void<\/span> <span style=\"color: #0000ff;\">setup<\/span>() {\r\n   \r\n  <span style=\"color: #408080;\"><i>\/* Initialise le port s\u00e9rie *\/<\/i><\/span>\r\n  Serial.begin(<span style=\"color: #666666;\">115200<\/span>);\r\n   \r\n  <span style=\"color: #408080;\"><i>\/* Initialise les broches *\/<\/i><\/span>\r\n  pinMode(TRIGGER_PIN, OUTPUT);\r\n  digitalWrite(TRIGGER_PIN, LOW); <span style=\"color: #408080;\"><i>\/\/ La broche TRIGGER doit \u00eatre \u00e0 LOW au repos<\/i><\/span>\r\n  pinMode(ECHO_PIN, INPUT);\r\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>La fonction <code class=\"western\">setup()<\/code> <b>initialise le port s\u00e9rie<\/b>, met la broche <code class=\"western\">TRIGGER<\/code> du capteur <b>en sortie et \u00e0<\/b> <code class=\"western\"><b>LOW<\/b><\/code>, et met la broche <code class=\"western\">ECHO<\/code>du capteur <b>en entr\u00e9e<\/b>.<\/p>\n<table width=\"964\" cellspacing=\"0\" cellpadding=\"2\">\n<colgroup>\n<col width=\"24\" \/>\n<col width=\"933\" \/><\/colgroup>\n<tbody>\n<tr>\n<td width=\"24\">\n<pre class=\"western\"> 1\r\n 2\r\n 3\r\n 4\r\n 5\r\n 6\r\n 7\r\n 8\r\n 9\r\n10\r\n11\r\n12\r\n13\r\n14\r\n15\r\n16\r\n17\r\n18\r\n19\r\n20\r\n21\r\n22\r\n23\r\n24\r\n25<\/pre>\n<\/td>\n<td width=\"933\">\n<pre class=\"western\"><span style=\"color: #b00040;\">void<\/span> <span style=\"color: #0000ff;\">loop<\/span>() {\r\n  \r\n  <span style=\"color: #408080;\"><i>\/* 1. Lance une mesure de distance en envoyant une impulsion HIGH de 10\u00b5s sur la <\/i><\/span>\r\n<span style=\"color: #408080;\">   <i>bro<\/i><\/span><span style=\"color: #408080;\"><i>che TRIGGER *\/<\/i><\/span>\r\n  digitalWrite(TRIGGER_PIN, HIGH);\r\n  delayMicroseconds(<span style=\"color: #666666;\">10<\/span>);\r\n  digitalWrite(TRIGGER_PIN, LOW);\r\n  \r\n  <span style=\"color: #408080;\"><i>\/* 2. Mesure le temps entre l'envoi de l'impulsion ultrasonique et son \u00e9cho (si <\/i><\/span>\r\n        <span style=\"color: #408080;\"><i>il e<\/i><\/span><span style=\"color: #408080;\"><i>xiste) *\/<\/i><\/span>\r\n  <span style=\"color: #b00040;\">long<\/span> measure <span style=\"color: #666666;\">=<\/span> pulseIn(ECHO_PIN, HIGH, MEASURE_TIMEOUT);\r\n   \r\n  <span style=\"color: #408080;\"><i>\/* 3. Calcul la distance \u00e0 partir du temps mesur\u00e9 *\/<\/i><\/span>\r\n  <span style=\"color: #b00040;\">float<\/span> distance_mm <span style=\"color: #666666;\">=<\/span> measure <span style=\"color: #666666;\">\/<\/span> <span style=\"color: #666666;\">2.0<\/span> <span style=\"color: #666666;\">*<\/span> SOUND_SPEED;\r\n   \r\n  <span style=\"color: #408080;\"><i>\/* Affiche les r\u00e9sultats en mm, cm et m *\/<\/i><\/span>\r\n  Serial.print(F(<span style=\"color: #ba2121;\">\"Distance: \"<\/span>));\r\n  Serial.print(distance_mm);\r\n  Serial.print(F(<span style=\"color: #ba2121;\">\"mm (\"<\/span>));\r\n  Serial.print(distance_mm <span style=\"color: #666666;\">\/<\/span> <span style=\"color: #666666;\">10.0<\/span>, <span style=\"color: #666666;\">2<\/span>);\r\n  Serial.print(F(<span style=\"color: #ba2121;\">\"cm, \"<\/span>));\r\n  Serial.print(distance_mm <span style=\"color: #666666;\">\/<\/span> <span style=\"color: #666666;\">1000.0<\/span>, <span style=\"color: #666666;\">2<\/span>);\r\n  Serial.println(F(<span style=\"color: #ba2121;\">\"m)\"<\/span>));\r\n   \r\n  <span style=\"color: #408080;\"><i>\/* D\u00e9lai d'attente pour \u00e9viter d'afficher trop de r\u00e9sultats \u00e0 la seconde *\/<\/i><\/span>\r\n  delay(<span style=\"color: #666666;\">500<\/span>);\r\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>La fonction <code class=\"western\">loop()<\/code> <b>s&rsquo;occupe de la mesure et de l&rsquo;affichage. <\/b><\/p>\n<p>Elle g\u00e9n\u00e8re d&rsquo;abord l&rsquo;impulsion <code class=\"western\">HIGH<\/code> de 10\u00b5s qui d\u00e9clenche la prise de mesure. Elle mesure ensuite le temps n\u00e9cessaire pour un aller-retour du signal ultrason avec la fonction <a href=\"https:\/\/www.arduino.cc\/en\/Reference\/PulseIn\">pulseIn()<\/a>. Pour finir, elle calcule la distance avant de l&rsquo;afficher sur le port s\u00e9rie.<\/p>\n<p><em>N.B. La fonction <\/em><code class=\"western\">pulseIn()<\/code><em> retourne 0 si le temps de timeout est atteint. Il est donc possible de g\u00e9rer l&rsquo;absence d&rsquo;obstacle si vous le souhaitez avec un <\/em><code class=\"western\">if (measure == 0) { ... }<\/code><em> par exemple.<\/em><\/p>\n<p><em>PS La valeur retourn\u00e9e par <\/em><code class=\"western\">pulseIn()<\/code><em> doit \u00eatre divis\u00e9e par deux avant de faire le calcul de distance. Un aller-retour est \u00e9gal \u00e0 deux fois la distance mesur\u00e9e.<\/em><\/p>\n<p>Le code complet avec commentaires :<\/p>\n<table width=\"964\" cellspacing=\"0\" cellpadding=\"2\">\n<colgroup>\n<col width=\"24\" \/>\n<col width=\"933\" \/><\/colgroup>\n<tbody>\n<tr>\n<td width=\"24\">\n<pre class=\"western\"> 1\r\n 2\r\n 3\r\n 4\r\n 5\r\n 6\r\n 7\r\n 8\r\n 9\r\n10\r\n11\r\n12\r\n13\r\n14\r\n15\r\n16\r\n17\r\n18\r\n19\r\n20\r\n21\r\n22\r\n23\r\n24\r\n25\r\n26\r\n27\r\n28\r\n29\r\n30\r\n31\r\n32\r\n33\r\n34\r\n35\r\n36\r\n37\r\n38\r\n39\r\n40\r\n41\r\n42\r\n43\r\n44\r\n45\r\n46\r\n47\r\n48\r\n49\r\n50\r\n51\r\n52<\/pre>\n<\/td>\n<td width=\"933\">\n<pre class=\"western\"><span style=\"color: #408080;\"><i>\/* <\/i><\/span>\r\n<span style=\"color: #408080;\"> <i>* Code d'exemple pour un capteur \u00e0 ultrasons HC-SR04.<\/i><\/span>\r\n<span style=\"color: #408080;\"> <i>*\/<\/i><\/span>\r\n\r\n<span style=\"color: #408080;\"><i>\/* Constantes pour les broches *\/<\/i><\/span>\r\n<span style=\"color: #008000;\"><b>const<\/b><\/span> byte TRIGGER_PIN <span style=\"color: #666666;\">=<\/span> <span style=\"color: #666666;\">2<\/span>; <span style=\"color: #408080;\"><i>\/\/ Broche TRIGGER<\/i><\/span>\r\n<span style=\"color: #008000;\"><b>const<\/b><\/span> byte ECHO_PIN <span style=\"color: #666666;\">=<\/span> <span style=\"color: #666666;\">3<\/span>;    <span style=\"color: #408080;\"><i>\/\/ Broche ECHO<\/i><\/span>\r\n \r\n<span style=\"color: #408080;\"><i>\/* Constantes pour le timeout *\/<\/i><\/span>\r\n<span style=\"color: #008000;\"><b>const<\/b><\/span> <span style=\"color: #b00040;\">unsigned<\/span> <span style=\"color: #b00040;\">long<\/span> MEASURE_TIMEOUT <span style=\"color: #666666;\">=<\/span> <span style=\"color: #666666;\">25000UL<\/span>; <span style=\"color: #408080;\"><i>\/\/ 25ms = ~8m \u00e0 340m\/s<\/i><\/span>\r\n\r\n<span style=\"color: #408080;\"><i>\/* Vitesse du son dans l'air en mm\/us *\/<\/i><\/span>\r\n<span style=\"color: #008000;\"><b>const<\/b><\/span> <span style=\"color: #b00040;\">float<\/span> SOUND_SPEED <span style=\"color: #666666;\">=<\/span> <span style=\"color: #666666;\">340.0<\/span> <span style=\"color: #666666;\">\/<\/span> <span style=\"color: #666666;\">1000<\/span>;\r\n\r\n<span style=\"color: #408080;\"><i>\/** Fonction setup() *\/<\/i><\/span>\r\n<span style=\"color: #b00040;\">void<\/span> <span style=\"color: #0000ff;\">setup<\/span>() {\r\n   \r\n  <span style=\"color: #408080;\"><i>\/* Initialise le port s\u00e9rie *\/<\/i><\/span>\r\n  Serial.begin(<span style=\"color: #666666;\">115200<\/span>);\r\n   \r\n  <span style=\"color: #408080;\"><i>\/* Initialise les broches *\/<\/i><\/span>\r\n  pinMode(TRIGGER_PIN, OUTPUT);\r\n  digitalWrite(TRIGGER_PIN, LOW); <span style=\"color: #408080;\"><i>\/\/ La broche TRIGGER doit \u00eatre \u00e0 LOW au repos<\/i><\/span>\r\n  pinMode(ECHO_PIN, INPUT);\r\n}\r\n \r\n<span style=\"color: #408080;\"><i>\/** Fonction loop() *\/<\/i><\/span>\r\n<span style=\"color: #b00040;\">void<\/span> <span style=\"color: #0000ff;\">loop<\/span>() {\r\n  \r\n  <span style=\"color: #408080;\"><i>\/* 1. Lance une mesure de distance en envoyant une impulsion HIGH de 10\u00b5s sur <\/i><\/span>\r\n<span style=\"color: #408080;\">        <i>la bro<\/i><\/span><span style=\"color: #408080;\"><i>che TRIGGER *\/<\/i><\/span>\r\n  digitalWrite(TRIGGER_PIN, HIGH);\r\n  delayMicroseconds(<span style=\"color: #666666;\">10<\/span>);\r\n  digitalWrite(TRIGGER_PIN, LOW);\r\n  \r\n  <span style=\"color: #408080;\"><i>\/* 2. Mesure le temps entre l'envoi de l'impulsion ultrasonique et son \u00e9cho (si <\/i><\/span>\r\n<span style=\"color: #408080;\">       <i>il e<\/i><\/span><span style=\"color: #408080;\"><i>xiste) *\/<\/i><\/span>\r\n  <span style=\"color: #b00040;\">long<\/span> measure <span style=\"color: #666666;\">=<\/span> pulseIn(ECHO_PIN, HIGH, MEASURE_TIMEOUT);\r\n   \r\n  <span style=\"color: #408080;\"><i>\/* 3. Calcul la distance \u00e0 partir du temps mesur\u00e9 *\/<\/i><\/span>\r\n  <span style=\"color: #b00040;\">float<\/span> distance_mm <span style=\"color: #666666;\">=<\/span> measure <span style=\"color: #666666;\">\/<\/span> <span style=\"color: #666666;\">2.0<\/span> <span style=\"color: #666666;\">*<\/span> SOUND_SPEED;\r\n   \r\n  <span style=\"color: #408080;\"><i>\/* Affiche les r\u00e9sultats en mm, cm et m *\/<\/i><\/span>\r\n  Serial.print(F(<span style=\"color: #ba2121;\">\"Distance: \"<\/span>));\r\n  Serial.print(distance_mm);\r\n  Serial.print(F(<span style=\"color: #ba2121;\">\"mm (\"<\/span>));\r\n  Serial.print(distance_mm <span style=\"color: #666666;\">\/<\/span> <span style=\"color: #666666;\">10.0<\/span>, <span style=\"color: #666666;\">2<\/span>);\r\n  Serial.print(F(<span style=\"color: #ba2121;\">\"cm, \"<\/span>));\r\n  Serial.print(distance_mm <span style=\"color: #666666;\">\/<\/span> <span style=\"color: #666666;\">1000.0<\/span>, <span style=\"color: #666666;\">2<\/span>);\r\n  Serial.println(F(<span style=\"color: #ba2121;\">\"m)\"<\/span>));\r\n   \r\n  <span style=\"color: #408080;\"><i>\/* D\u00e9lai d'attente pour \u00e9viter d'afficher trop de r\u00e9sultats \u00e0 la seconde *\/<\/i><\/span>\r\n  delay(<span style=\"color: #666666;\">500<\/span>);\r\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h3 class=\"western\"><span style=\"color: #000000;\">La pr\u00e9cision du capteur<\/span><\/h3>\n<p>Essais pour voir si le capteur donne des mesures pr\u00e9cises ou non.<\/p>\n<h4 class=\"western\"><a name=\"test-en-interieur-avec-un-petit-obstacle\"><\/a>Test en int\u00e9rieur avec un petit obstacle<\/h4>\n<p><b>Banc de test en int\u00e9rieur<\/b><\/p>\n<p>Commen\u00e7ons les tests avec une configuration tr\u00e8s classique : un montage en int\u00e9rieur, \u00e0 ras du sol ou sur une table, avec un obstacle de petite taille (ici un simple morceau de bois).<\/p>\n<p>C&rsquo;est la pire situation possible pour ce type de capteurs \u00e0 ultrason. La surface en dessous du capteur g\u00e9n\u00e8re des \u00e9chos intempestifs. L&rsquo;obstacle est bien trop petit pour donner des \u00e9chos \u00ab\u00a0propres\u00a0\u00bb et de multiples obstacles se trouvent sur les c\u00f4t\u00e9s de la zone de mesure.<\/p>\n<h3 class=\"western\">Quelques conseils d&rsquo;utilisations<\/h3>\n<p>Ces capteurs \u00e0 ultrason ont besoin d&rsquo;une zone d\u00e9gag\u00e9e, avec une surface dure et lisse d&rsquo;au moins 50cm\u00b2 en face du capteur pour donner des r\u00e9sultats corrects.<\/p>\n<p>Inutile d&rsquo;essayer de mesurer une distance par rapport \u00e0 un rideau ou une surface absorbant le son, \u00e7a ne donnera rien. De m\u00eame, utiliser ce genre de capteur \u00e0 ras le sol ou sur une table, voir pire, ce n&rsquo;est d\u00e9finitivement pas une bonne fa\u00e7on d&rsquo;avoir des mesures correctes.<\/p>\n<p>Voici les r\u00e9sultats de mes mesures sur une plage limit\u00e9e de 10 millim\u00e8tres \u00e0 50 centim\u00e8tres :<\/p>\n<table width=\"367\" cellspacing=\"0\" cellpadding=\"2\">\n<colgroup>\n<col width=\"108\" \/>\n<col width=\"63\" \/>\n<col width=\"94\" \/>\n<col width=\"86\" \/><\/colgroup>\n<tbody>\n<tr>\n<th width=\"108\">Distance mm<\/th>\n<th width=\"63\">Mesure<\/th>\n<th width=\"94\">Erreur mm<\/th>\n<th width=\"86\">Erreur %<\/th>\n<\/tr>\n<tr>\n<td width=\"108\">10<\/td>\n<td width=\"63\">10,20<\/td>\n<td width=\"94\">0,20<\/td>\n<td width=\"86\">2,00%<\/td>\n<\/tr>\n<tr>\n<td width=\"108\">20<\/td>\n<td width=\"63\">18,70<\/td>\n<td width=\"94\">1,30<\/td>\n<td width=\"86\">6,50%<\/td>\n<\/tr>\n<tr>\n<td width=\"108\">30<\/td>\n<td width=\"63\">23,46<\/td>\n<td width=\"94\">6,54<\/td>\n<td width=\"86\">21,80%<\/td>\n<\/tr>\n<tr>\n<td width=\"108\">40<\/td>\n<td width=\"63\">32,64<\/td>\n<td width=\"94\">7,36<\/td>\n<td width=\"86\">18,40%<\/td>\n<\/tr>\n<tr>\n<td width=\"108\">50<\/td>\n<td width=\"63\">42,50<\/td>\n<td width=\"94\">7,50<\/td>\n<td width=\"86\">15,00%<\/td>\n<\/tr>\n<tr>\n<td width=\"108\">60<\/td>\n<td width=\"63\">52,02<\/td>\n<td width=\"94\">7,98<\/td>\n<td width=\"86\">13,30%<\/td>\n<\/tr>\n<tr>\n<td width=\"108\">70<\/td>\n<td width=\"63\">66,30<\/td>\n<td width=\"94\">3,70<\/td>\n<td width=\"86\">5,29%<\/td>\n<\/tr>\n<tr>\n<td width=\"108\">80<\/td>\n<td width=\"63\">76,40<\/td>\n<td width=\"94\">3,60<\/td>\n<td width=\"86\">4,50%<\/td>\n<\/tr>\n<tr>\n<td width=\"108\">90<\/td>\n<td width=\"63\">85,34<\/td>\n<td width=\"94\">4,66<\/td>\n<td width=\"86\">5,18%<\/td>\n<\/tr>\n<tr>\n<td width=\"108\">100<\/td>\n<td width=\"63\">95,54<\/td>\n<td width=\"94\">4,46<\/td>\n<td width=\"86\">4,46%<\/td>\n<\/tr>\n<tr>\n<td width=\"108\">150<\/td>\n<td width=\"63\">144,50<\/td>\n<td width=\"94\">5,50<\/td>\n<td width=\"86\">3,67%<\/td>\n<\/tr>\n<tr>\n<td width=\"108\">200<\/td>\n<td width=\"63\">188,70<\/td>\n<td width=\"94\">11,30<\/td>\n<td width=\"86\">5,65%<\/td>\n<\/tr>\n<tr>\n<td width=\"108\">250<\/td>\n<td width=\"63\">237,66<\/td>\n<td width=\"94\">12,34<\/td>\n<td width=\"86\">4,94%<\/td>\n<\/tr>\n<tr>\n<td width=\"108\">300<\/td>\n<td width=\"63\">286,62<\/td>\n<td width=\"94\">13,38<\/td>\n<td width=\"86\">4,46%<\/td>\n<\/tr>\n<tr>\n<td width=\"108\">350<\/td>\n<td width=\"63\">334,56<\/td>\n<td width=\"94\">15,44<\/td>\n<td width=\"86\">4,41%<\/td>\n<\/tr>\n<tr>\n<td width=\"108\">400<\/td>\n<td width=\"63\">384,86<\/td>\n<td width=\"94\">15,14<\/td>\n<td width=\"86\">3,79%<\/td>\n<\/tr>\n<tr>\n<td width=\"108\">450<\/td>\n<td width=\"63\">433,50<\/td>\n<td width=\"94\">16,50<\/td>\n<td width=\"86\">3,67%<\/td>\n<\/tr>\n<tr>\n<td width=\"108\">500<\/td>\n<td width=\"63\">482,46<\/td>\n<td width=\"94\">17,54<\/td>\n<td width=\"86\">3,51%<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><b>Distance minimum possible<\/b><\/p>\n<p>Pour commencer, m\u00eame avec toute la bonne volont\u00e9 du monde, on n&rsquo;a pas pu descendre en dessous de 10mm, ce qui est d\u00e9j\u00e0 pas mal et bien plus que les deux centim\u00e8tres minimum de la fiche constructeur. Ce sera donc le minimum de ce test.<\/p>\n<p><em>PS <\/em><em>On a <\/em><em>pu remarquer qu&rsquo;en dessous d&rsquo;un centim\u00e8tre, le capteur faisait n&rsquo;importe quoi. <\/em><em>on<\/em><em> suppose donc que le constructeur donne un minimum de deux centim\u00e8tres pour garder un peu de marge.<\/em><\/p>\n<p>Graphique de lin\u00e9arit\u00e9 du capteur sur la plage 1-50cm<\/p>\n<p>Graphique d&rsquo;erreurs du capteur sur la plage 1-50cm<\/p>\n<p>La courbe orange est la th\u00e9orie. La courbe bleue est la pratique.<\/p>\n<p>On remarque de suite que la th\u00e9orie et la pratique ne sont pas tout \u00e0 fait identiques. Il y a une l\u00e9g\u00e8re d\u00e9rive avec un taux d&rsquo;erreur de ~5% en moyenne au-dessus de 7 centim\u00e8tres.<\/p>\n<p>D&rsquo;un point de vue pr\u00e9cision, en dessous de dix centim\u00e8tres, c&rsquo;est du grand n&rsquo;importe quoi. Si on veut<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h3 class=\"western\" align=\"center\">=-=-=-=-=-=<\/h3>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p align=\"center\">\n","protected":false},"excerpt":{"rendered":"<p>Mesurer une distance avec un capteur \u00e0 ultrason HC-SR04 et une carte Arduino \/ Genuino Dans ce tutoriel, nous allons apprendre ensemble \u00e0 utiliser un capteur de distance \u00e0 ultrason de r\u00e9f\u00e9rence HC-SR04 avec une carte Arduino \/ Genuino. En bonus, nous testerons la pr\u00e9cision des mesures . Sommaire * Comment mesurer une distance * Le capteur HC-SR04 * Principe [&#8230;]<\/p>\n","protected":false},"author":7,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-3086","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.breizh56.fr\/crepp2024\/wp-json\/wp\/v2\/pages\/3086"}],"collection":[{"href":"https:\/\/www.breizh56.fr\/crepp2024\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.breizh56.fr\/crepp2024\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.breizh56.fr\/crepp2024\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/www.breizh56.fr\/crepp2024\/wp-json\/wp\/v2\/comments?post=3086"}],"version-history":[{"count":3,"href":"https:\/\/www.breizh56.fr\/crepp2024\/wp-json\/wp\/v2\/pages\/3086\/revisions"}],"predecessor-version":[{"id":3089,"href":"https:\/\/www.breizh56.fr\/crepp2024\/wp-json\/wp\/v2\/pages\/3086\/revisions\/3089"}],"wp:attachment":[{"href":"https:\/\/www.breizh56.fr\/crepp2024\/wp-json\/wp\/v2\/media?parent=3086"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}