/
4,926 Views2
Raspberry Zero - RFM 95 Lorawan hat

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

Interfacing Option

Puis P5 I2C

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

oled 128x64 wiring

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:

Attention n’ajoutez que ce qu’il se trouve entre /* FOR OLED */ et /* END OLED */
//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

reapsberry zeo rfm95
reapsberry zeo rfm95

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:

oled

 

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:

oled

 

  1. 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

    Reply
    1. Merci pour votre commentaire. Votre projet est très intéressant. Avez-vous un site inetrnet qui le présente? Bonne soirée

      Reply

Répondre à Christophe Cancel reply

fr_FRFrench