{"id":1447,"date":"2009-12-30T14:51:35","date_gmt":"2009-12-30T13:51:35","guid":{"rendered":"http:\/\/www.alphak.net\/news\/?p=1447"},"modified":"2015-04-18T20:07:26","modified_gmt":"2015-04-18T18:07:26","slug":"youpi-testons-les-moteurs","status":"publish","type":"post","link":"https:\/\/www.alphak.net\/news\/2009\/12\/youpi-testons-les-moteurs\/","title":{"rendered":"Youpi, testons les moteurs !"},"content":{"rendered":"<p>J&rsquo;avais longuement expliqu\u00e9 dans <a href=\"\/news\/2009\/05\/on-a-retrouve-le-prototype-du-t-800\/\" target=\"_self\">cet article<\/a> les \u00e9tapes de <strong>fabrication d&rsquo;un c\u00e2ble parall\u00e8le<\/strong> pour relier le robot Youpi \u00e0 un PC standard.<\/p>\n<p>Aujourd&rsquo;hui je vais comme promis diffuser les quelques <strong>lignes de code<\/strong> permettant de tester l&rsquo;ensemble des moteurs. Le programme est grandement inspir\u00e9 de celui que l&rsquo;on peut trouver sur le site du <a href=\"http:\/\/sandiris.free.fr\/web\/index.php?option=com_content&amp;task=view&amp;id=19&amp;Itemid=29\" target=\"_blank\">BTS-IRIS de Niort<\/a>.<\/p>\n<p>C&rsquo;est un programme d\u00e9velopp\u00e9 \u00e0 la va-vite en C. Il pourra servir de <strong>base <\/strong>pour tous ceux qui comme moi souhaitent v\u00e9rifier que tous les moteurs sont en bon \u00e9tat de fonctionnement.<!--more--><\/p>\n<h3>Le code<\/h3>\n<p>robotest.c<\/p>\n<pre class=\"prettyprint\">&#47;*\r\nYoupi Robot Test program\r\n------------------------\r\n\r\nAuthor: AlphaK - www.alphak.net\r\nRevision: 2010-07-16\r\n\r\nThis program has to be run as root\r\nor with sufficient credentials (suid...)\r\n*&#47;\r\n\r\n#include &lt;stdio.h&gt;\r\n#include &lt;stdlib.h&gt;\r\n#include &lt;fcntl.h&gt;\r\n#include &lt;unistd.h&gt;\r\n#include &lt;sys&#47;io.h&gt;\r\n\r\n&#47;&#47; Change this to your parallel port\r\n#define LPT 0x378\r\n\r\n&#47;&#47; Defines the byte type\r\ntypedef unsigned char byte;\r\n\r\n&#47;&#47; Defines the time between each instruction\r\nint tempo = 2000;\r\n\r\n&#47;*\r\nThis functions writes a byte to the parallel port\r\nDo not use any other way to do it as the robot needs to pause\r\nbetween each instruction.\r\n*&#47;\r\nvoid writelpt(byte b) {\r\n\toutb(b, LPT);\r\n\tusleep(tempo);\r\n}\r\n\r\n&#47;*\r\nThis is the main function\r\n*&#47;\r\nint main() {\r\n\r\n\t&#47;&#47;Variables\r\n\tint i,j;\r\n\tint steps = 600;\r\n\r\n\t&#47;&#47;Welcome message\r\n\tprintf(&#34;*** YOUPI ROBOT TEST PROGRAM ***\\n&#34;);\r\n\r\n\t&#47;&#47;Tries to access parallel port\r\n\tif(ioperm(LPT, 1, 1) != 0) {\r\n\t\tperror(&#34;ioperm&#34;);\r\n\t\treturn 1;\r\n\t}\r\n\r\n\t&#47;&#47;Initializes the robot\r\n\tprintf(&#34; * Initialization\\n&#34;);\r\n\twritelpt(0x47);\r\n\twritelpt(0x00);\r\n\r\n\t&#47;&#47;Orders earch motor to rotate\r\n\tfor(j=0; j&lt;6; j++) {\r\n\t\tprintf(&#34; * Test of motor %d\\n&#34;, j);\r\n\r\n\t\t&#47;&#47;...with the correct tempo value\r\n\t\ttempo = (j == 0) ? 2000:1500;\r\n\r\n\t\t&#47;&#47;...into one direction\r\n\t\twritelpt(0x80);\r\n\t\twritelpt(0x00);\r\n\t\tfor(i=0; i&lt;steps; i++) {\r\n\t\t\twritelpt(0x40+j);\r\n\t\t\twritelpt(0x00+j);\r\n\t\t}\r\n\r\n\t\t&#47;&#47;...into the opposite direction\r\n\t\twritelpt(0xBF);\r\n\t\twritelpt(0x3F);\r\n\t\tfor(i=0; i&lt;steps; i++) {\r\n\t\t\twritelpt(0x40+j);\r\n\t\t\twritelpt(0x00+j);\r\n\t\t}\r\n\t}\r\n\r\n\treturn 0;\r\n}<\/pre>\n<p>Et le Makefile qui va avec :<\/p>\n<pre class=\"prettyprint\">CC=gcc\r\nCFLAGS=-W -Wall -O\r\n\r\nall: robotest\r\n\r\nrobotest: robotest.c\r\n\t$(CC) $(CFLAGS) -o $@ $&lt;\r\n\r\nclean:\r\n\trm robotest<\/pre>\n<h3>Quelques explications<\/h3>\n<p>Le manuel indique une vitesse de rotation maximale de 40\u00b0\/s pour tous les moteurs, avec une r\u00e9solution maximale de 0.03\u00b0 par 1\/2 pas. Chaque 1\/2 pas est effectu\u00e9 gr\u00e2ce \u00e0 l&rsquo;envoi de 2 instructions par le port parall\u00e8le. Pour faire avancer le robot \u00e0 cette vitesse maximale, il est n\u00e9cessaire d&rsquo;espacer chaque instruction d&rsquo;un temps T en secondes, calcul\u00e9 ci-dessous :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1459\" title=\"robot-youpi-T-formula\" src=\"http:\/\/cdn.alphak.net\/news\/wp-content\/uploads\/sites\/2\/2009\/12\/robot-youpi-T-formula.png\" alt=\"\" width=\"261\" height=\"102\" \/><\/p>\n<p>Il faut donc espacer chaque instruction de 1500 \u00b5s, ce qui explique les 1500 \u00e0 la ligne 27 du code. Descendre en dessous de cette limite est susceptible de provoquer des catastrophes inconnues, donc si vous essayez, cela sera \u00e0 vos risques et p\u00e9rils. Note : comme me l&rsquo;a fait remarquer cosmos dans les commentaires, pour le moteur de la base ayant une r\u00e9solution de 0.04\u00b0 par 1\/2 pas, ces espacements doivent monter \u00e0 2000\u00b5s selon cette m\u00eame formule.<\/p>\n<h3>Bugs connus<\/h3>\n<p>Avec un sommeil de 1500 \u00b5s entre chaque instruction, le programme devrait th\u00e9oriquement \u00eatre termin\u00e9 en approximativement 2+6*(2+600*2)*2*0.0015 = <strong>22 secondes<\/strong>, en n\u00e9gligeant le temps n\u00e9cessaires aux autres instructions. Hors j&rsquo;obtiens en moyenne un temps d&rsquo;ex\u00e9cution \u00e0 <strong>58 secondes<\/strong>.<\/p>\n<p>Ce ph\u00e9nom\u00e8ne est expliqu\u00e9 en partie par le paragraphe suivant, tir\u00e9 de la page man 3 de usleep :<\/p>\n<blockquote><p>La p\u00e9riode de sommeil peut \u00eatre allong\u00e9e par\u00a0 la\u00a0 charge\u00a0 syst\u00e8me, par le temps pass\u00e9 \u00e0 traiter l&rsquo;appel de fonction, ou par la granularit\u00e9 des temporisations syst\u00e8me.<\/p><\/blockquote>\n<p>En r\u00e9sum\u00e9, lors de mon test, la vitesse de rotation de chaque moteur n&rsquo;est pour le moment <strong>pas optimale<\/strong>. J&rsquo;avais fait d&rsquo;autres essais en r\u00e9duisant significativement cette temporisation \u00e0 quelques \u00b5s, ou en utilisant nanosleep afin d&rsquo;avoir une granularit\u00e9 plus fine, mais le temps d&rsquo;ex\u00e9cution total n&rsquo;est jamais descendu en dessous de ces 58 secondes. Je ne sais pas encore comment optimiser cette vitesse, cela fait appel \u00e0 des notions d&rsquo;<strong>architecture syst\u00e8me<\/strong> et de <strong>programmation temps r\u00e9el<\/strong> qui me manquent \u00e0 l&rsquo;heure actuelle. Dans tous les cas, m\u00eame si la vitesse est \u00e0 l&rsquo;heure actuelle brid\u00e9e, le programme est n\u00e9anmoins capable de d\u00e9montrer le fonctionnement correct de chaque moteur.<\/p>\n<h3>Informations compl\u00e9mentaires<\/h3>\n<p>J&rsquo;en profite pour placer un rappel : au lieu de me contacter personnellement pour me demander de l&rsquo;aide \u00e0 propos de ce robot, merci d&rsquo;effectuer cette d\u00e9marche en <strong>laissant un commentaire<\/strong> sur ce site afin que les questions et r\u00e9ponses profitent \u00e0 tout le monde.<\/p>\n<p><strong>NB :<\/strong> vous pourrez maintenant trouver en un seul clic tous les articles de ce site relatifs au robot Youpi gr\u00e2ce au <a href=\"\/news\/tag\/youpi\/\" target=\"_self\">tag Youpi<\/a>.<\/p>\n<h3>Mise \u00e0 jour du 18\/04\/2015<\/h3>\n<p>J&rsquo;ai de bonnes raisons de penser que mon calcul de temporisation dont la formule est expos\u00e9e ci dessus est faux. Mes nouveaux calculs indiquent que les instructions devraient \u00eatre s\u00e9par\u00e9es de 375 \u00b5s (respectivement 500 \u00b5s pour le moteur de la base) au lieu des 1500 \u00b5s (respectivement 2000 \u00b5s). Si cela est exact, les vitesses d&rsquo;ex\u00e9cution de robotest et de Youba pourraient \u00eatre am\u00e9lior\u00e9es jusqu&rsquo;\u00e0 x4 ! D&rsquo;autre part on peut envisager l&rsquo;utilisation de l&rsquo;instruction nanosleep qui serait susceptible de r\u00e9duire le temps de sommeil \u00ab\u00a0inutile\u00a0\u00bb (c.f. explications ci-dessus). Je n&rsquo;ai malheureusement pas la possibilit\u00e9 de tester ces changements actuellement, ne disposant pas du Youpi \u00e0 mon domicile. Cela pourra n\u00e9anmoins s&rsquo;arranger dans les prochaines semaines. Je vous ferai part des am\u00e9liorations disponibles d\u00e8s que cela sera possible.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>J&rsquo;avais longuement expliqu\u00e9 dans <a href=\"\/news\/2009\/05\/on-a-retrouve-le-prototype-du-t-800\/\" target=\"_self\">cet article<\/a> les \u00e9tapes de <strong>fabrication d&rsquo;un c\u00e2ble parall\u00e8le<\/strong> pour relier le robot Youpi \u00e0 un PC standard.<\/p>\n<p>Aujourd&rsquo;hui je vais comme promis diffuser les quelques <strong>lignes de code<\/strong> permettant de tester l&rsquo;ensemble des moteurs. Le programme est grandement inspir\u00e9 de celui que l&rsquo;on peut trouver sur le site du <a href=\"http:\/\/sandiris.free.fr\/web\/index.php?option=com_content&amp;task=view&amp;id=19&amp;Itemid=29\" target=\"_blank\">BTS-IRIS de Niort<\/a>.<\/p>\n<p>C&rsquo;est un programme d\u00e9velopp\u00e9 \u00e0 la va-vite en C. Il pourra servir de <strong>base <\/strong>pour tous ceux qui comme moi souhaitent v\u00e9rifier que tous les moteurs sont en bon \u00e9tat de fonctionnement.<\/p>\n\t<div class=\"post-teaser-block\">\r\n\t\t<div class=\"teaserHellip\">\r\n\t\t\t<span class=\"teaserLeft\">[<\/span><span class=\"teaserCenter\">&hellip;<\/span><span class=\"teaserRight\">]<\/span>\r\n\t\t<\/div>\r\n\t\t<div class=\"teaserText\">\r\n\t\t\t<a href=\"https:\/\/www.alphak.net\/news\/2009\/12\/youpi-testons-les-moteurs\/\" title=\"Youpi, testons les moteurs !\" rel=\"bookmark\"><span class=\"teaserlink\">Lire la suite de l'article&nbsp;<i class=\"fa fa-chevron-right\"><\/i><\/span><\/a>\r\n\t\t<\/div>\r\n\t\t<a class=\"teaserLink\" href=\"https:\/\/www.alphak.net\/news\/2009\/12\/youpi-testons-les-moteurs\/\" title=\"Youpi, testons les moteurs !\" rel=\"bookmark\"><\/a>\r\n\t<\/div>\r\n","protected":false},"author":1,"featured_media":1459,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[142],"tags":[205,343,207,143,144],"class_list":["post-1447","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-bricolage","tag-c","tag-code","tag-programme","tag-robot","tag-youpi"],"_links":{"self":[{"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/posts\/1447"}],"collection":[{"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/comments?post=1447"}],"version-history":[{"count":7,"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/posts\/1447\/revisions"}],"predecessor-version":[{"id":3004,"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/posts\/1447\/revisions\/3004"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/media\/1459"}],"wp:attachment":[{"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/media?parent=1447"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/categories?post=1447"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/tags?post=1447"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}