{"id":2754,"date":"2020-04-19T19:09:03","date_gmt":"2020-04-19T17:09:03","guid":{"rendered":"http:\/\/www.ardpylab.fr\/?page_id=2754"},"modified":"2020-05-19T17:52:48","modified_gmt":"2020-05-19T15:52:48","slug":"gestion-des-sorties-numeriques","status":"publish","type":"page","link":"https:\/\/www.ardpylab.fr\/?page_id=2754","title":{"rendered":"Gestion des sorties num\u00e9riques"},"content":{"rendered":"\n<h2 style=\"text-align: center;\"><em><strong>(par le protocole \u201dFirmata standard\u201d)<\/strong><\/em><\/h2>\n<p><br><br><\/p>\n<p>Pour modifier l&rsquo;\u00e9tat d&rsquo;une sortie num\u00e9rique (l&rsquo;\u00e9quivalent d&rsquo;un <strong>\u201d<\/strong><strong>digitalWrite\u201d<\/strong>&nbsp;en langage Arduino), la syntaxe est la suivante :<\/p>\n<p style=\"padding-left: 40px;\"><strong>board.digital[num\u00e9ro_de_pin].write(0_ou_1)<\/strong><\/p>\n<p>o\u00f9&nbsp;:<\/p>\n<p style=\"padding-left: 40px;\">&#8211; <strong>\u201d<\/strong><strong>board\u201d<\/strong> est l\u2019objet cr\u00e9\u00e9 lors de l\u2019appel de la m\u00e9thode <strong>\u201d<\/strong><strong>Arduino\u201d<\/strong>&nbsp;du module <strong>\u201d<\/strong><strong>pyfirmata\u201d<\/strong>,<\/p>\n<p style=\"padding-left: 40px;\">&#8211; <strong>\u201d<\/strong><strong>num\u00e9ro_de_pin\u201d<\/strong>&nbsp;est le num\u00e9ro de la sortie du microcontr\u00f4leur dont on veut modifier l\u2019\u00e9tat,<\/p>\n<p style=\"padding-left: 40px;\">&#8211; <strong>\u201d<\/strong><strong>0_ou_1\u201d<\/strong>&nbsp;est le niveau logique souhait\u00e9.&nbsp;<\/p>\n<p><br>Le plus simple est de cr\u00e9er une fonction qui sera appel\u00e9e dans nos programmes en Python pour modifier l&rsquo;\u00e9tat d&rsquo;une sortie num\u00e9rique&nbsp;:<\/p>\n\n\n\n<figure class=\"wp-block-table\">\n<table style=\"width: 100%; height: 39px;\">\n<tbody>\n<tr style=\"height: 21px;\">\n<td style=\"height: 21px; padding-left: 40px;\" bgcolor=\"#FFFFCC\">\n<p><span style=\"color: #000000;\">def DigitalWrite(board,pin,val):&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;<\/span><\/p>\n<p><span style=\"color: #000000;\">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;board.digital[pin].write(val)<\/span><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n\n\n\n<p><br>Ainsi, l\u2019instruction pour mettre la sortie num\u00e9rique \u201d<strong>9\u201d<\/strong>, de l\u2019objet <strong>\u201d<\/strong><strong>board\u201d<\/strong>,&nbsp;\u00e0 l\u2019\u00e9tat haut est :<\/p>\n<p style=\"padding-left: 40px;\"><strong>DigitalWrite(board, 9, 1)<\/strong>&nbsp;<\/p>\n<p><u><br>Remarque<\/u>&nbsp;:<\/p>\n<p>Contrairement \u00e0 un programme Arduino, avec Pyfirmata, il n\u2019est pas n\u00e9cessaire de d\u00e9clarer au pr\u00e9alable une broche en sortie num\u00e9rique avant de l\u2019utiliser.<br><br><\/p>\n\n\n\n<p><u>Exemple<\/u>&nbsp;:<\/p>\n<p>Avec notre <a href=\"https:\/\/www.ardpylab.fr\/?page_id=2497\/#circuit\" data-wplink-url-error=\"true\">circuit<\/a> support des exemples, nous allons reprendre le programme Arduino qui demande \u00e0 l\u2019utilisateur de saisir une instruction:<\/p>\n<ul>\n<li>si l\u2019instruction est <strong>\u201dON\u201d<\/strong>, la DEL rouge s\u2019allume,<\/li>\n<li>et si c\u2019est <strong>\u201dOFF\u201d<\/strong>, la DEL rouge s\u2019\u00e9teint).<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-2500 aligncenter\" style=\"border: 3px solid #eeeeee; padding: 3px; margin: 3px;\" src=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-ms5.png\" alt=\"\" width=\"561\" height=\"306\"><\/figure>\n<\/div>\n<p>et l\u2019adapter en langage Python en utilisant la biblioth\u00e8que <strong>\u201d<\/strong><strong>pyfirmata\u201d<\/strong> (programme <strong>\u201d<a href=\"https:\/\/www.ardpylab.fr\/downloads\/firmata-standard\/ledrvbdigitaloutput.zip\" data-wplink-url-error=\"true\">LedRVBDigitalOutput.py<\/a>\u201d<\/strong>) :<br><br><\/p>\n\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.ardpylab.fr\/downloads\/firmata-standard\/codes\/py\/LedRVBDigitalOutput.py\" data-wplink-url-error=\"true\"><img loading=\"lazy\" decoding=\"async\" width=\"884\" height=\"728\" class=\"wp-image-2769 aligncenter\" style=\"border: 3px solid #eeeeee; padding: 3px; margin: 3px;\" src=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-firm2b.png\" alt=\"\" srcset=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-firm2b.png 884w, https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-firm2b-300x247.png 300w, https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-firm2b-768x632.png 768w\" sizes=\"auto, (max-width: 884px) 100vw, 884px\" \/><\/a><\/figure>\n<\/div>\n\n\n\n<p><strong><u><br \/>D\u00e9roulement du programme<\/u><\/strong><strong>\u00a0:<\/strong><\/p>\n<p>&#8211; <u>Importation des librairies et d\u00e9finition de fonctions<\/u>\u00a0:<\/p>\n<p style=\"padding-left: 40px;\">. Le module <strong>\u201dConnectToArduino.py\u201d, <\/strong>contenant les fonctions de connexion \u00e0 l\u2019arduino via le protocole <strong>\u201dFirmata standard\u201d<\/strong>, est import\u00e9.<\/p>\n<p style=\"padding-left: 40px;\">L\u2019importation de ce module importe \u00e9galement les biblioth\u00e8ques\u00a0:<\/p>\n<p style=\"padding-left: 80px;\">&#8211; <strong>\u201d<\/strong><strong>pyfirmata\u201d<\/strong>\u00a0pour contr\u00f4ler l\u2019Arduino,<\/p>\n<p style=\"padding-left: 80px;\">&#8211; <strong>\u201d<\/strong><strong>serial.tools.list_ports\u201d<\/strong>\u00a0pour d\u00e9terminer la liste des ports COM disponibles,<\/p>\n<p style=\"padding-left: 80px;\">&#8211; <strong>\u201d<\/strong><strong>sys\u201d <\/strong>pour sortir du programme.<br \/><br \/><\/p>\n<p style=\"padding-left: 40px;\">\u00a0. Fonction <strong>\u201d<\/strong><strong>DigitalWrite\u201d <\/strong>pour modifier l\u2019\u00e9tat logique d\u2019une broche num\u00e9rique.<br \/><br \/><\/p>\n<p>&#8211; <u>D\u00e9claration des constantes et variables<\/u>\u00a0:<\/p>\n<p style=\"padding-left: 40px;\">. <strong>PinLedR = 11<\/strong> (constante correspondant au n\u00b0 de la broche sur laquelle la DEL rouge est connect\u00e9e)<br \/><br \/><\/p>\n<p><a id=\"connect\"><\/a>&#8211; <u>Connexion \u00e0 l&rsquo;Arduino<\/u>\u00a0:<\/p>\n<p style=\"padding-left: 40px;\">. Appel de la fonction du module \u201d<strong>ConnectToArduino.py<\/strong>\u201d de s\u00e9lection du port COM\u00a0:<\/p>\n<p style=\"padding-left: 80px;\"><strong>PortComArduino = SelectPortCOM()<br \/><br \/><\/strong><\/p>\n<p style=\"padding-left: 40px;\">Le nombre de port COM disponible est alors d\u00e9termin\u00e9\u00a0:<\/p>\n<p style=\"padding-left: 80px;\"><strong>PortsCOM = list(serial.tools.list_ports.comports()<\/strong><\/p>\n<p style=\"padding-left: 40px;\">&#8211;&gt; si nombre de port COM = 0 : message d\u2019erreur,<\/p>\n<p style=\"padding-left: 40px;\">&#8211;&gt; si nombre de port COM = 1 : s\u00e9lection de ce port COM pour la connexion,<\/p>\n<p style=\"padding-left: 40px;\">&#8211;&gt; si nombre de port COM &gt; 1 : L\u2019utilisateur doit s\u00e9lectionner le bon port COM.<br \/><br \/><\/p>\n\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.ardpylab.fr\/downloads\/firmata-standard\/codes\/py\/ConnectToArduino.py\" data-wplink-url-error=\"true\"><img loading=\"lazy\" decoding=\"async\" width=\"912\" height=\"751\" class=\"wp-image-2771 aligncenter\" style=\"border: 3px solid #eeeeee; padding: 3px; margin: 3px;\" src=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-firm3.png\" alt=\"\" srcset=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-firm3.png 912w, https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-firm3-300x247.png 300w, https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-firm3-768x632.png 768w\" sizes=\"auto, (max-width: 912px) 100vw, 912px\" \/><\/a><\/figure>\n<\/div>\n\n\n\n<p><br>. Tentative d\u2019ouverture du port COM s\u00e9lectionn\u00e9 (<strong>PortComArduino<\/strong>) et de connexion \u00e0 l&rsquo;Arduino via le protocole <strong>\u201dFirmata standard\u201d<\/strong> avec la fonction \u201d<strong>OpenPortCom<\/strong>\u201d&nbsp;du module \u201d<strong>ConnectToArduino.py<\/strong>\u201d:<\/p>\n<p style=\"padding-left: 40px;\"><strong>board = OpenPortCom(PortComArduino)<\/strong><\/p>\n<p style=\"padding-left: 40px;\">&#8211;&gt; message d\u2019erreur et le programme est arr\u00eat\u00e9 si l\u2019ouverture du port COM s\u00e9lectionn\u00e9 ou la cr\u00e9ation de l\u2019objet <strong>\u201dboard\u201d<\/strong> a \u00e9chou\u00e9. <br>Un \u00e9chec lors de la connexion se produit si le port COM indiqu\u00e9 ne correspond pas \u00e0 un port Arduino ou si le protocole <strong>\u201dFirmata standard\u201d <\/strong>n&rsquo;a pas \u00e9t\u00e9 t\u00e9l\u00e9vers\u00e9 dans la m\u00e9moire de l&rsquo;Arduino.<\/p>\n\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.ardpylab.fr\/downloads\/firmata-standard\/codes\/py\/ConnectToArduino.py\" data-wplink-url-error=\"true\"><img loading=\"lazy\" decoding=\"async\" width=\"930\" height=\"553\" class=\"wp-image-2776 aligncenter\" style=\"border: 3px solid #eeeeee; padding: 3px; margin: 3px;\" src=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-firm4.png\" alt=\"\" srcset=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-firm4.png 930w, https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-firm4-300x178.png 300w, https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-firm4-768x457.png 768w\" sizes=\"auto, (max-width: 930px) 100vw, 930px\" \/><\/a><\/figure>\n<\/div>\n\n\n\n<p><br \/>&#8211; <u>Boucle principale du programme (boucle <strong>\u201d<\/strong><\/u><strong><u>while True\u201d<\/u><\/strong><u>)<\/u> :<\/p>\n<p style=\"padding-left: 40px;\">. Si la connexion \u00e0 l\u2019Arduino est r\u00e9ussie, attente de la saisie de l\u2019instruction :<\/p>\n<p style=\"padding-left: 80px;\"><strong>saisie = str(input(\u201d\u201d))<\/strong><\/p>\n<p style=\"padding-left: 40px;\">. La DEL rouge est allum\u00e9e ou \u00e9teinte suivant l\u2019instruction saisie\u00a0:<\/p>\n<p style=\"padding-left: 80px;\"><strong>if saisie==\u201dON\u201d : DigitalWrite(board,PinLedR,1)<\/strong><\/p>\n<p style=\"padding-left: 80px;\"><strong>elif saisie==\u201dOFF\u201d : DigitalWrite(board,PinLedR,0)<br \/><br \/><\/strong><\/p>\n<p>&#8211; <u>Fin du programme en appuyant sur <\/u><u>Ctrl-C<\/u>\u00a0:<\/p>\n<p style=\"padding-left: 40px;\">&#8211;&gt; La DEL rouge est \u00e9teinte et le port COM est ferm\u00e9.<\/p>\n<p>\u00a0<\/p>\n\n\n<div  class=\"grids-section grids-is-stretch\" style=\"--_gs-gap-desktop:0px 0px;--_gs-m-desktop:0 0 0 0;--_gs-p-desktop:0 0 0 0;--_gs-bg-desktop:transparent none;--_gs-bg-xp-desktop:0px;--_gs-zi-desktop:auto;--_gs-d-desktop:block;--_gs-mw-desktop:calc(100% - 0 - 0);--_gs-gap-tablet:0px 0px;--_gs-m-tablet:0 0 0 0;--_gs-p-tablet:0 0 0 0;--_gs-bg-tablet:transparent none;--_gs-bg-xp-tablet:0px;--_gs-zi-tablet:auto;--_gs-d-tablet:block;--_gs-mw-tablet:calc(100% - 0 - 0);--_gs-gap-mobile:0px 0px;--_gs-m-mobile:0 0 0 0;--_gs-p-mobile:0 0 0 0;--_gs-bg-mobile:transparent none;--_gs-bg-xp-mobile:0px;--_gs-zi-mobile:auto;--_gs-d-mobile:block;--_gs-mw-mobile:calc(100% - 0 - 0);--_gs-columns:2;--_gs-rows:1\"><div class=\"grids-s-w_i\">\n<div class=\"grids-area\" style=\"--_ga-column:1\/2;--_ga-row:1\/2;--_ga-m-desktop:0 0 0 0;--_ga-p-desktop:0 0 0 0;--_ga-bg-desktop:transparent none;--_ga-zi-desktop:auto;--_ga-d-desktop:flex;--_ga-mw-desktop:calc(100% - 0 - 0);--_ga-m-tablet:0 0 0 0;--_ga-p-tablet:0 0 0 0;--_ga-bg-tablet:transparent none;--_ga-zi-tablet:auto;--_ga-d-tablet:flex;--_ga-mw-tablet:calc(100% - 0 - 0);--_ga-m-mobile:0 0 0 0;--_ga-p-mobile:0 0 0 0;--_ga-bg-mobile:transparent none;--_ga-zi-mobile:auto;--_ga-d-mobile:flex;--_ga-mw-mobile:calc(100% - 0 - 0)\">\n\n<div class=\"wp-block-image\"><figure class=\"alignleft size-large\"><a href=\"https:\/\/www.ardpylab.fr\/?page_id=2739\"><img loading=\"lazy\" decoding=\"async\" width=\"50\" height=\"28\" src=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/03\/moins.jpg\" alt=\"\" class=\"wp-image-107\"\/><\/a><\/figure><\/div>\n\n<\/div>\n\n<div class=\"grids-area\" style=\"--_ga-column:2\/3;--_ga-row:1\/2;--_ga-m-desktop:0 0 0 0;--_ga-p-desktop:0 0 0 0;--_ga-bg-desktop:transparent none;--_ga-zi-desktop:auto;--_ga-d-desktop:flex;--_ga-mw-desktop:calc(100% - 0 - 0);--_ga-m-tablet:0 0 0 0;--_ga-p-tablet:0 0 0 0;--_ga-bg-tablet:transparent none;--_ga-zi-tablet:auto;--_ga-d-tablet:flex;--_ga-mw-tablet:calc(100% - 0 - 0);--_ga-m-mobile:0 0 0 0;--_ga-p-mobile:0 0 0 0;--_ga-bg-mobile:transparent none;--_ga-zi-mobile:auto;--_ga-d-mobile:flex;--_ga-mw-mobile:calc(100% - 0 - 0)\">\n\n<div class=\"wp-block-image\"><figure class=\"alignright size-large\"><a href=\"https:\/\/www.ardpylab.fr\/?page_id=2784\"><img loading=\"lazy\" decoding=\"async\" width=\"50\" height=\"28\" src=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/03\/plus.jpg\" alt=\"\" class=\"wp-image-106\"\/><\/a><\/figure><\/div>\n\n<\/div>\n<\/div><\/div>\n\n\n\n","protected":false},"excerpt":{"rendered":"<p>(par le protocole \u201dFirmata standard\u201d) Pour modifier l&rsquo;\u00e9tat d&rsquo;une sortie num\u00e9rique (l&rsquo;\u00e9quivalent d&rsquo;un \u201ddigitalWrite\u201d&nbsp;en langage Arduino), la syntaxe est la suivante : board.digital[num\u00e9ro_de_pin].write(0_ou_1) o\u00f9&nbsp;: &#8211; \u201dboard\u201d est l\u2019objet cr\u00e9\u00e9 lors de l\u2019appel de la m\u00e9thode \u201dArduino\u201d&nbsp;du module \u201dpyfirmata\u201d, &#8211; \u201dnum\u00e9ro_de_pin\u201d&nbsp;est le num\u00e9ro de la sortie du microcontr\u00f4leur dont on veut modifier l\u2019\u00e9tat, &#8211; \u201d0_ou_1\u201d&nbsp;est le [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-2754","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.ardpylab.fr\/index.php?rest_route=\/wp\/v2\/pages\/2754","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ardpylab.fr\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.ardpylab.fr\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.ardpylab.fr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ardpylab.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2754"}],"version-history":[{"count":1,"href":"https:\/\/www.ardpylab.fr\/index.php?rest_route=\/wp\/v2\/pages\/2754\/revisions"}],"predecessor-version":[{"id":5221,"href":"https:\/\/www.ardpylab.fr\/index.php?rest_route=\/wp\/v2\/pages\/2754\/revisions\/5221"}],"wp:attachment":[{"href":"https:\/\/www.ardpylab.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2754"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}