Académique Documents
Professionnel Documents
Culture Documents
Travail de Bachelor
Rapport de projet
2 Remerciements
Je tiens à remercier Monsieur Hervé Dedieu, directeur de l’entreprise Novaccess et professeur à la
HEIG-VD et Monsieur Jean-Daniel Carrard, fondateur de l’entreprise JDC Electronic SA pour leurs
conseils en matière de capteurs et de technologies de communication au sujet des stations
météorologiques.
Je remercie aussi Monsieur Marcos Rubinstein, mon responsable de travail de Bachelor, qui m’a
suivi et conseillé tout au long du projet ainsi que Monsieur Claude Guinchard et ses collègues de
l’atelier A03 pour m’avoir aidé lors de la conception des cartes PCB.
3 Planification
La planification des tâches ainsi que le diagramme de GANTT de la planification sont ajoutés en
annexes de ce rapport. Tous les deux sont sous forme de tableur Excel et le modèle du diagramme
de GANTT m’a été fourni par Monsieur Marcos Rubinstein.
4 Journal de travail
Un journal de travail a été tenu durant toute la seconde phase du travail de Bachelor. C’est-à-dire
à partir du lundi 18 juin 2018. Aucun journal n’a été établi pendant la première partie du projet
car cela n’avait pas été jugé nécessaire.
Tasks :
1. High-level design of the system
2. Lower-level specifications per platform unit
a. Required sampling rate for
i. Temperature
ii. Wind
iii. Humidity
iv. Slow E field
v. Wideband E Field
b. Required data communication data rates per unit
3. Search for suitable platforms
a. Does Raspberry Pi satisfy the requirements?
i. Availability of sensors
ii. Ports
iii. Communications
b. Does Arduino satisfy the requirements?
i. Availability of sensors
ii. Ports
iii. Communications
c. Other platforms (evaluation of suitability for each one)
i. Availability of sensors
ii. Ports
iii. Communications
4. Choice of platform
5. Acquisition of platform and sensors
6. Test of hardware and sensors
7. Programming
a. Flow diagram
b. Implementation
8. Test
6 Résumé du projet
AKUNU est un projet qui a pour but de développer un réseau de capteurs portant le même nom et
dont l’objectif est de collecter au niveau mondial des données atmosphériques pour les pays à
faible revenu. Ce projet est proposé conjointement par le laboratoire Armstrong de l’université
d’Uppsala en Suède, l’université nationale de Colombie, l’université de Colombo au Sri Lanka,
l’université nationale de Cordoba en Argentine, l’UNIDEF en Argentine et l’institut IICT de la HEIG-
VD à Yverdon-les-Bains en Suisse.
Il existe déjà un grand nombre de stations météorologiques qui sont à la pointe de la technologie.
Ces stations sont généralement très fiables, très robustes et permettent de récolter des données
atmosphériques d’une grande précision, y compris des champs électromagnétiques de la foudre
avec une précision suffisante pour permettre la détection et la localisation en temps réel de ces
décharges. Mais le grand problème est que ces stations coûtent beaucoup trop cher pour les pays à
faible revenu et que ces derniers n’ont pas forcément besoin d’un réseau de capteurs
météorologiques de si haute précision. Utiliser une solution plus accessible en acceptant en
contrepartie de perdre quelque peu en fiabilité et en précision serait suffisant pour ces pays.
L’objectif principal du projet AKUNU est de mettre en place une infrastructure de stations
météorologiques permettant de récolter des données atmosphériques telles que la température
ambiante, l’humidité dans l’air, la pression atmosphérique, la vitesse et la direction du vent ainsi
que les champs électromagnétiques. Le coût de l’infrastructure se doit d’être bon marché afin que
les prix soient accessibles pour les pays en voie de développement. La spécification des prix et
coûts d’exploitation se place dans une fourchette large, allant des capteurs ultra bas prix ne
coûtant que quelques centaines de francs suisses jusqu’à une dizaine ou une vingtaine de milliers
de francs pour une solution finale.
Les premiers pays visés par le projet AKUNU sont l’Argentine, la Colombie et le Brésil en Amérique
latine ainsi que le Sri Lanka situé au sud de l’Inde. Puis, si la mise en place d’une infrastructure à
bas prix de stations météorologiques s’avère concluante dans ces quatre pays, il serait envisageable
de mettre en place des réseaux de stations météorologiques dans d’autres pays à faible revenu.
Dans un premier temps, une petite infrastructure a été mise en place pour tester des solutions à
très bas prix (quelques centaines de francs) en commençant par utiliser du matériel bon marché et
des technologies de communication basiques. Plus tard, il sera possible d’utiliser des protocoles de
communication et du matériel plus optimisés pour les stations météorologiques afin d’améliorer la
fiabilité, la robustesse et l’autonomie du réseau AKUNU et de ses stations.
Concernant la récupération des données atmosphériques, actuellement les stations
météorologiques envoient des données sur un serveur de fichiers à l'intérieur du réseau AKUNU.
Dans le futur, l’idéal serait de pouvoir récolter les données en temps réel afin de pouvoir détecter
au plus vite l’arrivée d’orages, de bourrasques de vent ou d’autres phénomènes atmosphériques.
L’objectif serait que les stations météorologiques puissent envoyer chaque seconde les données
qu’elles récoltent à un serveur central puis ensuite sur le Cloud afin que les informations puissent
être traitées en temps réel par les personnes concernées.
Les données sont pour l'instant envoyées de manière séquentielle au serveur central via un fichier
de logs. Il est possible de modifier différents compteurs pour augmenter ou diminuer les fréquences
de récolte indépendamment pour chaque type de donnée et il est aussi possible de gérer les
fréquences d'envoi des fichiers de logs sur le serveur de fichiers. Pour les données relatives aux
champs électromagnétiques, les transmissions ont lieu de façon événementielle où la station émet
uniquement lorsqu'un flux électromagnétique est détecté.
Un des points les plus importants du projet AKUNU est de pouvoir facilement ajouter des stations
météorologiques supplémentaires et d’étendre la taille du réseau couvert par les stations. Cela
signifie que la conception de l'infrastructure mise en place a été étudiée pour être évolutive.
La force du réseau AKUNU est de pouvoir offrir une infrastructure de stations météorologiques qui
soit évolutive et abordable pour les pays à faible revenu tout en leur permettant néanmoins de
récolter des données atmosphériques de bonne qualité à des fins de recherche scientifique et
d’alertes météorologiques
8 Introduction
Ce document est le rapport final du travail de Bachelor effectué sur le projet AKUNU. AKUNU est
un projet qui a pour but de développer un réseau de capteurs portant le même nom et dont
l’objectif sera de collecter au niveau mondial des données atmosphériques pour les pays à faible
revenu. Ce projet est proposé conjointement par le laboratoire Armstrong de l’université d’Uppsala
en Suède, l’université nationale de Colombie, l’université de Colombo au Sri Lanka, l’université
nationale de Cordoba en Argentine, l’UNIDEF en Argentine et l’institut IICT de la HEIG-VD à Yverdon-
les-Bains en Suisse.
Ce travail est effectué par Julien Brêchet, étudiant de troisième année de la filière Réseaux et
Services au sein de l’HEIG-VD d’Yverdon-les-Bains. Le professeur responsable est Monsieur Marcos
Rubinstein, professeur à la HEIG-VD et membre de l’institut IICT.
Le travail de Bachelor est divisé en deux phases. La première a lieu du lundi 19 février 2018 au
vendredi 15 juin 2018 à raison d’environ 12 heures par semaine et où le travail préliminaire est
effectué en parallèle d’autres cours lors du dernier semestre de la formation d’ingénieur HES au
sein de la HEIG-VD. A la fin de ces seize premières semaines, un rapport intermédiaire doit être
rendu le 15 juin 2018 et celui-ci est noté afin d’évaluer le travail préparatoire effectué sur le projet
AKUNU.
Ensuite, la seconde partie s’effectue du lundi 18 juin 2018 au vendredi 27 juillet 2018. Durant ces
six semaines, l’étudiant travaille sur le projet à plein temps, ce qui équivaut à une quarantaine
d’heures par semaine. Le rapport final du travail de Bachelor doit être remis au secrétariat TIC le
vendredi 27 juillet 2018 à 12h00 et sera défendu par l’étudiant courant septembre 2018.
9 Rapport de projet
9.1 Conception haut niveau du système
9.1.1 Objectifs du système
Le projet AKUNU a pour objectif de permettre à des pays en voie de développement de récolter
des données atmosphériques telles que la température ambiante, l’humidité dans l’air, la pression
atmosphérique, la vitesse et la direction du vent et les champs électromagnétiques en mettant en
place une infrastructure de stations météorologiques pour un coût relativement faible et accessible
ne dépassant pas la vingtaine de milliers de francs suisses.
Le premier critère est que l’infrastructure soit évolutive, c’est-à-dire qu’il doit être aisé d’ajouter
de nouvelles stations au sein du réseau AKUNU et que ce soit facile d’améliorer les composants et
les technologies utilisés. Le second critère est que le coût de mise en place de l’infrastructure soit
accessible aux pays émergents. L’infrastructure et les stations météorologiques qui la composent
doivent, malgré leur faible coût, être fiables et robustes afin d’avoir des coûts de maintenance peu
élevés. Les données relevées par les stations devront aussi être d’une précision suffisamment
satisfaisante, même si nous savons qu’il ne sera probablement pas possible de rivaliser avec les
instruments de mesure de haute-précision fabriqués par des constructeurs de renommée mondiale.
Le plus important est d’avoir une infrastructure robuste, fiable et de récolter des données
atmosphériques avec une précision honnête tout en restant dans un budget accessible.
Les données récoltées devront être envoyées à un serveur central le plus vite possible afin que des
météorologues et autres personnes compétentes puissent analyser les données au plus proche du
temps réel. Pour ce faire, beaucoup de réflexions sont axées sur l’évolutivité de l’infrastructure et
l’objectif est de pouvoir améliorer les technologies et les composants qui forment le réseau de
L’un des objectifs est d’utiliser des protocoles de communication basse consommation afin que les
stations soient énergétiquement autonomes. Mais initialement, la première infrastructure de test
sera mise en place avec des technologies dites basiques et avec des transmissions de données ne
coûtant rien ou très peu.
L’un des autres objectifs, probablement le plus important, est que les plateformes et les
technologies utilisées puissent offrir une grande évolutivité de l’infrastructure du réseau de
capteurs. Il devra être aisé d’ajouter de nouvelles stations dans le réseau, d’améliorer les
plateformes et les technologies de communication utilisées, d’augmenter la vitesse de transmission
et de s’approcher de plus en plus de la récolte de données en temps réel.
Dans un souci de maintenance, il serait aussi utile de pouvoir détecter si une station de
météorologie ou un autre élément du réseau AKUNU tombe en panne et éventuellement pouvoir le
redémarrer à distance. Selon les plateformes et les technologies utilisées, une solution de
maintenance peut être plus ou moins facilement mise en place.
9.1.5.2.1 Arduino M0
Il existe de nombreux produits Arduino comme le modèle M0 disposant d’un microcontrôleur 32 bits
(figure 3). Tout comme le Raspberry Pi Zero W, sa consommation énergétique est assez faible.
Les spécifications de l’Arduino M0 sont les suivantes [6] :
1 microcontrôleur AT91SAM3X8E
Tension de 3.3V pour le microcontrôleur
Tension d’entrée recommandée de 7 à 12V
Mémoire flash de 512kB
SRAM de 96kb
Vitesse d’horloge à 84MHz
12 I/O pins analogiques
54 I/O pins digitales
Consommation énergétique de 800mA
Exemple de prix pour l’Arduino Due : 48.- CHF sur digitec.ch.
Figure 5 : Capteur Adafruit BME 280 trouvé sur le site officiel adafruit.com
Poids de 2.4g
Prix de l’antenne GPS : 4.95$ sur le site d’Adafruit.
Figure 6 : Antenne passive avec connecteur UFL trouvée sur le site officiel adafruit.com
A noter que les antennes passives comme celle que nous apercevons à la figure 6 ne possèdent pas
de LNA et n’exigent donc aucune puissance pour fonctionner [11].
Chipset MTK3339
66 canaux pour rechercher des satellites
Fréquence de mise à jour à 10Hz
Tension de 5V
Intensité de 20mA
Compatible avec une batterie RTC
Enregistrement de données intégré
Sortie PPS
Antenne interne + connecteur UFL pour une antenne externe active
LED de statut
66 satellites recherchés et 22 suivis (traking)
Taille de l’antenne : 15mm x 15mm x 4mm
Précision de la position : 1.8m
Précision de la vitesse : 0.1m/s
Sensibilité d’acquisition : -15dBm
Sensibilité de suivi : -165dBm
Jusqu’à 210 canaux PRN
Détection et réduction du brouillage
Détection et compensation du multi-path
Avec un Arduino ou un Raspberry Pi, il est possible de communiquer avec le capteur Ultimate GPS
Breakout par TTL ou avec un lien série UART. Le capteur permet de récupérer le temps, la date, la
longitude, la latitude et l’altitude toutes les 15 secondes et en cas de besoin la mémoire flash
interne peut stocker jusqu’à 16 heures de données [12].
Exemple de prix de la carte de dérivation Ultimate GPS : 39.95$ sur le site d’Adafruit.
Figure 7 : Adafruit Ultimate GPS Breakout sur une plaque de test trouvé sur le site officiel adafruit.com
La figure 7 nous montre qu’il est possible de connecter l’Adafruit Ultimate GPS Breakout sur une
plaque de test et que la carte possède neuf pins ainsi qu’un connecteur UFL pour y brancher une
antenne passive.
Sortie de 0.4V à 2V
Plage de mesure fiable allant de 0.5 à 50 mètres par seconde
Précision de +/- 1 mètre par seconde
Résolution de 0.1m/s
Vitesse maximale de calcul : 70m/s
Hauteur : 105mm
Poids : 111.8g
Longueur de bras : 70mm
Longueur du câble : 99cm avec un diamètre de 4.8mm
Longueur de la prise : 30mm
Exemple de prix de l’anémomètre : 44.95$ sur le site d’Adafruit et 44.95 CHF sur digikey.ch
Figure 8 : Anémomètre avec tension de sortie analogique trouvé sur le site officiel adafruit.com
batteries les appareils fonctionnant avec ces technologies. Les communications ont lieu
sporadiquement et vont du périphérique LPWAN à un serveur. Parfois le serveur peut répondre dans
les secondes qui suivent pour donner des informations au périphérique qui a envoyé la requête.
Le débit n’est en général pas très élevé, il s’élève à une centaine de bits par seconde. Et comme
je l’ai déjà expliqué auparavant, les communications ne se font que de temps en temps comme par
exemple de manière séquentielle toutes les 15 minutes. Les technologies LPWAN peuvent s’avérer
très intéressantes au niveau de l’autonomie des stations météorologiques car la consommation
énergétique est moindre mais le problème est qu’il serait impossible de s’approcher de l’envoi des
données en temps réel car le nombre et le débit des communications sont limités. Parmi les
technologies LPWAN les plus connues, nous pouvons trouver LoRa et Sigfox.
9.1.7.1.1 LoRa
LoRa est une technologie LPWAN utilisée pour envoyer des messages de petite taille de façon
sporadique d’un périphérique LoRa à un serveur qui peut être physique, virtuel ou être une instance
sur un Cloud tel qu’Amazon Web Services.
A proprement parler, LoRa est la couche physique qui utilise une modulation de spectre propriétaire
développée par la société française Cycleo qui a ensuite été rachetée par Semtech. La modulation
s’effectue principalement sur les bandes ISM 868MHz mais peut aussi s’effectuer sur d’autres
fréquences. LoRaWAN est quant à elle la couche applicative qui fonctionne sur la couche physique
LoRa. C’est une technologie ouverte (open-standard).
9.1.7.1.2 Sigfox
Tout comme LoRa, Sigfox est une technologie LPWAN utilisant des composants qui consomment très
peu d’énergie et qui peuvent fonctionner sur batteries. Sigfox est un protocole de communication
développé par la société française du même nom qui est implantée à Labège, commune de la
banlieue toulousaine [14].
A l’aide de la figure 10, nous pouvons constater que les zones couvertes par Sigfox sont
actuellement un peu plus nombreuses que pour LoRa mais le réseau Sigfox ne couvre pas tous les
pays visés par le projet AKUNU. L’Argentine, le Brésil ainsi que la Colombie possèdent des
infrastructures permettant d’utiliser la technologie Sigfox mais ce n’est pas encore le cas pour le
Sri Lanka [15].
Sigfox utilise une technologie de modulation propriétaire qui utilise tout comme LoRa les bandes
ISM 868MHz en Europe et 902MHz aux Etats-Unis [14]. Sigfox utilise une modulation d BPSK pour les
transmissions montantes (liaisons uplink allant du périphérique au Cloud Sigfox). Il utilise un
protocole léger avec peu d’overhead pour gérer des messages de petite taille dans des systèmes
conventionnels. Sigfox est optimisé au maximum afin de consommer le moins d’énergie possible
lors de l’envoi d’un message [16].
La taille maximale d’un message uplink est de 12 octets, ce qui équivaut à 96 bits. Le nombre
maximal d’envoi de messages par jour pour un périphérique est défini à 140 pour éviter à ce que
ce dernier consomme trop d’énergie. Quant aux messages de liaison descendante (downlink), ils
sont limités à 4 envois par jour et ont une taille maximale limitée à seulement 8 octets.
La topologie de l’architecture du réseau Sigfox est en étoile. Des milliers d’objets (périphériques)
transmettent leurs messages au réseau Sigfox via les stations Sigfox déployées dans les différents
endroits du monde indiqués par la figure 10. Ces stations communiquent via un lien point à point
avec le Cloud Sigfox et ce dernier pousse les messages vers de nombreux serveurs clients et
plateformes informatiques [16]. La figure 11 ci-dessous illustre un exemple d’architecture Sigfox.
Figure 11 : Architecture Sigfox trouvée sur une vidéo Youtube de l'entreprise [17]
Sigfox est compatible avec les technologies Bluetooth, GPS 2G/3G/4G et wifi. Ses coûts de
connectivité sont peu élevés et c’est une technologie qui permet de mettre en place des solutions
qui consomment très peu d’énergie [16].
Tout comme avec la technologie LoRa, l’un des inconvénients de Sigfox est que la couverture du
réseau n’est pas disponible dans au moins un des quatre pays qui sont concernés par le projet
AKUNU. Ici le problème serait pour le Sri Lanka qui ne dispose à priori d’aucune couverture du
réseau Sigfox. L’autre problème est aussi le même que pour LoRa, c’est-à-dire que chaque station
météorologique ne pourrait envoyer au serveur qu’un nombre limité de messages par jour, 140 avec
Sigfox. Ce serait donc, tout comme pour LoRa, impossible de s’approcher de l’envoi des données
en temps réel.
Dispositif ayant toutes les fonctions possibles (FFD : Full Function Device)
Dispositif ayant des fonctions limitées (RFD : Reduced Function Device)
Le FFD peut assurer trois rôles dans un réseau : coordinateur PAN, routeur ou dispositif relié à un
capteur (plus petite fonction possible, appelé dispositif de fin). Le RFD quant à lui est prévu pour
des applications simples (signaler l'état d'un capteur, contrôler l'activation d'un actionneur). Il est
considéré comme un dispositif d’extrémité (end device en anglais), dans le sens où il n'est pas
essentiel au réseau [18].
Pour communiquer sur un même réseau, un FFD (au moins) et des RFD doivent utiliser le même
canal physique parmi ceux définis selon la bande de fréquence choisie. Le FFD peut dialoguer avec
des RFD et des FFD, tandis que le RFD dialogue avec un FFD uniquement [18].
9.1.7.2.1 Zigbee
ZigBee est un protocole de haut niveau permettant la communication d'équipements personnels ou
domestiques équipés de petits émetteurs radio à faible consommation ; il est basé sur la norme
IEEE 802.15.4 pour les réseaux PAN. ZigBee peut utiliser les trois bandes définies par la norme IEEE
802.15.4 : [19]
Figure 12 : Aperçu sous forme de pile pour la technologie ZigBee 3.0 [21]
La norme IEEE 802.15.4 définit la couche physique et la couche MAC du protocole ZigBee. Pour
obtenir une solution fonctionnelle, il faut implémenter les couches de plus haut niveau que sont
les couches réseau et application parce que celles-ci ne sont pas standardisées par la norme IEEE
802.155.4. La ZigBee alliance s’occupe de cette partie du protocole en fournissant une pile de
référence qui est réservée aux membres de l’alliance [19] qui développent leurs propres solutions.
Nous pouvons apercevoir ces différentes couches dans la figure 12 ci-dessus.
Zigbee PRO sert d'infrastructure réseau pour les réseaux et produits basés sur Zigbee. Utilisé seul,
il peut constituer la base d’implémentations d’architectures IoT robustes et propriétaires. Comme
déjà dit auparavant dans ce document, il étend la norme IEEE 802.15.4 en ajoutant un réseau maillé
et des couches de sécurité supplémentaires avec un framework applicatif pour devenir une solution
interopérable et à faible consommation énergétique.
Caractéristiques de ZigBee PRO [22] :
Communication crossband (full duplex) sur des bandes de 2.4GHz et sous-GHz avec prise en
charge de plusieurs supports physiques
Fonctionnement global dans la bande de fréquence 2.4GHz selon la norme IEEE 802.15.4
Opération régionale dans les bandes 915MHz et 868MHz
Solution agile de fréquence fonctionnant sur 16 canaux pour la fréquence 2.4GHz et 90
canaux pour la bande sous-GHz
Intègre des mécanismes d’économie d’énergie pour toutes sortes d’appareils et supporte
les appareils sans batterie
Mécanisme de découverte avec confirmation de l’application
Mécanisme de jumelage avec confirmation de l’application
Topologie réseau maillée
Communication dans un PAN
Différentes options de transmission incluant unicast, broadcast et multicast
Mécanisme sécurisé pour la génération de clefs
Utilise le standard AES-128 pour le schéma de sécurité
Selon un article qui étudie les distances maximales de communication pour ZigBee [24], pour un
message de 1'024 bits sur le canal 26, la distance maximale est de 45 mètres. La distance chute
considérablement à 20 mètres s’il y a du trafic sur le canal wifi numéro 13. Avec des messages
d’une taille de 512 bits, la distance maximale de communication n’augmente pas de manière très
significative : 50 mètres avec du bruit environnant standard, 45 mètres avec un autre réseau ZigBee
sur le canal 26 et 30 mètres si du trafic sur le canal wifi numéro 13 est présent.
Pour une taille de message de 256 bits, la distance maximum augmente à 45 mètres si du trafic wifi
sur le canal 13 a lieu et sinon c’est 50 mètres. Les distances de communication ZigBee sont donc
influencées par la présence ou non de réseaux wifi [23].
La technologie ZigBee peut s’avérer très intéressante pour le projet AKUNU car il serait
envisageable d’installer des stations météorologiques tous les 20-30 mètres afin que les messages
de chaque station puissent être relayés jusqu’au coordinateur PAN. Il serait aussi techniquement
possible de mettre en place une solution de self-healing au cas où un nœud du réseau tomberait
en panne.
9.1.7.2.2 Z-Wave
Z-Wave est un protocole qui communique en utilisant une technologie de faible puissance dans la
bande de fréquence 868MHz. Ce protocole radio est optimisé pour des échanges à faible bande
passante (entre 9 et 40 kbit/s) et des appareils sur pile ou alimentés électriquement, par opposition
au wifi par exemple, qui est prévu pour des échanges à haut débit et sur des appareils alimentés
électriquement uniquement. Z-Wave fonctionne dans la gamme de fréquences sous-GHz, qui
dépend des régions (868MHz en Europe, 908MHz aux Etats-Unis, et d'autres fréquences suivant les
bandes ISM des régions). La portée est d'environ 50 m [25].
Tout comme ZigBee, Z-Wave est basé sur la norme IEEE 802.15.4 et fonctionne avec une topologie
maillée. Mais contrairement à son concurrent, Z-Wave est surtout spécialisé dans les domaines de
la domotique et il utilise uniquement les bandes de fréquence 915MHz et 868MHz (sous-GHz), pas
de 2.4GHz. Z-Wave utilise un système radio propriétaire élaboré par la société californienne Sigma
Designs [26].
Puisque Z-Wave est totalement propriétaire, cela signifie qu’il y a moins de problèmes
d’interopérabilité qu’avec ZigBee car ce dernier est développé par différentes entreprises au
niveau de la couche réseau et de la couche applicative.
Voici ci-dessous quelques caractéristiques de la technologie [27] :
Un réseau Z-Way possède une topologie maillée, tout comme ZigBee. Il peut y avoir trois types de
nœuds différents dans le réseau [29] :
Contrôleur : 1 ou plusieurs dans le réseau, connaît tous ses voisins, a un accès intégral à la
table de routage, peut communiquer chaque nœud du réseau, si une route existe
Esclave : connaît tous ses voisins, n’a aucun accès à la table de routage, peut uniquement
répondre au nœud dont il a reçu le message
Esclave de routage : connaît tous ses voisins, connaît partiellement les informations
contenues dans la table de routage, peut répondre au nœud dont il a reçu le message et
peut aussi envoyer des messages non sollicités à un nombre prédéfini de nœuds auxquels il
a accès
Z-Way fournit des fonctionnalités ressemblantes à ZigBee mais est beaucoup plus axé côté
domotique et n’est pas actuellement couvert au Sri Lanka. L’utilisation de ZigBee semble
actuellement plus adaptée pour mettre en place l’infrastructure du réseau AKUNU.
9.1.7.3 Bluetooth
Bluetooth est une norme de communications permettant l'échange bidirectionnel de données à très
courte distance en utilisant des ondes radio UHF sur une bande de fréquence de 2,4 GHz. Il existe
plusieurs versions, la plus récente étant la 5 qui a été rendue publique en 2016 [30].
La technologie Bluetooth fonctionne sur la bande de fréquence ISM 2.4GHz qui est comprise plus
précisément entre 2'400 et 2'435MHz [30].
Il existe 79 canaux RF numérotés de 0 à 78 et qui sont séparés de 1MHz en commençant par
2'402MHz. Le codage de l'information se fait par sauts de fréquences et la période est de 625 µs,
ce qui permet 1 600 sauts par seconde. Il existe trois classes de modules radio Bluetooth [30] :
Energy afin de consommer peu d’énergie lors de l’envoi de données. Par contre, il faudrait
absolument des cartes Bluetooth de classe 1 pour avoir une portée proche de la centaine de mètres
car la portée maximale des classes 2 et 3 est absolument insuffisante !
Les Raspberry Pi sont compatibles Bluetooth 4.x et BLE. Il pourrait être intéressant de coupler ces
plateformes avec la technologie Bluetooth classe 1 pour tenter de mettre en place un réseau maillé
basse consommation pouvant s’étendre initialement sur quelques centaines de mètres.
9.1.7.4 Wifi
Les protocoles de communication wifi sont très connus et très répandus à travers le monde. Il existe
de nombreux documents expliquant les caractéristiques et les spécificités de cette technologie et
c’est pourquoi je ne vais pas beaucoup détailler dans ce rapport ce qu’est le wifi.
Les principaux éléments à connaître sont les différentes normes existantes IEEE 802.11 concernant
les réseaux sans fil locaux ainsi que leurs caractéristiques principales. J’ai trouvé un tableau
résumant bien cela sur Wikipédia [33]. Le voici représenté dans la figure 15 ci-dessous :
Figure 15 : tableau montrant les protocoles wifi existants ainsi que leurs caractéristiques principales
En observant le tableau ci-dessus, nous pouvons constater qu’il existe deux bandes de fréquence
bien distinctes. Certains protocoles comme le 802.11b et le 802.11g fonctionnent sur la bande ISM
à 2.4GHz alors que les normes 802.11a et ac utilisent la bande U-NII dans les 5GHz. Le protocole
802.11n, et bientôt le 802.11ax, utilise même les deux bandes de fréquence.
Comparé à la technologie Bluetooth, le taux de transfert de données des technologies wifi est
beaucoup plus élevé et la portée est meilleure. Par contre ce sont des protocoles qui consomment
beaucoup plus d’énergie et il serait difficilement possible de mettre en place une solution avec des
équipements sur batteries communiquant en wifi à l’intérieur du réseau AKUNU.
Le wifi est donc beaucoup plus rapide et plus performant que le Bluetooth, mais ce premier
consomme beaucoup plus d’énergie. Quoiqu’il existe depuis 2017 un nouvel amendement wifi basse
consommation et sous-GHz nommé IEEE 802.11ah.
La norme 802.11ah est surnommée Halow et a pour objectif de permettre l’utilisation du wifi pour
l’Internet des objets. Halow fonctionne sur les fréquences 863 à 868MHz en Europe et grâce à ses
fréquences moins élevées, il est plus aisé pour les signaux de conserver leur intégrité lors de leur
passage à travers les obstacles solides, et cela tout en essayant d’envoyer les messages avec une
faible puissance d’émission pour favoriser l’autonomie des appareils wifi. Par contre, à cause de sa
puissance d’émission plus faible, le débit est beaucoup plus faible que celui des autres normes wifi
[34].
La technologie wifi pourrait être utilisée pour la mise en place de la première infrastructure de
test car elle est facile à mettre en place et est compatible avec beaucoup d’équipements comme
les nano-ordinateurs Raspberry Pi ou les plateformes Arduino équipées d’une carte réseau wifi. Il
serait aussi envisageable de mettre en place une solution wifi fonctionnant avec le protocole basse
consommation 802.11ah pour favoriser l’autonomie des stations météorologiques.
Figure 16 : comparatif des débits des différentes normes de réseaux téléphoniques trouvé sur [37]
Les réseaux GSM, GPRS et EDGE vont gentiment commencer à disparaître au début des années 2020
pour laisser place aux technologies plus récentes telles que la 4G.
embarqués. De trois, ils possèdent aussi une interface WLAN intégrée qui leur permettra de
communiquer au travers du réseau wifi AKUNU.
Au début, les Raspberry Pi seront branchés sur secteur mais j’ai sélectionné le modèle Zero W pour
les stations météorologiques pour favoriser une mise en place ultérieure d’une solution de stations
sur batteries afin de tenter d’avoir des stations avec une autonomie acceptable.
Les stations communiqueront avec un serveur de fichier qui sera installé sur un Raspberry Pi 3
modèle B+ qui récoltera les données des capteurs envoyées par les stations Raspberry Pi Zero W.
Tous ces dispositifs se trouveront dans un réseau WLAN distribué par un point d’accès wifi.
Les deux capteurs sélectionnés pour la première partie du travail de Bachelor sont le capteur
Adafruit BME 280 pour récolter la température, l’humidité environnante et la pression
barométrique ainsi que le capteur Adafruit Ultimate GPS pour récupérer le temps, la date, la
longitude, la latitude et l’altitude en fonctionnant de satellites GPS.
Durant la seconde partie du travail de Bachelor, des capteurs supplémentaires seront installés et
testés. La possibilité de concevoir des cartes PCB sera étudiée et le programme de récolte de
données sera amélioré au fur et à mesure. Si le temps le permet, la mise en place d’une instance
sur un Cloud est envisageable pour fournir aux météorologues un accès facile à toutes les données
atmosphériques récoltées par l’infrastructure de test du réseau AKUNU.
La figure 17 ci-dessus montre un exemple de topologie pour un réseau WLAN contenant un point
d’accès wifi, un serveur de fichiers ainsi que quatre stations météorologiques. Les stations récoltent
des données atmosphériques à l’aide de capteurs et utilisent une carte de dérivation GPS pour
obtenir le temps UTC ainsi que la longitude et la latitude de la station.
Le diagramme de flux en bloc représenté dans la figure 18 montre le processus de récolte des
données atmosphériques et GPS. La station météorologique envoie toutes les X secondes/minutes
une requête aux différents capteurs pour récupérer la température, l’humidité dans l’air, la
pression atmosphérique ainsi que des données relatives au GPS comme le temps UTC, la latitude et
la longitude. Ensuite ces données sont stockées localement dans un fichier de logs, un simple fichier
texte par exemple. Quand un certain nombre de ces données sont récupérées, le fichier est envoyé
sur le serveur de fichiers et pendant ce temps un nouveau fichier est créé localement sur la station
météorologique et il va stocker à son tour les nouvelles données récupérées des capteurs.
Selon le ou les protocoles de communication qui seront utilisés lors de la seconde partie du travail
de Bachelor, la taille des paquets de données transmis peut être limitée. C’est pourquoi il a été
décidé de mettre en place un processus qui va, après avoir écrit un certain nombre de données
dans un fichier, envoyer ce fichier au serveur et commencer à écrire dans un nouveau fichier. Ainsi,
la taille des fichiers transmis au serveur Raspberry Pi 3 B+ peut être facilement gérée afin de ne
pas avoir de fichiers trop volumineux.
Le diagramme pourra être mis à jour en cours de projet en fonction des modifications qui seront
opérées et des différents capteurs mis en place. Par exemple, nous pourrions mettre en place un
capteur de pluie qui détecterait de lui-même quand il devrait envoyer des données à la station, car
ça ne servirait à rien qu’il envoie des données quand il ne pleut pas. Dans ce cas-ci, l’envoi de
requêtes deviendrait bidirectionnel et le diagramme de la figure 18 devrait être modifié.
Figure 18 : Diagramme de flux en bloc indiquant comment les données sont récoltées et stockées
Par la suite, il sera par exemple possible de mettre en place une instance sur le Cloud à laquelle le
serveur de fichiers pourra envoyer tous les logs qu’il a reçus des stations météorologiques. La
technologie de communication à utiliser entre le serveur de fichiers et l’instance Cloud sera
discutée dans la seconde phase du travail de Bachelor.
Actuellement, il est prévu de brancher tous les équipements du réseau AKUNU sur le secteur
électrique. Mais, grâce à leur faible consommation, les plateformes Raspberry Pi Zero W ont été
sélectionnées pour faire office de stations météorologiques pour tenter de les mettre plus tard sur
batteries afin de pouvoir les rendre autonomes sur plusieurs jours ou semaines, voire plusieurs mois.
Le point d’accès qui m’a été fourni est un Linksys Wireless G. La configuration que j’ai mise en
place est assez standard. Les caractéristiques principales sont les suivantes :
Nom du routeur : R1
Modèle du routeur : Linksys WRT54G/GL/GS
Version du firmware : DD-WRT v24-sp2 (10/10/09) mini - build 13064
Adresse MAC : C0:C1:C0:59:B8:6E
SSID : AKUNU-LAN1
Mode de sécurité : WPA2 Personal avec algorithme AES
Plage d’adresse IP du réseau : 192.168.1.1/24
Réseau wifi G-Only
Canal utilisé : 11
L’ensemble de la configuration du réseau wifi est consultable en se connectant sur le routeur à
l’adresse 192.168.1.1.
Il a été décidé de mettre en place un réseau LAN de classe C car actuellement, pour l’infrastructure
de test, il n’y aura au maximum que cinq ou six dispositifs. Dans le cas très peu probable où il y
aurait plus de 254 équipements au sein du réseau, il serait possible de modifier l’adresse IP du
réseau ainsi que son masque de sous-réseau afin d’utiliser un réseau LAN de classe B ou de classe
A. J’ai configuré le wifi pour qu’il utilise le canal 11 afin de limiter au maximum le risque
d’interférences (les trois canaux recommandés sont le 1, le 6 et le 11) et pour qu’il fonctionne
uniquement avec la norme 802.11g à 2.4GHz. Les Raspberry Pi sont compatibles avec la norme
802.11g, donc je préfère éviter la cohabitation avec la norme 802.11b et forcer tous les
équipements à se parler en 802.11g.
Le système d’exploitation que j’utilise est le Raspbian Stretch Desktop. Raspbian Stretch est la
dernière version du système d’exploitation officiel de Raspberry qui est basé sur la distribution
Debian et optimisé pour fonctionner sur un Raspberry Pi. J’ai choisi d’utiliser au début la version
Desktop car j’estime avoir suffisamment de place disponible avec ma carte SD de 16GB et la
configuration des réseaux wifi est plus simple avec une interface graphique. Mais par la suite il
serait envisageable d’utiliser une image épurée sans interface graphique et où tous les logiciels
superflus seraient désinstallés et les processus inutiles seraient désactivés. Cela permettrait
d’économiser quelques GB d’espace disque et d’augmenter légèrement les performances du
Raspberry Pi.
J’ai aussi autorisé les connexions SSH afin de pouvoir me connecter à distance à partir de mon
ordinateur portable. Pour ce faire, j’ai utilisé la commande sudo raspi-config, menu « 5 Interfacing
Options », interface « P2 SSH » et j’ai autorisé les connexions SSH sur le Raspberry Pi. J’ai configuré
le nom du serveur en AKUNU-server et lui ai mis une adresse IP statique 192.168.1.10 en éditant
le fichier « /etc/dhcpcd.conf » selon la figure 20 ci-dessous.
Ensuite, il faut créer le dossier où nous souhaitons stocker nos fichiers de données météorologiques
et le partager. On utilise la commande sudo mkdir -m 1777 /share pour créer le dossier « share »
et le partager.
Une fois le dossier créé, il faut éditer le fichier « smb.conf » qui a été créé lors de l’installation de
samba. On utilise la commande sudo nano /etc/samba/smb.conf pour l’éditer.
On édite la section [share] pour paramétrer le partage SMB selon les informations de la figure 21.
Ensuite, il faut configurer les utilisateurs autorisés ainsi que leur mot de passe pour se connecter
au partage SMB. Dans notre cas, il nous faut ajouter l’utilisateur pi : sudo smbpasswd -a pi
Une fois le mot de passe configuré pour le compte pi, il faut relancer le service Samba avec la
commande sudo /etc/init.d/samba restart. A partir de maintenant, Samba va démarrer
automatiquement au démarrage du Raspberry Pi et notre serveur de fichiers est désormais
opérationnel. La figure 22 montre qu’il suffit d’un simple chargeur avec câble micro USB pour
alimenter et faire tourner le serveur de fichiers Raspberry Pi 3 B+.
Tout comme pour le serveur de fichiers, j’utilise le système d’exploitation Raspbian Stretch
Desktop. J’utilise aussi une carte micro SD de 16GB que j’ai préalablement formatée avec le logiciel
SD Card Formatter et sur laquelle j’ai flashé l’image Raspbian Stretch à l’aide du logiciel Etcher.
Ensuite, j’ai autorisé les connexions SSH en effectuant la même procédure que pour le serveur de
fichiers. J’ai nommé la station AKUNU-station1 et lui ai fixé une adresse statique 192.168.1.11
avec un masque de sous-réseau /24.
Figure 23 : Contenu d'un kit d'extension GPIO trouvé sur Amazon [47]
En suivant le tutoriel, j’ai tout d’abord dû télécharger deux librairies Python écrites et fournies par
Adafruit me permettant de contacter le capteur BME 280. Les librairies Adafruit_Python_GPIO et
Adafruit_Python_BME280 sont disponibles sur GitHub et sont publiées par la société Adafruit [48],
[49]. Après les avoir clonées avec Git, j’ai installé leurs modules pour Python avec la commande
sudo python setup.py install pour chacune des deux librairies Python.
J’ai connecté les pins du Raspberry Pi et du capteur BME 280 selon le tableau ci-dessous :
La communication entre la station et le capteur BME 280 s’effectue avec un bus I2C. Il m’a fallu
activer le chargement automatique du kernel module I2C pour que la communication I2C avec le
capteur puisse s’activer automatiquement au démarrage du Raspberry Pi. Pour ce faire, j’ai utilisé
la commande sudo raspi-config et je suis allé dans le menu « 5 Interfacing Options », interface
« P5 I2C » et j’ai activé l’interface I2C.
I2C est un bus série synchrone bidirectionnel half-duplex, où plusieurs équipements, maîtres ou
esclaves, peuvent être connectés au bus. Les échanges ont toujours lieu entre un seul maître et un
ou plusieurs esclaves, toujours à l'initiative du maître. Cependant, rien n'empêche un composant
de passer du statut de maître à esclave et réciproquement. La connexion est réalisée par
l'intermédiaire de deux lignes [50] :
Pour tester si la connexion fonctionne, nous pouvons utiliser la commande i2cdetect –y 1 sur la
station et vérifier que le capteur est présent à l’adresse 0x77. Si c’est le cas comme l’indique la
figure 25, il est possible de tester le fonctionnement du capteur avec les exemples de scripts fournis
dans la librairie Adafruit_Python_BME280.
Il aurait été possible de connecter le GPS avec la technologie TTL mais je n’ai pas d’adaptateur
série USB TTL à disposition. A la place, j’envoie des trames UART sur une liaison série entre le
Raspberry Pi et le GPS. J’ai trouvé sur Wikipédia un graphique et une explication sur la constitution
d’une trame UART [53]. Le graphique est affiché dans la figure 26 ci-dessous :
Le bit « start » est toujours à 0 et sert à la synchronisation du récepteur. La taille des données est
comprise entre 5 et 9 bits et les bits sont envoyés en format Little Endian, c’est-à-dire du bit de
poids le plus faible au bit de poids le plus fort. Le bit de parité est optionnel et le bit « stop » est
toujours à 1 et sa durée varie entre 1, 1.5 et 2 coups d’horloge (défini par l’utilisateur) [53].
Une fois les pins correctement connectées, il faut installer un daemon GPS qui puisse parser les
données brutes du GPS et il est possible d’utiliser pour cela l’utilitaire gpsd qui fait office
d’interface entre l’application et le hardware du GPS [51]. Pour installer gpsd, il faut entrer la
commande suivante : sudo apt-get install gpsd gpsd-clients python-gps
Une fois gpsd installé, il faut éditer le fichier « /boot/cmdline.txt » avec la commande sudo nano
/boot/cmdline.txt et supprimer toutes les valeurs console=tty**** à part console=tty1.
Ensuite, il faut éditer le fichier « /boot/config.txt » et ajouter la ligne enable_uart=1 à la fin du
fichier. Grâce à cette ligne, nous activons explicitement le port série sur les pins GPIO du Raspberry
Pi [52]. Ensuite, il faut redémarrer le nano-ordinateur afin qu’il prenne en compte la modification.
Une fois la station redémarrée, nous nous assurons qu’aucun processus gpsd n’est en train de
tourner et nous le tuons le cas échéant. La commande est la suivante : sudo killall gpsd
Maintenant, il faut encore entrer la commande sudo gpsd /dev/ttyS0 -F /var/run/gpsd.sock pour
forcer gpsd à utiliser la liaison série UART. Il est possible de tester si le GPS fonctionne avec la
commande cgps –s ou cgps tout court.
La figure 27 montre le branchement des capteurs BME 280 et GPS sur la plaque d’essai.
Figure 27 : Branchement des capteurs BME 280 et GPS sur la plaque d'essai
Figure 28 : Ajout d'une antenne passive UFL 9mm x 9mm pour améliorer la détection des satellites
récolter un certain type de donnée et va stocker les valeurs obtenues dans des fichiers de logs
séparés. Par exemple, les données concernant la température seront stockées séparément des
données de pression, d’humidité et de localisation GPS. Pour reconnaître le type des données
stockées dans le fichier, un indice à deux chiffres est utilisé. Le tableau ci-dessous indique quel
indice correspond à quel type de donnée.
La figure 29 illustre le fonctionnement du nouveau processus de récolte des données. Chaque thread
de récolte va récupérer les données auprès du capteur concerné et lorsque le nombre de logs
stockés pour un certain type de donnée atteint une certaine valeur, un nouveau thread est appelé
pour envoyer le fichier de logs sur le partage SMB du serveur de fichiers. Pendant ce temps, le
thread de récolte ouvre un nouveau fichier dans lequel il va écrire les prochains logs qu’il va
récupérer.
Les threads récoltant la température, la pression barométrique et l’humidité ambiante
communiquent avec le capteur Adafruit BME 280 par le protocole I2C. Chaque type de donnée est
récolté de manière indépendante en fonction des compteurs d’intervalle paramétrés pour chacun
d’entre eux. Mais il faut savoir que les trois types de données sont retournés par le capteur dans
un seul et même vecteur et que ce dernier est uniquement mis à jour lors de l’appel de la fonction
qui va récupérer la température (fonction read_temperature() fournie par la librairie
Adafruit_Python_BME280). Cela signifie que si nous paramétrons pour la pression et/ou l’humidité
une fréquence d’échantillonnage plus petite que celle pour récolter la température, les données
de pression et/ou d’humidité récoltées ne seront pas actualisées tant que le thread qui récupère
la température n’a pas mis à jour le vecteur de retour du capteur BME 280 en appelant la fonction
read_temperature(). Il est donc par exemple inutile de récolter la pression et/ou l’humidité chaque
seconde si la température n’est récupérée que toutes les soixante secondes. Dans ce cas-ci, nous
aurions les mêmes valeurs pour la pression et/ou l’humidité pendant une minute car le vecteur de
retour n’est mis à jour que toutes les soixante secondes. Pour avoir des données cohérentes pour
la pression et l’humidité, il faut que l’intervalle de récolte de la température soit inférieur ou égal
à ceux de la pression et de l’humidité.
Concernant la localisation GPS, un thread récupère en boucle dans une variable les données du
capteur GPS en UART. Le thread de récolte va récupérer périodiquement la latitude et la longitude
auxquelles se trouve la station météorologique en accédant à la variable mise à jour par le thread
GPS Poller. Si la récupération des données de localisation échoue plus de dix fois, le thread attend
un certain temps défini par une autre variable utilisée en cas d’échec, possédant un temps
d’attente généralement plus court que la fréquence standard de localisation. Ainsi, en cas
d’incapacité momentanée du GPS à obtenir le positionnement GPS de la station, il est possible de
retenter une localisation en utilisant un intervalle d’attente plus court.
Pour obtenir la vitesse du vent récupérée analogiquement par l’anémomètre, il faut mettre en
place et configurer un convertisseur analogique-numérique pour pouvoir numériser la tension
analogique de sortie de l’anémomètre. Une fois numérisée, la vitesse est récupérée par le thread
responsable de données du vent et calibrée selon les normes fournies par le constructeur de
l’anémomètre.
La capture de la force des champs électromagnétiques se fait via un câble coaxial et les données
récupérées doivent tout comme pour celles de l’anémomètre être numérisées avec un convertisseur
analogique-numérique.
Figure 29 : Diagramme de flux en bloc illustrant le fonctionnement du nouveau processus de récolte des données
Le thread de gestion des compteurs de récolte est responsable d’écouter sur un port TCP afin
d’ouvrir et de gérer des connexions TCP avec des machines distantes. Il récupère le nom du
compteur à modifier ainsi que la nouvelle valeur à lui attribuer. Si le nom du compteur passé en
paramètre est erroné, le thread avertit la machine distante que le compteur n’existe pas. Mais
dans le cas où le compteur existe, il attribue la nouvelle valeur au compteur et avertit la machine
distante que les modifications ont été effectuées.
Grâce à ce thread, il est possible depuis une machine distante de modifier séparément pour chaque
type de donnée les intervalles de récupération des valeurs ainsi que le nombre maximal de logs à
stocker dans un fichier avant de l’envoyer au serveur de fichiers.
Chaque thread de récolte écrit les valeurs qu’il récupère dans un fichier et lorsque le compteur de
logs dépasse la valeur du nombre maximal de logs à stocker, le fichier est envoyé sur le partage
SMB du serveur de fichiers. Chaque fichier possède un nom qui respecte le format suivant :
<Version>_<Nom de la station>_<Indice>_<Compteur de fichiers>
Le numéro de version est utilisé principalement pour le développement du script de récolte des
données. La version permet d’identifier facilement quel fichier de logs a été écrit lors de quelle
phase de test et permet de comparer plus facilement les différences entre chaque version pour
vérifier le résultat des nouvelles améliorations qui ont été développées.
Le nom de la station permet d’identifier la station qui a récolté les logs inscrits dans le fichier.
L’indice quant à lui permet de distinguer le type des données stockées dans le fichier. Une
explication détaillée est fournie au début de ce chapitre 9.5.1.1.
Le compteur de fichiers est incrémenté de 1 à chaque ouverture d’un nouveau fichier. Prenons
exemple pour les données de température de la station 1 en l’état de la version 24 du script. Le
premier fichier ouvert au lancement du script va s’appeler V24_STA01_00_1.txt. Lorsque le fichier
devient volumineux et que le compteur de logs dépasse la valeur du nombre maximal de logs de
température à stocker, le fichier est fermé et envoyé sur le partage SMB du serveur de fichiers.
Pendant ce temps, le script incrémente le compteur de fichiers et le concatène au nom qui va être
utilisé pour ouvrir le fichier suivant qui va stocker les nouveaux logs. Le fichier va s’appeler
V24_STA01_00_2.txt, les suivants s’appelleront V24_STA01_00_3.txt, V24_STA01_00_4.txt et ainsi
de suite…
Le but est de configurer un daemon NTP qui va récupérer le temps UTC du capteur GPS, synchroniser
le temps de la station avec celui du GPS et définir la station en tant que stratum 1 pour que les
autres dispositifs du réseau AKUNU puissent éventuellement venir synchroniser leur horloge avec le
temps de la station.
Pour commencer, il faut disposer d’une connexion à Internet pour mettre à jour les paquets
disponibles pour une installation avec l’utilitaire APT. Une fois la commande sudo apt-get update
exécutée, il faut installer différents paquets dont nous avons besoin avec la commande
sudo apt-get install gpsd gpsd-clients python-gps pps-tools. A noter que certains paquets ont déjà
été installés lors de la première phase du travail de Bachelor.
Ensuite, il faut activer le support du kernel module PPS pour les interfaces GPIO. Pour ce faire, il
faut éditer le fichier « /boot/config » de la station et y ajouter les lignes suivantes :
dtoverlay=pps-gpio,gpiopin=18
core_freq=250
La première ligne active le support de PPS au travers de la pin GPIO18 et la seconde ligne force la
fréquence de l’horloge du CPU. Pour activer automatiquement le module PPS au démarrage du
Raspberry Pi, il faut éditer le fichier « /etc/modules » et ajouter le module pps-gpio.
PPS (Pulse-Per-Second) est un signal électrique de forme carré transmettant une information de
temps dans un câble [56]. Grâce au signal PPS, il est possible d’améliorer la précision de la
synchronisation de l’horloge.
Une fois le module PPS activé par défaut, il faut modifier la configuration par défaut du daemon
gpsd en éditant le fichier « /etc/default/gpsd ». La configuration doit ressembler à la figure 31 ci-
dessous :
Le rectangle rouge de la figure 32 montre le nouveau branchement qui a été effectué sur le GPS
afin de pouvoir activer le signal PPS avec la pin GPIO18 de la station de météorologie.
Il est possible de tester si le module PPS a été chargé par le kernel avec la commande
sudo dmesg | grep pps et de vérifier si le signal PPS fonctionne correctement avec
sudo ppstest /dev/pps0
Une fois que le signal PPS et le daemon gpsd sont configurés et fonctionnels, il faut installer le
paquet ntp avec l’utilitaire APT. Ensuite, il faut éditer le fichier « /etc/ntp.conf » pour ajouter en
fin de fichier nos sources GPS et PPS. Les configurations effectuées sont visibles dans la figure 33.
Maintenant, nous pouvons utiliser le programme ntpq pour envoyer des requêtes au service NTP et
vérifier la précision du temps récupéré des satellites GPS. La commande à utiliser est
sudo ntpq –np et cela nous donne un affichage comme illustré par la figure 34. A noter qu’il n’y a
pas de connexion à Internet lorsque la requête est effectuée, c’est pourquoi les serveurs
x.debian.pool.n ne peuvent pas être atteints par la station en ce moment.
L’offset indique le décalage horaire, en millisecondes, entre le client NTP et la source. Le jitter
indique la différence, en millisecondes, entre deux échantillons [57]. L’offset peut être diminué
en allant modifier le time1 du fichier ntp.conf (-0.031s dans la figure 33). En ajustant le time1, il
est possible de diminuer l’offset à moins de 10 millisecondes.
Actuellement, une précision de quelques dizaines de millisecondes est amplement suffisante mais
si nous voulons par la suite récolter des données sur des champs électromagnétiques de la foudre
et les comparer avec les chiffres d’autres instituts, il faudrait idéalement avoir une précision bien
inférieure à la milliseconde. En effet, la capture des champs électromagnétiques devrait
s’effectuer idéalement avec une fréquence aux alentours de la microseconde et la précision de
l’horloge de la station météorologique se devrait d’être au moins aussi précise que la fréquence
d’échantillonnage. Ce faisant, il faudrait un GPS d’une meilleure précision (moins de variation de
l’offset) que l’Adafruit Ultimate GPS mais cela coûterait évidemment bien plus cher.
D’ici la fin du travail de Bachelor, une étude va être faite pour penser à d’autres types de solutions
plus précises à mettre en place pour la synchronisation de l’horloge des stations météorologiques.
Des tests de performance seront aussi établis pour tester jusqu’à combien d’échantillons par
seconde nous pouvons récolter avec un nano-ordinateur Raspberry Pi Zero W et Raspberry Pi 3.
quelques problèmes pour réussir à faire communiquer le reactor avec le client Twisted jusqu’à ce
que je tombe sur cet article.
Figure 35 : Photo d'un MCP3008 trouvée sur le site officiel d'Adafruit [62]
L’ADC MCP3008 possède 8 canaux d’entrées analogiques étant chacun codés sur 10 bits. Les valeurs
converties en numérique vont donc de 0 à 1023 pour chaque canal. La communication entre l’ADC
et le Raspberry Pi se fait via une liaison SPI qui est un bus de données série synchrone et qui opère
en full duplex [64]. Le débit est aussi plus important qu’avec une liaison I2C.
Pour savoir comment connecter les pins de l’ADC avec ceux du Raspberry Pi, j’ai suivi le tutoriel
du MCP3008 écrit par Tony DiCola qui est disponible sur le site officiel d’Adafruit [65]. La
connectique est la suivante :
Nous pourrions utiliser d’autres GPIO sur le Raspberry Pi que les pins GPIO18, 23, 24 et 25. Le choix
des GPIO que nous utilisons est effectué au niveau du logiciel de récolte des données (figure 36).
Figure 36 : Configuration des GPIO du Raspberry Pi utilisés pour communiquer avec l’ADC MCP3008
Une fois l’ADC MCP3008 et l’anémomètre QS-FS01 connectés, j’ai créé un nouveau thread pour
récolter la vitesse du vent récupérée par l’anémomètre. J’ai tout d’abord installé les paquets
nécessaires avec sudo apt-get build-essential python-dev python-smbus git puis j’ai téléchargé
la librairie du MCP3008 mise à disposition par Adafruit [66] et je l’ai ensuite installée sur le
Raspberry Pi avec la commande sudo python setup.py install. Pour tester le bon fonctionnement
de l’ADC, la librairie fournit des scripts de test.
Après avoir installé la librairie Python, j’ai pu coder le thread qui va récolter la vitesse du vent. Il
m’a fallu trouver les données du fabricant de l’anémomètre [67] pour pouvoir calibrer la vitesse en
fonction des données numériques qui sont reçues depuis l’ADC. Il m’a aussi fallu calculer à quoi
correspondait le résultat numérique reçu de l’ADC par rapport à la tension de sortie analogique de
l’anémomètre. Nous utilisons le canal d’entrée analogique 0 du MCP3008 pour recevoir la tension
l’anémomètre.
Figure 37 : Formule de conversion des données numériques brutes en vitesse du vent en m/s
La figure 37 indique que la valeur numérique brute retournée par l’ADC doit être multipliée par 3.3
(voltage de l’alimentation de l’ADC) puis divisée par 1023 pour obtenir la tension de sortie de
l’anémomètre (valeur numérique sur 10 bits). Ensuite, il faut appliquer la conversion du fabricant :
Soustraire 0.4 car la tension initiale est de 0.4V lorsqu’il y a un vent nul
Diviser le tout par 1.6 car la plage de la tension de sortie de l’anémomètre va de 0.4V à 2V
(la tension peut monter plus haut selon le fournisseur mais avec une perte de précision pour
le calcul de la vitesse du vent)
Multiplier par 32.4 car une tension de 2V correspond selon le fournisseur à un vent de
32.4m/s
A noter que la précision des valeurs récoltées n’a pas encore pu être testée car il n’y a pas de
soufflerie au sein de la HEIG. Il faudrait aller dans une entreprise possédant ce genre d’installations
pour pouvoir calibrer l’ADC et l’anémomètre et ainsi améliorer la précision des données. Idem pour
le capteur BME 280. Il existe sur le marché des dispositifs plus ou moins fiables qui ne coûtent pas
trop cher et qui peuvent nous donner à la fois la température, la pression barométrique, l’humidité
et même la vitesse du vent. Si un de ces dispositifs est reconnu comme étant fiable et qu’il ne
coûte pas trop cher, il serait envisageable d’en acquérir un pour effectuer le calibrage des
différents capteurs.
Avec un multimètre, j’ai pu vérifier que la tension de sortie de l’anémomètre correspond bien à
0.4V lorsque le vent est nul. Et pour que l’anémomètre fonctionne correctement, il faut l’alimenter
sur le 5V. Le 3.3V ne suffit pas.
Figure 38 : Plaque de test avec tous les capteurs et toutes les connexions nécessaires
Pour créer un circuit imprimé, j’ai utilisé le programme Altium Designer pour lequel l’école m’a
donné une licence. Après avoir pris en main les fonctionnalités de base du logiciel, j’ai commencé
par dessiner le schéma de la carte. Une fois ce dernier terminé, j’ai commencé à concevoir le plan
de la carte PCB puis quand les connecteurs étaient correctement placés, je suis passé à l’atelier
de la salle A03 où j’ai reçu de l’aide de Monsieur Claude Guinchard pour le paramétrage du
programme Altium et la conception du câblage entre les différents connecteurs. Le schéma et le
plan de la carte PCB sont fournis en annexes de ce rapport (document numérique de la dernière
version de la carte PCB uniquement).
Quand le schéma et le plan du circuit imprimé ont été terminés, je les ai envoyés à Monsieur
Guinchard qui a pu lancer la fabrication de la carte PCB. Les figures 39 et 40 montrent le résultat
final de la première carte PCB et la figure 41 nous montre à quoi ressemble une station
météorologique munie de la carte. Notons que la carte PCB est connectée au Raspberry Pi de façon
à ce que les capteurs soient situés sur le dessous.
9.5.2.7 Développement d’une interface console utilisateur pour la gestion des stations
La manière d’utiliser le script de gestion des compteurs de récolte expliquée au chapitre 9.5.2.4
est fonctionnelle mais pas très conviviale pour un utilisateur lambda. En effet, si ce dernier n’a pas
l’habitude d’utiliser le script, il ne saura pas forcément combien de paramètres fournir en entrée
ni dans quel ordre les donner, sans parler de connaître le nom exact de la variable qu’il aimerait
modifier.
Pour simplifier la tâche aux utilisateurs devant gérer les compteurs de récolte, j’ai implémenté
une interface console utilisateur en utilisant la librairie npyscreen qui est un framework pour la
programmation d'applications de terminaux ou de consoles [68]. npyscreen a été choisi car c’est un
framework simple d’utilisation et qu’il est compatible autant avec les systèmes d’exploitation
Raspbian que Windows. En effectuant mes recherches, j’ai découvert qu’il existait plusieurs
frameworks comme par exemple python-inquirer et Kivy. Mais python-inquirer n’est pas compatible
avec Windows et Kivy permet de créer des interfaces graphiques ergonomiques mais demande
beaucoup de temps à être maîtrisé. Le framework npyscreen est un juste compromis car il permet
de créer rapidement des interfaces consoles ergonomiques.
Pour installer npyscreen, j’ai cloné le dépôt sur GitHub [69] et j’ai installé la librairie avec la
commande sudo python setup.py install. Pour que le framework fonctionne sur Windows, j’ai aussi
dû télécharger la librairie Curses 2.2 [70] sur les machines Windows sur lesquelles nous allons
utiliser les consoles utilisateur npyscreen.
Pour concevoir l’interface console utilisateur, je me suis inspiré d’un exemple se trouvant dans la
documentation de npyscreen [68]. L’utilisateur remplit le champ de l’adresse IP de la station,
choisit la variable à modifier parmi une liste de compteurs existants (un seul choix possible) puis
définit la nouvelle valeur de la variable. Quand l’utilisateur a fini, il clique sur le bouton « OK » et
le formulaire npyscreen envoie une commande qui ouvre le client Twisted en utilisant les trois
paramètres entrés par l’utilisateur dans le formulaire de la console npyscreen. La figure 42
représente la console utilisateur et la figure 43 montre la réponse retournée par la station après
un changement fructueux de la valeur de la variable désirée.
Figure 42 : Console utilisateur avec laquelle on veut modifier l'intervalle de température de la station 192.168.2.11
A noter que nous utilisons aussi des nombres de type float pour le nombre de logs maximal à stocker
dans un fichier. Cela a été décidé ainsi afin d’éviter d’effectuer des conversions de type
supplémentaires dans un souci de performance. L’utilisation de nombres décimaux ne pose
absolument aucun problème puisque le code vérifie à chaque écriture que le nombre de logs inscrits
dans le fichier est supérieur ou non au nombre maximal. Si oui, le fichier est fermé et envoyé sur
le serveur, sinon le thread continue d’écrire dans ce même fichier.
DKMS est un framework utilisé pour pouvoir rebuilder le module lors de mises à jour du noyau Linux.
Une fois le pilote ajouté à DKMS, il faut builder et installer le driver avec la commande
sudo dkms install rtl8192eu/1.0
Attention ! Pour éviter des problèmes de version du kernel lors de l’installation du driver, il faut
tout d’abord mettre à jour le noyau Linux avec sudo apt-get update et sudo apt-get upgrade puis
ensuite redémarrer le Raspberry Pi.
Après avoir réussi à installer le driver de la clef wifi, j’ai utilisé la commande sudo lshw –c network
pour vérifier que la clef est maintenant détectée par le système ainsi que pour connaître son nom
logique d’interface. La figure 45 indique que la clef USB wifi utilise le driver rtl8192eu et que son
nom logique d’interface est wlan0.
Une fois le driver installé et la connectivité de la clef wifi testée, j’ai lu un article du site officiel
de Raspberry Pi sur comment configurer un Raspberry Pi en tant qu’AP wifi pour un réseau local
[75]. Il faut premièrement installer les utilitaires dnsmasq et hostapd avec apt-get puis arrêter les
deux services pour pouvoir les configurer :
sudo systemctl stop dnsmasq
sudo systemctl stop hostapd
Il faut éditer le fichier « /etc/dhcpcd.conf » pour définir l’adresse IP de chacune des interfaces
WLAN. La figure 46 ci-dessous affiche la configuration de la carte wlan1 utilisée comme point
d’accès wifi pour le réseau AKUNU-LAN2 et la configuration de l’interface wlan0 pour se connecter
au réseau Internet de chez moi. Si nous voulons utiliser le réseau de la HEIG-VD, il faut modifier
par conséquent la configuration de la carte wlan0.
Pour permettre à des machines distantes de se connecter au réseau AKUNU sans devoir configurer
manuellement une adresse IP statique, il faut configurer le service dnsmasq pour mettre en place
un serveur DHCP avec une réservation d’une plage d’adresses IP. Pour ce faire, il faut éditer le
Maintenant, nous pouvons configurer le logiciel du point d’accès sans-fil. Ce logiciel s’appelle
hostapd et permet d’établir un point d’accès wifi avec lequel nous allons créer le réseau AKUNU.
Pour configurer hostapd, il faut tout d’abord créer un nouveau fichier que nous allons appeler
« /etc/hostapd/hostapd.conf ». Ce fichier contient toutes les informations relatives au réseau
sans-fil AKUNU que nous voulons créer. Je me suis basé sur l’exemple de cet article [75].
interface=wlan1
driver=nl80211 #driver de la carte native du Raspberry Pi 3
ssid=AKUNU-LAN2 #nom du réseau AKUNU
hw_mode=g #utilisation de la norme 802.11g
channel=11 #canal 11
wmm_enabled=0
macaddr_acl=0 #pas de filtrage des adresses MAC
auth_algs=1 #désactive l’authentification ouverte
ignore_broadcast_ssid=0 #le SSID n’est pas masqué
wpa=2 #méthode d’authentification WPA2
wpa_passphrase=mdpWifi #consulter le document des informations de connexion
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
Une fois la configuration du fichier hostapd.conf terminée, il faut préciser à hostapd qu’il doit
utiliser ce fichier par défaut. Pour ce faire, il faut éditer « /etc/default/hostapd » et ajouter la
ligne DAEMON_CONF="/etc/hostapd/hostapd.conf"
Maintenant que les services dnsmasq et hostapd sont configurés, ils peuvent être réactivés :
sudo systemctl start dnsmasq
sudo systemctl start hostapd
Ensuite, il faut activer la redirection (forwarding) des paquets IPv4 en dé-commentant la ligne
net.ipv4.ip_forward=1 dans le fichier « /etc/sysctl.conf ». Une fois cela fait, il faut ajouter une
règle de pare-feu pour créer une traduction NAT entre les interfaces wlan0 et wlan1 puis
optionnellement des règles permettant de filtrer le trafic allant du réseau connecté à Internet vers
le réseau AKUNU et vice-versa pour diminuer le risque d’intrusions dans le réseau.
-A POSTROUTING -o wlan0 -j MASQUERADE
-A FORWARD -i wlan0 -o wlan1 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i wlan1 -o wlan0 -j ACCEPT
Pour que la configuration des iptables soit rétablie après un redémarrage du Raspberry Pi, il faut
sauver la configuration dans un fichier qui sera rechargé au démarrage. Nous allons nommer le
fichier iptables.ipv4.nat et nous allons le stocker dans le répertoire « /etc ».La commande est la
suivante : sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"
Pour restaurer les règles iptables au démarrage de l’ordinateur, il faut ajouter la ligne
iptables-restore < /etc/iptables.ipv4.nat dans le fichier « /etc/rc.local » juste avant la ligne
exit 0. Le fichier rc.local permet de lancer des commandes au démarrage du Raspberry Pi.
Maintenant, il faut encore forcer l’activation du service hostapd au démarrage pour que le point
d’accès wifi AKUNU-LAN2 se lance automatiquement lors du démarrage du Raspberry Pi. Pour ce
faire, il faut forcer le service de démarrer au boot avec la commande
sudo update-rc.d hostapd defaults. Pour terminer, il faut redémarrer l’ordinateur et vérifier que
le point d’accès s’active automatiquement.
Lors de la configuration du point d’accès wifi, j’ai trouvé des compléments sur d’autres articles
tels que [76] et [77].
A noter qu’il est tout à fait possible d’utiliser l’interface eth0 en la branchant à un câble Ethernet
pour se relier à un réseau ayant accès à Internet. Mais étant donné que peu de salles à la HEIG-VD
sont munies de câbles Ethernet et de prises RJ45, il a été décidé d’utiliser une seconde interface
WLAN pour se connecter à un réseau possédant un accès Internet, d’où l’achat d’une clef USB wifi
(figure 48). J’ai d’ailleurs demandé à l’école une autorisation d’accès au réseau HEIG-Devices pour
pouvoir y connecter mon routeur wifi Raspberry Pi et ainsi disposer d’une connexion à Internet pour
les dispositifs du réseau AKUNU. La demande a été acceptée et j’ai dû modifier la configuration de
l’interface wlan0 dans le fichier dhcpcd.conf pour que l’interface prenne une adresse IP allouée
dynamiquement par le serveur DHCP de l’école.
programme attend une seconde plus un nombre aléatoire allant de 0 à 2 puissance le nombre
d’échecs. Par exemple, si l’envoi d’un certain fichier vient d’échouer pour la troisième fois, le
programme va attendre un temps aléatoire allant de 1 à 9 secondes. Des nombres aléatoires sont
utilisés pour éviter que si plusieurs envois produisent un échec en même temps, qu’ils retentent
leur chance à nouveau tous au même moment. Plus le nombre d’échecs est élevé, plus les chances
de retenter un envoi au même instant sont faibles et donc plus les chances de réussite de l’envoi
sont élevées.
Si nous ne sommes pas dans la console avec laquelle nous avons lancé le script de récolte des
données (ce qui est très probable), nous ne pouvons pas voir les notifications envoyées par les
threads. Si nous voulons arrêter la station après avoir tué le programme, il faut faire attention à
attendre un intervalle de temps au moins aussi élevé que le plus grand intervalle d’attente entre
deux récupérations de données car le thread doit sortir de son sommeil pour vérifier que le killer
s’est activé. Par exemple, si le plus grand intervalle de récupération est celui de la localisation
GPS qui est défini à 10 minutes, pour être sûr que le thread ait eu le temps de se réveiller, de se
terminer proprement et d’envoyer le fichier de logs sur le serveur de fichiers, il faudrait attendre
au minimum 10 minutes entre l’enclenchement du killer et l’arrêt de la station météorologique.
De plus, il ne faut pas oublier de laisser le temps au programme d’envoyer les fichiers restants sur
le partage SMB du serveur. A la suite de ce travail de Bachelor, ce serait un des premiers points à
améliorer.
Lorsque nous voulons lancer à nouveau le programme de test, il faut faire attention à d’abord
modifier le numéro de version en éditant le script pour éviter d’écraser les fichiers de logs déjà
créés !
Si nous voulons tout de même tuer un programme de manière brutale, cela est possible en utilisant
la commande sudo kill -9 <pid> qui envoie un signal SIGKILL afin de provoquer la fin immédiate du
programme correspondant au pid.
Pour implémenter le killer, je me suis basé sur un exemple écrit par Mayank Jaiswal sur le site de
Stack Overflow [78]. J’ai aussi effectué de nombreuses recherches pour savoir comment forcer le
serveur Twisted d’arrêter d’écouter sur le port TCP qu’il utilisait et j’ai finalement trouvé comment
faire en me basant sur la documentation de Twisted et sur un poste d’un certain sajattack [79].
9.5.2.12 Création d’un thread pour récupérer les données du connecteur BNC
Premièrement, pour pouvoir détecter des interruptions envoyées par un capteur, j’ai installé la
librairie RPi.GPIO 0.6.3 [80] avec la commande pip install RPi.GPIO. Ensuite, pour récupérer les
données de l’antenne connectée en coaxial au BNC femelle de la carte PCB, j’ai configuré dans le
script Python les GPIO du Raspberry Pi pour que ce dernier puisse communiquer avec le nouvel ADC
qui vient d’être installé. J’ai aussi paramétré un GPIO qui est directement connecté au connecteur
BNC dans le but de pouvoir détecter une impulsion montante et ainsi déclencher une interruption.
La figure 51 ci-dessous représente les configurations mentionnées :
Figure 51 : Configuration des GPIO pour la communication entre le Raspberry Pi et le nouvel ADC
Les données en provenance de l’antenne de champs électromagnétiques vont être stockées dans
un buffer circulaire en attendant qu’une interruption ait lieu. Pour créer un buffer circulaire, j’ai
décidé d’utiliser une double-ended queue (deque) car c’est une collection très performante [81]
qui, lorsqu’elle ajoute un nouvel élément en fin de queue, supprime en même temps le plus ancien
élément se trouvant en tête de queue. L’utilisation d’une deque pour faire un buffer circulaire me
semble donc appropriée.
J’ai créé un thread bncPoller qui va écouter le canal 0 du nouvel ADC MCP3008 (celui relié au
connecteur BNC) et qui va ajouter la valeur récupérée à la fin du buffer circulaire (.append()) et
donc par la même occasion faire « coulisser » le buffer et écraser la valeur la plus ancienne. J’ai
aussi mis en place un système d’interruptions qui, quand il détecte un flux montant sur la pin
GPIO6, appelle une fonction qui va copier le buffer et notifier un thread electromagneticFields qui
est chargé de l’écriture du buffer dans un fichier de logs. Le diagramme de flux de la figure 52
illustre le fonctionnement du système d’interruptions.
Une image a aussi été créée à partir du Raspberry Pi faisant office de routeur wifi et de serveur de
fichiers au cas où celui-ci tomberait en panne. Tout comme pour les stations météorologiques, il
suffit de formater une carte SD, de flasher l’image dessus et de brancher la carte dans le Raspberry
Pi. Normalement pour le routeur wifi / serveur de fichiers, il n’y a aucune modification à faire car
actuellement, il est prévu d’utiliser uniquement un seul serveur.
Attention ! Il vaut mieux configurer un nouveau Raspberry Pi hors de portée du réseau wifi AKUNU
afin d’éviter que le nouveau nano-ordinateur prenne une adresse IP déjà existante et ne crée des
problèmes sur le réseau.
le problème provenait de la carte wifi native wlan1 du routeur Raspberry Pi et qu’elle se mettait
dans une sorte d’état en veille.
Avec la commande iwconfig, j’ai pu constater que le Power Management de la carte wlan1 était
activé. En utilisant la commande sudo iw wlan0 set power_save off [83], j’ai pu désactiver le
Power Management. J’ai ajouté cette commande dans le fichier « /etc/rc.local » pour
automatiquement désactiver le Power Management au démarrage du routeur. J’en ai fait de même
avec l’interface wlan0 de la station météorologique. Quant à la clef USB wifi du routeur, le Power
Management était déjà désactivé par défaut.
La figure 57 affiche la sortie de la commande iwconfig qui indique que le Power Management des
cartes WLAN est maintenant désactivé. Depuis lors, je n’ai plus rencontré de problème de
connexion sur le réseau AKUNU.
Figure 57 : Sortie de la commande iwconfig indiquant que le Power Management est désactivé
Nous pouvons constater dans le tableau ci-dessus que malgré des fréquences de récolte
relativement faibles (120 secondes), le Raspberry Pi Zero W utilise déjà tout son CPU, dont au moins
95% alloués au programme de récolte de données. Le Pi 3 quant à lui utilise un CPU à fond mais en
possède encore trois autres qui fonctionnent à moins d’un pourcent chacun.
En augmentant les fréquences de récolte à une minute, il n’y a pas vraiment d’impact au niveau
de la mémoire utilisée. Au niveau CPU, le Pi Zero W est logiquement toujours à bloc tandis que le
Pi 3 est passé à 103% d’utilisation. En augmentant encore plus la fréquence avec maintenant une
récolte pour chaque type de donnée toutes les secondes, la mémoire n’est toujours pas vraiment
impactée mais nous pouvons apercevoir que le Pi 3 est maintenant passé à plus de 120% d’utilisation
CPU. En passant à 10 données par seconde pour chaque type, le pourcentage de mémoire utilisée
commence d’augmenter et le taux d’utilisation CPU du Pi 3 dépasse les 130%.
En passant à des fréquences allant au centième de seconde, l’utilisation de la mémoire subit encore
une augmentation mais elle est peu significative. L’utilisation CPU du Pi 3 augmente logiquement
mais reste bien en dessous des 200%. En diminuant drastiquement le nombre maximum de logs par
fichier sur le Raspberry Pi 3 de sorte à générer environ un envoi par seconde par type de donnée,
donc quatre envois sur le serveur de fichiers par seconde, j’ai réussi à faire monter le pourcentage
d’utilisation à 210%.
En paramétrant une récolte des données de température toutes les millisecondes et les autres types
à une minute ou plus, le Raspberry Pi Zero W n’arrive pas à récolter les données de température
plus rapidement qu’une fois toutes les 4-5 millisecondes (environ 4.9 millisecondes de moyenne).
Ce qui est bien trop lent pour pouvoir capturer des champs électromagnétiques générés par la
foudre. Le Pi 3 lui aussi ne récupère pas la température plus rapidement que le Pi Zero W, il est
parfois même plus lent !
Pour avoir une solution assez rapide qui puisse récolter les données de la foudre aux alentours de
la microseconde, il faudrait regarder du côté des plateformes Arduino qui sont réputées être de
meilleures solutions pour les systèmes temps réel. Ou sinon, il serait peut-être possible de concevoir
un élément intermédiaire disposant d’un buffer. Cet élément serait branché entre l’antenne de
champs électromagnétiques et le Raspberry Pi et permettrait à ce dernier de pouvoir lire plus
lentement les données récoltées lors de la détection d’un champ électromagnétique.
En revenant aux tests concernant l’utilisation du CPU, grâce à ses quatre cœurs, le Raspberry Pi 3
supporte bien mieux que le Pi Zero W les grandes charges d’utilisation du script de récolte de
données lorsque les intervalles de récupération sont très rapides. La différence se remarque encore
plus lorsque le débit de fichiers envoyés sur le partage SMB est élevé. Le Pi Zero W a du mal à suivre
la cadence et il en résulte donc qu’il y a de nombreux échecs d’envois de fichiers, ce qui engendre
de nouvelles tentatives qui peuvent consommer une partie de la bande passante du réseau AKUNU.
Concernant la mémoire RAM, les tests démontrent que même avec des intervalles de récolte très
faibles, la mémoire utilisée par les Raspberry Pi 3 et Zero W ne dépasse pas les 25-30%. La RAM
n’est donc pas problématique au niveau des performances.
J’ai aussi pensé à calculer la consommation électrique réelle de chaque modèle de Raspberry Pi
mais je n’ai pas le matériel requis à disposition. J’ai effectué ces tests de performance lors de la
dernière semaine du travail de Bachelor, ce qui signifie que je n’ai malheureusement plus le temps
de chercher et de commander le matériel adéquat. Je ne le recevrais pas à temps de toute manière.
Mise en place d’un buffer intermédiaire sur des plateformes compatibles temps réel pour
pouvoir capturer au niveau de la microseconde les champs électromagnétiques générés par
la foudre
Remplacement du wifi par une technologie de communication basse consommation telle
que LoRa, Sigfox, ZigBee, Bluetooth Low Energy etc. afin de pouvoir mettre les stations
météorologiques sur batteries
Etude des batteries utilisables pour rendre les stations autonomes, actuellement il faudrait
des batteries énormes et coûteuses mais en mettant en place un protocole à faible
consommation à la place du wifi cela deviendrait plus abordable
Calibrage des différents capteurs dans une salle disposant d’une infrastructure de test
Mise en place d’une instance Cloud accessible par les météorologues et autres personnes
concernées par le projet AKUNU
Développement sur l’instance Cloud d’une application web permettant d’analyser les
données récoltées
Utilisation d’un système de temps haute précision (par exemple une horloge atomique) au
sein du réseau AKUNU pour pouvoir récolter les données des champs électromagnétiques
avec une précision en dessous de la microseconde
Envoi de notifications évoluées par les stations concernant l’état de leurs threads de récolte
de données, possibilité de développement d’une fonctionnalité de notification dans
l’application web
Pour être sûr que le routeur a démarré correctement, il faut regarder si le réseau AKUNU-LAN2
apparaît dans les réseaux wifi disponibles.
10 Conclusion
La remise de ce rapport de projet conclut le travail de Bachelor que moi, Julien Brêchet, ai effectué
dans le cadre du projet de recherche AKUNU. De nombreuses recherches ont été effectuées sur les
capteurs, plateformes et technologies de communication existants et un réseau wifi AKUNU a été
mis en place. Dans ce réseau se trouvent actuellement plusieurs stations météorologiques, un
serveur de fichiers ainsi qu’un routeur wifi permettant aux dispositifs AKUNU de disposer d’un accès
à Internet.
Après que les différents capteurs aient été initialement testés sur une plaque de test, des cartes
PCB ont été conçues. Le résultat s’est avéré concluant et il est d’ailleurs prévu dans les semaines
suivant la remise de ce travail de faire construire de nouvelles cartes PCB afin de pouvoir les
envoyer aux instituts et universités concernés par le projet AKUNU.
Des tests de performance ont été effectués et il en résulte principalement que les plateformes
Raspberry Pi ne sont pas assez rapides pour récolter les champs électromagnétiques générés par la
foudre. Il faudrait utiliser une plateforme compatible temps réel (un modèle Arduino par exemple)
faisant office de buffer pour stocker les champs électromagnétiques capturés et qu’ensuite la
station Raspberry Pi vienne lire les données enregistrées. Il serait aussi intéressant de mettre en
place une horloge atomique ou une solution équivalente pour disposer d’un système de temps haute
précision au sein du réseau AKUNU afin d’avoir des données temporelles fiables dans le but de les
comparer avec d’autres instituts et entreprises. Mais la mise en place d’une solution de ce genre
peut coûter plusieurs milliers de francs !
Malgré un manque de précision temporelle et de rapidité de récupération des données, les
plateformes Raspberry Pi se sont montrées robustes et fiables concernant la récolte des autres
types de données. De nombreuses séries de tests ont été effectuées et après bon nombre
d’améliorations apportées au script de récolte de données et à la conception de cartes PCB pour
améliorer la connectivité des capteurs, l’infrastructure AKUNU peut fonctionner 24 heures sur 24
sans rencontrer le moindre problème. La mise en place d’un réseau AKUNU fiable et robuste peut
donc être considérée comme un succès !
Il sera possible par la suite d’utiliser d’autres protocoles de communication à faible consommation
afin de tenter de mettre les stations météorologiques sur batteries pour les rendre autonomes. Il
faudra aussi construire des boîtes de protection permettant d’isoler les plateformes sans toutefois
devoir altérer la valeur des données récoltées. Une boîte entièrement hermétique ne permettrait
par exemple pas de récupérer le vrai pourcentage d’humidité environnante. La mise en place d’une
instance Cloud est aussi prévue par la suite et des spécialistes back-end et front-end pourront
développer une application web qui permettrait d’analyser les données des fichiers de logs générés
par les stations. Le format des données est compatible CSV. Donc actuellement, le meilleur moyen
d’analyser les logs est d’aller sur le partage SMB du serveur de fichiers, de récupérer les données
et de les importer dans un fichier CSV pour pouvoir générer des graphiques.
Concernant mon expérience personnelle sur ce travail, j’ai décidé d’écrire mes scripts en Python
car c’est un langage que j’ai peu utilisé durant mes années d’études mais qui pourra m’être très
utile dans ma carrière professionnelle. J’ai perdu plusieurs heures au début de ce travail de
Bachelor pour commencer à maîtriser le langage mais je suis satisfait de l’expérience que j’ai
acquise. J’ai aussi apprécié de pouvoir toucher à plusieurs domaines que je ne connaissais pas
beaucoup. J’ai notamment trouvé intéressante la conception de cartes PCB avec le logiciel Altium.
De plus, Monsieur Guinchard et ses collègues m’ont expliqué des choses intéressantes au sujet du
processus de fabrication des cartes PCB. J’ai apprécié de toucher un peu au monde de
l’électronique, domaine auquel je m’intéresse mais dans lequel je ne me suis jamais vraiment
plongé entièrement. De par mon métier d’informaticien, je suis beaucoup plus proche du matériel
propre à l’informatique, comme par exemple l’acquisition et le montage de différents composants
pour installer une tour d’ordinateur.
Je remercie encore une fois toutes les personnes qui ont participé au projet AKUNU en m’aidant
lors de différentes tâches ainsi que les personnes qui auront pris le temps de lire ce rapport de
travail de Bachelor. J’estime que j’ai effectué un bon travail et que maintenant le projet AKUNU
dispose d’une bonne base sur laquelle commencer de nouvelles recherches et de nouveaux
développements. Je passe maintenant le témoin à Monsieur Marcos Rubinstein et lui remets le
projet AKUNU entre ses mains.
11 Références
[1] « Raspberry Pi Zero W », Raspberry Pi. [En ligne]. Disponible sur:
https://www.raspberrypi.org/products/raspberry-pi-zero-w/. [Consulté le: 05-juin-2018].
[2] « Comparatif des modèles de Raspberry PI | Tableaux comparatifs », SocialCompare. [En
ligne]. Disponible sur: http://socialcompare.com/fr/comparison/raspberrypi-models-
comparison. [Consulté le: 05-juin-2018].
[3] « Raspberry Pi 3 Model B+ », Raspberry Pi. [En ligne]. Disponible sur:
https://www.raspberrypi.org/products/raspberry-pi-3-model-b-plus/. [Consulté le: 05-juin-
2018].
[4] « Arduino - Introduction », Arduino. [En ligne]. Disponible sur:
https://www.arduino.cc/en/Guide/Introduction. [Consulté le: 05-juin-2018].
[5] maxpeigne, « Différence entre Arduino et Raspberry Pi ? » [En ligne]. Disponible sur:
http://forums.futura-sciences.com/electronique/699229-difference-entre-arduino-raspberry-
pi.html. [Consulté le: 05-juin-2018].
[6] « Arduino M0 », Arduino. [En ligne]. Disponible sur: https://store.arduino.cc/arduino-m0.
[Consulté le: 05-juin-2018].
[7] « Arduino Due », Arduino. [En ligne]. Disponible sur: https://store.arduino.cc/arduino-due.
[Consulté le: 05-juin-2018].
[8] « Top 12 Raspberry Pi alternatives (2018 edition) », ZDNet. [En ligne]. Disponible sur:
https://www.zdnet.com/pictures/top-12-raspberry-pi-alternatives-2018-edition/7/.
[Consulté le: 05-juin-2018].
[9] « Adafruit BME280 I2C or SPI Temperature Humidity Pressure Sensor », Adafruit. [En ligne].
Disponible sur: https://www.adafruit.com/product/2652. [Consulté le: 05-juin-2018].
[10] « Passive GPS Antenna uFL - 9mm x 9mm -2dBi gain », Adafruit. [En ligne]. Disponible sur:
https://www.adafruit.com/product/2460. [Consulté le: 05-juin-2018].
[11] « Antennes GPS », TRAKGPS. [En ligne]. Disponible sur:
http://www.trakgps.com/fr/index.php/information/articles-localisation-gps/67-antennes-
gps. [Consulté le: 05-juin-2018].
[12] « Adafruit Ultimate GPS Breakout - 66 channel w/10 Hz updates », Adafruit. [En ligne].
Disponible sur: https://www.adafruit.com/product/746. [Consulté le: 05-juin-2018].
[13] « Anemometer Wind Speed Sensor w/Analog Voltage Output », Adafruit. [En ligne].
Disponible sur: https://www.adafruit.com/product/1733. [Consulté le: 05-juin-2018].
[14] « Sigfox », Wikipédia. 28-mai-2018.
[15] « Coverage | Sigfox », SigFox. [En ligne]. Disponible sur:
https://www.sigfox.com/en/coverage. [Consulté le: 05-juin-2018].
[16] « Sigfox Technology Overview | Sigfox », Sigfox. [En ligne]. Disponible sur:
https://www.sigfox.com/en/sigfox-iot-technology-overview. [Consulté le: 05-juin-2018].
[17] SIGFOX, Sigfox Network Architecture. .
[18] « IEEE 802.15.4 », Wikipédia. 22-mars-2018.
[19] « ZigBee », Wikipédia. 02-févr-2018.
[20] « Our Members | Zigbee Alliance », ZigBee. [En ligne]. Disponible sur:
http://www.zigbee.org/zigbeealliance/our-members/. [Consulté le: 05-juin-2018].
[21] « Zigbee 3.0 | Zigbee Alliance », ZigBee. [En ligne]. Disponible sur:
http://www.zigbee.org/zigbee-for-developers/zigbee-3-0/. [Consulté le: 05-juin-2018].
[22] « Zigbee PRO | Zigbee Alliance », ZigBee. [En ligne]. Disponible sur:
http://www.zigbee.org/zigbee-for-developers/zigbee-pro/. [Consulté le: 05-juin-2018].
[23] M. A. Moridi, Y. Kawamura, M. Sharifzadeh, E. K. Chanda, M. Wagner, et H. Okawa,
« Performance analysis of ZigBee network topologies for underground space monitoring and
communication systems », Tunn. Undergr. Space Technol., vol. 71, p. 201‑209, janv. 2018.
[24] V. Iordache, M. Minea, et R. A. Gheorghiu, « Considerations for using ZigBee technology in
vehicular non-critical applications », 2017, p. 853‑856.
[25] « Z-Wave », Wikipédia. 18-févr-2018.
[26] B. Ray, « Z-Wave Vs. Zigbee », Link-Labs, 21-nov-2017. [En ligne]. Disponible sur:
https://www.link-labs.com/blog/z-wave-vs-zigbee. [Consulté le: 05-juin-2018].
[27] « About Z-Wave Technology », Z-Wave Alliance. [En ligne]. Disponible sur: https://z-
wavealliance.org/about_z-wave_technology/. [Consulté le: 05-juin-2018].
[28] « Z-Wave Global Regions | Silicon Labs ». [En ligne]. Disponible sur:
https://www.silabs.com/products/wireless/mesh-networking/z-
wave/benefits/technology/global-regions. [Consulté le: 05-juin-2018].
[29] « Understanding Z-Wave Networks, Nodes & Devices | Vesternet ». [En ligne]. Disponible
sur: https://www.vesternet.com/resources/technology-indepth/understanding-z-wave-
networks/. [Consulté le: 05-juin-2018].
[30] « Bluetooth », Wikipédia. 11-mai-2018.
[31] « Topology Options | Bluetooth Technology Website », Bluetooth.com. [En ligne].
Disponible sur: https://www.bluetooth.com/bluetooth-technology/topology-options.
[Consulté le: 06-juin-2018].
[32] « Bluetooth à basse consommation », Wikipédia. 20-avr-2018.
[33] « IEEE 802.11 », Wikipédia. 09-mars-2018.
[34] « IEEE 802.11ah », Wikipédia. 28-janv-2018.
[35] « Global System for Mobile Communications », Wikipédia. 25-mars-2018.
[36] « General Packet Radio Service », Wikipédia. 14-nov-2016.
[37] D. Nussbaum, « Le débit des téléphones portables : de la 1G à la 4G », Futura Tech, 11-
déc-2015. [En ligne]. Disponible sur: https://www.futura-
sciences.com/tech/dossiers/telecoms-histoire-telephone-portable-annees-80-nos-jours-
1944/page/5/. [Consulté le: 07-juin-2018].
[38] « Universal Mobile Telecommunications System », Wikipédia. 28-févr-2018.
[39] « UMTS frequency bands », Wikipedia. 12-mars-2018.
[40] « LTE (réseaux mobiles) », Wikipédia. 29-mai-2018.
[41] « LTE Advanced », Wikipédia. 10-mars-2018.
[42] « Samba (informatique) », Wikipédia. 25-avr-2018.
[43] « Server Message Block », Wikipédia. 19-déc-2017.
[44] « Samba: Set up a Raspberry Pi as a File Server for your local network », The MagPi
Magazine, 02-juin-2017. .
[45] F. Boender, « Store credentials in file for use with smbclient », Coderwall, 25-févr-2016.
[En ligne]. Disponible sur: https://coderwall.com/p/bkpiyg/store-credentials-in-file-for-use-
with-smbclient. [Consulté le: 14-juin-2018].
[46] « xDevs.com | Using BME280 temperature/humidity/pressure sensor with Raspberry Pi ».
[En ligne]. Disponible sur: https://xdevs.com/guide/thp_rpi/. [Consulté le: 14-juin-2018].
[47] « Kuman RPi GPIO Breakout Expansion Kit For Raspberry PI with 3.5 Inch LCD Screen , T-
type expansion board + 400 points Tie Points Solderless Breadboard + 40 pin IDE male:
Amazon.fr: High-tech ». [En ligne]. Disponible sur: https://www.amazon.fr/Kuman-
Expansion-Raspberry-Solderless-
Breadboard/dp/B074DV8DKR/ref=sr_1_2?ie=UTF8&qid=1525347075&sr=8-
2&keywords=Raspberry+Pi+Gpio+Kit. [Consulté le: 14-juin-2018].
[48] Adafruit, Adafruit_Python_GPIO: Library to provide a cross-platform GPIO interface on
the Raspberry Pi and Beaglebone Black using the RPi.GPIO and Adafruit_BBIO libraries.
Adafruit Industries, 2018.
[49] Adafruit, Adafruit_Python_BME280: Python Driver for the Adafruit BME280 Breakout.
Adafruit Industries, 2018.
[50] « I2C », Wikipédia. 17-mai-2018.
[51] « Setting Everything Up | Adafruit Ultimate GPS on the Raspberry Pi | Adafruit Learning
System », Adafruit. [En ligne]. Disponible sur: https://learn.adafruit.com/adafruit-ultimate-
gps-on-the-raspberry-pi/setting-everything-up. [Consulté le: 14-juin-2018].
[52] « Using UART instead of USB | Adafruit Ultimate GPS on the Raspberry Pi | Adafruit
Learning System ». [En ligne]. Disponible sur: https://learn.adafruit.com/adafruit-ultimate-
gps-on-the-raspberry-pi/using-uart-instead-of-usb. [Consulté le: 14-juin-2018].
[53] « UART », Wikipédia. 12-juin-2018.
[54] D. Mandle, « Getting GPSd to work with Python and Threading », Things I’ve Figured Out,
06-sept-2012. .
[55] « Raspberry Pi Time », Autonomic Guru, 08-nov-2016. [En ligne]. Disponible sur:
https://autonomic.guru/gps-time-on-raspberry-pi/. [Consulté le: 03-juill-2018].
[56] « Pulse par seconde », Wikipédia. 12-févr-2018.
[57] « NTP: ntpq output explained | TECH.kulish.com », 30-oct-2007. .
[58] « Twisted », Twisted Matrix Labs. [En ligne]. Disponible sur:
https://twistedmatrix.com/trac/wiki. [Consulté le: 09-juill-2018].
[59] « Documentation – Twisted », Twisted Matrix Labs. [En ligne]. Disponible sur:
https://twistedmatrix.com/trac/wiki/Documentation. [Consulté le: 09-juill-2018].
[60] « Downloads – Twisted », Twisted Matrix Labs. [En ligne]. Disponible sur:
https://twistedmatrix.com/trac/wiki/Downloads. [Consulté le: 09-juill-2018].
[61] Glyph, « Twisted - How to run a Twisted server in a non-main thread », Stack Overflow,
16-oct-2012. [En ligne]. Disponible sur: https://stackoverflow.com/questions/12917980/non-
blocking-server-in-twisted/12924751. [Consulté le: 09-juill-2018].
[62] A. Industries, « MCP3008 - 8-Channel 10-Bit ADC With SPI Interface », Adafruit. [En ligne].
Disponible sur: https://www.adafruit.com/product/856. [Consulté le: 09-juill-2018].
[63] « 2.7V 4-Channel/8-Channel 10-Bit A/D Converters with SPI Serial Interface | Application
Notes », p. 40, 2008.
[64] « Serial Peripheral Interface », Wikipédia. 12-avr-2018.
[65] T. DiCola, « MCP3008 | Raspberry Pi Analog to Digital Converters | Adafruit Learning
System », Adafruit. [En ligne]. Disponible sur: https://learn.adafruit.com/raspberry-pi-
analog-to-digital-converters/mcp3008. [Consulté le: 11-juill-2018].
[66] Adafruit_Python_MCP3008: Python code to use the MCP3008 analog to digital converter
with a Raspberry Pi or BeagleBone black. Adafruit Industries, 2018.
[67] chinaplccenter.com, « QS-FS | Application notes in English ». .
[68] « An introduction to npyscreen — npyscreen documentation », Readthedocs. [En ligne].
Disponible sur: http://npyscreen.readthedocs.io/introduction.html. [Consulté le: 09-juill-
2018].
[69] npcole, Repository GitHub de la librarie npyscreen. 2018.
[70] C. Gohlke, « Python Extension Packages for Windows - Curses ». [En ligne]. Disponible sur:
https://www.lfd.uci.edu/~gohlke/pythonlibs/#curses. [Consulté le: 16-juill-2018].
[71] « D-LINK Netzwerkadapter - Interdiscount », Interdiscount. [En ligne]. Disponible sur:
https://www.interdiscount.ch/fr/ordinateurs-logiciel/r%C3%A9seau/accessoires-
r%C3%A9seau--C526000/d-link-netzwerkadapter--P0000371099. [Consulté le: 16-juill-2018].
[72] « dwa-131 [Wiki ubuntu-fr] », Wiki Ubuntu-fr. [En ligne]. Disponible sur:
https://doc.ubuntu-fr.org/dwa-131. [Consulté le: 16-juill-2018].
[73] M. Bergmark, rtl8192eu-linux-driver: Drivers for the rtl8192eu chipset for wireless
adapters (D-Link DWA-131 rev E1 included!). 2018.
[74] « DWA-131 REV_E Drivers », D-Link. [En ligne]. Disponible sur:
ftp://files.dlink.com.au/products/DWA-131/REV_E/Drivers/. [Consulté le: 16-juill-2018].
[75] « Setting up a Raspberry Pi as an access point in a standalone network (NAT) - Raspberry Pi
Documentation », Raspberry Pi. [En ligne]. Disponible sur:
https://www.raspberrypi.org/documentation/configuration/wireless/access-point.md.
[Consulté le: 16-juill-2018].
[76] E. Scalafiotti, « Turn a RaspBerryPi 3 into a WiFi router-hotspot », Edo Scalafiotti, 17-juin-
2016. .
[77] Soren, « How-To: Turn a Raspberry Pi into a WiFi router », Raspberry Pi HQ, 04-déc-2013. .
[78] M. Jaiswal, « python - How to process SIGTERM signal gracefully? », Stack Overflow. .
[79] sajattack, « twisted port.stopListening() doesn’t stop? », GitHub. [En ligne]. Disponible
sur: https://github.com/riptideio/pymodbus/issues/19. [Consulté le: 22-juill-2018].
[80] « RPi.GPIO », PyPI. [En ligne]. Disponible sur: https://pypi.org/project/RPi.GPIO/.
[Consulté le: 25-juill-2018].
[81] aaronasterling, « python - efficient circular buffer », Stack Overflow. [En ligne].
Disponible sur: https://stackoverflow.com/questions/4151320/efficient-circular-buffer.
[Consulté le: 23-juill-2018].
[82] « Win32DiskImager - Ubuntu Wiki », Wiki Ubuntu. [En ligne]. Disponible sur:
https://wiki.ubuntu.com/Win32DiskImager. [Consulté le: 23-juill-2018].
[83] M. Heuberger, « Bug #1394163 “Unable to turn powersave for wlan0 off” : Bugs : linux
package : Ubuntu », Launchpad.net. 21-nov-2014.
14 Annexes
Les documents annexes au rapport de projet sont les suivants :
15 Signature
Je soussigné, Julien Brêchet, étudiant de troisième année de la filière Réseaux et Services au sein
de la HEIG-VD d’Yverdon-les-Bains, confirme avoir réalisé seul mon travail de Bachelor et avoir cité
les sources que j’ai utilisées dans les références du rapport.
Julien Brêchet