Hé! Vous semblez être en United States, souhaitez-vous utiliser notre site English ?
Switch to English site
Skip to main content

Plan interactif de la qualité de l'air - 4ème partie: Construire la carte

Si vous suivez le projet de Plan interactif de la qualité de l'air, vous avez déjà une idée de ce que représente ce projet, ainsi qu'une idée générale des concepts qui constitueront la construction de ce Plan, sinon, je vous recommande de lire les parties 1 et 2 de cette série de construction.

Modélisation du Plan

Il n'y a pas deux endroits identiques sur terre, chaque zone sur le Plan est unique, c'est un point important à garder à l'esprit tout au long de sa construction, étant donné que le processus utilisé pour construire une cellule du Plan devra être répété pour constituer le reste des zones du même Plan.

Je construis le Plan de la qualité de l'air à Lagos, l'état du Nigeria où j'habite. L'état du Lagos compte 18 zones principales de gouvernement local, je vais donc construire 18 cellules sur le Plan.

La première étape a été d'obtenir une image du Plan de Lagos, ce qui m'amène à mon premier conseil : « Utilisez une image de carte propre », google maps contre-intuitivement, n'est pas une bonne source pour une image de zone en ce qui concerne le Plan de la qualité de l'air, bien que j'aie fini par référencer google maps pour la seule zone (Ikorodu) qui n'était pas représentée sur l'image de stock gratuite que j'ai obtenu de google. Il se trouve que je vis à Ikorodu et je n'avais pas l’intention de l'ignorer.

Lagos map

L'étape suivante est la création d'un schéma vectoriel des zones sur l'image du Plan. J'ai trouvé qu'il n'y a pas vraiment de raccourci pour ce processus, vous devez juste tracer minutieusement l'image sur un logiciel de graphisme vectoriel. Je recommande Inkscape pour cela, mais n'importe quel logiciel de graphisme vectoriel devrait fonctionner correctement.

vector outline of Largos Map

Conseil numéro 2 : « simplifiez le contour du Plan tracé », ce processus réduit le nombre de points sur les routes vectorielles, ce qui vous aidera grandement tout au long du processus de modélisation et éventuellement dans le processus d'usinage.

Une fois que j'ai eu le fichier graphique vectoriel sous forme de fichier SVG, je l'ai importé dans fusion 360 pour commencer à modéliser le Plan, ce qui m'amène à mon troisième conseil : « Modélisez tout », et je veux dire absolument tout ! Je n'ai pas entièrement suivi ce conseil moi-même et cela m'est revenu en pleine figure « 18 fois ».

Ma conception originale pour les cellules du Plan impliquait un empilement multicouche éclairé par les bords, similaire à ce que l'on trouve à l'intérieur des panneaux LCD –vous le verrez dans mon premier article. Mais lorsque j'ai finalement décidé de la taille que je voulais pour le Plan, j'ai réalisé que les petites zones sur le Plan rendraient la mise en œuvre en couches assez difficile. J'ai donc décidé de revenir à la conception plus simple en utilisant de l'acrylique transparent éclairé par les bords –également en partie provoquée par mes explorations dans l'article 3.

Découpage du Plan

Avant de lancer toutes les cellules du Plan sur le Contrôle numérique informatisé (CNC) pour les découper, je voulais voir comment nommer au mieux les zones sur le Plan, et voir ce qui se présente le mieux sur l'acrylique éclairé par le bord. J'ai fait donc deux découpes d'essai : dans la première, toute la surface de l'acrylique, sauf les graphiques du sujet, est fraisée à environ 0,2 mm ; dans la seconde, les graphiques du sujet sont découpés, laissant la plupart de la surface libre.

RS Logo engraved

DesignSpark Logo engraved

Je me suis convaincu que je préférais l'aspect du logo de RS, et je me suis également dit que les taches et les rayures seraient mieux cachées si toute la surface, à l'exception du texte, était découpée. J'ai d'abord modélisé le texte de la zone sur le Plan en fonction de ce choix, mais je dois mentionner que je suis extrêmement nouveau dans l'usinage CNC, nouveau comme ceci : je viens de concevoir et de construire mon premier CNC ! et c'est mon premier projet sur celui-ci.

