Arduino YUN, acquisition données

Arduino Yun
Arduino Yun

Ai-je besoin de vous présenter cette petite carte électronique, l’Arduino Yun ? …… non, car d’autre l’on déjà fait et bien mieux que je ne pourrais le faire !

C’est un article sur une application que j’ai réalisée avec l’Arduino Yun, mais pas uniquement sur le « nuage » , le Yun quoi !

Pourquoi l’Arduino Yun?

L’association Terragir a comme but : « de réaliser des économies d’énergie dans une démarche collective, dynamique et solidaire. ». Selon cette approche elle souhaitait avoir un banc de démonstration pour sensibiliser les gens à la notion d’énergie. Elle s’est adressée à Ezze Suisse pour construire un banc de production électrique par la force humaine, via le pédalage. Faire « sentir » la consommation énergétique de nos divers objets habituels (une lampe, un chauffe eau, une télévision, etc …), c’est l’objectif de l’ensemble à construire. On passera sous silence les diverses étapes pour le choix général de la solution et le pourquoi je me suis retrouvé au turbin, et en fin de compte pour ne pas trop surcharger l’article et ne pas vous endormir trop vite : on résumera uniquement le rôle du Yun et de la matrice de leds.

L’ensemble didactique projeté

INF-Terragir_SchemaGeneral

Le principal élément du système est la séparation de la production/consommation électrique, de la démonstration/visualisation de cette production. En résumé le pourquoi de ce choix : vélo adapté aux pédaleurs (enfant, adulte, ..), meilleure et adaptation de la démonstration, changement de type de lampe (led, halogène, ..), protection du matériel en cas de pédaleurs « joueurs », ….

Dans cet articles ne sera abordé que les parties ; ordinateur de gestion et matrice de leds.

  • Pour l’ordinateur de gestion, plusieurs choix (micro PC, Raspberry Pi, Yun, Mega, ..), j’ai pris, enfin de compte, un Arduino Yun pour sa facilité d’interfaçage avec les capteurs et son point d’accès wi-fi prêt à l’emploi.
  • La matrice de leds, pas de difficultés et je pensais aussi à un pilotage par Arduino Yun pour l’uniformité du matériel.

Ordinateur de gestion

Le rôle du Yun principal, tel que projeté :

  • assurer la partie serveur web (permettre de présenter les informations et les éventuels paramétrages).
  • servir d’accès point Wifi
  • piloter les pseudo-consommateurs (lampe, etc…).
  • l’ensemble doit pouvoir facilement évoluer suivant les remarques et désirs de l’association.
Synoptique Arduino Yun
Synoptique Arduino Yun

 

Matrice de leds

Nous avions proposé d’installer un écran PC pour que les participants puissent suivre l’évolution de la puissance et de l’énergie produites, distance de visibilité maximum de 5 à 6 mètres. Mais  les problèmes de reflets entre autre car le dispositif servira souvent en plein air,  nous ont fait écarter cette solution. Le prix encore relativement élevé des écrans mats n’ont pas permis de passer par cette voie. Une matrice de leds sera plus efficace dans ce cas de figure. Voici l’idée de départ et la proposition faite et comme toujours entre le départ et l’arrivée quelques différences …… 

Yun Arduino principe projet
Yun Arduino principe projet

 

Node.js avec le Yun tout va bien, jusqu’à ….

Je me suis dit, l’Arduino Yun avec linux, on doit pouvoir installer node.js, la bien connue plate-forme javascript (wikipedia), et comme je connaissais un peu cet outil, en faire un serveur web ce serait super ! En effet, pouvoir depuis n’importe quel smartphone, tablette voire PC communiquer avec le système pour afficher, enregistrer ou paramétrer le dispositif, c’est fun et pratique !

Maintenant, je vais vous présenter ma recette pour faire tourner un serveur Web avec node.js sur l’Arduino Yun. C’est, peut-être, même sûrement, ni la meilleure et ni la plus optimale, mais cela marche. Je ne l’ai pas trouvée tout seul, MERCI à tous ces gouroux qui ont publié sur le net moult renseignements. Si vous n’avez aucune connaissance sur le Yun, je vous propose de lire complètement un chapitre, puis de lire les articles proposés et enfin revenir pour suivre la procédure. On y va ??

