[TUTORIEL] RFM Master 1.1 et 2.0

Forum de support et échanges autour des Shields RFM22 et RFM Master

[TUTORIEL] RFM Master 1.1 et 2.0

Message non lude Florian » Lun 23 Mai 2016 17:16

Bonjour,

Aujourd'hui nous allons manipuler le RFM Master 1.1 et le RFM MAster 2.0 (LoRa).
Master1.1.jpg
Master1.1.jpg (52.28 Kio) Vu 224 fois

Le shield RFM Master appartient à la même famille que la carte Shield RFM22. Comme cette dernière ce produit embarque un module bidirectionnel. Il peut donc à la fois émettre et recevoir une donnée. Ainsi avec plusieurs de ces modules, on peut les faire interagir et communiquer entre eux.

Le RFM Master supporte différents modules bidirectionnels. Au choix, il peut être équipé d'un module RFM69HCW (Master 1.1) ou RFM95W (Master 2.0).
Le module RFM69HCW communique en 315, 433, 868 et 915MHz. Possibilité de créer une clé de cryptage et plusieurs nœuds.
Le module RFM95W permet de faire du LoRa.

Les modules RFM utilisés fonctionnent en 0-3,3V. L'arduino Uno fonctionne en 0-5V. Les modules et l'arduino communiquent ensemble grâce à la liaison SPI. Il y aura donc un problème de communication entre les deux à cause des niveaux de tensions différents. Le RFM Master est équipé d'un composant qui réalise l'adaptation de tension entre le module RFM et la carte arduino Uno. Il s'agit du NXP-NVT2010.

Le RFM Master possède un slot pour mini carte SD permettant d’effectuer du monitoring de donnée envoyée et/ou réceptionnée. Ou pour tout autre usages nécessitant une mini carte SD.

Le RFM Master a un connecteur d'antenne uFL. On y branche une rallonge uFL/SMA à laquelle on connecte l'antenne. Cette rallonge permet de déporter l'antenne de façon à laisser l'arduino et le shield dans une boîte hermétique afin des les protéger.

================================================================================================================
================================================================================================================
Documentations utiles:

Librairie:
La librairie utilisée pour faire fonctionner le RFM Master est la même peu importe le module qui équipe le produit, il s'agit de la librairie RadioHead.
  • Pour le module RFM69HCW, on utilise rf69.
  • Pour le module RFM95W, on utilise rf95.

Les datasheets des différents modules:

Tutoriels employant le module RFM22B:

Produits similaires:

================================================================================================================
================================================================================================================
Tutoriel RFM Master

Lors de la réalisation de ce tutoriel, le RFM Master est équipé avec un RFM69HCW, il s'agit donc du RFM Master 1.1.

Nous allons voir comment envoyer une donnée et comment se positionner en attente d'une donnée à réceptionner.
Nous allons réaliser deux programmes. Le premier enverra la data suivante, PING. Le deuxième, à la réception de la précédente data l'affichera sur le moniteur série et enverra à son tour une data qui sera PONG. Cette dernière sera à son tour affichée par le premier programme sur son moniteur série. Ainsi avec le rebouclage des programmes nous aurons un effet PING-PONG!

Nous allons voir comment attribuer un module à un réseau.
Il est possible, si on possède 2 modules RFM, de leur attribuer un réseau différent à chacun. Ainsi en les plaçant sur des réseaux différents ils ne pourront communiquer entre eux.

Nous verrons également comment créer une clé de cryptage pour nos données. (Possible que pour un RFM Master 1.1 équipé du module RFM69HCW).

================================================================================================================
- MATÉRIEL:

================================================================================================================
- BRANCHEMENTS:

Rien de plus simple, il suffit simplement de placer le RFM Master 1.1 en mezzanine sur la carte Arduino Uno. Absolument aucun câblage à effectuer.
RFM Master.png
RFM Master.png (37.47 Kio) Vu 250 fois

Il faut tout de même penser à connecter l'antenne!

================================================================================================================
- CODE:
-------------------------------------------------------------------------------
MODIFICATION
Important: avant même de lancer l'IDE Arduino, il faut modifier une ligne de commande de la librairie RadioHead. Cette modification est à effectuer peu importe le RFM Master employé.
Pour un RFM Master 1.1, il faut modifier la librairie RH_RF69.h. Si vous possédez un RFM Master 2.0, il faut modifier le fichier RH_RF95.h.

