{"id":2876,"date":"2020-04-20T18:28:01","date_gmt":"2020-04-20T16:28:01","guid":{"rendered":"http:\/\/www.ardpylab.fr\/?page_id=2876"},"modified":"2020-05-15T16:33:53","modified_gmt":"2020-05-15T14:33:53","slug":"gestion-des-sorties-numeriques-2","status":"publish","type":"page","link":"https:\/\/www.ardpylab.fr\/?page_id=2876","title":{"rendered":"Gestion des sorties num\u00e9riques"},"content":{"rendered":"\n<h2 style=\"text-align: center;\"><strong>(par le protocole \u201dFirmata Express\u201d)<\/strong><\/h2>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n\n\n\n<p>Pour modifier l&rsquo;\u00e9tat d&rsquo;une sortie num\u00e9rique (l&rsquo;\u00e9quivalent d&rsquo;un \u201ddigitalWrite\u201d en langage Arduino), il faut au pr\u00e9alable d\u00e9clarer la broche en sortie digitale \u00e0 l\u2019aide de l\u2019instruction suivante :<strong>&nbsp;<br><\/strong><\/p>\n<p style=\"padding-left: 40px;\"><strong>loop.run_until_complete(board.set_pin_mode_digital_output(pin))<\/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>PymataExpress\u201d<\/strong> du module <strong>\u201d<\/strong><strong>pymata-express\u201d<\/strong>,<\/p>\n<p style=\"padding-left: 40px;\">&#8211; <strong>\u201d<\/strong><strong>pin\u201d<\/strong>&nbsp;est le num\u00e9ro de la broche du microcontr\u00f4leur que l\u2019on souhaite d\u00e9clarer en sortie digitale,<\/p>\n<p style=\"padding-left: 40px;\">&#8211; <strong>\u201d<\/strong><strong>loop\u201d<\/strong> est la boucle des t\u00e2ches <strong>\u201d<\/strong><strong>asyncio\u201d<\/strong>&nbsp;d\u00e9clar\u00e9e ainsi&nbsp;<strong>: <\/strong><\/p>\n<p style=\"padding-left: 80px;\"><strong>loop = asyncio.get_event_loop()<\/strong>&nbsp;<\/p>\n<p><br>Le plus simple est de cr\u00e9er une fonction qui sera appel\u00e9e dans nos programmes en Python pour d\u00e9clarer une broche en 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 Set_DigitalOutput_Pin(board, pin):<\/span><\/p>\n<p style=\"padding-left: 40px;\"><span style=\"color: #000000;\">loop.run_until_complete(board.set_pin_mode_digital_output(pin))<\/span><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n\n\n\n<p><br>Ainsi, l\u2019instruction pour d\u00e9clarer la broche <strong>\u201d<\/strong><strong>11\u201d<\/strong>, de l\u2019objet <strong>\u201d<\/strong><strong>board\u201d<\/strong>, en sortie num\u00e9rique&nbsp;est :<\/p>\n<p style=\"padding-left: 40px;\"><strong>Set_DigitalOutput_Pin(board, 11)<\/strong>&nbsp;<br><br><\/p>\n<p>L\u2019\u00e9tat logique de la sortie est alors modifi\u00e9 \u00e0 l\u2019aide de l\u2019instruction suivante&nbsp;:<\/p>\n<p style=\"padding-left: 40px;\"><strong>loop.run_until_complete(board.digital_write(pin, val))<br><br><\/strong><\/p>\n<p>De m\u00eame, on peut d\u00e9finir une fonction pour l\u2019\u00e9criture sur une sortie digitale&nbsp;:<\/p>\n\n\n\n<figure class=\"wp-block-table\">\n<table style=\"width: 97.931%; height: 21px;\">\n<tbody>\n<tr style=\"height: 21px;\">\n<td style=\"height: 21px; padding-left: 40px; width: 100%;\" bgcolor=\"#FFFFCC\">\n<p><span style=\"color: #000000;\">def Digital_Write(board, pin, val):&nbsp;&nbsp;&nbsp;<\/span><\/p>\n<p style=\"padding-left: 40px;\"><span style=\"color: #000000;\"> loop.run_until_complete(board.digital_write(pin, val))<\/span><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n\n\n\n<p>Ainsi, l\u2019instruction pour mettre la sortie num\u00e9rique <strong>\u201d11\u201d<\/strong>, de l\u2019objet <strong>\u201dboard\u201d<\/strong>, \u00e0 l\u2019\u00e9tat haut est :<\/p>\n<p style=\"padding-left: 40px;\"><strong>Digital_Write(board, 11, 1)<\/strong><\/p>\n<p>&nbsp;<\/p>\n<p><u>Exemple<\/u>&nbsp;:<\/p>\n<p>L\u2019exemple d\u2019application de la gestion des sorties num\u00e9riques avec <strong>\u201dFirmata Express\u201d<\/strong> est le m\u00eame que celui avec <strong>\u201dFirmata Standard\u201d<\/strong>. <br><br><\/p>\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=\"575\" height=\"314\"><\/figure>\n<\/div>\n<p>&nbsp;<\/p>\n\n\n\n<p>Le programme adapt\u00e9 \u00e0 la biblioth\u00e8que <strong>\u201dpymata_express\u201d<\/strong> demande \u00e0 l\u2019utilisateur de saisir une instruction (si l\u2019instruction est <strong>\u201dON\u201d<\/strong>, la DEL rouge s\u2019allume, et si c\u2019est <strong>\u201dOFF\u201d<\/strong>, la DEL rouge s\u2019\u00e9teint (programme <strong>\u201d<a href=\"https:\/\/www.ardpylab.fr\/downloads\/firmata-express\/ledrvbdigitaloutput.zip\" data-wplink-url-error=\"true\">LedRVBDigitalOutput.py<\/a>\u201d<\/strong>).<\/p>\n\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.ardpylab.fr\/downloads\/firmata-express\/codes\/py\/LedRVBDigitalOutput.py\" data-wplink-url-error=\"true\"><img loading=\"lazy\" decoding=\"async\" width=\"890\" height=\"980\" class=\"wp-image-2887 aligncenter\" style=\"border: 3px solid #eeeeee; padding: 3px; margin: 3px;\" src=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-firm15.png\" alt=\"\" srcset=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-firm15.png 890w, https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-firm15-272x300.png 272w, https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-firm15-768x846.png 768w\" sizes=\"auto, (max-width: 890px) 100vw, 890px\" \/><\/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 \u201d<strong>ConnectToArduino.py<\/strong>\u201d, contenant les fonctions de connexion \u00e0 l\u2019arduino via le protocole \u201d<strong>Firmata Express<\/strong>\u201d, est import\u00e9. L\u2019importation de ce module importe \u00e9galement les biblioth\u00e8ques :<\/p>\n<p style=\"padding-left: 80px;\">&#8211; \u201d<strong>PymataExpress<\/strong>\u201d pour contr\u00f4ler l\u2019Arduino,<\/p>\n<p style=\"padding-left: 80px;\">\u2013 \u201d<strong>serial.tools.list_ports<\/strong>\u201d pour d\u00e9terminer la liste des ports COM disponibles,<\/p>\n<p style=\"padding-left: 80px;\">\u2013 \u201d<strong>sys<\/strong>\u201d pour sortir du programme.<\/p>\n<p style=\"padding-left: 40px;\">. \u201d<strong>asyncio<\/strong>\u201d n\u00e9cessaire au fonctionnement de \u201d<strong>PymataExpress<\/strong>\u201d<\/p>\n<p style=\"padding-left: 40px;\">. Fonction <strong>\u201d<\/strong><strong>Set_DigitalOutput_Pin\u201d <\/strong>pour d\u00e9clarer une broche en sortie num\u00e9rique,<\/p>\n<p style=\"padding-left: 40px;\">. Fonction <strong>\u201d<\/strong><strong>Digital_Write\u201d <\/strong>pour modifier l\u2019\u00e9tat logique d\u2019une broche num\u00e9rique,<\/p>\n<p style=\"padding-left: 40px;\">. Fonction <strong>\u201d<\/strong><strong>Arduino_Exit\u201d <\/strong>pour fermer le port COM et se d\u00e9connecter de l\u2019Arduino<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)<\/p>\n<p style=\"padding-left: 40px;\">. <strong>PortComArduino <\/strong>(port COM sur lequel l\u2019Arduino est connect\u00e9)<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 de s\u00e9lection du port COM du module \u201d<strong>ConnectToArduino.py<\/strong>\u201d:<\/p>\n<p style=\"padding-left: 80px;\"><strong>PortComArduino = SelectPortCOM()<\/strong><\/p>\n<p style=\"padding-left: 40px;\">Le nombre de port COM disponible est alors d\u00e9termin\u00e9 :<\/p>\n<p style=\"padding-left: 80px;\"><strong>PortsCOM = list(serial.tools.list_ports.comports()<\/strong><\/p>\n<p style=\"padding-left: 40px;\">\u2013&gt; si nombre de port COM = 0 : message d\u2019erreur,<\/p>\n<p style=\"padding-left: 40px;\">\u2013&gt; si nombre de port COM = 1 : s\u00e9lection de ce port COM pour la connexion,<\/p>\n<p style=\"padding-left: 40px;\">\u2013&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-express\/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 style=\"padding-left: 40px;\"><br>. Tentative d\u2019ouverture du port COM s\u00e9lectionn\u00e9 (<strong>PortComArduino<\/strong>) et de connexion \u00e0 l\u2019Arduino via le protocole <strong>\u201dFirmata Express\u201d<\/strong> avec la fonction <strong>\u201dOpenPortCom\u201d<\/strong> du module <strong>\u201dConnectToArduino.py\u201d <\/strong>:<\/p>\n<p style=\"padding-left: 80px;\"><strong>board = OpenPortCom(PortComArduino)<br><br><\/strong><\/p>\n\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.ardpylab.fr\/downloads\/firmata-express\/codes\/py\/ConnectToArduino.py\" data-wplink-url-error=\"true\"><img loading=\"lazy\" decoding=\"async\" width=\"906\" height=\"427\" class=\"wp-image-2889 aligncenter\" style=\"border: 3px solid #eeeeee; padding: 3px; margin: 3px;\" src=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-firm16.png\" alt=\"\" srcset=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-firm16.png 906w, https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-firm16-300x141.png 300w, https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-firm16-768x362.png 768w\" sizes=\"auto, (max-width: 906px) 100vw, 906px\" \/><\/a><\/figure>\n<\/div>\n\n\n\n<p style=\"padding-left: 40px;\"><br \/>\u2013&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.<\/p>\n<p style=\"padding-left: 40px;\">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 \u201dFirmata Express\u201d n\u2019a pas \u00e9t\u00e9 t\u00e9l\u00e9vers\u00e9 dans la m\u00e9moire de l\u2019Arduino.<\/p>\n<p>\u00a0<\/p>\n<p style=\"padding-left: 40px;\">. Si la connexion \u00e0 l\u2019Arduino est r\u00e9ussie:<\/p>\n<p style=\"padding-left: 40px;\">&#8211;&gt; d\u00e9finition d\u2019une boucle asyncio :<\/p>\n<p style=\"padding-left: 80px;\"><strong>loop = asyncio.get_event_loop()<\/strong><\/p>\n<p style=\"padding-left: 40px;\">&#8211;&gt; D\u00e9claration de la broche de la DEL rouge en sortie num\u00e9rique :<\/p>\n<p style=\"padding-left: 80px;\"><strong>Set_DigitalOutput_Pin(board, PinLedR)<\/strong><strong><br \/><br \/><\/strong><\/p>\n<p>&#8211; <u>Boucle principale du programme (boucle \u201d<\/u><u>while True\u201d<\/u><u>)<\/u> :<\/p>\n<p style=\"padding-left: 40px;\">. Attente de la saisie de l\u2019instruction\u00a0:<\/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 : Digital_Write(board,PinLedR,1)<\/strong><\/p>\n<p style=\"padding-left: 80px;\"><strong>elif saisie==\u201dOFF\u201d : Digital_Write(board,PinLedR,0)<br \/><br \/><\/strong><\/p>\n<p>&#8211; <span style=\"text-decoration: underline;\">Fin du programme en appuyant sur Ctrl-C<\/span><\/p>\n<p style=\"padding-left: 40px;\">&#8211;&gt; La DEL rouge est \u00e9teinte et le port s\u00e9rie 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=2852\"><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=2905\"><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 Express\u201d) &nbsp; &nbsp; Pour modifier l&rsquo;\u00e9tat d&rsquo;une sortie num\u00e9rique (l&rsquo;\u00e9quivalent d&rsquo;un \u201ddigitalWrite\u201d en langage Arduino), il faut au pr\u00e9alable d\u00e9clarer la broche en sortie digitale \u00e0 l\u2019aide de l\u2019instruction suivante :&nbsp; loop.run_until_complete(board.set_pin_mode_digital_output(pin)) o\u00f9&nbsp;: &#8211; \u201dboard\u201d est l\u2019objet cr\u00e9\u00e9 lors de l\u2019appel de la m\u00e9thode \u201dPymataExpress\u201d du module \u201dpymata-express\u201d, &#8211; \u201dpin\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-2876","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.ardpylab.fr\/index.php?rest_route=\/wp\/v2\/pages\/2876","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=2876"}],"version-history":[{"count":1,"href":"https:\/\/www.ardpylab.fr\/index.php?rest_route=\/wp\/v2\/pages\/2876\/revisions"}],"predecessor-version":[{"id":5103,"href":"https:\/\/www.ardpylab.fr\/index.php?rest_route=\/wp\/v2\/pages\/2876\/revisions\/5103"}],"wp:attachment":[{"href":"https:\/\/www.ardpylab.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2876"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}