REMARQUE : vous trouverez un bon tutoriel sur linino.org, je teste actuellement.

Extension mémoire avec la micro-carte SD

Le Yun est un peu court en mémoire pour recevoir node.js, il faut donc étendre sa mémoire sur une carte SD. Ce sera notre premier travail, l’augmentation de la partie mémoire utilisable par le linux de l’Arduino Yun (Linino, OpenWrt) :

  • Je vous conseille de passer la liaison internet plutôt que par le wi-fi. Vous trouverez sur Internet tous les renseignements nécessaires pour cette première prise en main du Yun.
  • pour la mise a jour du système Open-Wrt. Téléchargez l’image du Yun et copiez la sur la carte SD en racine. Ensuite relancer le Yun avec l’interface web administration. En bas de la page vous pourrez exécutez la mise à jour.
  • Maintenant on peut étendre la distribution sur la carte SD, vous trouverez ici un tutoriel. La taille minima pour la carte SD est 2GB (2000). Si vous avez un souci avec la carte SD type: « SD card not available », il vous faut formater la carte SD sur Android et créer une partition sur Yun. « fdisk /dev/sda1 »  n ; p ; accept par défault  puis reprendre l’extension. Attendez quelque chose comme (lors de mes derniers essais, la procédure finissait par autre chose ) :

Code Yun Installation

Server ftp-ssh

Pour la suite des opérations, vous devez vous loggez via le terminal en ssh sur votre Yun, dans le terminal vous écrivez : « ssh root@AdresseIpdeMonYun » bien sûr, il est préférable de connaître votre mot de passe, ce sera probablement plus facile (voir ce que vous avez décidé lors de la mise en train de votre Arduino Yun).

Avec la distribution Linino, Dropbear est installé et donc on l’utilise direct avec scp : linux-scp-command
Pour rappel :

Copie d’un fichier depuis le répertoire courant vers un répertoire du serveur :  « scp Fichier login@serveur:Chemin »
Copie d’un répertoire, avec éventuellement ses sous-répertoires, vers un répertoire du serveur :  « scp -r Repertoire login@serveur:Chemin »

Si vous êtes comme moi, un allergique au changement et vous avez l’habitude d’Openssh-sftp, rien ne vous empêche de remplacer Dropbear. Voici un petit tutoriel pour ce faire, sinon vous « y allez franco » en laissant Dropbear.

  • opkg update
  • opkg install vsftpd openssh-sftp-server

Pour une information générale de comment  installer un serveur sftp : http://www.ced-info.com

Installation de node.js

Voilà, on commence à entrer dans le vif du sujet ! Vous pouvez suivre la procédure décrite ici ou bien me faire confiance et foncer :

  • cd ..
  • opkg update
  • opkg install node
  • si vous voulez utiliser les websocket : npm install –save ws (opkg install node-ws)
  • pas sûr de la nécessité si vous n’utilisez pas les websocket, dans le doute, installez : npm install –save ultron 
  • npm install –save options
  • opkg install node-serialport

Et voilà node.js est installé !! Easy !! Vous pouvez le tester par un simple « node  -v » pour voir ce que vous avez installé.

Installation du fichier Swap

Il nous faut encore faire un gros travail, pas pour nous, pour l’Arduino Yun. C’est l’installation du fichier swap, vous trouverez un tutoriel ici, ou bien comme toujours me faire confiance, ce que je ne recommande pas, mais il y a toujours des « téméraires » !

  • dd if=/dev/zero of=/swapfile1 bs=1024 count=524288        **attendre longtemps, 75min !!! c’est un Yun, pas un Intel i7 !!
  • ……………
  • chown root:root /swapfile1
  • chmod 0600 /swapfile1
  • mkswap /swapfile1
  • swapon /swapfile1
  • free -m  (pour contrôle)
Exemple de swap file
Exemple de swap file

Et voilà c’est fini, vous pouvez vous servir de « node.js » sans problème, comme serveur web dans mon cas, mais comme bon vous voulez. Je vous propose de faire un serveur web de votre Arduino Yun avec Node.

Serveur web

Si vous ne connaissez pas le javascript et node.js, vous trouverez sur le net d’excellents cours qui vous permettent de bien comprendre ce que vous faites (enfin c’est ce qui est prévu ….). Je vous mets un serveur inspiré de l’article que vous trouverez ici. Ce serveur fonctionne sans les sockets (websockets), pour un dialogue intense, c’est pas l’idéal mais dans notre cas, c’est plus que suffisant.