Pour le Master 1.1, il faut modifier la ligne 626 et pour le Master 2.0, il faut modifier la ligne 451.
La ligne de code à changer pour la Master 1.1 est:
Code: Tout sélectionner
RH_RF69(uint8_t slaveSelectPin = SS, uint8_t interruptPin = 2, RHGenericSPI& spi = hardware_spi);

Par:
Code: Tout sélectionner
RH_RF69(uint8_t slaveSelectPin = SS, uint8_t interruptPin = 3, RHGenericSPI& spi = hardware_spi);

La ligne de code à changer pour la Master 2.0 est:
Code: Tout sélectionner
RH_RF95(uint8_t slaveSelectPin = SS, uint8_t interruptPin = 2, RHGenericSPI& spi = hardware_spi);

Par:
Code: Tout sélectionner
RH_RF95uint8_t slaveSelectPin = SS, uint8_t interruptPin = 3, RHGenericSPI& spi = hardware_spi);

Petite explication, le module RFM à besoin d'utiliser les interruptions pour fonctionner. Sur les cartes Arduino/Genuino Uno les interruptions sont gérées sur 2 broches uniquement D2 et D3. Or sur les RFM Master la broche D2 est utilisée par le slot de mini carte SD. Il faut donc modifier dans la librairie la broche affectée à l'interruption de la D2 à D3 ("uint8_t interruptPin = ").

-------------------------------------------------------------------------------
SKETCHS pour RFM Master 1.1
Pour réaliser ce tutoriel, il faut deux sketchs. Le premier qui envoie une donnée en continue et peut afficher une donnée sur le moniteur série dès qu'il en reçoit une. Et le deuxième qui affiche la donnée qu'il reçoit sur le moniteur série puis qui envoie une nouvelle donnée à son tour, seulement et seulement si il en a reçu une avant.

A savoir: dans la suite de ce tutoriel le RFM Master est équipé d'un RFM69, il s'agit donc d'un RFM Master 1.1. Sa fréquence par défaut est 433MHz or dans ce tutoriel on va régler la fréquence à 868MHz, juste pour savoir comment faire.
Attention: l'antenne vendue avec le RFM Master 1.1 est une antenne 433MHz.

Code de transmission:
Code: Tout sélectionner
  /* Skecth Ping-Pong */

    #include <SPI.h>
    #include <RH_RF69.h>

    RH_RF69 rf69;    // Définition de la commande.

    uint8_t data[] = "PING";    // Donnée qui va être émise.

    uint8_t buf[RH_RF69_MAX_MESSAGE_LEN];    // Variables qui vont permettre de
    uint8_t len = sizeof(buf);               // décrypter les données reçues.

    uint8_t key[] = { 0x05, 0x01, 0x19, 0x93, 0xfa, 0x27, 0x09, 0x19,  // Clé d'encryptage.
                      0x94, 0xed, 0x25, 0x01, 0x20, 0x09, 0x20, 0x16};

    uint8_t syncwords[] = {0x19, 0x93}; // Adresse réseau.

    void setup()
    {
      Serial.begin(9600);
      Serial.println("Sketch PING.");
     
      if (!rf69.init())    // Vérification que le modem soit correctement initialisé.
      {
        Serial.println("Echec de l'initialisation modem!");
      }
      else
      {
        Serial.println("Succes de l'initialisation modem!");
      }

         /* ---- CONFIGURATION ---- */
     
      rf69.setFrequency(868.0); // Fréquence.
     
      rf69.setTxPower(20);  // Puissance de transmission.

      rf69.setEncryptionKey(key); // Clé d'encryptage.

      rf69.setSyncWords(syncwords, sizeof(syncwords)); // Adresse réseau.
    }

    void loop()
    {
      rf69.send(data, sizeof(data));    // Envoi de la donnée(PING).
     
      if (rf69.waitAvailableTimeout(500))    // Timeout.
      {   
        if (rf69.recv(buf, &len))    // Réception d'une donnée(PONG).
        {
          Serial.println((char*)buf);    // Affichage de la donnée reçue.
        }
      }
      delay(400);
    }

