I2 - Conception d'un système embarqué temps réel
- Projets
- LoRaWAN - The Things Network
- ESP32 - LED RGB pilotée via Wifi
- ESP32 - BMP180
- Schéma LoRa + Grafana-Influx + NodeRED
- Installation outils MQTT
- Installation NodeRED
- Installation Arduino
- TP Nodered
- TP Arduino simulator
Projets
LoRaWAN - The Things Network
Objectif(s)
Créer un objet qui enverra via LoRa l'humidité et la température ambiante.
The Things Network (TTN)
The Things Network est une association qui a permis de créer un réseau communautaire LoRaWAN. Tout ceux qui le veulent peuvent apporter leur pierre à l'édifice en installant chez eux ou dans leur entreprise une passerelle LoRa. L'EPSI en possède une installée dans le myDIL.
Créer un compte et une application sur https://console.thethingsnetwork.org
Mise en place
Voici en résumé ce que nous devons faire :
- Installation de la carte sous Arduino.
- Récupérer le devEUI de la carte.
- Créer l'objet dans TTN à partir de ce devEUI.
- Utiliser un code typique pour tester la connexion en utilisant les clés fournies lors de l'étape précédente.
- Connecter le capteur (sans LoRa).
- Fusionner les deux codes précédents pour envoyer la température et l'humidité.
- Récupérer les données et les afficher dans un dashboard NodeRed.
Installation de la carte Things Uno sous Arduino
Au niveau matériel, rien à installer, sélectionner "Arduino Leonardo" dans le gestionnaire de carte.
La conception de la carte est assez simple : un modem LoRa est associé avec un microcontroleur (µC) Atmega32u4 qui équipe habituellement les Arduino Léonardo. Le µC et le modem communiquent en liaison série en s'envoyant des commandes formatées appelées commande AT. La librairie installée permet de faire abstraction de cette communication, mais on pourrait très bien communiquer avec ce modem directement depuis le moniteur série du PC par exemple.
Si jamais la carte vous pose des problèmes (port série non reconnu etc ..) => https://www.thethingsnetwork.org/docs/devices/node/troubleshooting.html
Dans le gestionnaire de librairies, installer TheThingsNetwork.
Récupération du devEUI
Récupérer le devEUI de votre carte => https://www.thethingsnetwork.org/docs/devices/uno/quick-start.html
Créer le device sur TTN
Sur la console TTN, dans votre application créer un device. Saisissez le devEUI précédemment récupéré et laissez les autres champs en génération automatique.
Tester la liaison
Sur Arduino, allez chercher Fichier>Exemples>TheThingsNetwork>SendOTAA. Modifier les différents champs importants pour correspondre à votre configuration (AppKey, FrequencyPlan ...) et vérifier dans le moniteur série que tout se passe bien (JOIN et envoi).
Vérifier sur la console TTN que les données arrivent bien.
Si vous rencontrer des problèmes de type "invalid_param" en console, il vous faut downgrader votre version de la librairie TheThingsNetwork en 2.5.16
Connecteur de capteur d'humidité/température (DHT11)
Ajouter ensuite un DHT11, récupérer ses données de température et d'humidité, et les envoyer via LoRa.
Connecter NodeRED
Lancer ensuite un serveur NodeRed afin de récupérer les données sur le MQTT TTN : https://www.thethingsnetwork.org/docs/applications/mqtt/api.html
Et les afficher sur un dashboard NodeRed (node-red-dashboard).
ESP32 - LED RGB pilotée via Wifi
Objectif
Contrôler une LED RGB, elle même piloté par un ESP32, au travers d'un dashboard NodeRed et de son outil "Color picker". Le protocole utilisé sera le MQTT et le transit des information se fera au format json.
Matériel
- Un ESP32
- Carte de développement avec Wifi et bluetooth BLE.
- Un shield LED WS1812
- Se pilote grâce à un fil
- La LED est reliée au pin 21 de l'ESP
Logiciel
Ajout de l'ESP 32 à Arduino si ce n'est pas déjà fait : https://doc.creatronic.fr/books/i2---conception-dun-syst%C3%A8me-embarqu%C3%A9-temps-r%C3%A9el/page/installation-arduino
Utiliser la board Wemos LOLIN32.
Pour contrôler la LED il existe beaucoup de librairies. Une des plus simple pour débuter est Adafruit Neopixel. Pour l'installer il faudra ajouter l'URL suivante dans le menu préférences :
https://adafruit.github.io/arduino-board-index/package_adafruit_index.json
Il y a un bug dans le mariage Adafruit Neopixel <-> ESP32. Les couleurs peuvent ne pas correspondre à vos attentes, notamment quand ça touche à la couleur rouge ... Pour le résoudre, il vous suffit de doubler l'appel à la fonction show().
Pour le MQTT, utilisez PubSubClient et ArduinoJson pour la gestion des json.
Livrable attendu
Pour obtenir la moyenne vous devrait produire un démonstrateur fonctionnel. Pour obtenir des points supplémentaires, ajoutez des fonctionnalités et fiabilisez votre code.
ESP32 - BMP180
Objectif(s)
Créer un objet connecté en wifi qui enverra via MQTT la température et la pression atmosphérique vers un serveur qui stockera ces informations en base de données InfluxDB avant de les restituer au travers de la solution Grafana.
Répartissez vous bien les tâches : le travail est divisible et il y a pas mal de choses à faire ...
Arduino
Ajout de l'ESP 32 à Arduino si ce n'est pas déjà fait : https://doc.creatronic.fr/books/i2---conception-dun-syst%C3%A8me-embarqu%C3%A9-temps-r%C3%A9el/page/installation-arduino
Utiliser la board Wemos LOLIN32.
Librairie conseillé(e) : Adafruit_BMP085
Pour l'installer il faudra ajouter l'URL suivante dans le menu préférences :
https://adafruit.github.io/arduino-board-index/package_adafruit_index.json
Rpi
Préparation du Raspberry Pi (installation Raspian)
Si Raspbian est déjà installé vous pouvez sauté cette étape.
Télécharger la dernière version de Raspbian : https://www.raspberrypi.org/downloads/raspbian/
Flasher l'image sur la carte SD avec Balena Etcher : https://www.balena.io/etcher/
Avant de débrancher la carte SD, sur la partition boot ajouter un fichier ssh (pas un .ssh, un fichier ssh tout court sans extension) afin que le système autorise le ssh bloqué par défaut.
Si vous souhaitez travailler en Wifi, il faut le configurer avant de mettre la carte SD dans le Raspberry : https://www.raspberrypi-spy.co.uk/2017/04/manually-setting-up-pi-wifi-using-wpa_supplicant-conf/
Mise à jour du système :
sudo apt update && sudo apt dist-upgrade && sudo apt upgrade
Installation de NodeRed
cd ~
bash <(curl -sL https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/update-nodejs-and-nodered)
sudo systemctl enable nodered.service
sudo node-red-start
Installation de InfluxDB
curl -sL https://repos.influxdata.com/influxdb.key | sudo apt-key add -
echo "deb https://repos.influxdata.com/debian buster stable" | sudo tee /etc/apt/sources.list.d/influxdb.list
sudo apt-get update && sudo apt-get install influxdb
sudo service influxdb start
Si tout va bien, taper "influx" pour accéder à la console influxdb.
Créer une base de donnée : create database lenomquevousvoulez;
Installation de Grafana
sudo apt update && sudo apt-get install -y software-properties-common apt-transport-https
sudo nano /etc/apt/sources.list.d/grafana.list
Ajouter le dépôt suivant puis enregistrer.
deb https://packages.grafana.com/oss/deb stable main
Puis :
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
sudo apt-get update && sudo apt-get install grafana
sudo service grafana-server start
Doc officielle en cas de problème : https://grafana.com/docs/installation/debian/
Accessible sous http://ip:3000
Login/mdp par défaut : admin/admin
Ajout des nodes nécessaires dans node-red
Ajouter les nodes suivants :
node-red-contrib-influxdb => va nous permettre de dialoguer avec les bases influxDB
Travail à réaliser
Sur nodeRED, créer un flow permettant de récupérer et stocker les données de l'objet connecté et de l'insérer dans un measurement influxDB.
Sur Grafana : créer un nouveau dashboard qui permettra d'afficher un graph et une gauge de la charge CPU (penser à activer l'auto refresh).
Schéma LoRa + Grafana-Influx + NodeRED
Installation outils MQTT
Mosquitto (broker)
Windows
Téléchargez et installez le fichier fourni :
https://mosquitto.org/download/
Lancez le Gestionnaire des tâches (CTRL+ALT+SUPPR) puis onglet Services chercher Mosquitto et lancez-le.
Linux
Suivant les distributions :
apt install mosquitto
Si vous utilisez snap :
snap mosquitto install
Dans les deux cas Mosquitto est déjà sensé tourné 😉
MacOS
(Pas de mac sous la main, merci de me valider la procédure 😅 )
http://macappstore.org/mosquitto/
MQTT.fx (client)
Installation NodeRED
RDV sur : https://nodered.org/docs/getting-started/local
En résumé cela se passe généralement de la même manière quelle que soit la plateforme :
- Installation de NodeJS (version 12 idéalement)
- Installation de NodeRed via npm (passer la console)
- Lancement de NodeRed
Attention : là aussi quelle que soit la plateforme, si vous fermez le shell depuis lequel vous avez lancé Node-Red, vous tuez le process, donc pus de NodeRed ... 😥
Installation Arduino
IDE en lui-même
https://www.arduino.cc/en/Main/Software
Si vous êtes sous Windows, évitez de passer par le Store
Ajouter les ESP8266
- Lancez Arduino
- Fichier->Préférences dans URL de gestionnaire de cartes supplémentaires ajoutez
https://arduino.esp8266.com/stable/package_esp8266com_index.json
S'il y a déjà une ou plusieurs URL, vous pouvez en mettre plusieurs à la fois en les séparant soit par une virgule, soit par un retour à la ligne
- Outils -> Type de carte -> Gestionnaire de cartes cherchez esp8266 dans la liste et installez 😉
Ajouter les ESP32
Même procédure que pour les ESP8266 mais avec l'URL suivante :
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
Dans le gestionnaire de carte, sélectionnez et installez ESP32.
TP Nodered
OpenData Montpellier 3M
La métropole met à disposition des données publiques très diverses. Ici on souhaite construire une API qui va répondre à une simple requête :
GET /velomag : renvoie le nombre de place(s) de vélo disponible(s) à la vélo-station Euromédecine (id = 41)
Lien(s)
Open Data Montpellier : https://data.montpellier3m.fr/dataset/disponibilite-des-places-velomagg-en-temps-reel/resource/adb98f8d-c4d2-4012-8abe
Dashboard
Installation
Cliquez en haut à droite sur
Puis sur Manage palette et installez node-red-dashboard
Maintenant en allant sur localhost:1880/ui vous pouvez visualiser un front qui va être piloter par NodeRed.
Pour gérer l'organisation globale de ce front, vous devez avoir maintenant en haut à droite un bouton supplémentaire qui représente un histogramme en bar miniature :
En cliquant dessus vous pouvez structurer le front en page et groupe. Chaque node que vous rajouterez ensuite dans l'espace de programmation pourra ensuite être placé via son menu de configuration.
A faire
Exploitez l'API OpenWeatherMap pour afficher la météo actuelle sur le dashboard.
Il existe un node pour exploiter directement l'API, vous ne devez pas l'utiliser pour cet exercice 🙄
Lien(s)
https://openweathermap.org/api
TP Arduino simulator
Création du compte
A réaliser
Sujet au choix, mais quantité variable suivant le nombre de membres dans le groupe : 1 par membre dans le groupe. Donc si vous êtes 3 vous devrait rendre 3 sujets, à vous de vous organiser ensuite.
Rendu = 1 pdf avec tous les codes + capture d'écran du montage
N'oubliez pas de mettre le nom des membres du groupe !
Quelque soit le sujet, seront évalués entre autres :
- Le bon fonctionnement
- La qualité, la propreté et la fiabilité du code
- La qualité et la propreté du montage
Sujet 1 : K2000
Vous devez, avec un bandeau de led, reproduire la célèbre face avant de la voiture de K2000. Il est attendu que ça ne soit pas une led unique rouge qui se balade sur le bandeau mais qu'on ait bien l'effet "trainée" comme on le peut voir ici :
Librairie recommandée(s) :
- Adafruit_NeoPixel.h
Sujet 2 : Attiny
L'Attiny est la le petit frère de l'Atmega328P qu'on trouve sur les Arduino UNO, et reste bien utile pour des petites applications.
Dans ce sujet, vous devrait y connecter une LED RGB qui changera de couleur continuellement dans le temps comme ceci :
Pensez bien à l'alimentation de l'Attiny !
Le pin mapping est le suivant :
Sujet 3 : serrure codée
En utilisant le clavier numérique 4x4 et un servo en guise de serrure, vous devrait concevoir un coffre qui s'ouvrira avec un code à 4 chiffres.
Sujet 4 : capteur gaz
Vous devrez construire un dispositif de protection en cas de présence excessive de gaz dans l'air. A partir d'un certain seuil, un buzzer devra émettre des bips et devra simuler l'activation de la ventilation grâce à un moteur.
Comme le capteur gaz est un peu particulier, un schéma vous est fourni (la résistance fait 4kOhm) :
Par ailleurs, un moteur ne se commande pas directement avec une Arduino, il faut utiliser un transistor pour le commander vous trouverez plein d'exemple de montage sur Google ;) )