{"id":3675,"date":"2026-06-16T10:39:19","date_gmt":"2026-06-16T09:39:19","guid":{"rendered":"https:\/\/www.macerobotics.com\/?p=3675"},"modified":"2026-06-16T10:39:44","modified_gmt":"2026-06-16T09:39:44","slug":"ia-neurone-artificiel-avec-le-robot-mr25-partie-2","status":"publish","type":"post","link":"https:\/\/www.macerobotics.com\/?p=3675","title":{"rendered":"IA &#8211; Neurone artificiel avec le robot MR25 (Partie 2)"},"content":{"rendered":"<h2>Pr\u00e9sentation<\/h2>\n<p>Dans cet article nous allons apprendre au robot MR25 \u00e0 \u00e9viter les obstacles en utilisant un neurone perception avec 5 entr\u00e9es. Avec les 5 capteurs du robot, il est pr\u00e9f\u00e9rable de ne plus simplement d\u00e9cider <strong data-start=\"65\" data-end=\"82\">avance \/ stop <\/strong>comme dans la <strong>partie n\u00b01<\/strong>, mais aussi de choisir une direction lorsque l&#8217;on d\u00e9tecte un obstacle.<\/p>\n<p data-start=\"155\" data-end=\"163\">Voici l&#8217;id\u00e9e :<\/p>\n<ul data-start=\"165\" data-end=\"378\">\n<li data-section-id=\"pdlyeo\" data-start=\"165\" data-end=\"207\">Capteurs 1 et 2 \u2192 surveillent la gauche.<\/li>\n<li data-section-id=\"1nxlhuy\" data-start=\"208\" data-end=\"242\">Capteur 3 \u2192 surveille le centre.<\/li>\n<li data-section-id=\"1ep3zou\" data-start=\"243\" data-end=\"285\">Capteurs 4 et 5 \u2192 surveillent la droite.<\/li>\n<\/ul>\n<p><a href=\"http:\/\/fr.macerobotics.com\/wp-content\/uploads\/sites\/4\/2026\/06\/Capture-decran-2026-06-04-191743.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-3982 aligncenter\" src=\"http:\/\/fr.macerobotics.com\/wp-content\/uploads\/sites\/4\/2026\/06\/Capture-decran-2026-06-04-191743.png\" alt=\"\" width=\"472\" height=\"378\" \/><\/a><\/p>\n<ul data-start=\"165\" data-end=\"378\">\n<li data-section-id=\"d7xzui\" data-start=\"286\" data-end=\"335\">Distance proche de 0 mm \u2192 obstacle tr\u00e8s proche.<\/li>\n<li data-section-id=\"1vumdik\" data-start=\"336\" data-end=\"378\">Distance proche de 250 mm \u2192 espace libre.<\/li>\n<\/ul>\n<p>On peut entra\u00eener un perceptron \u00e0 5 entr\u00e9es qui d\u00e9cide si le robot peut avancer, puis utiliser les capteurs pour d\u00e9terminer le sens de rotation lorsqu&#8217;il ne peut pas avancer.<\/p>\n<div class=\"code-embed-wrapper\"> <pre class=\"language-python code-embed-pre line-numbers\"  data-start=\"1\" data-line-offset=\"0\"><code class=\"language-python code-embed-code\">#!\/usr\/bin\/python3<br\/><br\/>import MR25       # Biblioth\u00e8que de contr\u00f4le du robot MR25<br\/>import time       # Pour les pauses dans la boucle principale<br\/><br\/># ============================================================<br\/># PERCEPTRON \u2014 Neurone artificiel \u00e0 seuil<br\/># ============================================================<br\/># Un perceptron calcule une somme pond\u00e9r\u00e9e de ses entr\u00e9es,<br\/># puis applique une fonction d&#039;activation pour d\u00e9cider : 0 ou 1.<br\/><br\/>def activation(x):<br\/>    &quot;&quot;&quot;Fonction d&#039;activation en \u00e9chelon (step function).<br\/>    Retourne 1 si x &gt;= 0 (voie libre), 0 sinon (obstacle).&quot;&quot;&quot;<br\/>    return 1 if x &gt;= 0 else 0<br\/><br\/># 5 poids \u2014 un par capteur de proximit\u00e9 (c1 \u00e0 c5)<br\/>w = [0.0, 0.0, 0.0, 0.0, 0.0]<br\/>b = 0.0    # Biais : ajuste le seuil de d\u00e9cision<br\/>eta = 0.1  # Taux d&#039;apprentissage (learning rate) : amplitude des corrections<br\/><br\/># ============================================================<br\/># DONN\u00c9ES D&#039;ENTRA\u00ceNEMENT<br\/># ============================================================<br\/># Chaque exemple est un couple ([c1,c2,c3,c4,c5], \u00e9tiquette)<br\/># Les valeurs des capteurs sont normalis\u00e9es entre 0.0 et 1.0 :<br\/>#   - Proche de 0.0 \u2192 obstacle d\u00e9tect\u00e9 (capteur satur\u00e9)<br\/>#   - Proche de 1.0 \u2192 voie d\u00e9gag\u00e9e (capteur \u00e0 port\u00e9e max)<br\/># \u00c9tiquette : 0 = obstacle \u2192 s&#039;arr\u00eater\/tourner, 1 = avancer<br\/><br\/>training_data = [<br\/>    # --- Cas OBSTACLE : capteurs faibles (obstacles proches) ---<br\/>    ([0.1, 0.1, 0.1, 0.1, 0.1], 0),  # Obstacles partout<br\/>    ([0.2, 0.2, 0.2, 0.2, 0.2], 0),  # Obstacles proches<br\/>    ([0.3, 0.2, 0.1, 0.2, 0.3], 0),  # Obstacle central fort<br\/>    ([0.2, 0.2, 0.2, 0.8, 0.8], 0),  # Obstacles proches<br\/>    ([0.8, 0.8, 0.2, 0.2, 0.2], 0),  # Obstacles proches<br\/><br\/>    # --- Cas AVANCER : capteurs forts (voie libre) ---<br\/>    ([0.8, 0.8, 0.8, 0.8, 0.8], 1),  # Voie totalement libre<br\/>    ([0.9, 0.8, 0.9, 0.8, 0.9], 1),  # Voie tr\u00e8s d\u00e9gag\u00e9e<br\/>    ([0.7, 0.9, 0.8, 0.9, 0.7], 1),  # Voie d\u00e9gag\u00e9e (l\u00e9g\u00e8re variation)<br\/>]<br\/><br\/># ============================================================<br\/># PHASE D&#039;APPRENTISSAGE \u2014 R\u00e8gle de Hebb \/ Perceptron<br\/># ============================================================<br\/># Pour chaque exemple, on calcule la sortie et on corrige les<br\/># poids proportionnellement \u00e0 l&#039;erreur : \u0394w = \u03b7 \u00d7 erreur \u00d7 entr\u00e9e<br\/><br\/>for epoch in range(100):  # Maximum 100 passes sur les donn\u00e9es<br\/><br\/>    erreur_totale = 0<br\/><br\/>    for inputs, target in training_data:<br\/><br\/>        # Calcul de la somme pond\u00e9r\u00e9e : s = \u03a3(wi \u00d7 xi) + b<br\/>        s = sum(wi * xi for wi, xi in zip(w, inputs)) + b<br\/><br\/>        # Application de la fonction d&#039;activation<br\/>        y = activation(s)<br\/><br\/>        # Erreur = diff\u00e9rence entre valeur attendue et valeur calcul\u00e9e<br\/>        erreur = target - y  # 0, +1 ou -1<br\/><br\/>        # Mise \u00e0 jour des poids : correction proportionnelle \u00e0 l&#039;erreur<br\/>        for i in range(5):<br\/>            w[i] += eta * erreur * inputs[i]<br\/><br\/>        # Mise \u00e0 jour du biais (entr\u00e9e fictive toujours \u00e9gale \u00e0 1)<br\/>        b += eta * erreur<br\/><br\/>        erreur_totale += abs(erreur)<br\/><br\/>    # Arr\u00eat anticip\u00e9 si le perceptron classe tout correctement<br\/>    if erreur_totale == 0:<br\/>        break<br\/><br\/># Affichage des param\u00e8tres appris<br\/>print(&quot;Poids :&quot;, w)<br\/>print(&quot;Biais :&quot;, b)<br\/><br\/># ============================================================<br\/># PILOTAGE EN TEMPS R\u00c9EL \u2014 Boucle principale<br\/># ============================================================<br\/><br\/>SEUIL_MAX = 250.0  # Distance maximale de d\u00e9tection (en cm ou unit\u00e9 capteur)<br\/>                  # Au-del\u00e0, on consid\u00e8re la voie comme libre<br\/><br\/>try:<br\/>  while True:<br\/>  <br\/>      # --- Lecture et normalisation des 5 capteurs de proximit\u00e9 ---<br\/>      # proxSensor(n) retourne une valeur brute ; on la plafonne \u00e0 SEUIL_MAX,<br\/>      # puis on divise pour obtenir un ratio entre 0.0 et 1.0<br\/>      p1 = MR25.proxSensor(1)<br\/>      p2 = MR25.proxSensor(2)<br\/>      p3 = MR25.proxSensor(3)<br\/>      p4 = MR25.proxSensor(4)<br\/>      p5 = MR25.proxSensor(5)<br\/><br\/>      capteurs = [p1, p2, p3, p4, p5]<br\/>      print(capteurs)<br\/><br\/>      c1 = min(p1, SEUIL_MAX) \/ SEUIL_MAX  # Capteur avant-gauche extr\u00eame<br\/>      c2 = min(p2, SEUIL_MAX) \/ SEUIL_MAX  # Capteur avant-gauche<br\/>      c3 = min(p3, SEUIL_MAX) \/ SEUIL_MAX  # Capteur avant-centre<br\/>      c4 = min(p4, SEUIL_MAX) \/ SEUIL_MAX  # Capteur avant-droite<br\/>      c5 = min(p5, SEUIL_MAX) \/ SEUIL_MAX  # Capteur avant-droite extr\u00eame<br\/>  <br\/>      entree = [c1, c2, c3, c4, c5]<br\/>      print(entree)<br\/>  <br\/>      # --- Inf\u00e9rence : le perceptron d\u00e9cide d&#039;avancer ou non ---<br\/>      s = sum(wi * xi for wi, xi in zip(w, entree)) + b<br\/>      print(&quot;s = &quot;, s)<br\/>      avance = activation(s)  # 1 = avancer, 0 = \u00e9viter l&#039;obstacle<br\/>  <br\/>      print(&quot;avance = &quot;, avance)<br\/><br\/>      if avance:<br\/>          # Voie libre \u2192 avancer \u00e0 vitesse mod\u00e9r\u00e9e<br\/>          MR25.forward(25)<br\/>          print(&quot;AVANCE&quot;)<br\/>  <br\/>      else:<br\/>          # Obstacle d\u00e9tect\u00e9 \u2192 choisir le c\u00f4t\u00e9 le plus d\u00e9gag\u00e9 pour tourner<br\/>  <br\/>          gauche = c1 + c2   # Score d&#039;espace \u00e0 gauche (somme des 2 capteurs gauches)<br\/>          droite = c4 + c5   # Score d&#039;espace \u00e0 droite (somme des 2 capteurs droits)<br\/>  <br\/>          # Le c\u00f4t\u00e9 avec le score le plus \u00e9lev\u00e9 est le plus d\u00e9gag\u00e9<br\/>          if gauche &gt; droite:<br\/>              MR25.turnLeft(40)   # Plus d&#039;espace \u00e0 gauche \u2192 tourner \u00e0 gauche<br\/>              print(&quot;TOURNE GAUCHE&quot;)<br\/>          else:<br\/>              MR25.turnRight(40)  # Plus d&#039;espace \u00e0 droite (ou \u00e9galit\u00e9) \u2192 tourner \u00e0 droite<br\/>              print(&quot;TOURNE DROITE&quot;)<br\/>  <br\/>      time.sleep(0.2)  # Pause <br\/><br\/>except KeyboardInterrupt:<br\/>    # Arr\u00eat propre du robot lors d&#039;une interruption clavier (Ctrl+C)<br\/>    MR25.stop()<br\/># en of file<\/code><\/pre> <div class=\"code-embed-infos\"> <\/div> <\/div>\n<p>Le neurone perceptron simple est un mod\u00e8le de pr\u00e9diction lin\u00e9aire. Il est n\u00e9cessaire d&#8217;utiliser plusieurs couches (r\u00e9seau) pour r\u00e9soudre des probl\u00e8mes plus complexes.<\/p>\n<p>Fin !<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pr\u00e9sentation Dans cet article nous allons apprendre au robot MR25 \u00e0 \u00e9viter les obstacles en utilisant un neurone perception avec 5 entr\u00e9es. Avec les 5 capteurs du robot, il est pr\u00e9f\u00e9rable de ne plus simplement d\u00e9cider avance \/ stop comme dans la partie n\u00b01, mais aussi de choisir une direction lorsque l&#8217;on d\u00e9tecte un obstacle. &hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[108,46,26],"tags":[],"class_list":["post-3675","post","type-post","status-publish","format-standard","hentry","category-ia","category-robot","category-tutoriel"],"_links":{"self":[{"href":"https:\/\/www.macerobotics.com\/index.php?rest_route=\/wp\/v2\/posts\/3675","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.macerobotics.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.macerobotics.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.macerobotics.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.macerobotics.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3675"}],"version-history":[{"count":1,"href":"https:\/\/www.macerobotics.com\/index.php?rest_route=\/wp\/v2\/posts\/3675\/revisions"}],"predecessor-version":[{"id":3676,"href":"https:\/\/www.macerobotics.com\/index.php?rest_route=\/wp\/v2\/posts\/3675\/revisions\/3676"}],"wp:attachment":[{"href":"https:\/\/www.macerobotics.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3675"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.macerobotics.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3675"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.macerobotics.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3675"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}