Ce serveur est articulé autours de cinq fichiers : app-3.js, router.js, server.js, requestHandlers.js et conf.json. Personnellement j’aime mieux tout dans un même fichier, surtout quand on n’a pas beaucoup de ligne de code, mais cette présentation multi-fichiers permet d’avoir quelque chose de plus simple à maintenir et à modifier.

Server web node.js synoptique
Server web node.js synoptique

Vous trouverez les fichiers ici NodeServerWebYun. Si vous souhaitez adapter ces fichiers pour votre propre usage, il n’y a en fait que deux fichiers à modifier. Le premier « app-3.js » c’est pour ajouter/enlever de la liste des gestionnaires d’appel. Le deuxième fichier « requestHandler.js » c’est pour modifier les gestionnaires d’appel proprement dit. Pour la solution mis en place j’ai un gestionnaire (upload) pour « POST » et un gestionnaire (vari) pour « GET » et un gestionnaire « http », c’est tout.

  • « vari » ce gestionnaire retourne le fichier « var.txt » au demandeur, ce fichier contient les valeurs mesurées mise à jour en continu par le système de pédalage.
  • « upload » ce gestionnaire transfert les ordres de l’extérieur vers la partie Arduino du Yun, essentiellement la mise à zéro du temps.
  • « start » ce gestionnaire retourne une page web de type standard en html et javascript (code ici : start-3.html)

Affichage de la page web retournée par le gestionnaire start (start-3.html) :

INF-Terragir_EcranPageWeb

Liaison Linino-Arduino :

Vous trouverez dans le fichier server.js (en fin de fichier), la partie qui « détourne » l’entrée standard stdin vers la sortie standard stdout et c’est tout comme liaison entre linux et Arduino.

Vous pouvez tester ce serveur cela fonctionne parfaitement, jusqu’à ……… (voir ci-dessous)

Redémarrage et reset

Le wi-fi de l’Arduino Yun n’est pas exempt de tout reproche, vous pouvez facilement vous en convaincre en navigant sur le net.  Dans mon cas, tout fonctionne bien si l’on ne doit pas effectuer un reset du wi-fi ou un redémarrage après une coupure de courant ou un simple arrêt du système. Je ne sais pas pourquoi, mais un redémarrage avec le wi-fi (en point d’accès ou en client) c’est la galère.

Prenons les choses depuis le début, pour autant qu’il en ai un ! Je veux effectuer un reset du wi-fi du Yun, dans mon cas en point d’accès, il est impossible d’assurer que l’ensemble accroche et fonctionne. Un fois oui, trois fois non, hasard ? Après plusieurs (beaucoup) heures de tâtonnement, je dois dire que j’ai abandonné . Il y a bien une méthode, mais pas très exploitable; retirer la carte SD, reset sur le wi-fi (+5sec et moins de 30s). Arrêt du système sans être trop brutal (coupure). Remettre la carte SD et espérer que le système accroche !!

Pour moi (avec la carte SD et l’extension linux), le wi-fi du Yun est inutilisable, par conséquent et comme un routeur wi-fi est relativement bon marché, j’utilise le Yun qu’avec une liaison filaire sur un routeur. Je suis d’accord, c’est pas très sexy et un peu frustrant, mais c’est sûr.

C’est vous qui voyez ! ……..

Serveur web ⇔ Arduino (Yun)

Pour avoir une vue d’ensemble des techniques de liaison Linino⇔Arduino, voici quelques suggestions :

La partie « Arduino » de l’Arduino Yun (fichier .ino) n’est pas très compliquée et ne comprend en fait que deux point à expliquer. C’est toujours le problème du démarrage, à la mise sous tension du système, il est nécessaire que chaque partie soit prête avant qu’on lui fasse appel.

Par exemple, la partie linux doit s’enclencher et ensuite on enclenche le serveur web (node.js). Dans la solution choisie, c’est le microcontrôleur Arduino qui active le processus du serveur web (« nodejs ») via un appel dans la partie setup() « nodejs.runShellCommandAsynchronously(« instruction à exécuter »); ». En conséquence, pour que cet appel se fasse au bon moment, c’est-à-dire une fois que le routeur et surtout Linino ont démarré, j’ai mis dès l’entrée du setup() une tempo de 5 min « delay(300000); ». Cela paraît beaucoup mais en fait, l’Arduino Yun est un petit système et en mettant une ou deux minutes cela ne passait pas.

