{"id":2969,"date":"2020-04-21T12:29:08","date_gmt":"2020-04-21T10:29:08","guid":{"rendered":"http:\/\/www.ardpylab.fr\/?page_id=2969"},"modified":"2020-05-10T17:11:54","modified_gmt":"2020-05-10T15:11:54","slug":"la-bibliotheque-arduino-tone","status":"publish","type":"page","link":"https:\/\/www.ardpylab.fr\/?page_id=2969","title":{"rendered":"La biblioth\u00e8que Arduino \u201dTone\u201d"},"content":{"rendered":"\n<h2 style=\"text-align: center;\"><span style=\"color: #333333;\"><em><strong>(prise en charge par le <\/strong><\/em><\/span><span style=\"color: #333333;\"><em><strong>protocole <br \/>\u201dFirmata Express\u201d)<\/strong><\/em><\/span><\/h2>\n\n\n\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>Pour produire un son avec un Arduino, on utilise un petit haut\u2010parleur ou un buzzer (transducteur) pi\u00e9zo\u2010\u00e9lectrique (commun\u00e9ment appel\u00e9 \u201dpiezo\u201d) connect\u00e9 sur une des sorties de l\u2019Arduino comme ci-dessous :<\/p>\n\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-2970 aligncenter\" style=\"border: 3px solid #eeeeee; padding: 3px; margin: 3px;\" src=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-firm20.png\" alt=\"\" width=\"573\" height=\"314\"><\/figure>\n<\/div>\n\n\n\n<p><br>En langage Arduino, Le signal \u00e9lectrique appliqu\u00e9 par le microcontr\u00f4leur sur une de ses sorties digitales ou analogiques, sur laquelle est connect\u00e9 le piezo ou le haut\u2010parleur, est r\u00e9alis\u00e9 avec la fonction <strong>tone()<\/strong>.<\/p>\n<p>Cette fonction g\u00e9n\u00e8re une onde carr\u00e9e (onde sym\u00e9trique avec \u00ab\u00a0duty cycle\u00a0\u00bb (niveau haut\/p\u00e9riode) \u00e0 50%) \u00e0 la fr\u00e9quence sp\u00e9cifi\u00e9e en Hertz (Hz) sur une broche. <br>La dur\u00e9e peut \u00eatre pr\u00e9cis\u00e9e, sinon l&rsquo;impulsion continue jusqu&rsquo;\u00e0 l&rsquo;appel de l&rsquo;instruction <strong>noTone()<\/strong>.<\/p>\n<p>Avec <strong>\u201d<\/strong><strong>pymata-express\u201d<\/strong>&nbsp;pour utiliser une broche de l\u2019Arduino en mode <strong>\u201dtone\u201d<\/strong>, il faut au pr\u00e9alable la d\u00e9clarer avec l\u2019instruction :<\/p>\n<p style=\"padding-left: 40px;\"><strong>loop.run_until_complete(board.set_pin_mode_tone(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 sur laquelle est connect\u00e9 le piezo ou le haut\u2010parleur,<\/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>d\u00e9clar\u00e9e ainsi <strong>: <\/strong><\/p>\n<p style=\"padding-left: 80px;\"><strong>loop = asyncio.get_event_loop()<\/strong><\/p>\n<p><strong>&nbsp;<\/strong><\/p>\n<p>On peut d\u00e9finir une fonction d\u00e9clarant plus facilement une broche en mode <strong>\u201dtone\u201d<\/strong> :<br><br><\/p>\n\n\n\n<figure class=\"wp-block-table\">\n<table style=\"width: 100%; height: 25px;\">\n<tbody>\n<tr style=\"height: 21px;\">\n<td style=\"height: 25px; padding-left: 40px; width: 100%;\" bgcolor=\"#FFFFCC\">\n<p><span style=\"color: #000000;\">def Set_Tone_Pin(board,pin):<\/span><\/p>\n<p style=\"padding-left: 40px;\"><span style=\"color: #000000;\">loop.run_until_complete(board.set_pin_mode_tone(pin))<\/span><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n\n\n\n<p><br>La syntaxe pour d\u00e9clarer la broche N\u00b0 <strong>3<\/strong> en mode <strong>\u201dtone\u201d<\/strong> est alors plus simple :<\/p>\n<p style=\"padding-left: 40px;\"><strong>Set_Tone_Pin(board,3)<br><br><\/strong><\/p>\n<p>Ensuite, on peut produire un son de fr\u00e9quence <strong>\u201d<\/strong><strong>F\u201d<\/strong> en Hz pendant une dur\u00e9e <strong>\u201d<\/strong><strong>D\u201d<\/strong> en ms avec un piezo connect\u00e9 sur la broche <strong>\u201d<\/strong><strong>pin\u201d<\/strong>&nbsp;au moyen de cette instruction&nbsp;:<\/p>\n<p style=\"padding-left: 40px;\"><strong>loop.run_until_complete(board.play_tone(pin, F, D))<\/strong><\/p>\n<p>L\u2019onde sonore peut \u00eatre \u00e9mise de fa\u00e7on continue&nbsp;:<\/p>\n<p style=\"padding-left: 40px;\"><strong>loop.run_until_complete(board.play_tone_continuously(pin, F))<\/strong><\/p>\n<p><strong>&nbsp;<\/strong><\/p>\n<p>Le plus simple est de r\u00e9unir les deux instructions dans une seule fonction dont les arguments sont le <strong>N\u00b0 de la broche<\/strong>, <strong>la fr\u00e9quence<\/strong> et l<strong>a dur\u00e9e<\/strong>, puis d\u2019utiliser l\u2019une ou l\u2019autre instruction en fonction de la valeur de la dur\u00e9e&nbsp;:<br><br><\/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 Tone(board,pin,freq,duration):<\/span><\/p>\n<p style=\"padding-left: 40px;\"><span style=\"color: #000000;\">if duration&gt;0:<\/span><\/p>\n<p style=\"padding-left: 80px;\"><span style=\"color: #000000;\">loop.run_until_complete(board.play_tone(pin, freq, duration))<\/span><\/p>\n<p style=\"padding-left: 40px;\"><span style=\"color: #000000;\">else:<\/span><\/p>\n<p style=\"padding-left: 80px;\"><span style=\"color: #000000;\">loop.run_until_complete(board.play_tone_continuously(pin, freq))<\/span><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n\n\n\n<p><br>Ainsi, la commande pour \u00e9mettre un son, avec un piezo connect\u00e9 \u00e0 la broche N\u00b03, \u00e0 une fr\u00e9quence de 440 Hz est&nbsp;:<\/p>\n<p style=\"padding-left: 40px;\">&#8211; Pendant 1 s&nbsp;:<strong> Tone(board,3,440,1000)<\/strong><\/p>\n<p style=\"padding-left: 40px;\">&#8211; De fa\u00e7on continue&nbsp;:<strong> Tone(board,3,440,0)<\/strong><\/p>\n<p><strong>&nbsp;<\/strong><\/p>\n<p>Une onde sonore \u00e9mise en continu est arr\u00eat\u00e9e avec l\u2019instruction&nbsp;:<\/p>\n<p style=\"padding-left: 40px;\"><strong>loop.run_until_complete(board.play_tone_off(pin))<\/strong><\/p>\n<p>o\u00f9 <strong>\u201d<\/strong><strong>pin\u201d<\/strong>&nbsp;est le num\u00e9ro de la broche du microcontr\u00f4leur sur laquelle est connect\u00e9 le piezo ou le haut\u2010parleur.&nbsp;<\/p>\n<p>On d\u00e9finira une fonction utilisant cette instruction&nbsp;:<br><br><\/p>\n\n\n\n<figure class=\"wp-block-table\">\n<table style=\"width: 100%; height: 21px;\">\n<tbody>\n<tr style=\"height: 21px;\">\n<td style=\"height: 21px; padding-left: 40px;\" bgcolor=\"#FFFFCC\">\n<p><span style=\"color: #000000;\">def No_Tone(board,pin):<\/span><\/p>\n<p style=\"padding-left: 40px;\"><span style=\"color: #000000;\">loop.run_until_complete(board.play_tone_off(pin))<\/span><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n\n\n\n<p><br>Et pour arr\u00eater l\u2019\u00e9mission sonore sur la broche N\u00b03, l\u2019instruction devient :<\/p>\n<p style=\"padding-left: 40px;\"><strong>No_Tone(board,3)<br><br><\/strong><\/p>\n<p><u>Exemple<\/u>&nbsp;:<\/p>\n<p>Le programme d\u2019application (<strong>\u201d<a href=\"https:\/\/www.ardpylab.fr\/downloads\/firmata-express\/tone.zip\" data-wplink-url-error=\"true\">Tone.py<\/a>\u201d<\/strong>) suivant, \u00e9met un \u201dbeep\u201d sonore :<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\/Tone.py\" data-wplink-url-error=\"true\"><img loading=\"lazy\" decoding=\"async\" width=\"845\" height=\"1024\" class=\"wp-image-2978 aligncenter\" style=\"border: 3px solid #eeeeee; padding: 3px; margin: 3px;\" src=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-firm21-845x1024.png\" alt=\"\" srcset=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-firm21-845x1024.png 845w, https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-firm21-247x300.png 247w, https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-firm21-768x931.png 768w, https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-firm21.png 933w\" sizes=\"auto, (max-width: 845px) 100vw, 845px\" \/><\/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\u00a0et d\u00e9finition de fonctions<\/u> :<\/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,<\/p>\n<p style=\"padding-left: 40px;\">. La biblioth\u00e8que <strong>\u201d<\/strong><strong>asyncio\u201d <\/strong>n\u00e9cessaire au fonctionnement de <strong>\u201d<\/strong><strong>PymataExpress\u201d<\/strong>,<\/p>\n<p style=\"padding-left: 40px;\">. La biblioth\u00e8que <strong>\u201d<\/strong><strong>time\u201d<\/strong>\u00a0pour la gestion des dur\u00e9es d\u2019\u00e9mission et de silence.<\/p>\n<p style=\"padding-left: 40px;\">. Fonction <strong>vSet_Tone_Pin\u201d <\/strong>pour d\u00e9clarer une broche en mode <strong>\u201d<\/strong><strong>Tone<\/strong><strong>\u201d<\/strong>,<\/p>\n<p style=\"padding-left: 40px;\">. Fonction <strong>\u201d<\/strong><strong>Tone\u201d <\/strong>pour produire une onde sonore de fr\u00e9quence fix\u00e9e en Hz,<\/p>\n<p style=\"padding-left: 40px;\">. Fonction <strong>\u201d<\/strong><strong>No_Tone\u201d <\/strong>pour arr\u00eater l\u2019\u00e9misssion sonore,<\/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>PinTone = 3<\/strong> (constante correspondant au n\u00b0 de la broche sur laquelle le piezo est connect\u00e9)<\/p>\n<p style=\"padding-left: 40px;\">. <strong>FreqTone = 440<\/strong> (variable correspondant \u00e0 la fr\u00e9quence en Hz de l\u2019onde sonore)<\/p>\n<p style=\"padding-left: 40px;\">. <strong>TimeSleep1 = 0.5 <\/strong>(variable correspondant \u00e0 la dur\u00e9e d\u2019\u00e9mission du son en s)<\/p>\n<p style=\"padding-left: 40px;\">. <strong>TimeSleep2 = 0.5 <\/strong>(variable correspondant \u00e0 la dur\u00e9e du silence en s)<\/p>\n<p style=\"padding-left: 40px;\">. <strong>PortComArduino <\/strong>(port COM sur lequel l\u2019Arduino est connect\u00e9)<br \/><br \/><\/p>\n<p>&#8211; <u>Connexion \u00e0 l&rsquo;Arduino<\/u>\u00a0:<\/p>\n<p style=\"padding-left: 40px;\">. D\u00e9tection du port COM\u00a0:<\/p>\n<p style=\"padding-left: 80px;\"><strong>PortComArduino = SelectPortCOM()<\/strong><\/p>\n<p style=\"padding-left: 40px;\">. Tentative d\u2019ouverture du port COM s\u00e9lectionn\u00e9\u00a0et connexion \u00e0 l\u2019Arduino:<\/p>\n<p style=\"padding-left: 80px;\"><strong>board = OpenPortCom(PortComArduino)<\/strong><\/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 :\u00a0<\/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 du piezo en mode <strong>\u201d<\/strong><strong>Tone\u201d<\/strong>\u00a0:<\/p>\n<p style=\"padding-left: 80px;\"><strong>Set_Tone_Pin(board, PinTone)<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;\">. Emission de l\u2019onde sonore \u00e0 la fr\u00e9quence <strong>\u201dFreqTone\u201d<\/strong> pendant <strong>\u201dTimeSleep1\u201d<\/strong>,<\/p>\n<p style=\"padding-left: 40px;\">. puis silence pendant <strong>\u201dTimeSleep2\u201d<\/strong>,<\/p>\n<p style=\"padding-left: 40px;\">. puis nouvelle \u00e9mission,<\/p>\n<p style=\"padding-left: 40px;\">. etc\u2026<br \/><br \/><\/p>\n<p>&#8211; <u>Fin du programme en appuyant sur <\/u><u>Ctrl-C\u00a0:<\/u><\/p>\n<p style=\"padding-left: 40px;\">&#8211;&gt; Arr\u00eat de l\u2019\u00e9mission sonore 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=2942\"><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=2987\"><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>(prise en charge par le protocole \u201dFirmata Express\u201d) &nbsp; &nbsp; Pour produire un son avec un Arduino, on utilise un petit haut\u2010parleur ou un buzzer (transducteur) pi\u00e9zo\u2010\u00e9lectrique (commun\u00e9ment appel\u00e9 \u201dpiezo\u201d) connect\u00e9 sur une des sorties de l\u2019Arduino comme ci-dessous : En langage Arduino, Le signal \u00e9lectrique appliqu\u00e9 par le microcontr\u00f4leur sur une de ses sorties [&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-2969","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.ardpylab.fr\/index.php?rest_route=\/wp\/v2\/pages\/2969","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=2969"}],"version-history":[{"count":0,"href":"https:\/\/www.ardpylab.fr\/index.php?rest_route=\/wp\/v2\/pages\/2969\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.ardpylab.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2969"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}