Une fois que j'ai été satisfait par la conception de l'ensemble du Plan, j'ai procédé à la découpe de la première zone du Plan, mais avant cela, j'ai réorganisé les cellules du Plan de manière à ce qu'un maximum d'entre elles puissent être placées sur la zone de construction de mon CNC.

Repenser ma stratégie de découpe

Après avoir découpé quelques zones, j'ai commencé à douter de mon choix de découper toute la surface de chaque cellule du Plan, surtout parce que cela demandait beaucoup de travail et que ça allait prendre beaucoup trop de temps avec la mèche de 1 mm que j'utilisais. J'ai aussi remarqué que la lumière ne traversait pas toute la première série de cellules du Plan que j'avais découpées, le bord éclairé était beaucoup plus brillant que le reste de la surface de la cellule.

Après avoir réfléchi un peu plus, j'ai décidé de faire une découpe décalée des textes sur le Plan, ce qui est une sorte de combinaison des deux patrons de découpe que j'avais testés initialement.

Cutting sectors of map

Texte décalé

Impression 3D sur le Plan

Les pièces imprimées en 3D sur le Plan sont principalement structurelles, elles permettent de fixer les cellules au panneau acrylique arrière, sans avoir à visser directement dans l'acrylique ou à utiliser des inserts thermiques, qui peuvent tous deux provoquer des fissures dans le matériau acrylique.

Map edge parts - 3D printed

Les parties de bord maintiennent la bande de LED juste contre les bords des cellules du Plan, et servent également à obscurcir partiellement l'illumination de ces bords. La modélisation de ces pièces a demandé beaucoup de travail car chacune d'entre elles a dû être modélisée individuellement en raison de la forme unique des zones.

Assemblage du Plan

L'assemblage du Plan a été assez simple, sauf que je n'ai pas modélisé et donc usiné tous les trous nécessaires, en particulier les trous pour faire passer les fils à travers le panneau arrière. Je les ai donc percés manuellement, ce qui n’a été ni pratique ni beau.

Conseil 4 : « Ayez un chiffon en microfibre à portée de main » ou mieux encore une paire de gants en microfibre, j'ai vérifié, et ils existent ; le plus gros problème que j'ai eu pendant le montage était de garder le Plan propre et sans bavure, il semblait que chaque fois que je touchais le Plan, je laissais une marque permanente.

Mise au point des capteurs de proximité capacitifs.

Le projet s'intitule Plan Interactif de la Qualité de l'Air, la partie interactive est rendue possible grâce aux pavés tactiles capacitifs qui sont les PCB carrés que vous m'avez vu installer à l'arrière de chaque cellule de ce Plan.

La détection utilisée sur ce Plan est la détection par auto-capacitance, ce qui signifie simplement que chaque zone du Plan possède un pavé tactile dédié dont la proximité est détectée individuellement. J'ai expérimenté la détection par capacitance mutuelle qui m'aurait permis de rendre toute la surface du Plan sensible au toucher.

Il s'agit essentiellement d'un ensemble de pavés tactiles disposés et connectés dans un patron de grille, un peu comme on connecte des boutons poussoirs dans une grille pour former un clavier, l'avantage de la capacité mutuelle est un plus grand nombre de points de contact par broche de microcontrôleur. Malheureusement, je n'ai pas réussi à le faire fonctionner correctement à l'échelle du Plan de la qualité de l'air.

Le contrôleur de proximité capacitif

