Sur demande de Juptofex, je vais détailler comment monter un Raspberry Pi pour contrôler, observer et suivre l'évolution d'une ou de plusieurs colonies de fourmis. Un Raspberry Pi est un ordinateur très basique qui a pour avantages principaux d'être bon marché, petit et très portable. C'est le truc idéal pour un très grand nombre de choses, quand on a besoin d'exploiter la versatilité qu'offre un ordinateur au niveau des opérations qu'il peut exécuter, sans pour autant avoir besoin d'une puissance énorme. Étant très silencieux, c'est le genre d'ordinateur qu'on peut laisser allumé en permanence n'importe où, ce qui est moins envisageable avec un PC de bureau classique qui consomme beaucoup et qui fait du bruit. C'est donc le truc parfait à mettre dans la tête d'un robot ou entre les rotors d'un drone, ou pour émuler une vieille console de jeux, ou contrôler de manière centralisée et intelligente le chauffage dans sa maison, gérer des systèmes d'alarme ou je ne sais quoi... Mais c'est aussi le monitor parfait pour ses petites colonies de fourmis ! Branché aux capteurs adaptés, cet ordinateur est capable de mesurer la température, l'hygrométrie, la luminosité, la durée du jour ou n'importe quoi qui vous passe par la tête ! Et même, mieux, branché aux outils adaptés, il est capable d'adapter chacun de ses paramètres pour vous plaire et servir à vos expériences.
Je ne vais pas expliquer comment ajouter les deux afficheurs à 7 segments parce que c'est pas vital au bon fonctionnement de l'ensemble, mais si ça intéresse suffisamment de gens je peux toujours faire de beaux diagrammes et publier le code nécessaire à ce que ça marche ! Pour l'instant je ne vais donc que détailler les branchements (assez simples) à faire pour connecter un thermomètre. Je vais également montrer comment enregistrer des mesures et les présenter via une interface web, pour avoir un truc joli et accessible depuis n'importe où dans la maison.
À l'avenir (après mes examens, j'ai déjà perdu une demi-journée de révisions c'est la mort

Les préliminaires :
Forcément ça plait jamais, mais là c'est un peu obligatoire, il faut être assez indépendant pour ce genre de projet. Je me ferai un plaisir de répondre à vos questions, et à défaut d'en avoir la possibilité je suis sûr que d'autres membres sauront vous aider. J'incite quand même à faire une recherche google avant de demander, ça amène tellement plus loin en termes de compétences acquises, d'autant qu'il y a vachement de blogs sur les Raspberry Pi en ligne et qu'ils sont pour la grande majorité très intéressants à lire indépendamment de l'information qu'on y cherchait au départ.
Les domaines de compétence suivants ne sont pas nécessaires à maîtriser avant de continuer, mais si vous les maîtrisez vous comprendrez ce que vous faites, ce qui est toujours intéressant :
- Linux : c'est le système d'exploitation qui fera tourner votre Raspberry Pi. Le système d'exploitation est ce qui fait l'interface entre les circuits électriques et tous les logiciels installés sur un ordinateur. Windows est un système d'exploitation, et Linux c'est un peu comme Windows mais en plus libre. Vous avez plus de contrôle sur la machine, ce qui est parfait quand on veut la customiser très lourdement comme on projette de le faire. L'inconvénient qui vient avec, c'est que c'est plus dur à manier, mais bon, on s'y fait vite.
- Python : c'est un langage de programmation ! Il présente comme avantages d'être assez facile d'accès et très rapide à écrire, c'est vite fait de faire un programme fonctionnel avec Python. Il est donc très souvent recommandé aux débutants et aux gens qui ont besoin d'écrire des trucs qui marchent en peu de temps. C'est avec ça que j'ai codé mes trucs sur le Raspberry Pi, pour autant on peut le faire en n'importe quel langage, ça n'a pas d'importance.
- Un tout petit peu d'électronique : ici c'est pas super important, je vais montrer tous mes branchements, mais dès qu'on veut faire des trucs plus sophistiqués ça devient très intéressant de savoir où brancher quoi pour faire des trucs qui fonctionnent.
Démarrer avec le Raspberry Pi :
Pour avoir un mini-ordinateur qui fonctionne il faut donc d'un côté le matériel, et de l'autre le système d'exploitation. Ce dernier se trouve en ligne, on télécharge juste le nécessaire sur le site officiel de Raspberry Pi, c'est gratuit et bien expliqué. Ce que j'utilise chez moi comme système d'exploitation est Raspbian, pour l'avoir vous pouvez soit télécharger "Raspbian Jessie with Pixel", "Raspbian Jessie Lite", ou "NOOBS", un truc censé drastiquement faciliter la vie aux nouveaux utilisateurs. Avec NOOBS, sélectionnez "Raspbian" au moment voulu pour obtenir la même chose que moi, c'est ce qui est recommandé par le logiciel de toute façon.
Si vous ne savez vraiment pas ce que vous faites, téléchargez NOOBS, foutez le contenu de l'archive sur une carte SD vide, insérez la carte SD dans le Raspberry et démarrez le, avant de choisir "Raspbian" comme système d'exploitation désiré. Il n'y a pas plus simple que ça.

