Dans cet article, vous allez apprendre à configurer un Raspberry Zero W avec un carte « chapeau » Radio RF95. Vous allez aussi le faire fonctionner en mode de réception pour qu’il reçoive les paquets envoyés par le Joystick (ou par un autre module LoRa) que j’ai réalisé et configuré dans cet article : un joystick pour orienter un petit robot avec lora. Vous allez encore configurer un écran écran Oled I2C 128×64 pour afficher les paquets reçus et des messages.
Pour l’installation du Raspberry, veuillez suivre cet article: https://eco-sensors.ch/2-faire-ses-sauvegardes-sans-connexion/
Matériel
LCD OLED 128×64 I2C
Référence: https://hallard.me/adafruit-oled-display-driver-for-pi/
Nous allons d’abord vérifier que I2C est activé sur votre Raspberry. Ouvrez votre terminal et tapez la commande suivante
sudo raspi-config
Sélectionner 5 Interfacing Option
Puis P5 I2C
Puis, répondez YES pour l’activer. Puis cliquez sur <Finish>
Câblage
Référence: https://learn.adafruit.com/monochrome-oled-breakouts/wiring-1-dot-3-128×64#using-with-i2c
Installation des librairies (C) et de git
sudo apt-get install build-essential git-core libi2c-dev i2c-tools lm-sensors
Installation d’ArduiPi_OLED
Note: ArduiPi_OLED remplace ArduiPi_SSD1306
mkdir ~/Soft cd ~/Soft git clone https://github.com/hallard/ArduiPi_OLED.git cd ArduiPi_OLED/ sudo make
Le nouveau script compilera la librairie (libArduiPi_OLED *) et l’installera pour vous (c’est pourquoi nous devons utiliser sudo) dans
/usr/local/lib/
et en-têtes de bibliothèque dans
/usr/local/include/
Testons!
Allez dans
cd ~/Soft/ArduiPi_OLED/examples
et compilez
sudo make
puis lancez le fichier de démo pour un écran 128×64 fonctionnant sur I2C
sudo ./oled_demo --verbose --oled 3
De mon côté, ca marche très bien
Radio RFM95
Installation des librairies C pour BCM 2835
mkdir ~/Soft wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.52.tar.gz tar zxvf bcm2835-1.52.tar.gz cd bcm2835-1.52 sudo ./configure sudo make sudo make check sudo make install
RadioHead
Référence : https://github.com/hallard/RadioHead
cd ~/Soft/ git clone https://github.com/hallard/RadioHead.git cd RadioHead/ cd ~/Soft/RadioHead/examples/raspi sudo nano RasPiBoards.h
Il faut maintenant corriger la définition des pins pour qu’elle correspondent à mon PCB Radio RF95
Commentez et ajoutez ces lignes
// Module 1, 2 and 3 are example of module type soldered on the board // change to fit your needs // Module 1 on board RFM95 868 MHz (example) //#define MOD1_LED_PIN RPI_V2_GPIO_P1_07 // Led on GPIO4 so P1 connector pin #7 //#define MOD1_CS_PIN RPI_V2_GPIO_P1_24 // Slave Select on CE0 so P1 connector pin #24 //#define MOD1_IRQ_PIN RPI_V2_GPIO_P1_22 // IRQ on GPIO25 so P1 connector pin #22 //#define MOD1_RST_PIN RPI_V2_GPIO_P1_29 // Reset on GPIO5 so P1 connector pin #29 #define MOD1_LED_PIN RPI_V2_GPIO_P1_18 #define MOD1_CS_PIN RPI_V2_GPIO_P1_08 #define MOD1_IRQ_PIN RPI_V2_GPIO_P1_25 #define MOD1_RST_PIN RPI_V2_GPIO_P1_05
Pour quitter et sauver : <ctrl+X>, puis <maj+Y>, puis <enter>
Ensuite nous allons scanner votre carte
cd /Soft/RadioHead/examples/raspi/spi_scan sudo make sudo ./spi_scan
Si tout c’est bien passé, vous devriez voir ceci:
Checking register(0x42) with CS=GPIO06 => Nothing! Checking register(0x10) with CS=GPIO06 => Nothing! Checking register(0x42) with CS=GPIO07 => Nothing! Checking register(0x10) with CS=GPIO07 => Nothing! Checking register(0x42) with CS=GPIO08 => SX1276 RF95/96 (V=0x12) Checking register(0x10) with CS=GPIO08 => Nothing! Checking register(0x42) with CS=GPIO26 => Nothing! Checking register(0x10) with CS=GPIO26 => Nothing!
Votre carte radio a bien été vue à la GPIO08
Maintenant, nous allons le faire fonctionner en mode récepteur. C’est à dire qu’il va attendre qu’un émetteur lui envoie des paquets.
cd ~/Soft/RadioHead/RadioHead/examples/raspi/rf95 sudo make sudo ./rf95_server
Je vais utiliser le Joystick que j’ai fait dans cet article : un joystick pour orienter un petit robot avec lora pour que ce Joystick lui indique sa position (haut, bas, gauche, dtroite).
J’ai le grand bonheur de constater que lorsque le Jostick est bougé de haut en bas et de gauche à droite, mon petit Raspberry Zero W affiche ces informations
pierrot@smartidea2:~/Soft/RadioHead/RadioHead/examples/raspi/rf95 $ sudo ./rf95_server rf95_server RF95 CS=GPIO8, IRQ=GPIO25, RST=GPIO22, LED=GPIO23 OK NodeID=1 @ 868.00MHz Listening packet... Packet[20] #255 => #255 -34dB: 75 70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Packet[20] #255 => #255 -34dB: 72 75 70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Packet[20] #255 => #255 -35dB: 64 6F 77 6E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Packet[20] #255 => #255 -35dB: 72 64 6F 77 6E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Packet[20] #255 => #255 -36dB: 75 70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Packet[20] #255 => #255 -35dB: 72 75 70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Packet[20] #255 => #255 -24dB: 75 70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Packet[20] #255 => #255 -24dB: 72 75 70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Packet[20] #255 => #255 -29dB: 72 69 67 68 74 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Packet[20] #255 => #255 -28dB: 72 72 69 67 68 74 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Ceci indique bien qu’il reçoit bien les paquets du Joystick via la technologie LoRa TF95 :o)
Nous allons voir plus bas, comment démarrer cette fonctionnalité automatiquement au démarrage du Raspberry, sans que vous aillez à tapez la commande
sudo ./rf95_server
Modification du Makefile RadioHead pour afficher des textes sur l’écran OLED
Nous allons modifier maintenant un fichier. Avant, nous allons faire une copie afin de garder l’original. Ouvrez votre terminal et taper la commande suivante
cd ~/Soft/RadioHead/Soft/RadioHead/examples/raspi/rf95
cp rf95_server.cpp rf95_server.ccpcopy
cd ~/Soft/RadioHead/Soft/RadioHead/examples/raspi/rf95
cp Makefile Makefilecopy
Nous allons ensuite éditer le ficher Makefile
cd ~/Soft/RadioHead/examples/raspi/rf95
sudo nano Makefile
et nous allons remplacer la ligne
LIBS = -lbcm2835
par
LIBS = -lbcm2835 -lArduiPi_OLED
Pour rappel, pour quitter et sauver le fichier après vos modifications, il faut appuyer sur les touche <ctrl>+x et ensuite <ctrl>+O ou <ctrl>+Y
Nous allons encore éditer le fichier rf95_server.cpp
cd ~/Soft/RadioHead/examples/raspi/rf95 sudo nano rf95_sever.ccp
et nous allons ajouter ces lignes juste dessous les autres lignes qui commencent par #include …
/*************** * For OLED LCD * ****************/ #include "ArduiPi_OLED_lib.h" #include "Adafruit_GFX.h" #include "ArduiPi_OLED.h" #include <getopt.h> // Instantiate the display ArduiPi_OLED display; // Config Option struct s_opts { int oled; int verbose; } ; int sleep_divisor = 1 ; // default options values s_opts opts = { OLED_ADAFRUIT_I2C_128x64, // Default oled (128x32 si vous utilisez un écran de cette taille false // Not verbose };
C’est pas fini. Recherchez la fonction main() en faisant une recherche avec les touches <ctrl>+W (le critère de recherche est ‘main (‘ )
et ajoutez ceci:
//Main Function
int main (int argc, const char* argv[] )
{
/* FOR OLED */
// I2C change parameters to fit to your LCD
if ( !display.init(OLED_I2C_RESET,opts.oled) )
{
exit(EXIT_FAILURE);
};
display.begin();
display.clearDisplay(); // clears the screen buffer
// text display tests
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.print("Welcome aboard\n");
display.print("EcoSensors\n");
display.print("\n");
display.print("Starting\n");
display.print("rf95_server\n");
display.display();
sleep(3);
/* END OLED */
unsigned long led_blink = 0;
compilez
cd ~/Soft/RadioHead/examples/raspi/rf95 sudo make
et exécutez rf95_server
$ sudo ./rf95_server
et vous devriez voir le message s’afficher
Welcome aboard EcoSensors Starting rf95_server
De mon côté, ca marche!
Voici quelques fonctions
display.setTextSize(1); // Taille du texte display.setTextColor(WHITE); // Couleur du texte display.setTextColor(WHITE, BLACK); // Inverse texte/couleur display.clearDisplay(); // Efface l'écran display.setCursor(0,0); // Positionne le curseur (x,y) display.print("message"); // Message à afficher display.display(); // Affiche les print() précédents
Pour afficher les packets reçus, il vous faut aller ajouter ces fonctions sous cette condition
if (rf95.available()) {}
plus précisément ici: https://github.com/pierrot10/RadioHead/blob/master/examples/raspi/rf95/rf95_server.cpp#L179.
Sous la ligne 179, ajoutez ceci:
/* OLED */ display.clearDisplay(); display.setTextColor(BLACK, WHITE); // 'inverted' text display.setCursor(0,0); display.print(" Listing "); display.setTextColor(WHITE, BLACK); // 'inverted' text display.print("Packet["); snprintf(buf_print,bufprintsize,"%d",len); display.print(buf_print); display.print("]\n"); display.print("#"); snprintf(buf_print,bufprintsize,"%d",from); display.print(buf_print); display.print(" => "); snprintf(buf_print,bufprintsize,"%d",to); display.print(buf_print); display.print("\n"); display.print("rssi:"); snprintf(buf_print,bufprintsize,"%d",rssi); display.print(buf_print); display.print("\n\n"); snprintf(buf_print,bufprintsize,"%s",buf); display.print(buf_print); display.print("\n"); display.display();
Je vous laisse voir vous, comment faire mieux et où vous jugez utilse d’afficher d’autres messages sur votre écran.
rf95_server en tant que service
Pour que le Raspberry fonction automatiquement en mode de réception des paquets, dès qu’il a démarré, il faut créer un nouveau service.
Créez le fichier suivant
sudo nano /lib/systemd/system/rf95_server.service
Coller ce texte (modifiez le chemin ExecStart, si nécessaire)
[Unit] Description=Launch welcome RF95 server to listen Radio packages After=multi-user.target [Service] Type=idle ExecStart=/home/pierrot/Soft/RadioHead/examples/raspi/rf95/rf95_server > /var/log/rf95-server.log 2>&1 [Install] WantedBy=multi-user.target
Modifiez les droits, recharger le daemon, activez le nouveau service et redémarrez votre Raspberry
sudo chmod 644 /lib/systemd/system/rf95_server.service sudo systemctl daemon-reload sudo systemctl enable rf95_server.service sudo reboot
Vous devriez voir ceci s’afficher
Autres testes
J’ai également alimenté mon Joystick et le module (récepteur) reçoit et affiche bien « up » quand le joystick (émetteur) poussé vers le haut, ainsi que down, left, right, etc…
Finalement, j’ai préparé un Feather MO Radio avec un module LoRa (émetteur) que j’ai, en plus, glissé dans un tube en aluminium :o). Le module Raspberry (récepteur) reçoit aussi les paquets avec un RSSi de -22 à -35, quand il est dans le tube, malgré le fait que le tube soit un obstacle aux ondes radio. Je n’ai malheureusement pas pu éloigner l’émetteur de plus de 4m.
Bravo!!!
Vous venez de configurer votre Raspberry pour qu’il affiche du texte. Mais vous venez surtout de configurer votre Raspberry pour qu’il puisse recevoir des paquets Radio avec LoRa. Vous avez aussi modifié la librairie RadioHead pour que le contenu des paquets reçus s’affichent sur l’écran OLED. Vous avez aussi fait en sorte que votre module écoute les paquets radio envoyés dès sont démarrage!
Soutenez-nous
Si vous avez aimé cet article, faites un don de quelques Euro pour le financement de mes projets et du matériel.
Obsolète
Ceci est conservé comme historique des opérations qui ont été effectuées mais qui ne sont plus d’actualité dans le cadre de cet article
Installation des librairies (Python):
Référence : https://learn.adafruit.com/ssd1306-oled-displays-with-raspberry-pi-and-beaglebone-black/usage
Comme nous utilisons un Raspberry, ouvrez votre terminal et installez les librairies suivantes:
sudo apt-get update sudo apt-get install build-essential python-dev python-pip sudo pip install RPi.GPIO
Puis installez encore ces deux librairies dont python-imaging
sudo apt-get install python-imaging sudo apt-get install python-smbus
Si ce n’est pas encore fait, installez git
sudo apt-get install git
Puis télécharger Adafruit_Python_SSD1306
git clone https://github.com/adafruit/Adafruit_Python_SSD1306.git cd Adafruit_Python_SSD1306
et installez-le
cd ~/Soft/SSD1306/Adafruit_Python_SSD1306 sudo python setup.py install
Usage
Référence : https://learn.adafruit.com/ssd1306-oled-displays-with-raspberry-pi-and-beaglebone-black/usage
Cet exemple est basé sur le lien ci-dessus. Je vais faire un exemple simplifié qui ne vas qu’afficher un message de bienvenue, quand vous allumez votre Raspberry.
Créez un fichier welcome.py et éditez-le
sudo mkdir ~/Python/welcome.py sudo vi ~/Python/welcome.py
Vous trouverez sur Github cet exemple qui est suffisamment commenté pour compléter le fichier welcome.py
Vous pourrez l’exécuter avec cette commande
sudo python ~/Python/welcome.py
Affichage du texte au démarrage de votre Raspberry
Réféfence: https://www.raspberrypi-spy.co.uk/2015/10/how-to-autorun-a-python-script-on-boot-using-systemd/
Je vais finalement déplacer le fichier welcome.py dans /opt
sudo mv ~/Python/welcome.py /opt/
Puis, je vais créer un lien symbolique dans ~/Python
cd ~/Python ln -s /opt/welcome.py welcome.py
Ce qui revient presque au même sauf que maintenant nous avons un lien dans ~/Python qui pointe sur le fichier qu’on a créé qui se trouve maintenant dans /opt.
Vous devez encore rendre le fichier exécutable en exécutant cette commande
sudo chmod +x /opt/welcome.py
Vous pouvez faire comme vous voulez. Moi j’ai préféré regrouper dans /opt, mes applications pour qu’elles ne dépendent pas des dossiers qui se trouvent dans les dossiers personnels.
Option 1:
Editez le fichier /etc/rc.local et ajoutez la ligne avant # Print…
python /opt/welcome.py # Print the IP address
Puis la commande
sudo rapsi-config
Choisissez 3 Boot options puis B2 Wait for Network at Boot et activez-le.
Redémarrer votre Raspberry
sudo reboot
Et vous devriez voir ceci:
Option 2:
Pour que ce fichier soit exécuté quand votre Raspberry démarre, il faut donc le démarrer en tant que service.
Pour cela, créez et éditez le fichier suivant
sudo nano /lib/systemd/system/welcome.service
Ajoutez les lignes suivantes
[Unit] Description=Launch welcome script which print IP and disk size on OLED After=multi-user.target [Service] Type=idle ExecStart=/usr/bin/python /opt/welcome.py > /var/log/oled-welcome.log 2>&1 [Install] WantedBy=multi-user.target
Puis tapez les touche <ctrl>+X, <maj>+Y, <enter>, pour quitter en sauvant.
Changez encore les droits de ce fichier
sudo chmod 644 /lib/systemd/system/welcome.service
Pour terminer, vous devez encore tapez ces deux commandes dans votre terminal
sudo systemctl daemon-reload sudo systemctl enable welcome.service
pour recharger le daemon et activer votre nouveau service.
Redémarrer votre Raspberry
sudo reboot
Et vous devriez voir ceci:
Merci pour ton tuto, il m’a été très utile pour réaliser ma Gateway avec la PCB de Philippe Cadic que je connais bien. Pour ma part mon projet consiste à connecter une ruche sur un réseau lora
Merci pour votre commentaire. Votre projet est très intéressant. Avez-vous un site inetrnet qui le présente? Bonne soirée