J'avais initialement prévu d'utiliser une carte Arduino Zero pour contrôler la détection de proximité sur le Plan. Comme je l'ai démontré dans la partie 1, j'ai choisi la carte Zero parce qu'elle comporte la puce ATSAMD21G18, un microcontrôleur de Microchip qui a un module de détection capacitif intégré. Mais je me suis rendu compte que j'avais une autre puce, l'ATSAMD21J17 que j'avais achetée pour un autre projet. Cette puce fait partie de la famille des microcontrôleurs ATSAMD21, donc elle comporte également un module de détection capacitif, avec l'avantage supplémentaire d'avoir plus de broches et donc plus de canaux tactiles capacitifs. J'ai conçu une carte de développement très basique utilisant cette puce. J'ai pensé que la carte pourrait être utile pour plus de choses que la simple construction de ce Plan, pour moi, et pour tous ceux d'entre vous qui pourraient être intéressés par la fabrication de la carte pour leurs propres besoins.

Arduino Zero board

CARTE DE DÉVELOPPEMENT ATSAMD21J17 (Contrôleur tactile capacitif)

Vous trouverez le schéma et les fichiers Gerber sur le référentiel GitHub.

Établir des connexions sur le Plan

Conseil 5 : « faites toutes vos connexions sur un PCB personnalisé si vous le pouvez ». Lorsque vous considérez que chaque signal câblé sur ce Plan doit être répété plusieurs fois (18 + 1 dans mon cas), il est tout simplement logique de faire les connexions sur un PCB. Cependant, je n'ai pas suivi mon propre conseil et à la place, j'ai décidé de faire mes connexions sur une carte de prototypage.

Custom PCB

Wiring on custom PCB

J'ai l'habitude d'utiliser des cartes de ce type quand j'ai beaucoup d'incertitude sur la façon dont je vais faire mes connexions. J'ai l'habitude de faire des prototypes comme ça. « D'habitude » ça marche, mais je ne le recommande absolument pas, d'abord parce qu’il est difficile de trouver du dépannage et surtout parce que ce n'est pas idéal pour une application qui utilise la détection capacitive, du moment que ça peut introduire du bruit supplémentaire dans les signaux tactiles.

Schéma

En plus du PCB personnalisé qui contrôle la plupart des capteurs tactiles capacitifs sur le Plan, j'utilise également une carte Arduino WIFI 1010. La carte Arduino contrôle les LED adressables sur le Plan et active également les fonctions IdO (IoT) sur le Plan. La carte tactile capacitive se connecte à l'Arduino via l'un de ses ports série, et les données tactiles envoyées sont ensuite associées à la qualité de l'air et aux données GPS de l'ESDK et traitées sur l'Arduino selon le cas.

Arduino and WiFi Boards

Alimentation : Le Plan est alimenté en courant continu, mais en courant alternatif à l'aide d'une alimentation à découpage de 5V et 2,5A.

PSU for map

Étalonnage et configuration de la proximité sur le Plan

Pour développer le code et programmer la carte ATSAMD21J17 (le contrôleur de détection capacitive), j'ai utilisé MPLAB X IDE, qui est l'environnement de développement dédié aux dispositifs Microchip. De plus, Microchip fournit des consignes très utiles sur la façon de développer une application tactile capacitive –instructions que j'ai suivies et dupliquées pour configurer la détection sur tous les pavés tactiles sur ce Plan. Bien que ce ne soit pas aussi simple qu'avec les Arduinos, il n'a pas été trop difficile d'obtenir le flux de données tactile capacitif via la série. Tout le travail lourd a été fait grâce au code généré automatiquement et je n'ai eu qu'à modifier une seule fonction dans le programme et à ajouter quelques lignes de code pour prétraiter et formater les données envoyées à l'Arduino.

J'ai dû calibrer la sensibilité et les seuils de détection pour toutes les zones du Plan. Je dois également mentionner que la carte tactile ne gère pas toute la détection des contacts sur ce plan. La puce ATSAMD21J17 ne dispose que de 16 canaux pour la détection de l'auto-capacitance, et le Plan comporte 18 zones distinctes. J'ai donc dû confier la détection des deux zones restantes à la carte Arduino WIFI 1010, comme je l'ai fait dans la 1ère partie de ce projet.

Transfert des données de la qualité de l'air sur le Plan

