Pour communiquer avec le Raspberry Pi, j’ai choisi d’utiliser des modules nRF24L01, module de liaison Hertzienne à 2,4 Ghz.
1 - But recherché
Le but de ce tutoriel est de faire dialoguer un Raspberry Pi et un Arduino Nano.
Nous allons voir comment réaliser l’installation de la bibliothèque RF24, le cablage, ainsi que la configuration du Raspberry et de l’Arduino Nano.
Les programmes en C++ sont une adaptation de programmes trouvés en exemple sur Internet, je les ait adapté à mon besoin.
2 - Principe de fonctionnement souhaité
Le principe de fonctionnement de ce tutoriel est de piloter depuis un Raspberry Pi, une LED commandée par l’Arduino Nano, ce dernier retourne au Raspberry Pi un état de la commande pour indiquer sa bonne exécution, ou pas.
- Allumage de la LED
- On envoi dans une commande une chaine JSON au Raspberry Pi, celui ci l’interprète, puis envoi au Nano via le nRF24L01 la commande d’allumage de la led (envoi du N° id attribué au nRF24L01 du Nano + commande "on" ).
- Le Nano reçoit la commande, allume la LED, et retourne sont état au Rpi.
- Le Rpi reçoit l’état de la LED, le programme reconstruit une chaine JSON de retour avec la valeur de retour pour l'utilisateur ("true" ou "false"), ainsi que l’état de la Led ("on" ou "off"))
- Extinction de la LED
- Idem ci dessus, mais envoi d’une commande "off"
- Demander l’état de la LED
- Le Rpi envoi une demande au Nano pour connaitre l’état de la led (envoi du N° id attribué au nRF24L01 du Nano + commande "get").
- Le Nano lit l’état de la Led qu’il a en mémoire, et le retourne au Rpi.
- Le Rpi reçoit l’état de la LED, le programme reconstruit une chaine JSON de retour avec la valeur de retour ("true" ou "false") ainsi que l’état de la Led ("on" ou "off"))
3 - Mise à jour du système
Avant toute installation, on commence par mettre à jour le système :
Code : Tout sélectionner
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get dist-upgrade
4.1 - Installation de SPI
Afin d’assurer une bonne stabilité de l’interface SPI, si le système est Overclocké, il est préférable de l’annuler. Il sera possible une fois que l’ensemble sera fonctionnel, de tenter une réactivation de l’overclock, Mais par sécurité, il vaut mieux d’abord installer l’ensemble, et le faire fonctionner dans des conditions normales et sur un système sain, et seulement après retenter un overclockage.
Pour activer l’interface SPI, il faut lancer la commande :
Code : Tout sélectionner
$ sudo raspi-config
Il est ensuite demandé si l’on souhaite charger le module SPI avec le Noyau, répondre "oui"
Quitter l’utilitaire "Raspi-config". Rebooter le système.
Après le redémarrage, on va autoriser l’accès à SPI. Pour cela, éditer le fichier "raspi-blacklist.conf" :
Code : Tout sélectionner
$ sudo nano /etc/modprobe.d/raspi-blacklist.conf
Si le fichier n’est pas vide, vérifier si la ligne ci-dessous existe :
Code : Tout sélectionner
blacklist spi-bcm2708
Code : Tout sélectionner
#blacklist spi-bcm2708
Au redémarrage, on vérifie que le SPI est bien activé :
Code : Tout sélectionner
pi@raspberrypi ~ $ ls -la /dev/spi*
crw-rw---T 1 root spi 153, 0 janv. 1 1970 /dev/spidev0.0
crw-rw---T 1 root spi 153, 1 janv. 1 1970 /dev/spidev0.1
5 - Installation de la bibliothèque
Créer un dossier que l’on nommera "nrf24l01" dans le "home directory" de l’utilisateur "pi". Importer la bibliothèque RF24, et la compiler de la façon suivante.
Code : Tout sélectionner
$ cd
$ mkdir nrf24l01
$ cd nrf24l01
$ git clone https://github.com/TMRh20/RF24.git
$ cd RF24
$ make
$ sudo make install
Code : Tout sélectionner
$ sudo apt-get install libjson0-dev
Code : Tout sélectionner
$ cd ~/nrf24l01
Compiler le fichier à l’aide de la commande « make »
Code : Tout sélectionner
$ make
6.1 - Le Raspberry Pi
Éteindre le Raspberry, nous allons lui connecter physiquement le module nRF24L01.
L’exemple est ici avec un Raspberry Type B, mais il est de même avec un A, A+, B+ ou Pi2
Connexion sur le Raspberry, les connexions aux broches ci-dessous ne peuvent être changées :
- 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 = CE0 du Raspberry vers CSN (pin 4) du nRF24L01. (Peut éventuellement être connecté sur pin 26 du Raspberry, mais les scripts devront être adaptés).
La connexion GND, pin 1 du nRF24L01 peut être prise partout ou il y a une pin GND sur le Raspberry.
- Reste la pin 22 du Raspberry, il s’agit d’un port GPIO. Si celui ci est déjà utilisé, on peut prendre n’importe quel port GPIO. Il faudra pour cela adapter le script "sender.cpp" puis le recompiler.
Code : Tout sélectionner
RF24 radio(RPI_V2_GPIO_P1_22, RPI_V2_GPIO_P1_24, BCM2835_SPI_SPEED_16MHZ);
Exemple : « RPI_V2_GPIO_P1_11″ pour le GPIO 0.
6.2 - L’Arduino Nano
Nous allons installer le module nRF24L01 sur un Arduino Nano. C’est ce dernier qui recevra l’ordre du Raspberry qui lui demandera d’allumer ou d’éteindre la Led.
Le tutoriel est ici donné avec un Arduino Nano, mais toute autre Arduino fera l'affaire, en respectant les connexions ci-dessous.
Voici le schéme de cablage du Nano et du nRF24L01
Connexion sur le Arduino Nano, les connexions aux broches ci-dessous ne peuvent être changées :
- Pin D11 du Nano vers MOSI (pin 6) du nRF24L01.
- Pin D12 du Nano vers MISO (pin 7) du nRF24L01.
- Pin D13 du Nano vers SCK (pin 5) du nRF24L01.
- Pin D10 du Nano vers CSN (pin 4) du nRF24L01.
- Pin D9 du Nano vers CE (pin 3) du nRF24L01.
- Pin D6 du Nano vers l’anode de la LED.
- L’alimentation du +3,3v, pin 2 du nRF24L01 est prise dans ce schéma sur le pin +3,3v du Nano.
Code : Tout sélectionner
#define RF_CE 9
#define RF_CSN 10
#define LED_PIN 6
7.1 - Programme Raspberry Pi
Le programme du Raspberry Pi permet d’envoyer via le nRF24L01, un ordre d’allumage ou d’extinction d’une LED. Cette dernière est commandée par notre Arduino Nano, l’ordre d’allumage et d’extinction est donc envoyé par le Raspberry Pi, vers Arduino Nano.
Le programme est écrit en C++, il utilise la bibliothèque RF24, que nous avons installée plus haut dans ce tutoriel.
Le principe est d’envoyer une chaine JSON via la ligne de commande du Raspberry Pi. Cette chaîne est composée de :
Code : Tout sélectionner
{
"to":"1", // id di nRF24L01 vers lequel on envoi la commande.
"message":"get", // commande envoyée au Arduino Nano.
"TTL":"3000" // (paramètre optionnel) "Time out" (si non précisé il sera de 1000 ms).
}
Code : Tout sélectionner
set=on // Commande l'allumage de la LED
set=off // Commande l'extinction de la LED
get // Demande au Nano quel est l'état de la LED
Code : Tout sélectionner
$ sudo ./sender '{"to":"1","message":"set=on"}'
Télécharger ci-dessous le ZIP, puis copier les deux fichiers contenus dans l'archive "nRF24L01_Raspberry " vers le dossier « ~/nrf24l01/
Se placer dans le dossier puis compiler le programme.
Code : Tout sélectionner
$ cd ~/nrf24l01
$ make
7.2 - Programme Aduino Nano
Le programme du Arduino Nano permet de recevoir les commandes envoyées, les interpréter, puis de répondre au Raspberry Pi si la commande est OK ou pas.
Ci-dessous le programme "ino" à charger depuis votre atelier Arduino (IDE).
8 - Conclusion
Notre montage est maintenant fonctionnel.
Les prochaines étapes seront de changer la LED par une sonde de température DS18B20, et donc adapter les programmes.
Au menu également une sonde DHT11 ou DHT 22, un détecteur ultrason de type HC-SR04 (pour remplacer le Raspi dans ma cuve à eau), .... et tout autre détecteur ou sonde dont je pourrais avoir besoin.
9 - Références
Voici quelques liens vers des articles sur la mise en oeuvre du nRF24L01. Ce sont des articles de montages ou de programmes, auxquels je me suis inspirés afin d’arriver à ce résultat.
http://blog.carr3r.com/post/raspberry-p ... 1-modules/
http://hack.lenotta.com/arduino-raspber ... -nrf24l01/
http://www.homautomation.org/2014/06/11 ... -nrf24l01/