Code de réception:
Code: Tout sélectionner
    /* Skecth Ping-Pong */

    #include <SPI.h>
    #include <RH_RF69.h>

    RH_RF69 rf69;    // Définition de la commande.

    uint8_t data[] = "PONG";   // Donnée qui va être émise.

    uint8_t buf[RH_RF69_MAX_MESSAGE_LEN];    // Variables qui vont permettre de
    uint8_t len = sizeof(buf);               // décrypter les données reçues.

    uint8_t key[] = { 0x05, 0x01, 0x19, 0x93, 0xfa, 0x27, 0x09, 0x19,  // Clé d'encryptage.
                      0x94, 0xed, 0x25, 0x01, 0x20, 0x09, 0x20, 0x16};

    uint8_t syncwords[] = {0x19, 0x93}; // Adresse réseau.

    void setup()
    {
      Serial.begin(9600);
      Serial.println("Sketch PONG.");

      if (!rf69.init())    // Vérification que le modem soit correctement initialisé.
      {
        Serial.println("Echec de l'initialisation modem!");
      }
      else
      {
        Serial.println("Succes de l'initialisation modem!");
      } 
       
         /* ---- CONFIGURATION ---- */
     
      rf69.setFrequency(868.0); // Fréquence.
     
      rf69.setTxPower(20);  // Puissance de transmission.

      rf69.setEncryptionKey(key); // Clé d'encryptage.

      rf69.setSyncWords(syncwords, sizeof(syncwords)); // Adresse réseau.
    }

    void loop()
    {
      if (rf69.recv(buf, &len))    // Réception d'une donnée(PING).
      {
        Serial.println((char*)buf);    // Affichage de la donnée reçue.
       
        rf69.send(data, sizeof(data));    // Envoi de la donnée(PONG).
      }
    }

Une fois les sketchs uploadés dans un Arduino, le moniteur série devrait afficher ce qui suit:
Pour le sketch de transmission:
Transmission.png
Transmission.png (26.03 Kio) Vu 250 fois

Pour le sketch de réception:
Réception.png
Réception.png (25.01 Kio) Vu 250 fois

-------------------------------------------------------------------------------
PROGRAMMATION
Maintenant que les cartes communiquent, penchons nous un peu sur les lignes de codes utilisées.
Les lignes de codes décrites juste après concernent essentiellement les RFM Master 1.1. Elles ne sont pas toutes nécessaires ni utilisables pour les RFM Master 2.0.
________________________________________________________________________________________________________________
Fréquence:
Code: Tout sélectionner
rf69.setFrequency(868.0); // Fréquence.

Cette commande permet de régler la fréquence d'émission du module (315, 433, 868 et 915MHz). Par défaut la fréquence du RFM69 (module équipant la Master 1.1) est 433MHz. Cette commande existe aussi pour le module RFM95W (module équipant la Master 2.0).
________________________________________________________________________________________________________________
Puissance de transmission:
Code: Tout sélectionner
rf69.setTxPower(20);  // Puissance de transmission.

Cette commande permet de régler la puissance d'émission du module (en dBm). Cette commande existe pour la Master 2.0. Il est important de régler la puissance d'émission du module RFM69HCW au maximum (20dBm). Dans le cas contraire, la communication entre 2 modules ne se fera que si leurs antennes sont côtes à côtes.
________________________________________________________________________________________________________________
Clé d'encryptage:
Code: Tout sélectionner
uint8_t key[] = { 0x05, 0x01, 0x19, 0x93, 0xfa, 0x27, 0x09, 0x19,  // Clé d'encryptage.
                  0x94, 0xed, 0x25, 0x01, 0x20, 0x09, 0x20, 0x16};

Avant d'écrire la ligne de code permettant de configurer la clé de cryptage, il faut la déclarer. Elle s'écrit en valeur hexadécimale sur 16 bytes.
Les valeurs ci-dessus servent d'exemples, vous pouvez configurer la clé de cryptage qui vous plait.
Code: Tout sélectionner
rf69.setEncryptionKey(key); // Clé d'encryptage.

Cette commande configure la clé de cryptage qui va permettre de crypter les données envoyées mais également de décrypter les données reçues. Si les 2 modules devant communiquer ensemble non pas la même clé alors ils ne communiqueront pas.
Le cryptage de donnée n'est disponible qu'avec la Master 1.1.
________________________________________________________________________________________________________________
Adresse réseau:
Code: Tout sélectionner
uint8_t syncwords[] = {0x19, 0x93}; // Adresse réseau.

Avant d'écrire la ligne de code permettant de configurer l'adresse réseau, il faut la déclarer. Elle s'écrit en valeur hexadécimale sur 2 bytes.
Code: Tout sélectionner
rf69.setSyncWords(syncwords, sizeof(syncwords)); // Adresse réseau.