Nous sommes maintenant définitivement dans la section de programmation de ce Plan. Le moment est donc venu pour l'astuce 6 : « penser à ce que les avantages du codage peuvent faire pour moi ». Revenir au Plan impliquait beaucoup de répétitions et il est important de coder efficacement. Le Plan doit réagir à de multiples signaux tactiles, stocker et organiser les différents points de données de qualité de l'air (CO2, COV, etc.) en fonction des différentes zones à partir desquelles les données seront lues. Il est donc important d'éviter autant que possible la spécificité dans le code, nous voulons moins de if(area == "ikorodu") et plus de if(area == areas[index]).

struct
{
  String Area_Name = ""; 
  byte startindex = 0;  
  byte endindex = 20;  
  float Cap_Signal = 0; 
  float prevCap_Signal = 0;
  float Cap_Threshold = genThreshold;
  float alpha = 1.0;
  float sensitivity = 0.0;
  long thresholdresettimer = 0;
  uint8_t detectionstate = 0;
  float sigSwing = 30.0;
  float maxsig = 0.0;
  float minsig = 99999.0;
  float sample[10];
  uint8_t samplecounter = 0;
  float rawsig = 0;
  long debounceTime = 0;
  int AIRQ_dataPT = 1500;
  int allDataPT[2];
} MAPCELL[19];

Ce que j'ai fait est d'implémenter un tableau de structures pour toutes les zones sur ce Plan. Une classe fonctionnerait aussi car la structure contient des variables comme le nom de la zone, le premier et le dernier index des LEDs illuminant cette zone, le signal tactile capacitif, et les valeurs de seuil configurées individuellement. Elle contient aussi des variables pour tous les points de données de qualité de l'air fournis par l'ESDK. Cela me permet de référencer toutes les données par zone sur le Plan en utilisant un indice unique, ce qui facilite énormément la programmation.

Affichage des niveaux de qualité de l'air

La principale façon dont le Plan montre les niveaux de qualité de l'air est à travers les couleurs discrètes montrées sur les zones de ce Plan. Cependant, je comprends que les couleurs discrètes à elles seules ne soient pas capables de communiquer grand-chose. C'est pourquoi j'ai ajouté la barre de niveau que vous voyez à gauche du Plan. En tant que concepteur, je sais ce que les couleurs représentent, mais ce Plan n'a pas été conçu pour moi seul. Il a été conçu pour informer les gens sur la qualité de l'air autour d’eux, et la barre de niveau fournit le contexte nécessaire à l'affichage des couleurs du Plan. Je devrais également y ajouter un petit écran OLED à un moment donné pour afficher les niveaux de qualité de l'air bruts.

Showing air quality levels

La barre comporte 12 niveaux qui s'illuminent avec des couleurs allant du bleu au rouge. J'ai également nommé certains niveaux sur la barre en utilisant des mots amicaux et non agressifs. Je veux éduquer les gens et non les embêter.

Lorsqu'une personne s'approche du Plan et touche une zone, le Plan détecte le toucher dans cette zone et tire les données sur la qualité de l'air qu'il a stockées. Ensuite, il calcule le niveau équivalent sur une échelle de 1 à 12, ce qui lui indique le nombre de barres à allumer sur la barre de niveau et la couleur à utiliser pour éclairer la zone touchée sur le Plan.

Géocodage inversé

Le géocodage inversé signifie le processus de conversion des données de position en latitude et en longitude en une adresse que nous pouvons lire et comprendre. J'ai transformé l'ESDK en un enregistreur mobile de données sur la qualité de l'air dans mon deuxième article, où j'ai parlé de mon matériel GPS, de son implémentation et de son logiciel –c'est un bon article de référence. Ici, je m'appuie sur cette expérience et j'utilise les données de latitude et de longitude déjà enregistrées sur l'enregistreur pour générer la chaîne d'adresses que le Plan utilisera pour trouver l'emplacement de l'enregistreur sur le Plan.

Comment inverser le géocodage

Google fournit une API de géocodage inversé qui est parfaite pour ce que nous voulons faire, les informations complètes sur l'API peuvent être trouvées ici, mais je vais résumer les étapes nécessaires pour obtenir les données dont nous avons besoin :