Pour plus de détails ou des instructions d'installation sans NOOBS, le site officiel de Raspberry est très bien fourni alors je ne vais pas m'étendre là dessus, tant que votre machin démarre correctement vous pouvez faire la suite. Il vous faudra juste vous assurer de connecter votre Raspberry à internet, soit par wifi soit avec un câble ethernet.
Brancher et relever des mesures d'un thermomètre :
Le thermomètre que j'ai pris est un MCP9808, pour sa précision et le fait qu'il venait avec une bibliothèque Python facilitant très largement la lecture de ses mesures. Si vous êtes d'esprit aventurier par contre, vous pouvez démonter des vieux thermomètres électriques chez vous et identifier le composant qui sert à la mesure de la température, en général ce sont des machins moches qui dépassent du circuit imprimé. Ce genre de composant a généralement une résistance variable avec la température, et des montages savants permettent de mesurer la résistance du composant pour en déduire la température, tout ça est bien détaillé en ligne si ça vous intéresse.
Pour le MCP9808, la première chose à faire a été de souder le circuit imprimé aux broches, en faisant attention à ne pas faire dépasser d'étain pour éviter de lier deux broches normalement séparées. Ensuite, des 8 broches disponibles, seules 4 nous intéressent. Deux pour l'alimentation, et deux pour la communication.
Sur le schéma ci-dessous, l'alimentation est assurée par les fils en bleu clair et la communication se fait au travers des fils verts. Vous pouvez utilisez n'importe quelle broche pour l'alimentation (pour peu que vous ayez 3,3 V d'un côté et un terre de l'autre. Pour les broches de communication par contre il faut absolument respecter le branchement montré sur le schéma, sinon ça ne marche pas.
Une fois le tout connecté, soit par soudure soit par l'intermédiaire d'une breadboard ou je ne sais quoi d'autre, il ne reste plus qu'à gérer le côté logiciel ! Le matériel fonctionne, théoriquement.
La toute première chose à faire n'est à faire qu'une seule fois pour tous les périphériques qu'on peut lier au Raspberry et qui utilisent l'I2C. L'I2C est un protocole de communication entre composants électroniques qui nécessite l'installation et l'activation de certaines petites choses sur l'ordinateur. C'est le protocole de communication utilisé par le thermomètre en l’occurrence, mais il est aussi utilisé par toute une panoplie de petites choses que vous pouvez connecter au Raspberry pour lui permettre d'analyser son environnement. L'avantage est que tous les composants qui utilisent l'I2C pour communiquer le font au travers de deux broches uniquement, la SDA et la SCL, ce qui permet potentiellement d'avoir 10 petits capteurs qui n'utilisent que 2 broches plutôt que 20 pour communiquer avec le Raspberry Pi. C'est pratique, ça sauve de la place.
Pour activer l'I2C donc, il faut lancer la commande suivante avant de triturer quelques petits fichiers.
Code : Tout sélectionner
sudo apt-get install i2c-tools
Pour ouvrir un fichier sous Linux, la manière la plus simple de procéder avec le Raspberry est de lancer la commande "sudo nano nom_du_fichier". C'est un éditeur en ligne de commande qui s'ouvre, et bien qu'il soit moche les commandes qu'on peut utiliser avec lui sont listées en bas, ce qui facilite pas mal la tâche quand on ne connait rien aux éditeurs en ligne de commande. Si vous connaissez bien votre ordinateur, vous pouvez éditer les fichiers avec n'importe quel éditeur, en faisant bien attention ici à les éditer en tant que "root", l'utilisateur qui a tous les droits (ceci est accompli en mettant le "sudo" avant le nano dans la commande que j'ai montré, il y a d'autres manières de faire mais c'est pas pertinent).
Après, dans /etc/modules ("sudo nano /etc/modules"), il faut ajouter aux deux dernières lignes :
Code : Tout sélectionner
i2c-bcm2708
i2c-dev
Si le fichier /etc/modprobe.d/raspi-blacklist.conf existe, il faut lui retirer les deux lignes suivantes (ou ajouter un # devant, ce qui revient à en faire des commentaires que l'ordinateur ne lira jamais) :
Code : Tout sélectionner
blacklist spi-bcm2708
blacklist i2c-bcm2708
Dans /boot/config.txt, ajoutez enfin :
Code : Tout sélectionner
dtparam=i2c1=on
dtparam=i2c_arm=on
Après ça il s'agit de redémarrer, avec la commande suivante :
Code : Tout sélectionner
sudo reboot
Au redémarrage, l'I2C devrait être activé et fonctionnel. Il s'agit maintenant juste d'installer ce qui est nécessaire à faire fonctionner le petit thermomètre. Pour ça il faudra entrer en ligne de commande et exécuter les choses suivantes dans le Raspberry :
Code : Tout sélectionner
sudo apt-get update
sudo apt-get install build-essential python-dev python-pip python-smbus git
sudo pip install RPi.GPIO
cd ~
git clone https://github.com/adafruit/Adafruit_Python_MCP9808.git
cd Adafruit_Python_MCP9808
sudo python setup.py install
cd ~
Je vais pas prendre le temps d'expliquer toutes ces commandes parce que ce n'est pas un tutoriel Linux, mais en gros vous êtes en train de télécharger et d'installer les choses nécessaires pour lire ce que votre thermomètre a a vous dire. S'il y a assez d’intéressés je peux faire un truc rapide expliquant comment fonctionnent les commandes sous Linux en général et ce que font précisément les commandes au-dessus.
Si vous créez ensuite un fichier nommé "temperature.py" dans lequel vous copiez le code suivant et que vous l'exécutez, vous devriez voir apparaître à l'écran la température que mesure le thermomètre !
Code : Tout sélectionner
#!/usr/bin/python
import Adafruit_MCP9808.MCP9808 as MCP9808
sensor = MCP9808.MCP9808()
sensor.begin()
temp = sensor.readTempC()
print("Il fait actuellement " + "{0:0.3F}".format(temp) + "°C dans cette piece.")
Ce que ce code fait est qu'il charge ce que vous venez juste de télécharger pour lire les valeurs données par le thermomètre, avant de les imprimer à l'écran, et s'arrêter. Donc c'est assez facile.

Mais il faut bien commencer doucement.

Ce qui serait assez chouette ce serait de pouvoir écrire dans un fichier les valeurs de température relevées pour pouvoir les garder sur le long terme et tracer des graphes avec ! Pour ça il nous faut donc que le programme lise des températures perpétuellement, qu'il fasse des petites pauses entre chaque lecture pour pas niquer l'espace de stockage en deux jours, et qu'il ouvre et écrive dans un fichier les informations notées pour les conserver.
Pour ça créons tout d'abord un répertoire dans lesquels nous écrirons les relevés de température, à raison de un fichier par jour, avec la date du jour comme nom de fichier. On nommera le répertoire "logs_de_temperature", et on peut le créer en entrant la commande suivante dans le terminal de commande :
Code : Tout sélectionner
mkdir /home/pi/logs_de_temperature
En modifiant le code au-dessus un peu on arrive à ça, qui fait exactement ce qu'on veut !
Code : Tout sélectionner
#!/usr/bin/python
import Adafruit_MCP9808.MCP9808 as MCP9808
from time import sleep, time, strftime
sensor = MCP9808.MCP9808()
sensor.begin()
while True:
temp = sensor.readTempC()
with open("/home/pi/logs_de_temperature/" + strftime("%d-%m-%Y"), "a") as day_log:
day_log.write(strftime("%H%M ") + "{0:0.3F}".format(temp) + "\n")
sleep(60)
Maintenant, le Raspberry enregistre une valeur toutes les minutes dans un répertoire prévu à cet effet. Si vous voulez que ce soit moins fréquent, vous pouvez éditer la dernière ligne du programme en question, "sleep(60)", et remplacer le 60, qui est l'intervalle de temps en secondes entre chaque relevé de température, par le temps que vous voulez.
Toutefois ce programme a un problème, c'est qu'en le lançant tel qu'il est on ne peut plus entrer de commandes. Si vous appuyez sur Ctrl+C vous retrouverez contrôle de votre petite machine, mais le programme ne tournera plus.

Une bonne solution serait de faire en sorte que le programme se lance automatiquement à chaque fois que le Raspberry Pi démarre, comme ça on n'aurait pas à s'emmerder à sortir un écran ou à s'y connecter par SSH pour lancer le programme après chaque coupure de courant ou autre miséricorde qui viendrait ruiner le train-train quotidien du petit ordinateur.
Pour cela, il faut éditer le fichier "/etc/rc.local", qui regroupe toutes les commandes lancées dès qu'on allume le PC ! On n'a qu'à y ajouter la commande qu'on pourrait utiliser pour lancer le programme à la main, c'est à dire rien d'autre de plus que "/home/pi/temperature.py". Attention toutefois, il faut ajouter cette commande sur une ligne à part et avant toute mention de "exit", qui marque la fin de ce que l'ordinateur lira au démarrage.
Bon, du coup on a un programme qui gère le thermomètre et s'assure, dès que le Raspberry est allumé, d'enregistrer les températures que relève le thermomètre une fois par minute. Maintenant on va voir comment tracer de jolis graphes avec ça, et les servir aux autres ordinateurs de la maison qui pourront les voir au travers d'un navigateur web.
Monter un petit site web accessible depuis la maison uniquement :
Actuellement, vous avez un Raspberry Pi connecté à internet via une box, très probablement. Si vous avez d'autres ordinateurs dans la maison, ou même un téléphone portable, que vous connectez à internet également, il y a de grandes chances qu'ils y accèdent par la même box que le Raspberry Pi. Il se trouve que votre Raspberry Pi et vos autres ordinateurs communiquent un peu au travers de cette box, ils se posent des questions sur "qui est quoi" pour savoir dans quel réseau ils se trouvent et tout. Si vous jouez à une partie d'Age of Empires en LAN, alors vos ordinateurs se mettent à se demander d'autres questions, comme "où est ton soldat ?", "combien de vie lui reste-t-il ?", "combien de ressources porte ce villageois ?"... C'est en manipulant les réponses que votre ordinateur donne à ce genre de question que les hackeurs peuvent donner une vie infinie à leurs troupes ou douer leurs bonhommes de téléportation, mais bref. La morale, c'est que les ordinateurs communiquent spontanément quand ils sont reliés à une même box.
Quand vous allez sur ce forum, votre ordinateur demande au serveur "donne moi la page /index.php" ou autre, et le serveur lui répond "je vais te donner la page /index.php, c'est du html et tout", et votre ordinateur se dit "chouette, du html, c'est un truc que je connais, je vais pouvoir transformer le texte que ça représente en page web avec des images et des belles couleurs pour que ce soit lisible pour l'humain qui se sert de moi".
Votre navigateur web est un peu comme une brute dans ce sens, à chaque fois que vous lui donnez une adresse il y va et fait toujours cette même requête : "donne moi cette page : xxx". Vous pouvez même lui faire demander ça à votre Raspberry Pi du coup, en tapant l'adresse IP du Raspberry dans votre barre de navigation (vous pouvez trouver cette fameuse adresse en tapant "ifconfig" dans le terminal de commande, normalement ça ressemble à 192.168.XXX.XXX). Toutefois, le Raspberry n'est pas configuré pour répondre à ce genre de requête, et du coup, il ne va rien répondre. Votre navigateur web vous dira que le machin refuse les connexions ou qu'il n'est pas disponible, quelle tristesse.

Pour remédier à cette tragédie, éduquons le Raspberry dans les voies du web et des requêtes HTTP, afin qu'il puisse enfin communiquer lisiblement avec le monde ! Pour ce faire, nous allons utiliser Flask, qui permet de monter et gérer des serveurs web en Python et qui est loin de présenter tous les défauts du PHP.

Pour installer Flask, si vous avez suivi toutes les commandes à la lettre jusqu'ici il vous suffit de faire dans la ligne de commande :
Code : Tout sélectionner
sudo pip install flask
Sinon, vous pouvez faire :
Code : Tout sélectionner
sudo apt-get install python-pip
sudo pip install flask
Après ça c'est dommage mais soit vous connaissez déjà le Python et vous allez apprendre des trucs, soit vous connaissez pas et vous n'allez rien comprendre. N'importe qui a le droit de copier le code qui suit, j'y attache pas vraiment une grande importance, mais j'aime bien quand les gens comprennent ce qu'ils font, alors j'incite vraiment ceux qui en auraient besoin à apprendre le Python ou n'importe quel autre langage de programmation (une fois qu'on en connait un c'est beaucoup plus facile d'en apprendre de nouveaux), c'est vraiment intéressant je trouve.
Pour un site web très très basique, chez moi j'ai 6 fichiers répartis dans deux répertoires, donc ça va. Ce que je vais présenter ici est une version épurée de celui qui tourne en permanence chez moi, lui est un peu plus gros déjà mais si vous comprenez comment ajouter des fichiers et les modifier pour augmenter la taille de votre application web, vous dépasserez la taille du mien en un rien de temps !
Voici déjà la structure des répertoires :
Code : Tout sélectionner
~/application_web
+ static
| global.css
| stylesheet-reset.css
+ templates
| index.html
| base.html
| temperature_live.html
| pages.py
Des explications sur ce que fait chaque fichier :
- global.css : comme son extension l'indique, c'est une feuille de style, un "Cascading StyleSheet". C'est ce qui définit la couleur de l'arrière plan, la couleur et la police du texte, la position des éléments sur la page... Concrètement, c'est ce qui régit l'apparence des choses, sans toucher du tout au contenu, qui lui est contenu dans les fichiers html.
- stylesheet-reset.css : chaque navigateur ayant la sale tendance à glisser des paramètres css par défaut dans les pages web qu'il vous présente, et ces paramètres par défaut étant différents d'un navigateur à l'autre, ce fichier sert à tout mettre à zéro pour éviter les différences de présentation entre Chrome et Firefox par exemple. Ces différences sont mineures, certes, mais moi elles me gênent.
- base.html : c'est la base ! Sur votre mini-site vous aurez deux pages, qui ont en commun la barre du haut et la barre latérale là. Si vous aviez fait deux fichiers séparés dans lesquels vous décriviez tout le nécessaire pour créer la barre du haut et la barre latérale séparément, à chaque fois que vous éditez un des deux fichiers vous auriez à éditer l'autre pour que le site dans son ensemble reste cohérent, ce qui serait chiant au possible. La solution ici est de faire un fichier séparé qui ne décrit que la barre du haut et la barre latérale, et laisse aux fichiers spécifiques à chaque page le loisir de mettre tout ce qu'ils veulent dans l'espace du milieu.
- index.html : c'est le fichier décrivant le contenu du container central sur la page de l'index, ici il contient pas grand chose.
- temperature_live.html : c'est le fichier contenant tout le code nécessaire à dessiner de beaux graphiques en javascript (ok ok j'ai menti il n'y a pas que tu Python), et le code nécessaire à faire une requête par minute au Raspberry pour qu'il nous donne la nouvelle mesure qu'il a relevé depuis la dernière fois.
- pages.py : c'est le maître de l'application en personne, c'est ce fichier qu'on lance pour démarrer le site web. C'est lui qui dit quoi donner quand le Raspberry reçoit une requête HTTP, qui va chercher les fichiers dans lesquels on enregistre la température pour les formater en json, qui est facilement lisible en javascript, et tout et tout. Il faut donc prendre soin de ce fichier, sinon tout pète !
Voici tous les fichiers mentionnés dans une archive prête pour le téléchargement. Il vous suffit de placer le répertoire nommé "application_web" dans votre "home", et de lancer l'application avec la commande suivante pour voir si ça marche :
Code : Tout sélectionner
python pages.py
Si vous retentez de vous connecter à votre Raspberry Pi avec votre navigateur web, vous devriez maintenant voir un truc classe comme ça :
Maintenant il ne vous reste qu'à ajouter la ligne "python pages.py" à votre /etc/rc.local, pour que le serveur web se lance automatiquement au démarrage du Raspberry Pi. Comme ça vous pouvez le laisser dans un coin sans écran et il sera tranquille.
Voilà voilà, je vais rajouter d'autres choses à ce sujet à l'avenir, au fur et à mesure que je construits mon propre Raspberry. D'ici une ou deux semaines je devrais ajouter tout ce qui est nécessaire à la réalisation des timelapses là.
Et bien sûr, surtout n'hésitez pas avec les questions, c'est grâce à elles que je verrai s'il y a besoin ou non de rajouter quoi que ce soit dans ce tutoriel ! Les critiques aussi sont les bienvenues, si vous trouvez que je passe trop de temps sur un sujet et pas assez sur un autre, ou que vous voulez encore plus de détails sur un truc qui pour moi parait insignifiant, signalez-le !