TP3
Hervé Boeglen 2017 1
Raspberry Pi et réseau de capteurs sans fil
1. Introduction :
Nous souhaitons mettre en place une plateforme de réseau de capteurs à
l’aide de l’Arduino et du Raspberry PI. Ainsi une carte Arduino, à laquelle on
connectera toutes sortes de capteurs, constituera un nœud faible puissance
dont le rôle sera de transmettre les données du capteur au serveur
représenté par le Raspberry PI.
Notre objectif final sera de parvenir à un serveur Web affichant en temps réel
la température stockée dans une base de données et qui sera obtenue à partir
d’un Arduino connecté par une liaison sans fil. Pour parvenir à cet objectif, je
vous propose de suivre quelques étapes qui doivent vous permettre de
comprendre les interactions entre les différentes technologies mises en
œuvre.
2. Présentation du matériel :
2.1. Nœud de collecte des données :
Carte Arduino UNO
Le projet de logiciel et de matériel libre Arduino est aujourd’hui une référence :
https://www.arduino.cc/
Il met à disposition de l’utilisateur tout un écosystème matériel (shields) et
logiciel (IDE Arduino) permettant de réaliser rapidement et pour un coût
modique (environ 20€) une application à microcontrôleur. L’Arduino UNO se
TP3
Hervé Boeglen 2017 2
connecte à l’ordinateur via un port série et permet de commander facilement
toute une série d’actionneurs ou d’acquérir des données de différents capteurs
analogiques ou numériques et évidemment d’effectuer des traitements sur ces
données.
Capteur de température DS18B20 de MAXIM Integrated
Le DS18B20 a une gamme de mesure qui s'étend de -55 °C à +125 °C. Il
transmet sa mesure directement en degrés Celsius, codée sur 16 bits sur
un bus un fil (protocole OneWire).
https://datasheets.maximintegrated.com/en/ds/DS18B20.pdf
Quels sont les protocoles série couramment utilisés par les
microcontrôleurs ?
2.2. Nœud de centralisation, de traitement et d’affichage des données :
Carte Raspberry PI 2
TP3
Hervé Boeglen 2017 3
Cette carte est bien plus performante qu’un Arduino puisqu’elle
comporte notamment un processeur 4 cœurs de type ARM A7. La
puissance est suffisante pour faire tourner un système d’exploitation
Linux offrant tous les éléments logiciels nécessaires à notre application.
Cette carte présente également l’avantage de disposer d’un
connecteur d’E/S à 40 broches permettant de s’interfacer avec de
nombreux dispositifs extérieurs. Vous constaterez qu'il y a deux modes
de numération des broches : le mode BCM et le mode BOARD. Il faudra
en tenir compte dans les programmes que vous réaliserez.
2.3. Liaison sans fil :
Liaison radio à base de NRF24L01
Il s’agit d’une puce du fabricant Nordic Semiconductor qui permet des
liaisons sur la bande ISM (2.4GHz dans ce cas précis) à un débit maximal
de 2Mbits/s ce qui est amplement suffisant pour notre application.
http://www.nordicsemi.com/eng/Products/2.4GHz-RF/nRF24L01
TP3
Hervé Boeglen 2017 4
Ce module est de très faible coût (on le trouve à moins de 1€ sur le web).
Il communique avec n’importe quel système en utilisant le protocole SPI.
Dernier avantage et non des moindres : il existe une bibliothèque logicielle
facilitant sa mise en œuvre sur l’Arduino et le Raspberry PI. Il s’agit de la
bibliothèque RF24 :
https://tmrh20.github.io/RF24/index.html
3. Présentation de l’application
Il s’agit de réaliser une liaison sans fil entre un Arduino équipé d’un
capteur DS18B20 et un Raspberry PI. Plus précisément :
Le Raspberry PI équipé du module NRF24L01 envoie une requête
conformément à un intervalle de temps déterminé à l’Arduino équipé,
du même module qui renvoie alors l’information de température.
Cette température est stockée dans une base de données présente sur
le Raspberry PI.
L’évolution de la température issue de la base de données est
consultable via une page web dynamique (affichage des données en
temps réel). Cela nécessite évidemment un serveur web.
Les images suivantes présentent des éléments du système (câblage,
affichage des données côté Raspberry PI et affichage des requêtes côté
Arduino).
TP3
Hervé Boeglen 2017 6
Dans ce qui suit, je vous propose de passer par quelques étapes qui sont à
mon sens les briques élémentaires qu’il faut posséder pour parvenir au
résultat final.
3.1. Communication USB série entre Arduino et Raspberry PI
Réaliser une liaison série entre un Arduino équipé d’un capteur de
température DS18B20 et un Raspberry Pi qui affichera cette température
dans une console série (logiciel minicom par exemple). On utilisera l’un
des ports USB du Raspberry PI.
A partir du datasheet du DS18B20, répondre aux questions suivantes :
Le DS18B20 est-il un capteur numérique ou analogique ?
Quelle est sa précision ? Peut-on la changer ? Si oui quelle est la
conséquence sur le temps de conversion ?
Nous aurons besoin de la bibliothèque OneWire (partie 3.2) qu’il faudra
installer dans l’IDE (menu Croquis/Inclure une bibliothèque/Gérer les
bibliothèques) :
La bibliothèque se trouve sur un serveur git à l’adresse suivante :
https://github.com/PaulStoffregen/OneWire/archive/master.zip
On câblera le montage de la Figure 7 du datasheet (page 7) en
considérant que VDD = VPU. Attention au câblage du capteur sur
l’Arduino !
TP3
Hervé Boeglen 2017 7
Evidemment il faut d’abord savoir comment envoyer une donnée sur
le port série de l’Arduino ! Voici une page traitant de ce sujet :
http://www.ladyada.net/learn/arduino/lesson4.html
FAIRE VALIDER PAR L’ENSEIGNANT
3.2. Brancher le DS18B20 directement sur le Raspberry PI
Il est également possible de brancher un DS18B20 sur le Raspberry PI et
d’afficher la température depuis le RPI.
Utiliser la broche GPIO4 pour la réception des données.
Ecrire un programme en Python ou en C qui affiche la température en
degrés Celsius dans une console. On pourra s’aider de la page suivante :
http://www.framboise314.fr/mesure-de-temperature-1-wire-
ds18b20-avec-le-raspberry-pi/
ATTENTION la procédure indiquée dans la page précédente pour
activer l’interface OneWire sur le Raspberry Pi n’est plus la bonne !
Dans Raspbian Jessie avec PIXEL, il suffit de passer par le menu
Préférences :
Et d’activer le Onewire par l’interface graphique :
TP3
Hervé Boeglen 2017 8
FAIRE VALIDER PAR L’ENSEIGNANT
3.3. Prise en main des modules NRF24L01+ et de la librairie RF24
En vous aidant du datasheet du NRF24L01+, répondre aux questions
suivantes.
Par quelle interface communique-t-on avec le module ?
Quelle est la vitesse maximale de cette interface ?
Sur quelle bande de fréquence radio le module fonctionne-t-il ?
Quel est le type de modulation utilisée ?
Quel est le débit de transfert maximal atteignable en radio ?
Quelle est la puissance d’émission maximale ? A votre avis, quelle est la
distance maximale de communication ?
Ce module est très populaire car faible coût. Malheureusement, on trouve
rarement des puces originales. La plupart des modules que l’on trouve sur
le marché sont des copies Chinoises de moins bonne qualité. Voir à ce
sujet la page suivante :
https://zeptobars.com/en/read/Nordic-NRF24L01P-SI24R1-real-fake-
copy
Récupérer et installer la librairie RF24 sur le Raspberry PI et l’Arduino :
Sur le RPI : $ mkdir nrf24l01 $ cd nrf24l01 $ git clone https://github.com/TMRh20/RF24.git $ cd RF24 $ make $ sudo make install
TP3
Hervé Boeglen 2017 9
Expliquer les commandes précédentes.
Sur l’Arduino :
Récupérer et installer la bibliothèque RF24. Pour cela, dans l’IDE
Arduino, allez dans le menu Croquis/Inclure une bibliothèque/Gérer les
bibliothèques et rechercher RF24 :
La bibliothèque se trouve sur un serveur git à l’adresse suivante :
https://github.com/TMRh20/RF24/archive/master.zip
Câblage des modules :
Raspberry PI :
TP3
Hervé Boeglen 2017 10
Pin 19 = MOSI du Raspberry vers MOSI (pin 6) du nRF24L01. Pin 21 = MISO du Raspberry vers MISO (pin 7) du nRF24L01. Pin 23 = SCLK du Raspberry vers SCK (pin 5) du nRF24L01. Pin 24 = CS0 du Raspberry vers CSN (pin 4) du nRF24L01. Pin 22 = GPIO 25 du Raspberry vers CE (pin 3) du nRF24L01. Pin 1 = 3.3V PWR du Raspberry vers VCC (pin 2) du nRF24L01. Pin 6 = GND du Raspberry vers GND (pin 1) du nRF24L01.
Arduino :
Attention le module s’alimente en 3.3V !
Tester l’exemple Gettingstarted dans les deux sens (PI-Arduino et
Arduino-PI). Dans le cas du Raspberry Pi, il faut aller dans le sous-
répertoire examples_linux du répertoire RF24, éditer le fichier
gettingstarted.cpp et initialiser la radio avec ligne suivante :
RF24 radio(RPI_V2_GPIO_P1_22,RPI_V2_GPIO_P1_24,BCM2835_SPI_SPEED_8MHZ);
On terminera par un make pour générer l’exécutable. Ne pas oublier
d’activer le SPI sur le Raspberry Pi (menu Préférences/Configuration du
Raspberry Pi) !
Pour éviter les interférences avec vos camarades qui utilisent le même
module avec le canal radio par défaut, s’assurer de sélectionner un canal
libre ! Pour cela, on rajoutera la ligne suivante au programme :
Radio.setChannel(numéro de canal) ;
TP3
Hervé Boeglen 2017 11
FAIRE VALIDER PAR L’ENSEIGNANT
Allumer une LED située sur l’Arduino à partir du PI. On pourra s’inspirer de
la page suivante :
http://www.framboise314.fr/faire-dialoguer-un-raspberry-et-un-
arduino-via-nrf24l01/
ATTENTION la procédure indiquée dans la page précédente pour activer
l’interface SPI sur le Raspberry Pi n’est plus la bonne ! Dans Raspbian
Jessie avec PIXEL, il suffit de passer par le menu Préférences comme dans
la partie précédente. Eviter surtout la partie concernant raspi-
blacklist.conf !
FAIRE VALIDER PAR L’ENSEIGNANT
3.4. Installer un serveur Web pour piloter des pins GPIO et faire un
affichage graphique de température
3.4.1. Installation du serveur
Nous souhaitons installer un serveur LAMP.
Expliquer les mots/acronymes suivants :
LAMP
JavaScript
CSS
JSON
Existe-il d’autres technologies de serveurs Web ? Citez-en une.
Installer le serveur LAMP sur votre RPi. On pourra s’aider de la page
suivante :
http://simple-duino.com/installer-serveur-web-raspberry/
3.4.2. Allumer/Eteindre une LED à partir d’une page php.
TP3
Hervé Boeglen 2017 12
Créer une page de ce type en php et permettant d’allumer/d’éteindre une
LED :
3.4.3. Affichage graphique de la température en provenance d’un DS18B20
Récupérer la température en provenance d’un DS18B20 connecté au RPi
et l’afficher dans une page Web. Faire de même avec la température d’un
nœud distant.
FAIRE VALIDER PAR L’ENSEIGNANT
3.5. Un serveur Web avec une base de données et un affichage de la
température sous forme de graphique
La page suivante pourra vous aider :
http://raspberrywebserver.com/cgiscripting/rpi-temperature-
logger/building-an-sqlite-temperature-logger.html
Il y a bien sûr plusieurs solutions possibles. On pourra regarder des solutions
construites autour de HighCharts ou Google Charts.
FAIRE VALIDER PAR L’ENSEIGNANT