{"id":179,"date":"2012-07-13T11:56:13","date_gmt":"2012-07-13T11:56:13","guid":{"rendered":"http:\/\/arthurlambert.fr\/robotique\/wordpress\/?p=179"},"modified":"2012-07-13T12:40:10","modified_gmt":"2012-07-13T12:40:10","slug":"evitement-dobstacle-partie-2","status":"publish","type":"post","link":"https:\/\/arthurlambert.fr\/robotique\/wordpress\/evitement-dobstacle-partie-2\/","title":{"rendered":"Premier programme avec Arduino : Evitement d\u2019obstacle &#8211; Partie 2"},"content":{"rendered":"<p>Voici la <a title=\"Article - Partie 1\" href=\"http:\/\/arthurlambert.fr\/robotique\/wordpress\/premier-programme-avec-arduino-moteur-capteur-et-evitement-dobstacle\/\">seconde partie de l&#8217;article<\/a> concernant l&#8217;\u00e9vitement d&#8217;obstacle.<\/p>\n<h3>Etape 4 : Programme d&#8217;\u00e9vitement d&#8217;obstacle<\/h3>\n<p>Le code est plus ou moins proche d&#8217;une version fonctionnelle et finale. Voici tout d&#8217;abord le code source :<\/p>\n<p><strong>motor.c : Ce fichier d\u00e9finit les fonctions permettant de commander les moteurs \u00e0 travers des fonctions associ\u00e9es \u00e0 diff\u00e9rents types de mouvement.<\/strong><\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#include &quot;motor.h&quot;\r\n\r\nvoid move_forward()\r\n{\r\n  analogWrite (E2, SPEED);\r\n  digitalWrite(M2,LOW);\r\n  analogWrite (E1, SPEED);\r\n  digitalWrite(M1,HIGH);\r\n}\r\n\r\nvoid move_backward()\r\n{\r\n  analogWrite (E2, SPEED);\r\n  digitalWrite(M2,HIGH);\r\n  analogWrite (E1, SPEED);\r\n  digitalWrite(M1,LOW);\r\n}\r\n\r\nvoid turn_right ()\r\n{\r\n  analogWrite (E2, 0);\r\n  digitalWrite(M2,LOW);\r\n  analogWrite (E1, SPEED);\r\n  digitalWrite(M1,HIGH);\r\n}\r\n\r\nvoid turn_left ()\r\n{\r\n  analogWrite (E2, SPEED);\r\n  digitalWrite(M2,LOW);\r\n  analogWrite (E1, 0);\r\n  digitalWrite(M1,HIGH);\r\n}\r\n\r\nvoid rotate_right ()\r\n{\r\n  analogWrite (E2, SPEED);\r\n  digitalWrite(M2,HIGH);\r\n  analogWrite (E1, SPEED);\r\n  digitalWrite(M1,HIGH);\r\n}\r\n\r\nvoid rotate_left ()\r\n{\r\n  analogWrite (E2, SPEED);\r\n  digitalWrite(M2,LOW);\r\n  analogWrite (E1, SPEED);\r\n  digitalWrite(M1,LOW);\r\n}\r\n\r\nvoid stop_motor ()\r\n{\r\n  analogWrite (E1, 0);\r\n  analogWrite (E2, 0);\r\n}\r\n<\/pre>\n<p><strong>sensor.c : Gestion des obstacles.<\/strong><\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#include &quot;sensor.h&quot;\r\n\r\nint static r = 0;\r\n\r\nvoid handle_obstacle ()\r\n{\r\n   int i;\r\n   int left_avg = 0;\r\n   int right_avg = 0;\r\n\r\n   if (r == 1024)\r\n   r = 0;\r\n\r\n   for (i = 0; i &lt; 5; i++)\r\n      left_avg += analogRead(LEFT_SENSOR);\r\n\r\n   for (i = 0; i &lt; 5; i++)\r\n      right_avg += analogRead(RIGHT_SENSOR);\r\n\r\n   left_avg = left_avg \/ 5;\r\n   right_avg = right_avg \/ 5;\r\n\r\n   \/\/ zero obstacle in the both side\r\n   if (left_avg &lt; CONF_SENSOR &amp;&amp; right_avg &lt; CONF_SENSOR) \u00a0 \r\n   {\r\n \u00a0    move_forward();\r\n  \u00a0 \u00a0 delay (300);\r\n \u00a0 } \r\n \u00a0 \/\/ one obstacle on the left side \u00a0 \r\n   else if (left_avg &gt;= CONF_SENSOR &amp;&amp; right_avg &lt; CONF_SENSOR) \u00a0 \r\n   { \u00a0 \u00a0 \r\n      turn_right (); \u00a0\r\n    \u00a0 delay (300); \u00a0 \r\n   } \u00a0 \r\n   \/\/ one obstacle on the right side \u00a0\r\n   else if (right_avg &gt;= CONF_SENSOR &amp;&amp; left_avg &lt; CONF_SENSOR)\r\n   {\r\n      turn_left ();\r\n      delay (300);\r\n   }\r\n   else\r\n   {\r\n      stop_motor();\r\n      move_backward();\r\n      delay(500);\r\n      if (r % 2)\r\n         rotate_left();\r\n      else\r\n         rotate_right();\r\n      r++;\r\n      delay (1500);\r\n   }\r\n}\r\n<\/pre>\n<p>Enfin le &#8220;main&#8221; de mon programme :<\/p>\n<p><strong>romeo.c : Fonction main du programme<\/strong><\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#include &quot;motor.h&quot;\r\n#include &quot;sensor.h&quot;\r\n\r\nvoid setup(void)\r\n{\r\n  int i;\r\n  for (i = 6; i     pinMode(i, OUTPUT);\r\n\r\n  Serial.begin(19200);\r\n  move_forward();\r\n}\r\nvoid loop(void)\r\n{\r\n  handle_obstacle();\r\n  move_forward();\r\n  delay(15);\r\n}\r\n<\/pre>\n<p style=\"text-align: justify;\">Ainsi dans le fichier sensor.c, nous retrouvons le code correspondant \u00e0 la gestion des obstacles. Nous avons deux capteurs actuellement sur la plateforme mobile.<\/p>\n<p style=\"text-align: justify;\">TODO : AJOUTER PHOTO ROBOT + CAPTEURS + AJOUT CONE VISIBILITE<\/p>\n<p style=\"text-align: justify;\">Le code ici reste tr\u00e8s simple, nous allons r\u00e9cup\u00e9rer 5 fois les valeurs sur nos capteurs et nous calculons la moyenne des valeurs obtenues. Cette \u00e9tape permet d&#8217;augmenter la pr\u00e9cision puisque les capteurs peuvent parfois renvoyer des valeurs erron\u00e9es.<\/p>\n<p style=\"text-align: justify;\">Ensuite nous avons 3 cas \u00e0 g\u00e9rer :<\/p>\n<ol>\n<li>Aucun obstacle d\u00e9tect\u00e9 par nos capteurs : J&#8217;avance tout droit<\/li>\n<li>Un obstacle d\u00e9tect\u00e9 sur l&#8217;un des capteurs : Je me dirige dans la direction oppos\u00e9 a l&#8217;obstacle d\u00e9tect\u00e9<\/li>\n<li>Les deux capteurs d\u00e9tectent un obstacle : Je recule, effectue une rotation \u00e0 90\u00b0 sur la gauche ou la droite.<\/li>\n<\/ol>\n<p>Les r\u00e9sultats sont plutot encourageants comme <a title=\"Ajout d\u2019un repo pour le projet et avancement\" href=\"http:\/\/arthurlambert.fr\/robotique\/wordpress\/ajout-dun-repo-pour-le-projet-et-avancement\/\">vu lors d&#8217;un article pr\u00e9c\u00e9dent.<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Voici la seconde partie de l&#8217;article concernant l&#8217;\u00e9vitement d&#8217;obstacle. Etape 4 : Programme d&#8217;\u00e9vitement d&#8217;obstacle Le code est plus ou moins proche d&#8217;une version fonctionnelle et finale. Voici tout d&#8217;abord le code source : motor.c : Ce fichier d\u00e9finit les &hellip; <a href=\"https:\/\/arthurlambert.fr\/robotique\/wordpress\/evitement-dobstacle-partie-2\/\">Continuer la lecture <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":true,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,4],"tags":[7,47,48,49],"class_list":["post-179","post","type-post","status-publish","format-standard","hentry","category-projet_robot","category-tuto","tag-arduino","tag-evitement-dobstacle","tag-langage-c","tag-sharp-gp2y0a21"],"_links":{"self":[{"href":"https:\/\/arthurlambert.fr\/robotique\/wordpress\/wp-json\/wp\/v2\/posts\/179","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/arthurlambert.fr\/robotique\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/arthurlambert.fr\/robotique\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/arthurlambert.fr\/robotique\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/arthurlambert.fr\/robotique\/wordpress\/wp-json\/wp\/v2\/comments?post=179"}],"version-history":[{"count":12,"href":"https:\/\/arthurlambert.fr\/robotique\/wordpress\/wp-json\/wp\/v2\/posts\/179\/revisions"}],"predecessor-version":[{"id":184,"href":"https:\/\/arthurlambert.fr\/robotique\/wordpress\/wp-json\/wp\/v2\/posts\/179\/revisions\/184"}],"wp:attachment":[{"href":"https:\/\/arthurlambert.fr\/robotique\/wordpress\/wp-json\/wp\/v2\/media?parent=179"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/arthurlambert.fr\/robotique\/wordpress\/wp-json\/wp\/v2\/categories?post=179"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/arthurlambert.fr\/robotique\/wordpress\/wp-json\/wp\/v2\/tags?post=179"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}