arduino uno logo Il y a quelques mois, je vous avais parlé de la carte électronique Arduino, mondialement connue, qui permettait de réaliser des automatismes, surveillances et autres inventions personnelles. Nous avions pensé faire un Cycle Cours de formation sur ce sujet, mais l'énergie, la compétence et le recul avaient manqué. Donc, le temps passant, cela a fait son chemin dans la tête de Raymond, l'auvergnat, et qui du coup s'est équipé d'un kit de démarrage. Son projet : pouvoir commander et surveiller à distance, divers dispositifs de sa maison.

La carte Arduino s'y prête totalement, mais il faut reconnaître qu'il y a du boulot avant que tout fonctionne. Nous avons partagé ce projet qui, heureusement, peut se décomposer en plusieurs étapes. Tout n'est pas fait, il reste à y connecter les relais de commande.

Les grandes lignes du projet

La carte Arduino est équipée d'une carte additionnelle Ethernet. L'ensemble est connecté au réseau local de la maison. De « l'autre coté de la carte Arduino », on peut trouver toutes les entrées et sorties pour y connecter des relais, des contacts et autres capteurs faciles à trouver dans le commerce.

Arduino2

On pilote à distance, via un panneau de commande, et au travers d'un navigateur comme Firefox, en lui passant une commande du genre : http://92.151.205.253:22084/start

  • « 92.151.205.253 » est par exemple l'adresse IP de votre box
  • « 22084 » correspond au numéro de port que l'on va utiliser (au lieu du 80 généralement utilisé).
  • « start » est le nom de la première page qui sera appelée pour l'identification.

Cependant, la carte Arduino est vierge de programmation, et a donc besoin d'être programmée pour effectuer les fonctions souhaitées. Un logiciel de développement gratuit peut être téléchargé sur le PC familial. La carte Arduino se connecte sur un port USB du PC. Le logiciel de développement injecte dans la carte un programme, et surveille le déroulement de ce programme via une pseudo ligne asynchrone. Je ne rentre pas dans les détails, se serait trop long et lourd à expliquer.

dev

Il faut apprendre le langage « C » de programmation, qui n'est pas trop compliqué, mais pas si simple quand même, et il y a notamment du pain sur la planche pour comprendre l'interface logicielle proposée avec la carte Ethernet. Heureusement, sur Internet, il existe une très grande panoplie d'exemples et de didacticiels. La découverte est passionnante, et l'on va découvrir des choses et être obligés de creuser profondément, même très profondément, dans la connaissance du protocole HTTP.

L'accès à distance se fait à partir d'un navigateur du genre Firefox ou Chrome, etc... Sur la box familiale, il faut ouvrir le port particulier choisi, et diriger les connexions entrantes vers l'adresse IP locale choisie pour la carte Arduino.

dev2

La carte Arduino doit se comporter comme un serveur Web, et envoyer une page d'accueil vers le client demandeur qui est à l'initiative de la connexion. Dans cette page d'accueil, l'utilisateur distant devra remplir un premier formulaire, en fournissant un mot de passe pour permettre son identification. Un « Cookie » sera envoyé au navigateur pour y mémoriser, ou non, sa bonne identification. Ensuite, la carte enverra un autre formulaire, qui présentera l'état des divers dispositifs distants. Les commandes positionnées par l'utilisateur seront renvoyées à la carte Arduino, qui les réalisera, puis ré-envoira une page présentant le nouvel état des divers dispositifs distants. Un bouton « Déconnexion » permettra de rompre l'identification et ainsi empêcher qu'un petit malin ne récupère la connexion.

Créer le serveur Web sur la carte Arduino

Les communications sont à l'initiative de programmes appelés « Clients », et les programmes dits « Serveur » sont en attente des clients. Quand un client ouvre une connexion vers un serveur, le serveur se « réveille » et accueille le client par une réponse positive, ou négative. Parfois elle peut aussi « faire le mort » pour éviter de se faire repérer par un hacker de grand chemin. Une fois le contact établi, des échanges peuvent continuer, et en final, se terminer par la rupture de la connexion.

Selon ce que l'on veut s'échanger, on définit un protocole d'échange entre le programme client et le programme serveur pour que les choses soient bien carrées, et ce protocole doit être bien approprié aux types d'échanges que l'on veut faire.

Depuis quelques dizaines d'années, les choses ont évolué, et différents protocoles sont nés : par exemple le protocole SMTP pour la transmission des mails, les protocoles POP3, IMAP pour la lecture des mails restés en poste « restante », FTP pour la transmission de gros fichiers et bien-sûr le protocole HTTP pour gérer la relation entre un client WEB et son serveur WEB. Il existe un grand nombre d'autres protocoles que l'on ne soupçonne pas.

Dans notre cas, c'est le protocole HTTP qui nous intéresse.

Encore un petit mot sur les communications sur Internet. Il existe deux modes principaux de transport des données qui sont : le mode UDP dit « sans connexion », qui consiste à envoyer une donnée courte vers un serveur sans avoir l'assurance de son parfait acheminement, d'où l'expression « Transmets et prie... » Ce qui signifie « prie que cela arrive à bon port ». C'est une transmission qui n'est donc pas rassurante mais qui a l'avantage d'être très légère. Un peu comme un message SMS.

Le mode TCP dit « connecté » qui assure une connexion de qualité entre le Client et le Serveur. Ce type de communication, qui est plus lourde, comporte une phase d'établissement de la liaison, puis une phase d'échanges de qualité sans perte d'information, et en final la phase de rupture de la liaison.

Tout cela pour dire que le protocole HTTP « s'installe » sur un transport de type TCP, et cela tombe bien parce que Arduino fournit la librairie de cette couche que l'on va utiliser. Il ne reste plus qu'à y programmer le protocole HTTP, réduit aux fonctionnalités que nous avons besoin.

Plutôt que de bricoler un exemple tout fait, et y faire des adaptations sans comprendre exactement les mécanismes de cette interface, nous avons préféré progresser pas à pas et découvrir les mécanismes proposés par les librairies fournies. Eh oui ! Nous souhaitons une gestion du protocole qui puisse être réutilisée dans divers projets, et donc cela nécessite un petit investissement. Ce qui va nous permettre aussi d’éclaircir l'interface de programmation fournie par Arduino.

En conclusion

En final, cela fonctionne, mais quel investissement… Que de bugs rencontrés, essentiellement parce que la RAM de la carte Arduino UNO est limitée à 2048 octets, et qu'elle est vite remplie si on ne fait pas attention. Les valeurs littérales sont stockées par défaut dans la RAM, il faut passer par un artifice pour les loger dans la zone programme, et libérer ainsi de l'espace dans la RAM. La « pile » s'installe aussi dans cet espace, ce qui est normal. Mais son augmentation entre en collision avec vos données réservées, étant donné que l'espace disponible est restreint. Cela provoque, lors de l'exécution, des super plantages, qui peuvent rester incompréhensibles. On passe par des moments de lassitude, mais, heureusement, il y a Internet et tous les contributeurs, qui racontent leurs mésaventures et comment ils s'en sont sortis.

En gros, ce développement est arrivé aux limites de cette carte Arduino UNO. Ce n'était pas un projet de débutant. Ceci dit la partie développée est totalement récupérable pour un autre projet, et l'adaptation à un autre besoin devrait être plus facile.

Avis aux amateurs.

Gérard Caussidéry