Dominique (Domi sur le forum de framboise314) a réalisé une liaison 2,4 GHz entre un Raspberry Pi et un Arduino Nano.
Il a publié son tutoriel sur le forum et vous pouvez le lire directement. Dominique m’a gentiment proposé de reprendre son tutoriel sur le blog pour le mettre à disposition de tous les lecteurs. Voilà qui est chose faite. Merci à Dominique pour ce partage ! Attention, ce tutoriel nécessite d’avoir quelques connaissances en ligne commande et en compilation de programme… Si vous êtes un « vrai » débutant mettez l’adresse dans vos favoris et revenez un peu plus tard.
Liaison 2,4 GHz entre Raspberry Pi et Arduino
Je laisse la parole à Dominique :
Recherchant un moyen de relier des capteurs autonomes à un Raspberry Pi. Mon choix s’est orienté sur l’utilisation d’un Arduino Nano. Petit mais suffisamment puissant pour être autonome, effectuer différents relevés, mais également effectuer des actions comme par exemple piloter un relais.
Pour communiquer avec le Raspberry Pi, j’ai choisi d’utiliser des modules nRF24L01, module de liaison Hertzienne à 2,4 Ghz.
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 câblage, 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 ai adaptés à mon besoin.
Principe de fonctionnement souhaité
Le principe de fonctionnement de ce tutoriel est de piloter depuis un Raspberry Pi, une LED piloté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 envoie dans une commande une chaine JSON au Raspberry Pi, celui ci l’interprète, puis envoie à l’Arduino Nano via le nRF24L01 la commande d’allumage de la led (envoi du N° d’ID attribué au nRF24L01 du Nano + commande « ON » ).
- L’Arduino Nano reçoit la commande, allume la LED, et retourne sont état au RasPi.
- Le RasPi 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 Raspberry Pi envoie une demande à l’Arduino Nano pour connaitre l’état de la LED (envoi du N° d’ID attribué au nRF24L01 du Nano + commande « GET« ).
- L’Arduino Nano lit l’état de la LED qu’il a en mémoire, et le retourne au RasPi.
- Le RasPi 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 »)
Passons maintenant à la partie technique, installation et configuration du matériel.
Mise à jour du système
Avant toute installation, on commence par mettre à jour le système :
$ sudo apt-get update $ sudo apt-get upgrade $ sudo apt-get dist-upgrade
Préparation du système
Installation de SPI
Afin d’assurer une bonne stabilité de l’interface SPI, il est préférable d’annuler l’overcloking si vous l’avez activé sur votre système… 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 :
$ sudo raspi-config
Aller dans le menu des options avancées (menu « Advanced Options »), puis dans le sous-menu, sélectionner « SPI« , et cliquer sur « Oui » pour activer le SPI.
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 » :
$ sudo nano /etc/modprobe.d/raspi-blacklist.conf
Attention, dans les dernières versions de Raspbian, j’ai remarqué que ce fichier n’existe plus, ou qu’il est vide, il n’y a donc plus rien à modifier dedans. Passer directement à la suite du prochain reboot sans suivre les modifications du fichier.
Si le fichier n’est pas vide, vérifier si la ligne ci-dessous existe :
blacklist spi-bcm2708
Dans ce cas, il faut la commenter en ajoutant un « # » devant :
#blacklist spi-bcm2708
On enregistre, on quitte l’éditeur, et on reboot le Raspberry.
Au redémarrage, on vérifie que le SPI est bien activé :
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
Si on voit apparaître les « /dev/spi* » , c’est que la configuration est correcte.
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.
$ cd $ mkdir nrf24l01 $ cd nrf24l01 $ git clone https://github.com/TMRh20/RF24.git $ cd RF24 $ make $ sudo make install
On installe la librairie « JSON » que l’on va utiliser dans notre script de communication :
$ sudo apt-get install libjson0-dev
Revenir dans le dossier nrf24l01
$ cd ~/nrf24l01
Copier les fichiers « Makefile » et « sender.cpp » que vous trouverez dans le ZIP « nRF24L01_Raspberry » en bas de ce tutoriel.
Compiler le fichier à l’aide de la commande « make »
$ make
Installation matérielle
Le Raspberry Pi
Éteignez le Raspberry Pi avant de lui connecter physiquement le module nRF24L01. Ceci évitera d’éventuelles destructions de ports…
L’exemple est ici avec un Raspberry Type B, mais les connexions sont identiques 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 du +3,3v, pin 2 du nRF24L01 est prise dans ce schéma sur le pin 1 du Raspberry. Cette alimentation peut être prise sur tout autre pin du Raspberry fournissant du 3,3v (pin 1 ou 17).
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.
Dans le script, changer la ligne :
RF24 radio(RPI_V2_GPIO_P1_22, RPI_V2_GPIO_P1_24, BCM2835_SPI_SPEED_16MHZ);
en adaptant « RPI_V2_GPIO_P1_22″ en fonction du pin GPIO connecté.
Exemple : « RPI_V2_GPIO_P1_11″ pour le GPIO 0.
Avant de remettre le Raspberry Pi sous tension, faites une nouvelle vérification de vos connexions…
L’Arduino Nano
Nous allons installer le module nRF24L01 sur un Arduino Nano. C’est ce dernier qui recevra l’ordre du Raspberry Pi lui demandant d’allumer ou d’éteindre la LED.
Le tutoriel est ici donné avec un Arduino Nano, mais toute autre carte Arduino fera l’affaire, en respectant les connexions ci-dessous.
Voici le schéma du câblage entre l’Arduino Nano et le nRF24L01
Connexion sur l’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.
Connexions pouvant être effectuées sur d’autre pin, mais qui devront être adaptées dans le code du Croquis exporté vers l’Arduino Nano.
- 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.
Pour effectuer les connexions D10, D9 ou D6 à un autre pin, il faut ouvrir le croquis Arduino (.ino) et adapter les lignes suivantes :
#define RF_CE 9 #define RF_CSN 10 #define LED_PIN 6
Les Programmes
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 :
{ "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). }
Les messages peuvent être :
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
Exemple de commande envoyée pour commander l’allumage de la LED :
$ sudo ./sender '{"to":"1","message":"set=on"}'
Nous envoyons bien en paramètre une chaîne au format JSON. Le programme du Raspberry Pi s’occupe de transcrire cette chaine afin d’envoyer les commandes à l’Arduino, via le nRF24L01.
Télécharger ci-dessous le ZIP, puis copier les deux fichiers contenus dans l’archive « nRF24L01_Raspberry » vers le dossier « ~/nrf24l01/«
nrf24-raspberry.zip Script pour Raspberry (1.58 Kio)
Se placer dans le dossier puis compiler le programme.
$ cd ~/nrf24l01 $ make</code>
Le programme sur le Raspberry Pi est maintenant fonctionnel.
Programme Aduino Nano
Le programme de l’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).
nrf24-arduino.ino.zip Script pour Arduino (1.28 Kio)
Conclusion
Notre montage est maintenant fonctionnel.
Les prochaines étapes seront de remplacer la LED par une sonde de température DS18B20, et donc d’adapter les programmes à ce nouveau périphérique.
Au menu également une sonde DHT 11 ou DHT 22, un détecteur ultrasons de type HC-SR04 (pour remplacer le RasPi dans ma cuve à eau), …. et tout autre détecteur ou sonde dont je pourrais avoir besoin.
Note de framboise314 : Merci Domi pour cette description détaillée qui pourra servir de point de départ à de nombreuses réalisations domotiques !
Sources
Voici quelques liens vers des articles sur la mise en œuvre 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/
- https://www.sparkfun.com/datasheets/RF/nRF2401rev1_1.pdf
L’article d’origine se trouve ici :