Structure d’un premier objet communicant
Le but de ce tutoriel est de mettre en œuvre une structure type d'un objet communicant basé sur l'utilisation d'une carte Arduino pour la partie acquisition/actionneurs et d'une carte PC embarqué (pcDuino, Raspberry Pi, ...) pour la partie traitement (script Python, programme C/C++, ...), connexion au réseau (filaire ou wifi), stockage local des données (serveur de bases de données SQLigth, MySQL, ...), mise à disposition des données (serveur web Apache2, lighttpd, ginx, ...). La connexion entre ces deux carte se fait naturellement par une liaison série sur USB. Le synoptique ci-dessous représente par exemple un système de surveillance de la hauteur et de la qualité de l'eau d'un cours d'eau. La température, le Ph et la hauteur de l'eau sont mesurés sur demande par la carte Arduino. Le pcDuino via un scritp Python dont l'exécution peut être planifiée avec Cron, effectue la demande puis lit les réponses et les stockent dans la base de données MySQL. Apache2, via une page web php, met à disposition des utilisateurs les informations.
Pourquoi une liaison entre un PC embarqué et un Arduino?
Les PC embarqués disposent généralement de l'environnement matériel nécessaire à la mise en œuvre de la partie Acquisition. Nous pourrions donc parfaitement nous passer de la carte Arduino. Voici quelques raisons pour expliquer cette architecture entre une Raspberry pi et une Arduino citées sur le site http://electroniqueamateur.blogspot.fr/2014/05/communication-par-usb-entre-raspberry.html :
-
Le Raspberry Pi n'est pas idéal pour accomplir des actions avec un timing précis, car Linux pourrait décider de se consacrer temporairement à une autre tâche. Par exemple, si vous contrôlez un moteur pas à pas avec le Raspberry Pi, le moteur pourrait s'arrêter momentanément, de temps à autres. L'Arduino est plus fiable dans ce genre de situation.
-
Vos capteurs peuvent se trouver sur un shield conçu pour être inséré sur un Arduino. Évidemment, la disposition des pins GPIO du Raspberry Pi n'est pas la même.
-
Si vous êtes déjà un utilisateur expérimenté de l'Arduino mais un néophyte en Python/Linux/Raspberry Pi, il y a certaines choses que vous savez déjà faire très facilement avec l'Arduino, mais que vous ne savez pas encore comment faire avec le Raspberry Pi.
-
Vous désirez établir un réseau de plusieurs capteurs satellites qui se rapportent à une seule station centrale, et plusieurs Arduinos coûtent moins cher que plusieurs Raspberry Pi.
On peut ajouter dans le cas d'un PC embarqué type Raspberry pi que ce dernier ne dispose pas d'entrées Analogique, ce qui disqualifie d'office tous les capteurs de ce type, et ils sont nombreux ...!
Acquisition des données
Plaçons nous donc dans le cas où nous devons acquérir une donnée Analogique à la demande. Nous allons utiliser un potentiomètre connecté à l'entrée A0 qui nous fournira un nombre compris entre 0 et 1023 que nous transmettrons ensuite sur le port série. La réception sur ce même port d'un caractère de déclenchement démarrera le processus d'acquisition :
Chaque fois de le caractère "M" sera reçu, nous allons retourner le résultat de la conversion analogique/numérique de la tension présente sur A0 :
Communication entre Arduino et Raspberry Pi
Pour faire communiquer les cartes Arduino et Raspberry pi ou une autre carte PC embarqué, rien de plus simple si cette dernière possède un pour USB. Il suffira de connecter la carte Arduino sur le port USB de la Raspberry comme on le fait pour un PC standard.
On peut installer l'IDE Arduino directement sur l'environnement Raspbian de la Raspberry pi pour développer sur Arduino, mais ce n'est pas nécessaire. Si vous souhaitez le faire : http://www.meccanismocomplesso.org/en/controlling-arduino-raspberry-pi/
Identifier le port série
La connexion de la carte Arduino sur un port USB de la Raspberry pi a entrainé l'apparition d'un nouveau périphérique matériel du type Serial Port over USB. Il est identifié par la dénomination tty* comme tous les autres ports de ce type sous linux. Pour l'identifier, il suffit de lister ces périphériques matériels. Ils sont situés dans le /dev :
La listes des périphériques apparait. Faire cette action Arduino déconnectée, puis Arduino connectée :
Note : Les périphériques de type Serial over USB sont souvent appelés ttyACMx ou ttyUSBx sous linux.
Maintenant, nous pouvons tester la communication entre les deux cartes en utilisant deux terminaux. Le premier nous servira à envoyer notre commande ("M") et le second à lire les données reçues :
A ce stade, il nous faut coder une application qui enverra le caractère "M" et lira les données reçues sur le port. Une telle application peut être codée simplement en shell à l'aide des commandes précédentes ou dans un autre langage de programmation. Nous utiliserons ici le langage Python mais il faut avant tout installer une librairie de gestion des communications séries :
Installation du module
Téléchargement : https://pypi.python.org/pypi/pyserial
Script Python
Dans le dossier Documents, créer le script suivant à l'aide de votre éditeur de texte préféré :
Vérifier le fonctionnement
Installation du serveur web
Nous choisissons ici d'installer Apache2 avec les modules php nécessaires qui nous permettrons de réaliser un site web dynamique pour accéder au données et pour les gérer au travers de l'outils phpMyAdmin :
Pour vérifier que tout s'est bien installé, ouvrez un navigateur et saisissez http://127.0.0.1 dans la barre d'adresse directement sur le PC embarqué ou http://ipDuPcEmbarque. La page suivante doit apparaitre :
Pour vérifier le fonction de php, nous allons écrire une page de test dans le dossier du serveur :
Dans un navigateur, saisissez l'url http://127.0.0.1/index.php :
Installation du serveur de bases de données
Nous choisirons ici d'installer MySQL server et phpMyAdmin pour gérer plus facilement les bases données :
Au cours de l'installation, vous devrez définir un mot de passe pour l'utilisateur administrateur du serveur MySQL.
Pour testez le fonctionnement du serveur, nous allons juste nous y connecter puis en sortir aussitôt !
Nous allons maintenant installer phpMyAdmin :
Lors de l'installation, il faudra indiquer le mot de passe root de MySQL configuré plus tôt, lors de l'installation du serveur.
L'installation de phpMyAdmin modifie les fichiers de configuration de php (php.ini). Ce fichier est chargé au démarrage d'Apache2, il est donc nécessaire de redémarrer ce serveur :
On accède à phpMyAdmin par l'intermédiaire d'un navigateur web. Seul le contenu du dossier du serveur est donc accessible (/var/www/html). Or, phpMyAdmin ne s'installe pas là. Il s'est installé dans le dossier /usr/share/phpmyadmin/. Nous allons donc créer un lien symbolique entre le dossier qui contient phpMyAdmin et le dossier du serveur :
Pour vérifier l'accès à phpMyAdmin, saisissez dans le navigateur l'url http://127.0.0.1/phpmyadmin
Base de données et tables
Pour sauvegarder les données des capteurs en provenance de la carte Arduino, nous avons besoin d'une base de données et d'au moins une table. Pour simplifier l'étude, nous nous limiterons ici à une table unique dans laquelle nous enregistrerons les grandeurs mesurées horodatées :
- Base de données : myBDD
- Tables : mesures
- Champs :
- Date : type datetime
- Temperature : type float
- Ph : type float
- Distance : type float
Créer la base de données :
Créer la table :
Créer les champs :
Note : Le champs Date est une "clé primaire" (Index PRIMARY), cela signifie que les enregistrements de ce champs seront uniques (pas deux mesures à la même date).
Insertion de données :
Note : La date sera insérée automatiquement grace à l'usage de la fonction NOW( ). L'exécution de cette requête nous permettra de récupérer sa syntaxe SQL. Cela s'avérera intéressant lors de la rédaction du script Python qui devra alimenter la table en données.
Accéder aux données
Note : La syntaxe de la requête pour accéder aux données est SELECT * FROM 'Mesures'
Insérer des données à partir d'un script Python
Pour accéder au serveur MySQL, nous devons installer un module d'interfaçage entre Python et MySQL server : MySQL-python 1.2.5
Installation du module
téléchargement : https://pypi.python.org/pypi/MySQL-python/1.2.5
A partir des sources :
Script python d'insertion de données
Dans le dossier Documents, créer le script suivant à l'aide de votre éditeur de texte préféré :
Excuter le script
Vérifier l'insertion des données
Pour vérifier l'insertion des données, il suffit d'ouvrir phpmyadmin et constater l'ajout d'une ligne de données à la table Mesures de la base myBDD :
Script python complet
Affichage des données en php
On affiche les données de la table dans un tableau après s'être connecté à la base de données :
L'utilisation de node.js en remplacement de php est parfaitement envisageable : https://codeforgeek.com/2015/01/nodejs-mysql-tutorial/
Exemple : Surveillance de la Sorgue
Un groupe d'élèves de terminal S ont mis en œuvre cette démarche dans le cadre de leur projet :
Trackbacks are disabled.