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: http://smart-idea.io/faire-ses-sauvegardes-avec-raspbery/

Merci pour votre contribution afin d’évaluer et perfectionner cet article

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:

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("SmartIdea\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
SmartIdea

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!

Si vous avez aimé cet article, publiez-le!

ou (et) soutenez-nous

 

 

Dernière mise à jour: 30 octobre 2018 à 23:04  

 

 

 

 

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 raspi-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:

 

Comments

  • Avatar

    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

Répondre à christophe Annuler la réponse

*