{"id":2638,"date":"2013-10-14T08:34:30","date_gmt":"2013-10-14T06:34:30","guid":{"rendered":"http:\/\/www.alphak.net\/news\/?p=2638"},"modified":"2014-09-21T16:44:56","modified_gmt":"2014-09-21T14:44:56","slug":"winter-is-coming-s01e01","status":"publish","type":"post","link":"https:\/\/www.alphak.net\/news\/2013\/10\/winter-is-coming-s01e01\/","title":{"rendered":"Winter is coming &#8211; S01E01"},"content":{"rendered":"<p><strong>L&rsquo;hiver vient.<\/strong> Apr\u00e8s avoir automatis\u00e9 le d\u00e9marrage et l&rsquo;arr\u00eat des radiateurs de mon appartement gr\u00e2ce \u00e0 l&rsquo;installation de <a title=\"Chauffage chauffage, plus loin que la nuit et le jour !\" href=\"http:\/\/www.alphak.net\/news\/2012\/10\/chauffage-chauffage-plus-loin-que-la-nuit-et-le-jour\/\">fils pilotes<\/a> et d&rsquo;une <a title=\"Et la chaleur fut\u2026\" href=\"http:\/\/www.alphak.net\/news\/2012\/10\/et-la-chaleur-fut\/\">centrale de programmation<\/a>, je souhaite vivement mettre en place une fonctionnalit\u00e9 similaire sur ma <strong>climatisation r\u00e9versible<\/strong>. Elle constitue pour moi un moyen \u00e9conomique et rapide de chauffer ma pi\u00e8ce principale, il serait donc int\u00e9ressant de pouvoir la d\u00e9clencher de mani\u00e8re programm\u00e9e, ou encore mieux, \u00e0 distance, par exemple de mani\u00e8re automatique le matin avant que je me l\u00e8ve, ou manuellement \u00e0 l&rsquo;heure o\u00f9 je sors du travail, afin que la pi\u00e8ce soit d\u00e9j\u00e0 chauff\u00e9e lorsque j&rsquo;arrive chez moi.<\/p>\n<p>Seulement, mettre en place un tel projet n&rsquo;est pas \u00e9vident. Ma clim de marque <strong>Airton<\/strong> n&rsquo;est <strong>pas programmable<\/strong>. Je ne peux pas non plus automatiser son d\u00e9clenchement en connectant son alimentation sur des relais, cela \u00e9quivaudrait \u00e0 couper brutalement le courant lorsque je demande un arr\u00eat, ce qui n&rsquo;est pas conseill\u00e9 quand le climatiseur est activ\u00e9.<\/p>\n<p>Ma seule possibilit\u00e9 d&rsquo;interaction avec l&rsquo;appareil reste sa <strong>t\u00e9l\u00e9commande<\/strong>. Je dois donc trouver un moyen de r\u00e9cup\u00e9rer les <strong>codes infrarouges<\/strong> envoy\u00e9s par la t\u00e9l\u00e9commande et de les faire reproduire par un second dispositif automatisable.<\/p>\n<p>Pour r\u00e9cup\u00e9rer les codes de la t\u00e9l\u00e9commande d&rsquo;origine, j&rsquo;ai choisi de ressortir mon <strong>Arduino<\/strong>, qui jusqu&rsquo;ici ne m&rsquo;avait pas encore beaucoup servi, et de lui connecter un <strong>r\u00e9cepteur infrarouge<\/strong> issu d&rsquo;un petit kit de d\u00e9veloppement command\u00e9 chez <a href=\"http:\/\/dx.com\/p\/ir-receiver-module-wireless-remote-control-kit-for-arduino-1-x-cr2025-135520\" target=\"_blank\">DealExtreme<\/a>. J&rsquo;ai effectu\u00e9 le c\u00e2blage de la mani\u00e8re suivante :<\/p>\n<p><a href=\"http:\/\/cdn.alphak.net\/news\/wp-content\/uploads\/sites\/2\/2013\/10\/ir-receiver-breadboard.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2657\" src=\"http:\/\/cdn.alphak.net\/news\/wp-content\/uploads\/sites\/2\/2013\/10\/ir-receiver-breadboard.jpg\" alt=\"ir-receiver-breadboard\" width=\"640\" height=\"463\" srcset=\"https:\/\/cdn.alphak.net\/wp-content\/uploads\/sites\/2\/2013\/10\/ir-receiver-breadboard.jpg 640w, https:\/\/cdn.alphak.net\/wp-content\/uploads\/sites\/2\/2013\/10\/ir-receiver-breadboard-300x217.jpg 300w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/><\/a><a href=\"http:\/\/cdn.alphak.net\/news\/wp-content\/uploads\/sites\/2\/2013\/10\/ir-receiver-schematics.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2658\" src=\"http:\/\/cdn.alphak.net\/news\/wp-content\/uploads\/sites\/2\/2013\/10\/ir-receiver-schematics.jpg\" alt=\"ir-receiver-schematics\" width=\"640\" height=\"616\" srcset=\"https:\/\/cdn.alphak.net\/wp-content\/uploads\/sites\/2\/2013\/10\/ir-receiver-schematics.jpg 640w, https:\/\/cdn.alphak.net\/wp-content\/uploads\/sites\/2\/2013\/10\/ir-receiver-schematics-300x289.jpg 300w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/><\/a>Je pr\u00e9cise, pour ceux qui ne connaissent pas et qui voudrait r\u00e9aliser des plans de c\u00e2blage similaires, que ces sch\u00e9mas ont \u00e9t\u00e9 r\u00e9alis\u00e9s avec le fabuleux <a href=\"http:\/\/fritzing.org\/download\/\" target=\"_blank\">Fritzing<\/a>. Attention, selon le type de r\u00e9cepteur infrarouge utilis\u00e9, le brochage peut varier. V\u00e9rifiez la notice du composant en cas de doute.<\/p>\n<p>J&rsquo;ai r\u00e9cup\u00e9r\u00e9 et utilis\u00e9 la <strong>biblioth\u00e8que de commande infrarouge<\/strong> pour Arduino d\u00e9velopp\u00e9e par Ken Shirriff sur la <a href=\"https:\/\/github.com\/shirriff\/Arduino-IRremote\" target=\"_blank\">page GitHub associ\u00e9e<\/a>. Le blog de Ken Shirriff regorge \u00e9galement d&rsquo;<a href=\"http:\/\/www.righto.com\/2009\/08\/multi-protocol-infrared-remote-library.html\" target=\"_blank\">excellentes explications<\/a> sur l&rsquo;utilisation de cette biblioth\u00e8que.<\/p>\n<p>J&rsquo;ai enfin compil\u00e9 et d\u00e9ploy\u00e9 le code suivant sur l&rsquo;Arduino. C&rsquo;est du quick and dirty, pour le test :<\/p>\n<pre class=\"prettyprint\">#include &lt;IRremote.h&gt;\r\nint RECV_PIN = 11; &#47;&#47;define input pin on Arduino\r\nIRrecv irrecv(RECV_PIN);\r\ndecode_results results;\r\n\r\nvoid setup()\r\n{\r\n\tSerial.begin(9600);\r\n\tirrecv.enableIRIn(); &#47;&#47; Start the receiver\r\n\tirrecv.blink13(true); &#47;&#47; Blink LED 13 during IR reception\r\n}\r\n\r\n&#47;&#47; Dumps out the decode_results structure.\r\n&#47;&#47; Call this after IRrecv::decode()\r\nvoid dump(decode_results *results) {\r\n\tint count = results-&gt;rawlen;\r\n\tif (results-&gt;decode_type == UNKNOWN) {\r\n\t\tSerial.print(&#34;Unknown encoding: &#34;);\r\n\t}\r\n\telse if (results-&gt;decode_type == NEC) {\r\n\t\tSerial.print(&#34;Decoded NEC: &#34;);\r\n\t}\r\n\telse if (results-&gt;decode_type == SONY) {\r\n\t\tSerial.print(&#34;Decoded SONY: &#34;);\r\n\t}\r\n\telse if (results-&gt;decode_type == RC5) {\r\n\t\tSerial.print(&#34;Decoded RC5: &#34;);\r\n\t}\r\n\telse if (results-&gt;decode_type == RC6) {\r\n\t\tSerial.print(&#34;Decoded RC6: &#34;);\r\n\t}\r\n\telse if (results-&gt;decode_type == PANASONIC) {\r\n\t\tSerial.print(&#34;Decoded PANASONIC - Address: &#34;);\r\n\t\tSerial.print(results-&gt;panasonicAddress,HEX);\r\n\t\tSerial.print(&#34; Value: &#34;);\r\n\t}\r\n\telse if (results-&gt;decode_type == JVC) {\r\n\t\tSerial.print(&#34;Decoded JVC: &#34;);\r\n\t}\r\n\tSerial.print(results-&gt;value, HEX);\r\n\tSerial.print(&#34; (&#34;);\r\n\tSerial.print(results-&gt;bits, DEC);\r\n\tSerial.println(&#34; bits)&#34;);\r\n\tSerial.print(&#34;Raw (&#34;);\r\n\tSerial.print(count, DEC);\r\n\tSerial.print(&#34;): &#34;);\r\n\r\n\tfor (int i = 0; i &lt; count; i++) {\r\n\t\tif ((i % 2) == 1) {\r\n\t\t\tSerial.print(results-&gt;rawbuf&#091;i&#093;*USECPERTICK, DEC);\r\n\t\t}\r\n\t\telse {\r\n\t\t\tSerial.print(-(int)results-&gt;rawbuf&#091;i&#093;*USECPERTICK, DEC);\r\n\t\t}\r\n\t\tSerial.print(&#34; &#34;);\r\n\t}\r\n\tSerial.println(&#34;&#34;);\r\n}\r\n\r\nvoid loop() {\r\n\tif (irrecv.decode(&amp;results)) {\r\n\t\tSerial.println(results.value, HEX);\r\n\t\tdump(&amp;results);\r\n\t\tirrecv.resume(); &#47;&#47; Receive the next value\r\n\t}\r\n}<\/pre>\n<p>La carte est maintenant pr\u00eate \u00e0 recevoir les codes de quelques t\u00e9l\u00e9commandes. Afin d&rsquo;afficher les codes IR reconnus par le dispositif, il est n\u00e9cessaire de lancer le<strong> moniteur s\u00e9rie<\/strong> de l&rsquo;\u00e9diteur Arduino.<\/p>\n<div id=\"attachment_2653\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/cdn.alphak.net\/news\/wp-content\/uploads\/sites\/2\/2013\/10\/arduino-and-ir-receiver.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-2653\" class=\"size-medium wp-image-2653\" src=\"http:\/\/cdn.alphak.net\/news\/wp-content\/uploads\/sites\/2\/2013\/10\/arduino-and-ir-receiver-300x225.jpg\" alt=\"Montage sur platine d'essais, on ne peut plus simple.\" width=\"300\" height=\"225\" srcset=\"https:\/\/cdn.alphak.net\/wp-content\/uploads\/sites\/2\/2013\/10\/arduino-and-ir-receiver-300x225.jpg 300w, https:\/\/cdn.alphak.net\/wp-content\/uploads\/sites\/2\/2013\/10\/arduino-and-ir-receiver-768x576.jpg 768w, https:\/\/cdn.alphak.net\/wp-content\/uploads\/sites\/2\/2013\/10\/arduino-and-ir-receiver.jpg 1024w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-2653\" class=\"wp-caption-text\">Montage sur platine d&rsquo;essais, on ne peut plus simple.<\/p><\/div>\n<p>La plupart des t\u00e9l\u00e9commandes que j&rsquo;avais sous la main ont \u00e9t\u00e9 reconnues par le r\u00e9cepteur, \u00e0 l&rsquo;exception de ma t\u00e9l\u00e9commande Xbox. La LED du r\u00e9cepteur clignote lorsqu&rsquo;il re\u00e7oit un signal IR. C&rsquo;est d&rsquo;ailleurs ce qui m&rsquo;a permis de constater que mon \u00e9cran PC <strong>parasitait<\/strong> le r\u00e9cepteur, j&rsquo;ai donc pris soin de conserver une distance suffisante entre les deux appareils pour mes tests.<\/p>\n<p>Je me suis par la suite focalis\u00e9 sur le <strong>d\u00e9codage des codes IR<\/strong> re\u00e7us, et affich\u00e9s dans moniteur s\u00e9rie. Sans surprise, la t\u00e9l\u00e9commande DealExtreme affiche les codes de t\u00e9l\u00e9commande <strong>NEC<\/strong>, tels que l&rsquo;indique sa documentation.<\/p>\n<p>La t\u00e9l\u00e9commande de mon climatiseur <strong>Airton<\/strong> est \u00e9galement reconnue comme utilisant le <strong>protocole NEC<\/strong>. En cherchant des informations sur ce protocole, j&rsquo;ai trouv\u00e9 entre autres <a href=\"http:\/\/wiki.altium.com\/display\/ADOH\/NEC+Infrared+Transmission+Protocol\" target=\"_blank\">cette synth\u00e8se<\/a>, tr\u00e8s bien r\u00e9alis\u00e9e. Elle m&rsquo;a alors permis de v\u00e9rifier si les codes IR re\u00e7us \u00e9taient coh\u00e9rents par rapport au protocole reconnu.<\/p>\n<p><a href=\"http:\/\/cdn.alphak.net\/news\/wp-content\/uploads\/sites\/2\/2013\/10\/decoded-ir-codes-with-raw-data.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2650\" src=\"http:\/\/cdn.alphak.net\/news\/wp-content\/uploads\/sites\/2\/2013\/10\/decoded-ir-codes-with-raw-data.png\" alt=\"decoded-ir-codes-with-raw-data\" width=\"616\" height=\"515\" srcset=\"https:\/\/cdn.alphak.net\/wp-content\/uploads\/sites\/2\/2013\/10\/decoded-ir-codes-with-raw-data.png 616w, https:\/\/cdn.alphak.net\/wp-content\/uploads\/sites\/2\/2013\/10\/decoded-ir-codes-with-raw-data-300x251.png 300w\" sizes=\"(max-width: 616px) 100vw, 616px\" \/><\/a><\/p>\n<p><span style=\"text-decoration: underline;\"><strong>Attention, l\u00e0, \u00e7a devient un poil technique :<\/strong><\/span><\/p>\n<p>La synth\u00e8se du protocole NEC m&rsquo;apprend que celui-ci transmet une information sur <strong>4 octets<\/strong> (soit 32 bits), plus un <strong>en-t\u00eate<\/strong> et un <strong>stop bit<\/strong>. Chaque bit 0 ou 1, ainsi que l&rsquo;en-t\u00eate et le stop bit, sont cod\u00e9s par un niveau actif (\u00e9mission de lumi\u00e8re IR) suivi d&rsquo;un niveau inactif (pas d&rsquo;\u00e9mission de lumi\u00e8re), la <strong>dur\u00e9e<\/strong> de chacun de ces niveaux d\u00e9terminant le type de bit cod\u00e9. Pendant un niveau actif, l&rsquo;\u00e9mission de lumi\u00e8re n&rsquo;est pas continue mais <strong>puls\u00e9e<\/strong> \u00e0 la fr\u00e9quence de <strong>38 kHz<\/strong>. Enfin, sur les 4 octets, seuls 2 comportent une <strong>information utile<\/strong>, puisque les 2 autres contiennent un XOR de l&rsquo;octet pr\u00e9c\u00e9dent avec 0xFF. Pour les novices en informatique, le XOR est un OU EXCLUSIF logique bit \u00e0 bit, et n&rsquo;a aucun rapport avec un personnage de fiction exer\u00e7ant la profession de sh\u00e9rif de l&rsquo;espace. Ici un XOR avec 0xFF revient \u00e0 inverser chaque bit, donc 0 devient 1 et 1 devient 0.<\/p>\n<p>Ainsi par exemple, au niveau de ma t\u00e9l\u00e9commande DealExtreme, le premier code remont\u00e9 est <strong>FFA25D<\/strong>, ce qui correspond en r\u00e9alit\u00e9 \u00e0 une r\u00e9ception de 00FFA25D exprim\u00e9 avec 32 bits. Les 4 octets sont 0x00, 0xFF, 0xA2, 0x5D. Le premier octet repr\u00e9sente <strong>l&rsquo;adresse<\/strong> (0), le second 0xFF correspond bien \u00e0 l&rsquo;inversion bit \u00e0 bit de 0x00, le troisi\u00e8me octet 0xA2 repr\u00e9sente <strong>la commande<\/strong>, et le quatri\u00e8me 0x5D correspond bien \u00e0 l&rsquo;inversion bit \u00e0 bit de 0xA2. Notez que la commande re\u00e7ue 0xA2 est exprim\u00e9e en LSB-first, bit de poids faible transmis en premier, et que si on la convertit en MSB-first, bit de poids fort transmis en premier comme l&rsquo;\u00eatre humain moyen a l&rsquo;habitude de manier les nombres (en g\u00e9n\u00e9ral on \u00e9crit les dizaines \u00e0 gauche des unit\u00e9s), on obtient le code logique de commande 0x45, soit 69 en d\u00e9cimal.<\/p>\n<p>La commande re\u00e7ue correspond donc \u00e0 un code 69 envoy\u00e9 \u00e0 l&rsquo;adresse 0. Fin de la plong\u00e9e dans le d\u00e9tail du protocole.<\/p>\n<p>Si je regarde maintenant les codes re\u00e7us correspondants aux appuis de touches sur ma t\u00e9l\u00e9commande <strong>Airton<\/strong>, 2 points m&rsquo;interpellent :<\/p>\n<ul>\n<li>J&rsquo;ai appuy\u00e9 sur plusieurs boutons de ma t\u00e9l\u00e9commande, et tous sont d\u00e9cod\u00e9s comme <strong>6A8E0000<\/strong> par le dispositif. Tous les boutons qui envoient le m\u00eame code, <strong>c&rsquo;est louche<\/strong>.<\/li>\n<li>Au niveau de la structure du code re\u00e7u, si 0x6A est l&rsquo;adresse, alors son inversion bit \u00e0 bit devrait \u00eatre 0x95, et non pas le 0x8E obtenu. De m\u00eame, l&rsquo;inversion bit \u00e0 bit de 0x00 devrait \u00eatre 0xFF, et non pas le 0x00 obtenu. <strong>Il y a donc vraiment quelque chose qui cloche<\/strong>.<\/li>\n<\/ul>\n<p>Forc\u00e9ment, je m&rsquo;attendais \u00e0 ce que cela ne soit <strong>pas simple<\/strong>. La bonne nouvelle pour moi, c&rsquo;est que le signal envoy\u00e9 par la t\u00e9l\u00e9commande est bien <strong>per\u00e7u par le r\u00e9cepteur<\/strong>. La mauvaise, c&rsquo;est que le r\u00e9cepteur ne semble pas d\u00e9coder ce signal <strong>de la bonne fa\u00e7on<\/strong>. Il faut donc investiguer sur la biblioth\u00e8que de commande infrarouge, comprendre comment elle fonctionne, et probablement la <strong>modifier<\/strong> pour l&rsquo;adapter aux sp\u00e9cificit\u00e9s de ma t\u00e9l\u00e9commande Airton. Mais \u00e7a, c&rsquo;est pour une prochaine fois.<\/p>\n","protected":false},"excerpt":{"rendered":"<p><strong>L&rsquo;hiver vient.<\/strong> Apr\u00e8s avoir automatis\u00e9 le d\u00e9marrage et l&rsquo;arr\u00eat des radiateurs de mon appartement gr\u00e2ce \u00e0 l&rsquo;installation de <a title=\"Chauffage chauffage, plus loin que la nuit et le jour !\" href=\"http:\/\/www.alphak.net\/news\/2012\/10\/chauffage-chauffage-plus-loin-que-la-nuit-et-le-jour\/\">fils pilotes<\/a> et d&rsquo;une <a title=\"Et la chaleur fut\u2026\" href=\"http:\/\/www.alphak.net\/news\/2012\/10\/et-la-chaleur-fut\/\">centrale de programmation<\/a>, je souhaite vivement mettre en place une fonctionnalit\u00e9 similaire sur ma <strong>climatisation r\u00e9versible<\/strong>. Elle constitue pour moi un moyen \u00e9conomique et rapide de chauffer ma pi\u00e8ce principale, il serait donc int\u00e9ressant de pouvoir la d\u00e9clencher de mani\u00e8re programm\u00e9e, ou encore mieux, \u00e0 distance, par exemple de mani\u00e8re automatique le matin avant que je me l\u00e8ve, ou manuellement \u00e0 l&rsquo;heure o\u00f9 je sors du travail, afin que la pi\u00e8ce soit d\u00e9j\u00e0 chauff\u00e9e lorsque j&rsquo;arrive chez moi.<\/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\/2013\/10\/winter-is-coming-s01e01\/\" title=\"Winter is coming &#8211; S01E01\" 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\/2013\/10\/winter-is-coming-s01e01\/\" title=\"Winter is coming &#8211; S01E01\" rel=\"bookmark\"><\/a>\r\n\t<\/div>\r\n","protected":false},"author":1,"featured_media":2651,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[253],"tags":[323,221,324,343,128,325,326],"class_list":["post-2638","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-projet-domotique","tag-airton","tag-arduino","tag-climatisation","tag-code","tag-diy","tag-infrarouge","tag-telecommande"],"_links":{"self":[{"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/posts\/2638"}],"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=2638"}],"version-history":[{"count":22,"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/posts\/2638\/revisions"}],"predecessor-version":[{"id":2912,"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/posts\/2638\/revisions\/2912"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/media\/2651"}],"wp:attachment":[{"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/media?parent=2638"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/categories?post=2638"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/tags?post=2638"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}