En code : Pour obtenir l'adresse en code, il suffit d'envoyer une requête « get » à la même URL, puis de lire la réponse sous forme de chaîne JSON. Pour le Plan de la qualité de l'air, nous n'avons pas besoin de toutes les informations renvoyées par l'API, il nous suffit de connaître le nom de la zone d'administration locale.

Nous devons naviguer dans la chaîne JSON pour obtenir le nom requis, ce qui est assez facile à faire en Python.

from unittest import result
import requests
apiquery = "https://maps.googleapis.com/maps/api/geocode/json?latlng=6.62007350384279,3.518361042330444&key=API KEY"
response = requests.get(apiquery)
data = response.json()
for i in data:
    if i == "results":
        try:                 
            print(data["results"][0]["address_components"][3]["long_name"])
            gotArea = data["results"][0]["address_components"][3]["long_name"]
        except:
            print("index error")
    

Le code envoie la requête API, navigue dans la réponse JSON, et imprime le nom de la zone locale pour cette adresse.

L'implémentation de ce code sur l’enregistreur me permet d'ajouter le nom de la zone aux données de qualité de l'air enregistrées avant de publier la chaîne sur le broker MQTT déjà exécuté sur l'ESDK/logger. La chaîne est publiée sur un sujet personnalisé que j'ai simplement nommé « map » (Plan), la publication des données ajoutées sur un sujet différent me permet de configurer le plan de qualité de l'air pour qu'il ne lise que les données provenant du sujet « map ». Une fois que les données arrivent sur le plan, il suffit d'extraire et de trier les données dans la structure appropriée, en fonction de la zone d'où proviennent ces données.

Encadrement du plan

Cette partie de la construction est « open-ended » (ouverte), tant il y a de façons d'encadrer quelque chose comme ça. J'ai pensé à utiliser un cadre photo normal, et j'ai envisagé aussi de faire un cadre personnalisé en bois ou même en métal, toutes des options valables, mais finalement j'ai décidé d'utiliser une combinaison de pièces imprimées en 3D, en acrylique découpé par CNC, avec une carte composite en aluminium comme panneau arrière pour la rigidité.

Map framing parts

Je préfère généralement décomposer les objets que je fabrique en sous-ensembles aussi petits que possible, ce qui facilite le démontage si jamais j'en ai besoin, ce qui m'aide surtout à contourner le manque d'électricité stable au Nigeria. Donc pas de longs travaux de découpage par CNC et pas d'impressions 3D exigeantes en temps.

Assembling the frame

A l'intérieur du Plan

Étalonnages finaux

Après avoir fermé le Plan, j'ai remarqué que les caractéristiques des pavés tactiles capacitifs avaient changé. Ils semblaient plus bruyants, probablement à cause de l'alimentation à découpage et du grand panneau arrière en aluminium. J'ai dû recalibrer les seuils des pavés dans le Plan terminé.

Final calibrations

J'ai essayé de rendre l'algorithme de détection aussi robuste et adaptatif au bruit que possible ; c'était un casse-tête et j'ai dû sacrifier un peu de sensibilité pour faire face au bruit, donc si je dois donner un septième conseil : ce sera d'utiliser un câble coaxial pour les pavés tactiles capacitifs, juste pour avoir des options de mise à la terre contre le bruit –vous trouverez plus d'informations sur le blindage des tactiles capacitifs ici. J'ai anticipé le problème du bruit et c'est pourquoi j'ai conçu un écran coplanaire intégré aux pavés, je n'ai simplement pas câblé la masse pour des raisons de simplicité.

S'il y a des questions sans réponse concernant la construction de ce Plan, veuillez vous référer au référentiel pour tous les CAD et CODE que j'ai utilisés, vous pouvez également y laisser un commentaire. Aussi, assurez-vous de suivre le projet pour voir le Plan de qualité de l'air déployée pour le public.

I am a passionate Hardware Engineer, with a deep interest in Robotics and Embedded hardware/software. I enjoy picking up new skills and challenging myself with finding innovative technological solutions.