Le reste du code est peut-être long, mais pas très complexe, le fichier est ici TerrAgir-YUN

Dernière remarque pour le Yun

Ce point ne concerne pas l’informatique, ni l’électronique, mais plutôt la construction de cette carte. Je laisse à demeure jusqu’à la livraison et même souvent après la livraison un petit cordon USB qui permet d’éviter de connecter/déconnecter le micro-connecteur USB de l’Arduino Yun qui ne résiste pas forcement bien à ce type de manœuvre. Si c’est décollé/dessoudé c’est pratiquement impossible de le ressouder manuellement et votre carte est fichue SMILE-10, vu le prix  ……….  C’est vous qui voyez !

Arduino Yun
Arduino Yun
Arduino Yun
Arduino Yun

 

 

 

 

 

 

 

 

 

 

Matrice de leds, simple, pas si simple !

Comme vous pouvez le constater sur les photos, j’ai installé un Arduino Mega avec un shield Ethernet alors que je voulais mettre un Yun ! La commande de la matrice de leds n’est pas aussi simple que je le pensais. Ce n’est pas un adressage par coordonnées x,y, eh oui, pensez au nombre de fils que cela représenterait (64×32) et comme on a 3 leds par points (RGB) cela nous amène à piloter 6144 leds !!

On commande les leds via des chips « Bus Controller » (datasheet 82c88.pdf) qui permettent de surtout simplifier fortement le câblage (un câble plat de 16 fils). Par contre la programmation est beaucoup moins instinctive. Quelques recherches sur internet, m’ont montré que la plupart utilisent des bibliothèques toutes faites entre autre, les deux bibliothèques d’Adafruit. « Comme tout le monde », j’ai utilisé ces bibliothèques prêtes à l’emploi pour le Mega. Donc pour l’instant je pilote ma matrice de leds par le Mega , par flemme, par manque de temps, c’est selon. Mais je ne lâche pas le morceau, je reviendrais dans quelques temps avec une solution pour le Yun.

Vous trouverez l’excellent tutoriel d’Adafruit ici

Arduino mega, shield Ethernet, matrice led
Arduino Mega
Arduino mega, shield Ethernet, matrice led
Arduino Mega
Arduino mega, shield Ethernet, matrice led
Arduino Mega, shield Ethernet, matrice led

Le code général est simple, il est ici Terragir_MatrixEtherClient, et les bibliothèques utilisées sont :

Le seul problème restant est la compatibilité d’adressage de la matrice de leds avec le shield Ethernet. Après  « quelques » tâtonnements j’ai trouvé une configuration possible (vous trouverez le pinout dans le code du programme de l’Arduino). Au final, vous pouvez voir le résultat avec l’affichage réalisé. Avec un plexi légèrement fumé ajouté devant la matrice de leds pour une question d’aspect, meilleur contraste et moins agressif.

Matrice leds 64x32
Matrice leds 64×32
Matrice leds 64x32
Matrice leds 64×32

Ensemble Yun/Mega

Voici quelques vues de l’ensemble matrice de led avec l’Arduino Mega pour la piloter et l’Arduino Yun comme serveur Web, acquisition de données et pilotage des lampes de visualisation de la consommation électrique via une batterie de relais.

Arduino Yun et Mega     Arduino Yun et Mega     Arduino Yun et Mega

Quelques photos de l’ensemble complet. Le tout est fixé dans le couvercle d’une remorque pour vélo.

EnsembleComplet-4 EnsembleComplet-3 EnsembleComplet-2 EnsembleComplet-1

Conclusion

Que dire !! Beaucoup, beaucoup d’heures perdues avec ces problèmes de démarrage, mais au final je suis content du résultat, le système est simple et le principe réutilisable.

Pour l’instant, surveiller l’évolution du software du Yun, avec les nouvelles versions, peut-être pourra-t-on se passer du routeur et probablement utiliser pleinement les capacités de connexion du Yun qui est, ma foi, une très jolie et agréable carte électronique.

le Yun ?   …….     oui, j’aime !