Cette commande configure l'adresse réseau sur lequel le module RFM va communiquer. Si 2 modules sont sur un réseau différent alors ils ne pourront pas communiquer.
Les valeurs ci-dessus servent d'exemples, vous pouvez configurer l'adresse réseau qui vous plait.
Attention: Avec 2 adresses réseaux différentes, ils ne peuvent pas communiquer car ils sont sur un réseau différent, cela ne signifie pas que leurs données sont cryptées.
Par défaut, lors de l'initialisation du module RFM69, l'adresse réseau est 0x2d, 0x64.


================================================================================================================
-Sketchs pour RFM Master 2.0:

Pour les personnes possédant un RFM Master 2.0 équipé d'un module RFM95W, voici 2 sketchs (transmission et émission) pour les faire fonctionner.
Vous remarquerez qu'il s'agit exactement des mêmes sketchs que pour le RFM Master 1.1 mais sans les lignes de commandes concernant la fréquence, la puissance de transmission, la clé de cryptage et l'affectation à un réseau.

Code de transmission:
Code: Tout sélectionner
    /* Skecth Ping-Pong */

    #include <SPI.h>
    #include <RH_RF95.h>

    RH_RF95 rf95;    // Définition de la commande.

    uint8_t data[] = "PING";    // Donnée qui va être émise.

    uint8_t buf[RH_RF95_MAX_MESSAGE_LEN];    // Variables qui vont permettre de
    uint8_t len = sizeof(buf);               // décrypter les données reçues.

    void setup()
    {
      Serial.begin(9600);
      Serial.println("Sketch PING.");
     
      if (!rf95.init())    // Vérification que le modem soit correctement initialisé.
      {
        Serial.println("Echec de l'initialisation modem!");
      }
      else
      {
        Serial.println("Succes de l'initialisation modem!");
      }
    }

    void loop()
    {
      rf95.send(data, sizeof(data));    // Envoi de la donnée(PING).

      if (rf95.waitAvailableTimeout(500))    // Timeout.
      {   
        if (rf95.recv(buf, &len))    // Réception d'une donnée(PONG).
        {
          Serial.println((char*)buf);    // Affichage de la donnée reçue.
        }
      }
      delay(400);
    }

Code de réception:
Code: Tout sélectionner
    /* Skecth Ping-Pong */

    #include <SPI.h>
    #include <RH_RF95.h>

    RH_RF95 rf95;    // Définition de la commande.

    uint8_t data[] = "PONG";    // Donnée qui va être émise.

    uint8_t buf[RH_RF95_MAX_MESSAGE_LEN];    // Variables qui vont permettre de
    uint8_t len = sizeof(buf);               // décrypter les données reçues.

    void setup()
    {
      Serial.begin(9600);
      Serial.println("Sketch PONG.");
     
      if (!rf95.init())    // Vérification que le modem soit correctement initialisé.
      {
        Serial.println("Echec de l'initialisation modem!");
      }
      else
      {
        Serial.println("Succes de l'initialisation modem!");
      }
    }

    void loop()
    {
      if (rf95.recv(buf, &len))    // Réception d'une donnée(PING).
      {
        Serial.println((char*)buf);    // Affichage de la donnée reçue.
       
        rf95.send(data, sizeof(data));    // Envoi de la donnée(PONG).
      }
    }

Les résultats obtenus sont identiques à ceux observés précédemment:
Pour le sketch de transmission:
Transmission.png
Transmission.png (26.03 Kio) Vu 250 fois

Pour le sketch de réception:
Réception.png
Réception.png (25.01 Kio) Vu 250 fois


Voilà, c'est terminé! Pour aller un peu plus loin, comme par exemple envoyer la valeur d'un capteur, je vous suggère d'aller faire un tour sur les tutoriels RFM22 Breakout et/ou Shield RFM22. Les commandes restent quasiment identiques puisque le RFM22B est aussi dans la librairie RadioHead.

Pour une utilisation de LoRaWan avec le RFM Master 2.0 consulter le tutoriel LoRaWan et Arduino.

A savoir: la LED ("L") du RFM Master est reliée à la broche 8.
Florian
 
Messages: 75
Inscription: Mer 24 Juil 2013 17:36

Retourner vers Shield RFM22 et RFM Master

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité