{"id":1516,"date":"2016-09-22T19:15:33","date_gmt":"2016-09-22T18:15:33","guid":{"rendered":"http:\/\/www.macerobotics.com\/?p=1516"},"modified":"2016-09-23T07:57:50","modified_gmt":"2016-09-23T06:57:50","slug":"realiser-un-petit-lidar-avec-un-capteur-time-of-flight","status":"publish","type":"post","link":"https:\/\/www.macerobotics.com\/?p=1516","title":{"rendered":"R\u00e9aliser un petit lidar avec un capteur Time-of-Flight"},"content":{"rendered":"<p>Cet article pr\u00e9sente la r\u00e9alisation d&#8217;un LIDAR avec un capteur laser <span class=\"st\">Time-of-Flight (ToF) .<\/span><\/p>\n<p><a href=\"http:\/\/www.macerobotics.com\/wp-content\/uploads\/2016\/09\/lidar1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-1518 size-medium aligncenter\" src=\"http:\/\/www.macerobotics.com\/wp-content\/uploads\/2016\/09\/lidar1-300x255.png\" alt=\"lidar1\" width=\"300\" height=\"255\" srcset=\"https:\/\/www.macerobotics.com\/wp-content\/uploads\/2016\/09\/lidar1-300x255.png 300w, https:\/\/www.macerobotics.com\/wp-content\/uploads\/2016\/09\/lidar1-768x653.png 768w, https:\/\/www.macerobotics.com\/wp-content\/uploads\/2016\/09\/lidar1-600x510.png 600w, https:\/\/www.macerobotics.com\/wp-content\/uploads\/2016\/09\/lidar1.png 801w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p><iframe loading=\"lazy\" src=\"https:\/\/www.youtube.com\/embed\/GrNeEv4osSw\" width=\"560\" height=\"315\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<p>Mat\u00e9riels n\u00e9cessaire :<\/p>\n<ul>\n<li>Une carte Esus<\/li>\n<li>Un capteur <span class=\"st\">VL53L0X de chez Pololu <\/span><\/li>\n<li>Un servomoteur AX12<\/li>\n<\/ul>\n<p>Logicielle:<\/p>\n<ul>\n<li>Librairie pour le capteur <span class=\"st\">VL53L0X, <a href=\"https:\/\/github.com\/pololu\/vl53l0x-arduino\">ici<\/a>.<\/span><\/li>\n<li>Processing<\/li>\n<li>Arduino IDE<\/li>\n<\/ul>\n<h2>Synoptique<\/h2>\n<p>Le servomoteur AX12 est c\u00e2bl\u00e9 sur la sortie Tx de la carte Esus. Puis le capteur <span class=\"st\">VL53L0X<\/span>, IO n\u00b02 pour SDA et n\u00b013 pour le signal SDL du bus I2C.<\/p>\n<p><a href=\"http:\/\/www.macerobotics.com\/wp-content\/uploads\/2016\/09\/lidar_synoptique.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1517 aligncenter\" src=\"http:\/\/www.macerobotics.com\/wp-content\/uploads\/2016\/09\/lidar_synoptique.png\" alt=\"lidar_synoptique\" width=\"489\" height=\"227\" srcset=\"https:\/\/www.macerobotics.com\/wp-content\/uploads\/2016\/09\/lidar_synoptique.png 489w, https:\/\/www.macerobotics.com\/wp-content\/uploads\/2016\/09\/lidar_synoptique-300x139.png 300w\" sizes=\"auto, (max-width: 489px) 100vw, 489px\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">L&#8217;alimentation doit \u00eatre d&#8217;au moins 7 Volt pour faire fonctionner le servomoteur. La capteur laser est aliment\u00e9 par une tension de 3.3V pr\u00e9sente sur la carte Esus.<\/p>\n<h2>Le code de la carte Esus<\/h2>\n<p style=\"text-align: justify;\">La carte Esus contr\u00f4le le servomoteur pour le d\u00e9placement d&#8217;un angle de 0 \u00e0 300\u00b0 aller-retour. De plus, elle g\u00e8re l&#8217;acquisition de la distance obtenu par le capteur <span class=\"st\">VL53L0X.<\/span><\/p>\n<p>Voici le setup :<\/p>\n<pre>void setup() \r\n{\r\n<span style=\"color: #008000;\"><strong>\u00a0\/\/ init serial\u00a0<\/strong> <\/span>\u00a0\r\n\u00a0Serial.begin(9600);\r\n\r\n\u00a0<span style=\"color: #008000;\"><strong>\/\/ init serial AX12<\/strong><\/span>\r\n\u00a0swSer.begin(1000000);\r\n\r\n\u00a0<span style=\"color: #008000;\"><strong>\/\/ init I2C<\/strong><\/span>\r\n\u00a0Wire.begin(2, 13);\/\/SDA, SCL\r\n\r\n\u00a0<span style=\"color: #008000;\"><strong>\/\/ init VL53L0X<\/strong><\/span>\r\n\u00a0sensor.init();\r\n\u00a0sensor.setTimeout(500);\r\n\r\n\u00a0state = 1;\r\n\r\n}<\/pre>\n<p>La boucle infini :<\/p>\n<pre>void loop()\r\n{\r\n\u00a0\r\n\u00a0 <span style=\"color: #008000;\"><strong>\/\/ servomotor control<\/strong><\/span>\r\n\u00a0 AX12_GoalPosition(0xFE, angle, 1023);\r\n\r\n\u00a0 <span style=\"color: #008000;\"><strong>\/\/ read distance<\/strong><\/span>\r\n\u00a0 data = sensor.readRangeSingleMillimeters();\r\n\r\n\u00a0 <span style=\"color: #008000;\"><strong>\/\/ send distance<\/strong><\/span>\r\n\u00a0 Serial.write(data&gt;&gt;8);\r\n\u00a0 Serial.write(data);\r\n\r\n\u00a0 <span style=\"color: #008000;\"><strong>\/\/ send angle<\/strong><\/span>\r\n\u00a0 Serial.write(angle&gt;&gt;8);\r\n\u00a0 Serial.write(angle);\r\n\r\n\u00a0 <span style=\"color: #008000;\"><strong>\/\/ angle between 0 and 300 \u00b0<\/strong><\/span>\r\n\u00a0 if(( angle &lt;= 300)and(state == 1))\r\n\u00a0 {\r\n\u00a0\u00a0\u00a0 angle = angle + 1; \r\n\u00a0 }\r\n\u00a0 else\r\n\u00a0 {\r\n\u00a0\u00a0\u00a0 state = 2;\r\n\u00a0 }\r\n\r\n\u00a0 if(( angle &gt;= 0)and(state == 2))\r\n\u00a0 {\r\n\u00a0\u00a0\u00a0 angle = angle - 1; \r\n\u00a0 }\r\n\u00a0 else\r\n\u00a0 {\r\n\u00a0\u00a0\u00a0 state = 1;\r\n\u00a0 }\r\n\u00a0 \r\n\r\n\u00a0 delay(5);\r\n\r\n<\/pre>\n<p>Voici le programme complet, <a href=\"http:\/\/macerobotics.com\/Documentation\/Esus\/lidar.ino\">ici<\/a>.<\/p>\n<p>&nbsp;<\/p>\n<h2>Le programme de visualisation<\/h2>\n<p style=\"text-align: center;\"><a href=\"http:\/\/www.macerobotics.com\/wp-content\/uploads\/2016\/09\/lidar2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1521\" src=\"http:\/\/www.macerobotics.com\/wp-content\/uploads\/2016\/09\/lidar2.png\" alt=\"lidar2\" width=\"405\" height=\"423\" srcset=\"https:\/\/www.macerobotics.com\/wp-content\/uploads\/2016\/09\/lidar2.png 405w, https:\/\/www.macerobotics.com\/wp-content\/uploads\/2016\/09\/lidar2-287x300.png 287w\" sizes=\"auto, (max-width: 405px) 100vw, 405px\" \/><\/a><\/p>\n<p>Voici le programme Processing de visualisation :<\/p>\n<pre>import processing.serial.*;\r\n\r\nSerial myPort;\u00a0 \r\nString val;\u00a0\u00a0\u00a0\u00a0 \r\n\r\nint distance_mm, val_old;\r\nint angle;\r\nfloat radian;\r\nfloat pox,poy;\r\n\r\nint x=0;\r\n\r\nvoid setup()\r\n{\r\n\u00a0 size(400, 400);\r\n\r\n\u00a0background(255);\r\n\r\n\u00a0 myPort = new Serial(this, \"COM13\", 9600);\r\n\u00a0 \r\n}\r\n\r\n\r\nvoid draw()\r\n{\r\n\r\n\u00a0 if(myPort.available() &gt;= 4)\r\n\u00a0 {\r\n\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 val_old = distance_mm;\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 distance_mm =\u00a0 (myPort.read() &lt;&lt; 8) | (myPort.read()); \r\n\u00a0\u00a0\u00a0 print(\"Val1:\");\r\n\u00a0\u00a0\u00a0 println(distance_mm);\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 distance_mm = distance_mm\/2;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 angle =\u00a0 (myPort.read() &lt;&lt; 8) | (myPort.read()); \r\n\u00a0\u00a0\u00a0 print(\"Angle:\");\r\n\u00a0\u00a0\u00a0 println(angle);\u00a0 \u00a0\r\n\u00a0\r\n\u00a0\u00a0\u00a0 myPort.clear(); \u00a0\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 if(angle &lt;= 45)\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 angle = angle + 315;\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 else\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 angle = angle - 45;\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0 \u00a0\r\n\u00a0 } \u00a0\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \/\/ conversion degre radian\r\n\u00a0\u00a0 radian = (angle * 3.14)\/180;\r\n\u00a0\u00a0 pox = int(cos(radian)*distance_mm);\r\n\u00a0\u00a0 poy = int(sin(radian)*distance_mm);\r\n\u00a0 \r\n\u00a0\u00a0 clear();\r\n\u00a0\u00a0 background(255);\r\n\r\n\u00a0\u00a0 stroke(0, 0, 0);\r\n\u00a0 \u00a0\r\n\u00a0\u00a0 \/\/ grille\r\n\u00a0\u00a0 line(200,0,200,400);\r\n\u00a0\u00a0 line(0,200,400,200);\r\n\u00a0 \u00a0\r\n\u00a0\u00a0 stroke(255, 0, 0);\r\n\u00a0 \u00a0\r\n\u00a0\u00a0 line(200,200,int(pox)+200,200-int(poy));\r\n\u00a0 \u00a0\r\n}<\/pre>\n<h2>Am\u00e9liorations<\/h2>\n<ul>\n<li>Vitesse<\/li>\n<li>Retour de l&#8217;angle du servomoteur AX12<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cet article pr\u00e9sente la r\u00e9alisation d&#8217;un LIDAR avec un capteur laser Time-of-Flight (ToF) . Mat\u00e9riels n\u00e9cessaire : Une carte Esus Un capteur VL53L0X de chez Pololu Un servomoteur AX12 Logicielle: Librairie pour le capteur VL53L0X, ici. Processing Arduino IDE Synoptique Le servomoteur AX12 est c\u00e2bl\u00e9 sur la sortie Tx de la carte Esus. Puis le &hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[44],"tags":[],"class_list":["post-1516","post","type-post","status-publish","format-standard","hentry","category-esus"],"_links":{"self":[{"href":"https:\/\/www.macerobotics.com\/index.php?rest_route=\/wp\/v2\/posts\/1516","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=1516"}],"version-history":[{"count":9,"href":"https:\/\/www.macerobotics.com\/index.php?rest_route=\/wp\/v2\/posts\/1516\/revisions"}],"predecessor-version":[{"id":1528,"href":"https:\/\/www.macerobotics.com\/index.php?rest_route=\/wp\/v2\/posts\/1516\/revisions\/1528"}],"wp:attachment":[{"href":"https:\/\/www.macerobotics.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1516"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.macerobotics.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1516"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.macerobotics.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1516"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}