P26 Réseau de capteurs de pollution
Etudiante : Marianne Butaye
Encadrants : Alexandre Boé, Xavier Redon & Thomas Vantroys
Sommaire
- 1 Présentation générale du projet
- 2 Cahier des charges
- 3 Avancement du projet
- 3.1 Semaine 1 (du 08/01/2018 au 14/01/2018)
- 3.2 Semaine 2 (du 15/01/2018 au 21/01/2018)
- 3.3 Semaine 3 (du 22/01/2018 au 28/01/2018)
- 3.4 Semaine 4 (du 29/01/2018 au 04/02/2018)
- 3.5 Semaine 5 (du 05/02/2018 au 11/02/2018)
- 3.6 Semaine 6 (du 12/02/2018 au 18/02/2018)
- 3.7 Semaine 7 (du 19/02/2018 au 25/02/2018)
- 4 Bibliographie
- 5 Annexes
Présentation générale du projet
Actuellement, seuls deux capteurs de pollution sont présents sur la métropole, un à Lille et l'autre à Fives. Une carte de pollution de la zone est générée à partir de ces deux capteurs et d'un algorithme tenant en compte les déplacements des nuages. L'objectif serait de pouvoir avoir une carte de la pollution en temps réel dont les données seraient obtenues à partir d'objets connectés. Chaque personne se déplaçant avec un de ces objets contribuerait à fournir des informations pour compléter la carte de pollution.
L'objet connecté prendrait la forme d'une carte portative, qui pourrait être attachée sur un brassard ou un vélo. La carte portative enverrait des relevés par bluetooth à un téléphone Android, qui lui-même les enverrait ensuite par la 3G à une base de données. Il sera également possible d'effectuer ces transmissions par une puce LORA, au choix de l'utilisateur.
La carte électronique sera composée au minimum d'un capteur de particules, d'un micro-contrôleur, d'une puce bluetooth et d'une puce LORA. On pourrait éventuellement rajouter d'autres capteurs comme un capteur de pression atmosphérique, un accéléromètre etc.
Cahier des charges
Tâches à réaliser
Ce projet se découpe en différentes parties :
- Mini état de l'art
- Réalisation de la carte électronique
- Programmation
- Réalisation du montage & tests
- Design sur ordinateur
- Gravure & soudage
- Application Android
- Base de données
Matériel fourni
- 1 boîte en plastique pour stocker le matériel
- 1 câble USB/mini USB
- 1 carte STM32F401RE nucleo
- 1 shield Bluetooth nucleo (BLE IDB04A1)
- 1 kit d'évaluation ST microelectronics. La carte possède une puce Bluetooth et un STM32 ainsi que des capteurs divers. Une application Android est disponible sur le site de ST microelectronics.
- 1 téléphone Android LG G4C
- 2 capteurs de particules
- 1 board pour passer du câble à des PINs
- Des convertisseurs 3.3V -> 5V
- 1 SensorTile Module (STM32 + bluetooth + capteurs + antenne)
- 1 module GPS programmable DS-GPM
- des câbles MM et FF
Planning
Tâche | Sous-tâche | Semaine 1 | Semaine 2 | Semaine 3 | Semaine 4 | Semaine 5 | Semaine 6 | Semaine 7 |
---|---|---|---|---|---|---|---|---|
Réunion avec les encadrants | x | x | ||||||
État de l'art | x | |||||||
Carte électronique | Programmation du micro-contrôleur | x | x | |||||
Réalisation du montage & tests | ||||||||
Design sur ordinateur | x | x | x | |||||
Gravure & soudage | ||||||||
Application Android | x | x | ||||||
Base de données |
Avancement du projet
Semaine 1 (du 08/01/2018 au 14/01/2018)
Je commence par rencontrer mes encadrants de projet afin d'établir le contexte et les objectifs de celui-ci, de récupérer le matériel et le travail déjà commencé auparavant.
La première chose à faire est de réaliser un mini état de l'art, pour mieux s'approprier le sujet.
État de l'art
Les équipements pour mesurer la pollution étant trop chers et donc réservés aux experts, les micro-capteurs de pollution ont fait leur apparition. Ceux-ci sont plus légers, portables, peu chers, faciles à utiliser et connectés. Les capteurs de particules fonctionnent par détection optique par diode laser. On aspire d'abord l'air par un ventilateur, qui circule ensuite dans une chambre de détection. La chambre permet de séparer les particules pour ne garder que les plus fines (les plus dangereuses). Le flux d'air chargé de particules traverse ensuite le signal optique émis par une diode laser dont le faisceau est diffracté par une lentille. Un photodétecteur placé face au faisceau émis recueille les baisses de luminosité liées au passage des particules. Il compte leur nombre par plages de tailles. À partir du débit de l'air, on peut remonter à une concentration en nombre puis en masse.
On repère plusieurs types de capteurs de pollution : les stations connectées et les capteurs nomades.
Dans les stations connectées, on retrouve les produits Footbot et Koto Air. La première mesure tous les niveaux de pollution, tandis que la seconde n'en mesure pas autant mais relève aussi l'humidité, la température, la luminosité et le niveau de bruit.
Ce projet est de la catégorie des capteurs nomades. On trouve dans cette catégorie le capteur français Flow de la société PlumeLabs, l'Atmo tube, Clarity, un capteur chinois et le Tzoa. Ces capteurs relèvent la plupart différentes pollutions, telles que les particules fines, le monoxyde d'azote, le monoxyde de carbone, l'ozone et les composés organiques volatiles (provenant de la pollution intérieure : moquettes, peintures, colles, plantes etc.). Certains embarquent aussi d'autres capteurs pour par exemple mesurer la température, l'humidité etc. Ces capteurs nomades ont pour principe de relever et traiter les données par le capteur, puis ensuite de les transmettre à une application mobile. Certains ont même vocation à les transmettre à une base de données selon le principe du "crowdsourcing", où les données récoltées sont partagées entre tous les utilisateurs; c'est le cas des capteurs Flow et Clarity.
Enfin, on trouve des capteurs nomades avec une forme un peu plus originale, comme c'est le cas des pulls réalisés par Nikolas Beltel, designer du groupe Aerochromics; ces pulls changent de couleur en fonction du taux de pollution pour des pollutions telles que les particules fines, le monoxyde de carbone ou encore la radioactivité.
Connexion bluetooth entre la carte STM32 et le téléphone
J'ai ensuite abordé en premier la connexion entre la carte STM32 et le téléphone, n'ayant pas encore eu une partie du matériel (le capteur de particules entre autres).
La carte STM32 est programmable grâce à un IDE disponible sur le site de MBed. Cet IDE est disponible en deux versions : en ligne ou à télécharger. J'ai décidé d'utiliser la version en ligne, celle-ci étant facile d'accès. Il suffit de créer un programme en ligne et de le compiler. Le fichier binaire ainsi créé est ensuite automatiquement téléchargé par le navigateur, et un drag&drop sur la carte STM32 (branchée par USB à l'ordinateur) permet de la reprogrammer.
La carte nécessite l'ajout d'un shield bluetooth pour la communication. On utilise ici le modèle BLE IDB04A1, un modèle aujourd'hui obsolète, ce qui a posé quelques problèmes pour la connexion à la carte. Le site de MBed a en effet beaucoup d'exemples et librairies disponibles en ligne, mais les projets BLE_HeartRate_IDB0XA1 et BLE_HeartRate_IDB04A1 ne fonctionnent pas avec ce modèle. Cette version-ci par contre fonctionne en partie. J'ai ainsi pu établir une connexion partielle, en suivant ces instructions puis celles-ci pour la partie Android.
Il s'est avéré que même l'exemple fonctionnant partiellement posait problème lors de l'initialisation du module Bluetooth. Un déboggage manuel a permis de déterminer exactement d'où venait l'erreur : le problème se produit lors de l'initialisation de la communication SPI entre les deux objets. Le problème vient en fait de l'utilisation de la LED : il n'est pas possible de l'utiliser en même temps que le shield Bluetooth. Il faut, pour résoudre ce problème, connecter deux PINs ensemble (le 11 et le 31 du côté CN10 de la carte) par un jumper.
Une fois le problème résolu, on peut voir s'afficher la configuration du module au démarrage de celui-ci sur un terminal connecté en série à la carte.
Une application Android est disponible pour tester les exemples. J'ai ainsi téléchargé l'application STM BLE Profiles sur le Play store. Le dispositif est reconnu et je peux accéder aux informations programmées dans la carte et transmises par Bluetooth.
L'intallation d'Android Studio étant particulièrement longue, je n'ai pas encore pu tester la connexion par Bluetooth avec une application Android se connectant aux services que j'ai créé dans le programme de la carte.
Semaine 2 (du 15/01/2018 au 21/01/2018)
Programmation du capteur de particules
Le capteur de particules est le SEN0177. On peut le connecter à un micro-contrôleur par 4 fils : VCC (5V), GND, TX et RX. Ce capteur est livré avec une carte adaptateur pour passer du connecteur à des PINs traditionnels. Il fonctionne selon une trame préétablie que l'on peut récupérer sur le site du constructeur (voir la bibliographie). On y trouve également un programme d'exemple pour Arduino que je me suis chargée de transcrire pour le faire fonctionner sur l'environnement de développement MBed.
Une chose importante est de ne pas se tromper sur le branchement des fils : le RX de l'adaptateur doit être connecté au TX de la STM32 et son TX au RX de la STM32. Il a aussi fallu faire attention à ne pas mettre trop de printf dans le code du programme : en effet, ceux-ci ralentissent le programme et on peut ainsi ne récupérer aucune donnée par la connexion série même si le programme est correct. Enfin, une dernière difficulté a été de trouver les bons noms des PINs à utiliser dans le programme; il est ainsi nécessaire de n'utiliser que les noms des PINs en vert ou en bleu du Pinout.
Pour récupérer les valeurs des particules fines de type 1.0, 2.5 et 10, il faut commencer par détecter si on a bien le début de la trame en liaison série, c'est-à-dire 0x42 suivi de 0x4D. On pourra ensuite trouver les valeurs dans les données reçues.
Dans les bâtiments de l'école, j'obtiens les valeurs de pollution suivantes, qui sont assez faibles.
PM1.0: 2 ug/m3 PM2.5: 5 ug/m3 PM10: 6 ug/m3
PM1.0: 3 ug/m3 PM2.5: 5 ug/m3 PM10: 5 ug/m3
PM1.0: 3 ug/m3 PM2.5: 5 ug/m3 PM10: 5 ug/m3
PM1.0: 3 ug/m3 PM2.5: 5 ug/m3 PM10: 5 ug/m3
PM1.0: 4 ug/m3 PM2.5: 6 ug/m3 PM10: 6 ug/m3
Le capteur contient un ventilateur qui aspire les particules et une sortie d'air, il ne faut donc pas les obstruer pour obtenir de bonnes valeurs.
Programmation du module GPS
Je ne peux pas programmer le véritable module GPS pour le moment car celui-ci est trop petit. C'est pour cela que j'ai effectué la programmation du module en utilisant un autre module à taille plus grande en attendant de pouvoir réaliser la carte. Le module obtenu est un DS-GPM. Celui-ci fonctionne sous une tension allant de 7 à 16V, je vais donc le connecter à une pile 9V.
Les GPS sont en général connectés par des liaisons classiques : séries avec RX et TX, SPI ou I2C. Ce module fonctionne en I2C, on va donc brancher 4 PINs : VCC(7->16V), GND, SDA et SDL.
De même, le site du constructeur permet le téléchargement d'un programme d'exemple Arduino et de la Datasheet. Les valeurs du GPS sont facilement récupérables : les données sont contenues dans 112 registres. Il suffit de récupérer ceux souhaités. L'interface I2C sur MBed permet également de récupérer d'un seul coup la totalité des registres.
Ce capteur ne fonctionne pas en intérieur. J'ai réussi à lire les registres mais étant en intérieur, je n'ai pas pu obtenir de valeurs exploitables.
Création du schematic de la carte sous Altium Designer
J'ai reçu la liste du matériel disponible entre temps, ainsi qu'une librairie pour Altium contenant certains composants déjà réalisés. J'ai ainsi commencé par faire ceux qui manquaient puis par réaliser un début de schéma.
Pour le composant Sensor Tile (ou ultra low power DSP STM32L476JGY6), qui contient à la fois un micro-contrôleur STM32, un module bluetooth et des capteurs divers, j'ai dû consulter le peu de datasheet existant puis me référer à la datasheet du composant STM32L476.
Liste des composants :
- HDC1080DMBR (capteur d'humidité et de température)
- TMP302DDRLR (switch de température)
- DPS310XTSA1 (baromètre et capteur de température)
- PCF8563T (horloge et calendrier temps réel)
- 538-47346-1001 (connecteur micro-USB)
- AMCA31-2R450G-S1F-T (antenne Bluetooth/WiFi)
- 146235-0001 (antenne GPS)
- AP3417CKTR-G1 (régulateur de tension)
- SN74LV1T34DCKR (buffer et modificateur de tension)
- BSS84-7-F (switch MOSFET)
- MAX4378TAUD+ (mesure de consommation)
- STLCS02V1 - SensorTile (microcontrôleur STM32 + module Bluetooth + micro + baromètre + capteur de température + accéléromètre + magnétomètre + gyroscope)
Connexion par Bluetooth entre STM32 + module bluetooth et téléphone Android
J'ai également poursuivi le travail sur la connexion par Bluetooth. Maintenant que la carte est capable de transmettre des données, j'ai créé une application Android capable de communiquer en BLE (Bluetooth Low Energy). J'ai d'abord commencé par télécharger des applications existantes sur le Play Store pour essayer de détecter la combinaison carte + module bluetooth.
J'ai notamment découvert par expérimentations que le nom de l'application ne doit pas dépasser 14 caractères ni ne contenir d'espaces, ou que les dernières versions de librairies mbed ne permettaient pas au module BLE de fonctionner correctement. Il est donc important de ne pas mettre à jour les librairies lors de l'importation du projet, et de ne pas oublier de connecter le jumper (voir semaine 1).
Une fois l'appareil Pollution détecté dans la liste des appareils connectés en Bluetooth, il est possible de le sélectionner et d'afficher la liste des services qu'il publie. En effet, chaque appareil bluetooth publie des services. Un service regroupe des caractéristiques qui vont bien ensemble. Ces caractéristiques peuvent ensuite être de type lecture, écriture ou les deux. Pour les caractéristiques que l'on peut lire, on peut ainsi obtenir la ou les valeurs associées. Par exemple, pour un service Service Pollution, on pourrait avoir une caractéristique Niveau de pollution ainsi qu'une autre Niveau d'humidité.
Après de nombreux essais, j'ai enfin réussi à détecter le service de pollution envoyé par la carte. C'est probablement grâce à l'ajout de l'adresse 0xFFFF dans la liste de diffusion des services, ce qui semble avoir mis à jour le cache . La carte peut en effet annoncer les services qu'elle contient. Cela n'est pas obligatoire pour que le bluetooth fonctionne mais permet de donner une bonne indication du fonctionnement de l'application. L'adresse 0xFFFF est réservée au développement.
J'ai enfin créé ma propre application Android par la suite pour récupérer correctement la valeur de la pollution. Celle-ci est par défaut considérée comme de l'hexadécimal, or nous souhaitons obtenir un entier. J'ai aussi ajouté le service de niveau de batterie (utile pour un objet connecté qui fonctionnera possiblement sur piles ou autres et dont on voudra vérifier la durée de vie) et le service d'information sur l'appareil (ici, la carte électronique).
Semaine 3 (du 22/01/2018 au 28/01/2018)
Suite du travail sur le schematic de la carte
Cette semaine, j'ai commencé par poursuivre le schematic de la carte électronique sous Altium. J'ai pour cela téléchargé et consulté les différentes datasheets des composants. Cela m'a permis d'établir une liste de points/questions à aborder avec mes tuteurs, parmi lesquels l'obtention de références manquantes de composants, comment effectuer la connexion/déconnexions entre les différents éléments du schéma etc. J'ai aussi créé la partie PCB de la carte sous Altium pour commencer à entrer la configuration des règles à respecter et d'ores et déjà créer des plans de masse.
Suite du travail sur l'application Android
J'ai également poursuivi le travail sur l'application Android pour la communication en Bluetooth. En effet, l'application a été créée à partir d'un projet d'exemple généré automatiquement, j'ai donc d'abord nettoyé un peu le code qui ne servirait pas ou plus.
La carte comportera plusieurs capteurs, il est donc important de pouvoir afficher et récupérer plusieurs caractéristiques du service de pollution. J'ai donc dans ce but ajouté une liste des éléments sur la page d'accueil et affiché les deux caractéristiques principales pour le moment, le niveau de particules et la batterie restante. Le bluetooth Low-Energy sous Android est fait de telle manière que seule une action de lecture ou d'écriture est possible à la fois. Cela signifie surtout que pour pouvoir obtenir les valeurs des deux caractéristiques citées précédemment, il faut mettre en place une file d'attente (ou queue en anglais) pour que les actions soient effectuées les unes à la suite des autres. Il existe différents types de files d'attentes sous Java ou Android, j'ai pour ma part employé une liste de type FIFO (First In First Out). La LinkedList de Java convient parfaitement dans ce cas-ci.
Un autre point important concerne l'affichage de la liste. En effet, une fois les bonnes valeurs des capteurs récupérées par Bluetooth, on souhaite pouvoir les mettre à jour dans la liste. Il a donc été nécessaire de rafraîchir l'affichage de la liste pour obtenir ces changements.
J'ai aussi travaillé sur les notifications. J'ai d'abord commencé par modifier le programme du module bluetooth, pour lui faire envoyer des mises à jour des valeurs des capteurs. La LED clignotante permet de vérifier que les mises à jours sont bien envoyées. Il est possible, sous Android, de souscrire à des notifications pour être tenu au courant des changements de valeurs des capteurs. Il est pour cela nécessaire d'indiquer que l'on souhaite recevoir les notifications et il faut donner une valeur à un descripteur particulier (les descripteurs permettent d'ajouter des configurations sur les caractéristiques). Je n'ai malheureusement pas encore réussi à observer de réception des notifications.
Semaine 4 (du 29/01/2018 au 04/02/2018)
Réunion avec mes tuteurs
La semaine a commencé avec une réunion avec M. Boé, sur le sujet de la carte électronique. J'ai ainsi pu obtenir les références manquantes des modules GPS et LORA.
J'avais également quelques questions à lui poser et cette réunion m'a permis d'obtenir les informations suivantes :
- Les différents éléments doivent pouvoir être connectés ou déconnectés facilement. Pour ceci, on utilisera des jumpers et des headers. Les headers seront mis sur la carte pour simuler une ligne coupée et les jumpers permettront de connecter/déconnecter cette ligne.
- Le switch de température donné dans la liste de composants ne sera pas utilisé.
- On pourra accéder aux sorties de mesures de courant grâce à des headers.
- Le module SensorTile sera alimenté en 3.3V. Il est normalement alimenté en 1.8V, mais il (et tous ses capteurs) est capable de supporter du 3.3V, alors qu'au contraire certains capteurs ne fonctionneront pas avec une tension inférieure à 3V. L'alimentation se fera sur la broche VDD sur SensorTile.
- La carte pourra soit être alimentée en 5V, tension qui grâce au régulateur de tension sera transformée en 3.3V, soit directement en 3.3V. Les tensions 5V et 3.3V peuvent être obtenues par des headers ou pour le 5V par le port micro-USB.
- Le module SensorTile dispose d'un pin pour la fonctionnalité USB On-The-Go, qui ne sera pas utilisée pour le moment. Un header permettra quand même une possible future utilisation de celui-ci. Ce port doit être alimenté en 3.3V.
- On n'utilisera pas le baromètre de la liste de matériel, car le SensorTile dispose déjà d'un capteur similaire.
Liste des composants supplémentaires :
- M10578-A2 (module GPS)
- RN2483A-I/RM103 (module LORA)
Réalisation du schematic et du PCB
J'ai ensuite continué et terminé la réalisation du schematic et du PCB associé, et ai envoyé ceux-ci pour validation auprès de M. Boé. Ce fut la première version de la carte (visible ci-dessous).
La révision de M.Boé m'a permis de remarquer quelques problèmes et changements a effectuer (notamment la taille des composants SMD comme les résistances et les capacités, ou le fait que le capteur de particules fonctionne sur du 5V). C'est la troisième version qui sera la finale, après quelques modifications supplémentaires au niveau des vias de masse et des antennes.
L'étape suivante consiste à imprimer la carte sur papier en taille réelle et poser les composants dessus pour vérifier les tailles des empreintes. Je n'ai malheureusement pas les composants, cette vérification devra donc attendre la semaine suivante.
Suite de la programmation de la carte STM32
La carte embarque de nombreux capteurs, il faudra donc pouvoir relever et transmettre ces valeurs au téléphone Android. J'ai donc commencé par créer de nombreux programmes, un pour chaque capteur, dans le but de relever leurs valeurs. Ainsi, certains d'entre eux communiquent avec le protocole I2C, comme c'est le cas du capteur d'humidité, de pression barométrique ou du RTC. Pour lire ces valeurs, il faut connaître l'adresse du capteur et faire une écriture sur le registre que l'on souhaite lire. On peut ensuite y faire une lecture et récupérer son contenu. Certains capteurs nécessitaient aussi une configuration préalable qui consistait à écrire certaines valeurs dans les registres de configuration.
D'autres capteurs (notamment le GPS, le module LORA et le capteur de particules) fonctionnent en écriture/lecture sur le port série. Ceux-ci se lisent plutôt facilement et on peut distinguer à qui appartiennent les valeurs en lecture par le début de chaque trame. Le capteur de particules par exemple écrira d'abord 0x42, alors que le GPS écrira '$'.
Le GPS, d'ailleurs, suit un protocole spécifique pour la forme de ses données; c'est le protocole NMEA 0183. Ce protocole permet de recevoir des trames de différents formes, une des plus connues étant la forme GGA. Je ne sais pas encore quels types de trames envoie ce module GPS car je ne peux pas tester mes programmes, n'ayant pas encore gravé la carte; mais je suis partie du principe pour réaliser le code que la trame était de forme GGA. Un exemple de trame se trouve ci-dessous :
$GPGGA,064036.289,4836.5375,N,00740.9373,E,1,04,3.2,200.2,M,,,,0000*0E
On y retrouve ainsi le type de la trame, l'heure d'envoi de celle-ci, la latitude, la longitude, l'altitude, le nombre de satellites utilisés pour calculer les coordonnées et d'autres informations diverses et variées.
Il est ensuite important de pouvoir transmettre ces données. J'ai donc créé de nouveaux services et caractéristiques pour l'envoi via le Bluetooth. J'ai essayé au maximum de reprendre les services qui existaient déjà pour cela.
Il existe ainsi un service Environmental Sensing Service qui peut embarquer de nombreuses caractéristiques, notamment la température, l'humidité ou a pression atmosphérique. J'ai malheureusement découvert au cours de mes expérimentations que je n'arrivais pas à transmettre plus de deux caractéristiques par services. La troisième se transformait automatiquement en valeur supplémentaire de la seconde caractéristique déclarée. Je me suis donc arrangée en laissant l'humidité et la pression au service ci-dessus et j'ai transféré la température dans le Pollution Service créé précédemment.
Un autre service est le Location and Navigation Service qui lui contient les données relatives à la positions telles que celles transmises par le GPS. Pour cette caractéristique, et afin de respecter la limite de deux caractéristiques par service, j'ai dû créer et envoyer des données sous forme de structure de données. En effet, cette structure (qui correspond au contenu de la caractéristique déclarée dans la documentation officielle) commence par des bits indiquant les valeurs à suivre, puis on y retrouvera à la suite la latitude, la longitude et l'altitude. La documentation indiquait cependant qu'une transformation devait être appliquée aux données issues des capteurs, afin de les transmettre sous forme d'entiers alors qu'elles étaient sous forme décimale. Dans ce cas-là, il fallait faire valeur x 10^7 pour le GPS d'après la documentation, mais j'ai été obligée de me limiter à 10^5, les valeurs n'ayant plus de sens au delà.
Enfin, le dernier service utilisé est le Current Time Service qui permet de stocker la date et l'heure obtenus à partir du RTC.
Semaine 5 (du 05/02/2018 au 11/02/2018)
Semaine 6 (du 12/02/2018 au 18/02/2018)
Semaine 7 (du 19/02/2018 au 25/02/2018)
Bibliographie
- État de l'art :
- Programmation de la carte :
- Programmation du capteur de particules :
- Programmation du module GPS :