{"id":5108,"date":"2018-09-01T04:30:25","date_gmt":"2018-09-01T03:30:25","guid":{"rendered":"https:\/\/www.blaess.fr\/christophe\/?p=5108"},"modified":"2018-08-29T05:45:11","modified_gmt":"2018-08-29T04:45:11","slug":"projet-pi-logger","status":"publish","type":"post","link":"https:\/\/www.blaess.fr\/christophe\/2018\/09\/01\/projet-pi-logger\/","title":{"rendered":"Projet Pi-Logger"},"content":{"rendered":"<p><a href=\"https:\/\/www.blaess.fr\/christophe\/2018\/09\/01\/projet-pi-logger\/pi-logger\/\" rel=\"attachment wp-att-5118\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2018\/09\/Pi-Logger.png\" alt=\"Pi-Logger\" width=\"250\" height=\"198\" class=\"alignright size-full wp-image-5118\" \/><\/a><\/p>\n<h1>Projet Pi-Logger<\/h1>\n<p style=\"text-align: justify;\">Lors de la mise au point d&rsquo;un syst\u00e8me industriel, il est souvent n\u00e9cessaire de surveiller les signaux de sortie d&rsquo;un \u00e9quipement.<br \/>\nBien s\u00fbr l&rsquo;oscilloscope et l&rsquo;analyseur de trames sont indispensables pour l&rsquo;analyse des signaux instantan\u00e9s, mais lors des phases de validation d&rsquo;un produit, il faut g\u00e9n\u00e9ralement faire des observations longues, sur plusieurs heures ou plusieurs jours. Je vous propose un petit outil pr\u00e9vu pour ce genre d&rsquo;analyse.<\/p>\n<p>\n<!--more-->\n<br \/>\n&nbsp;<\/p>\n<h2>Contexte<\/h2>\n<p style=\"text-align: justify;\">J&rsquo;ai r\u00e9cemment d\u00fb v\u00e9rifier le comportement des signaux de sortie d&rsquo;une carte embarqu\u00e9e (un module \u00e0 processeur i.MX6) qui pilote, par l&rsquo;interm\u00e9diaires de relais, les pompes de traitement de piscines et de spas. Les signaux (des sorties sur GPIO) sont issus d&rsquo;algorithmes d&rsquo;automatisation du traitement, apr\u00e8s analyse de divers senseurs (temp\u00e9rature, pH, ORP, taux de chlore, etc.).<\/p>\n<p style=\"text-align: justify;\">Je souhaitais obtenir un suivi des signaux relativement pr\u00e9cis (avec une r\u00e9solution de l&rsquo;ordre de la seconde), sur des dur\u00e9es longues (quelques semaines). Le fait que les signaux de sortie du module int\u00e9gr\u00e9 soient aux niveaux \u00e9lectriques {0, +3.3V} m&rsquo;a incit\u00e9 \u00e0 les injecter dans un Raspberry Pi pour les enregistrer et les analyser ensuite.<\/p>\n<p style=\"text-align: justify;\">Pour \u00e9viter d&rsquo;enregistrer \u00e0 chaque instant tous les signaux, j&rsquo;ai \u00e9crit un petit programme qui ne les affiche (ou ne les stocke) que lors des changements d&rsquo;\u00e9tat. Ce programme a \u00e9t\u00e9 compil\u00e9 et utilis\u00e9 sur une distribution Raspbian du 18 avril dernier, il est disponible sous licence libre (GPL v.2).<\/p>\n<p style=\"text-align: justify;\"><a href=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2018\/09\/Raspberry-Pi-connector.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright wp-image-5115 size-medium\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2018\/09\/Raspberry-Pi-connector-289x300.png\" alt=\"Raspberry-Pi connector\" width=\"289\" height=\"300\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2018\/09\/Raspberry-Pi-connector-289x300.png 289w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2018\/09\/Raspberry-Pi-connector.png 490w\" sizes=\"auto, (max-width: 289px) 100vw, 289px\" \/><\/a>Afin d&rsquo;assurer la meilleure portabilit\u00e9 possible, je n&rsquo;ai pas utilis\u00e9 de biblioth\u00e8que comme WiringPi, mais simplement l&rsquo;acc\u00e8s aux GPIO via les fichiers de <code>\/sys\/class\/gpio\/<\/code>. Ainsi ce programme est utilisable sur tout syst\u00e8me proposant des GPIO sous Linux quelque soit le processeur et le type d&rsquo;OS.<\/p>\n<p style=\"text-align: justify;\"><b>Attention\u00a0:<\/b> les GPIO d&rsquo;entr\u00e9e du Raspberry Pi (et de la plupart des <em>Single Board Computers<\/em> du m\u00eame genre) ne supportent que des tensions entre 0 et +3.3V. Ne leur soumettez pas directement des signaux {0, +5V} issus par exemple d&rsquo;un Arduino.<\/p>\n<p>&nbsp;<\/p>\n<h2>Installation<\/h2>\n<p style=\"text-align: justify;\">J&rsquo;ai pour habitude d&rsquo;h\u00e9berger mes projets libres, les exemples de mes article et les contenus de mes sesssions de formations sur Github. Suite aux \u00e9v\u00e9nements des derniers mois, et \u00e0 l&rsquo;incertitude quant \u00e0 l&rsquo;avenir de cette plate-forme, j&rsquo;ai d\u00e9cid\u00e9 de tester un nouveau d\u00e9p\u00f4t libre.<\/p>\n<p style=\"text-align: justify;\">J&rsquo;ai choisi <b>Framagit<\/b>, service propos\u00e9 par l&rsquo;association <a href=\"https:\/\/framasoft.org\/\">Framasoft<\/a> que j&rsquo;aime beaucoup et que je vous encourage \u00e0 supporter.<\/p>\n<p style=\"text-align: justify;\">Le projet se trouve ici <a href=\"https:\/\/framagit.org\/cpb\/pi-logger\">https:\/\/framagit.org\/cpb\/pi-logger<\/a>.<\/p>\n<p style=\"text-align: justify;\">La compilation se fait simplement ainsi\u00a0:<\/p>\n<pre>$ <b>git clone https:\/\/framagit.org\/cpb\/pi-logger.git<\/b>\nClonage dans 'pi-logger'...\nremote: Counting objects: 40, done.\nremote: Compressing objects: 100% (39\/39), done.\nremote: Total 40 (delta 16), reused 0 (delta 0)\nD\u00e9paquetage des objets: 100% (40\/40), fait.\nV\u00e9rification de la connectivit\u00e9... fait.\n$ <b>cd pi-logger<\/b>\n$ <b>make<\/b>\ngcc -Wall -pthread -g -D_PI_LOGGER_VERSION=\"0.1.2\"    pi-logger.c   -o pi-logger\n$<\/pre>\n<p style=\"text-align: justify;\">Dans le cas d&rsquo;une cross-compilation, il suffit de renseigner le pr\u00e9fixe CROSS_COMPILE sur la ligne de commande de <code>make<\/code>. Je pourrais fournir \u00e0 l&rsquo;avenir des recettes de compilation pour Buildroot et Yocto si des utilisateurs int\u00e9ress\u00e9s se manifestent.<\/p>\n<p>&nbsp;<\/p>\n<h2>Utilisation<\/h2>\n<p style=\"text-align: justify;\">Le programme est facile \u00e0 utiliser, il suffit de le lancer en lui indiquant sur sa ligne de commande la liste des entr\u00e9es GPIO \u00e0 surveiller. A priori, il n&rsquo;y a pas de limite au nombre de GPIO suivies, autre que celle des entr\u00e9es disponibles sur la carte.<\/p>\n<p style=\"text-align: justify;\">Il affiche alors sur sa sortie standard une table contenant une nouvelle ligne \u00e0 chaque changement d&rsquo;\u00e9tat. L&rsquo;horodatage et les valeurs d&rsquo;entr\u00e9es de chaque GPIO sont indiqu\u00e9s dans des colonnes distinctes.<\/p>\n<p style=\"text-align: justify;\">Si l&rsquo;on souhaite r\u00e9cup\u00e9rer le r\u00e9sultat dans un fichier, pour le traiter dans un tableur par exemple, l&rsquo;option \u00ab\u00a0<code>-c<\/code>\u00a0\u00bb permet d&rsquo;obtenir une sortie au format CSV (<em>Comma Separated Values<\/em>) et l&rsquo;option \u00ab\u00a0<code>-o<\/code>\u00a0\u00bb envoie les donn\u00e9es dans un fichier plut\u00f4t que sur sa sortie standard.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2018\/09\/GPIO-probes.png\" alt=\"GPIO Probes\" width=\"200\" height=\"200\" class=\"alignleft size-full wp-image-5120\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2018\/09\/GPIO-probes.png 200w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2018\/09\/GPIO-probes-150x150.png 150w\" sizes=\"auto, (max-width: 200px) 100vw, 200px\" \/><\/p>\n<p style=\"text-align: justify;\">Enfin, il peut \u00eatre n\u00e9cessaire d&rsquo;attendre un petit moment de stabilisation apr\u00e8s chaque changement d&rsquo;\u00e9tat, avant de lire les valeurs. Par exemple dans mon projet, les relais ont tendance \u00e0 rebondir pendant une centaine de microsecondes. Pour palier ce d\u00e9faut, l&rsquo;option \u00ab\u00a0<code>-w<\/code>\u00a0\u00bb permet d&rsquo;indiquer un d\u00e9lai d&rsquo;attente en microsecondes.<\/p>\n<p style=\"text-align: justify;\">Voici un exemple d&rsquo;ex\u00e9cution en surveillant trois sorties de mon syst\u00e8me, reli\u00e9es aux broches du Raspberry Pi 15, 16 et 18 (respectivement les GPIO 22, 23 et 24).<\/p>\n<pre>$ <b>sudo .\/pi-logger -w 1000 22 23 24<\/b>\n+----------+----+----+----+\n|   TIME   | 22 | 23 | 24 |\n+----------+----+----+----+\n| 13:30:01 |  0 |  1 |  0 |\n| 15:30:01 |  0 |  0 |  0 |\n| 00:30:00 |  1 |  0 |  0 |\n| 00:40:11 |  0 |  0 |  0 |\n| 04:00:01 |  0 |  0 |  1 |\n| 05:11:38 |  0 |  1 |  1 |\n| 05:12:52 |  0 |  0 |  1 |\n| 06:00:01 |  0 |  0 |  0 |\n(Ctrl-C)\n$<\/pre>\n<p style=\"text-align: justify;\">Voici un autre exemple d&rsquo;ex\u00e9cution o\u00f9 les donn\u00e9es sont stock\u00e9es directment dans un fichier, en utilisant un format CSV\u00a0:<\/p>\n<pre>$ <b>sudo .\/pi-logger -w 1000 22 23 24 -c -o datalog.csv<\/b>\n^C\n$ <b>cat datalog.t.csv<\/b>\nTIME,22,23,24,\n08:14:31:1,0,0,\n08:16:02:0,0,0,\n11:10:01:0,0,1,\n11:21:01:0,0,0\n13:47:56,0,1,0,\n$<\/pre>\n<p>&nbsp;<\/p>\n<h2>Conclusion<\/h2>\n<p style=\"text-align: justify;\">Ce petit outil m&rsquo;est tr\u00e8s utile pour assurer le <em>monitoring<\/em> de mon syst\u00e8me embarqu\u00e9. Je serais enchant\u00e9 qu&rsquo;il puisse servir \u00e0 d&rsquo;autres.<\/p>\n<p style=\"text-align: justify;\">Il est bien adapt\u00e9 \u00e0 des changements d&rsquo;\u00e9tats relativement lents (quelques centaines de microsecondes ou quelques millisecondes au minimum), et ne pr\u00e9tend pas pouvoir analyser des signaux \u00e0 fr\u00e9quence \u00e9lev\u00e9e.<\/p>\n<p>&nbsp;<\/p>\n<p style=\"text-align: center;\">Toutes les suggestions, remarques et retours d&rsquo;utilisation sont les bienvenus&nbsp;!<\/p>","protected":false},"excerpt":{"rendered":"<p>Projet Pi-Logger Lors de la mise au point d&rsquo;un syst&egrave;me industriel, il est souvent n&eacute;cessaire de surveiller les signaux de sortie d&rsquo;un &eacute;quipement. Bien s&ucirc;r l&rsquo;oscilloscope et l&rsquo;analyseur de trames sont indispensables pour l&rsquo;analyse des signaux instantan&eacute;s, mais lors des phases de validation d&rsquo;un produit, il faut g&eacute;n&eacute;ralement faire des observations longues, sur plusieurs heures [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,8,11],"tags":[],"class_list":["post-5108","post","type-post","status-publish","format-standard","hentry","category-embarque","category-linux-2","category-raspberry-pi"],"_links":{"self":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/5108","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/comments?post=5108"}],"version-history":[{"count":11,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/5108\/revisions"}],"predecessor-version":[{"id":5123,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/5108\/revisions\/5123"}],"wp:attachment":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/media?parent=5108"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/categories?post=5108"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/tags?post=5108"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}