FEATHER-32U4-LORA-LoRa-Radio

De MCHobby - Wiki
Sauter à la navigation Sauter à la recherche

FEATHER-32U4LORA-45.jpg
Crédit: AdaFruit Industries www.adafruit.com


MCHobby investit du temps et de l'argent dans la réalisation de traduction et/ou documentation. C'est un travail long et fastidieux réalisé dans l'esprit Open-Source... donc gratuit et librement accessible.
SI vous aimez nos traductions et documentations ALORS aidez nous à en produire plus en achetant vos produits chez MCHobby.

Utiliser le module LoRa Radio

Avant de commencer assurez-vous que vous avez votre Feather fonctionne sans problème, cela cette partie beaucoup plus facile. Une fois que vous avez la fonctionnalité Feather de base qui fonctionne vous pouvez télécharger le code, "Blink" , utilisez la sortie série, etc, vous pouvez ensuite passer à l'utilisation de la radio.

Notez que la radio sub-GHz n'est pas conçue pour le streaming audio ou vidéo!

Il est préférable d'utiliser de petits paquets de données. Le débit de données est ajustable mais le maximum atteignable est environ 19,2 Kbps (bits par seconde). Des débits de données plus faibles seront plus efficaces dans leurs transmissions.

Vous aurez, bien sûr, besoin d'au moins deux cartes possédant la même fréquence radio pour faire des tests! Les radios doivent être assortis en fréquence (par exemple 900 MHz et 900 MHz c'est ok, 900 MHz et 433 MHz ne fonctionnera pas). Ils doivent également utiliser les mêmes schémas d'encodage, vous ne pouvez pas faire communiquer un 900 MHz RFM69 talkie radio et un 900 MHz RFM96 LoRa radio.

Bibliothèque Arduino

Ces radios ont vraiment un excellent code déjà écrit, donc plutôt que de venir avec une nouvelle norme, nous vous suggérons d'utiliser les bibliothèques existantes comme AirSpayce Radiohead Library qui supporte également un grand nombre d'autres radios Il s'agit d'une véritable bibliothèque Arduino, alors merci de les remercier pour leurs efforts!

La bibliothèque RadioHead RFM9x

Pour commencer à utiliser la radio, vous devrez télécharger la bibliothèque RadioHead. Vous pouvez le faire en visitant le repo de github et en téléchargeant manuellement ou, plus simplement, cliquez simplement ici pour télécharger le zip correspondant à la version 1.62

Notez que tout le code dans les exemples ci-dessous est basé sur cette version, vous pouvez visiter la page de documentation de RadioHead pour obtenir la version la plus récente qui peut avoir des corrections de bugs ou plus de fonctionnalités.

Décompresser le zip et trouver le dossier nommé RadioHead et vérifier que le dossier RadioHead contient RH_RF95.cpp et RH_RF95.h (ainsi que quelques dizaines d'autres fichiers pour les radios qui sont pris en charge)   Placez le dossier de bibliothèque RadioHead votre arduinoIDE / libraries / folder. Vous devrez peut-être créer le sous-dossier des bibliothèques si c'est votre première bibliothèque. Redémarrez l'IDE pour que cela soit pris en compte.

Nous avons également un excellent didacticiel sur l'installation de la bibliothèque Arduino à: en suivant ce tutoriel

Exemple de base RX & TX

Permet d'obtenir une démo de base où un Feather LoRa transmet et l'autre reçoit.

Exemple de code d'émetteur

Nous commencerons par configurer l'émetteur

Ce code enverra un petit paquet de données une fois par seconde à l'adresse de noeud #1

Chargez ce code dans votre transmetteur Arduino/Feather!

// Feather9x_TX
// -*- mode: C++ -*-
// Example sketch showing how to create a simple messaging client (transmitter)
// with the RH_RF95 class. RH_RF95 class does not provide for addressing or
// reliability, so you should only use RH_RF95 if you do not need the higher
// level messaging abilities.
// It is designed to work with the other example Feather9x_RX

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

/* for feather32u4 */
#define RFM95_CS 8
#define RFM95_RST 4
#define RFM95_INT 7

/* for feather m0  
#define RFM95_CS 8
#define RFM95_RST 4
#define RFM95_INT 3
*/

/* for shield 
#define RFM95_CS 10
#define RFM95_RST 9
#define RFM95_INT 7
*/


/* for ESP w/featherwing 
#define RFM95_CS  2    // "E"
#define RFM95_RST 16   // "D"
#define RFM95_INT 15   // "B"
*/

/* Feather 32u4 w/wing
#define RFM95_RST     11   // "A"
#define RFM95_CS      10   // "B"
#define RFM95_INT     2    // "SDA" (only SDA/SCL/RX/TX have IRQ!)
*/

/* Feather m0 w/wing 
#define RFM95_RST     11   // "A"
#define RFM95_CS      10   // "B"
#define RFM95_INT     6    // "D"
*/

/* Teensy 3.x w/wing 
#define RFM95_RST     9   // "A"
#define RFM95_CS      10   // "B"
#define RFM95_INT     4    // "C"
*/

// Change to 434.0 or other frequency, must match RX's freq!
#define RF95_FREQ 915.0

// Singleton instance of the radio driver
RH_RF95 rf95(RFM95_CS, RFM95_INT);

void setup() 
{
  pinMode(RFM95_RST, OUTPUT);
  digitalWrite(RFM95_RST, HIGH);

  while (!Serial);
  Serial.begin(9600);
  delay(100);

  Serial.println("Feather LoRa TX Test!");

  // manual reset
  digitalWrite(RFM95_RST, LOW);
  delay(10);
  digitalWrite(RFM95_RST, HIGH);
  delay(10);

  while (!rf95.init()) {
    Serial.println("LoRa radio init failed");
    while (1);
  }
  Serial.println("LoRa radio init OK!");

  // Defaults after init are 434.0MHz, modulation GFSK_Rb250Fd250, +13dbM
  if (!rf95.setFrequency(RF95_FREQ)) {
    Serial.println("setFrequency failed");
    while (1);
  }
  Serial.print("Set Freq to: "); Serial.println(RF95_FREQ);
  
  // Defaults after init are 434.0MHz, 13dBm, Bw = 125 kHz, Cr = 4/5, Sf = 128chips/symbol, CRC on

  // The default transmitter power is 13dBm, using PA_BOOST.
  // If you are using RFM95/96/97/98 modules which uses the PA_BOOST transmitter pin, then 
  // you can set transmitter powers from 5 to 23 dBm:
  rf95.setTxPower(23, false);
}

int16_t packetnum = 0;  // packet counter, we increment per xmission

void loop()
{
  Serial.println("Sending to rf95_server");
  // Send a message to rf95_server
  
  char radiopacket[20] = "Hello World #      ";
  itoa(packetnum++, radiopacket+13, 10);
  Serial.print("Sending "); Serial.println(radiopacket);
  radiopacket[19] = 0;
  
  Serial.println("Sending..."); delay(10);
  rf95.send((uint8_t *)radiopacket, 20);

  Serial.println("Waiting for packet to complete..."); delay(10);
  rf95.waitPacketSent();
  // Now wait for a reply
  uint8_t buf[RH_RF95_MAX_MESSAGE_LEN];
  uint8_t len = sizeof(buf);

  Serial.println("Waiting for reply..."); delay(10);
  if (rf95.waitAvailableTimeout(1000))
  { 
    // Should be a reply message for us now   
    if (rf95.recv(buf, &len))
   {
      Serial.print("Got reply: ");
      Serial.println((char*)buf);
      Serial.print("RSSI: ");
      Serial.println(rf95.lastRssi(), DEC);    
    }
    else
    {
      Serial.println("Receive failed");
    }
  }
  else
  {
    Serial.println("No reply, is there a listener around?");
  }
  delay(1000);
}

Une fois téléchargé, vous devriez voir ce qui suit sur la console série

FEATHER-32U4LORA-46.png
Crédit: AdaFruit Industries www.adafruit.com

Ouvrez maintenant une autre instance de l'IDE Arduino - c'est pour que vous puissiez voir la sortie de la console série de la du Feather TX pendant que vous configurez le Feather RX.

Exemple de code récepteur

Ce code recevra et accusera réception d'un petit paquet de données. Chargez ce code dans votre Receiver Arduino / Feather!

Modèle:Tmbox text=Assurez-vous que le

Modèle:Ambox text=Décommenter / commenter les sections définissant les broches pour Feather 32u4, Feather M0, etc selon le chipset et le câblage que vous utilisez! Les broches utilisées varieront en fonction de votre configuration!

// Feather9x_RX
// -*- mode: C++ -*-
// Example sketch showing how to create a simple messaging client (receiver)
// with the RH_RF95 class. RH_RF95 class does not provide for addressing or
// reliability, so you should only use RH_RF95 if you do not need the higher
// level messaging abilities.
// It is designed to work with the other example Feather9x_TX

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

/* for feather32u4 */
#define RFM95_CS 8
#define RFM95_RST 4
#define RFM95_INT 7

/* for feather m0  
#define RFM95_CS 8
#define RFM95_RST 4
#define RFM95_INT 3
*/

/* for shield 
#define RFM95_CS 10
#define RFM95_RST 9
#define RFM95_INT 7
*/


/* for ESP w/featherwing 
#define RFM95_CS  2    // "E"
#define RFM95_RST 16   // "D"
#define RFM95_INT 15   // "B"
*/

/* Feather 32u4 w/wing
#define RFM95_RST     11   // "A"
#define RFM95_CS      10   // "B"
#define RFM95_INT     2    // "SDA" (only SDA/SCL/RX/TX have IRQ!)
*/

/* Feather m0 w/wing 
#define RFM95_RST     11   // "A"
#define RFM95_CS      10   // "B"
#define RFM95_INT     6    // "D"
*/

/* Teensy 3.x w/wing 
#define RFM95_RST     9   // "A"
#define RFM95_CS      10   // "B"
#define RFM95_INT     4    // "C"
*/

// Change to 434.0 or other frequency, must match RX's freq!
#define RF95_FREQ 915.0

// Singleton instance of the radio driver
RH_RF95 rf95(RFM95_CS, RFM95_INT);

// Blinky on receipt
#define LED 13

void setup() 
{
  pinMode(LED, OUTPUT);     
  pinMode(RFM95_RST, OUTPUT);
  digitalWrite(RFM95_RST, HIGH);

  while (!Serial);
  Serial.begin(9600);
  delay(100);

  Serial.println("Feather LoRa RX Test!");
  
  // manual reset
  digitalWrite(RFM95_RST, LOW);
  delay(10);
  digitalWrite(RFM95_RST, HIGH);
  delay(10);

  while (!rf95.init()) {
    Serial.println("LoRa radio init failed");
    while (1);
  }
  Serial.println("LoRa radio init OK!");

  // Defaults after init are 434.0MHz, modulation GFSK_Rb250Fd250, +13dbM
  if (!rf95.setFrequency(RF95_FREQ)) {
    Serial.println("setFrequency failed");
    while (1);
  }
  Serial.print("Set Freq to: "); Serial.println(RF95_FREQ);

  // Defaults after init are 434.0MHz, 13dBm, Bw = 125 kHz, Cr = 4/5, Sf = 128chips/symbol, CRC on

  // The default transmitter power is 13dBm, using PA_BOOST.
  // If you are using RFM95/96/97/98 modules which uses the PA_BOOST transmitter pin, then 
  // you can set transmitter powers from 5 to 23 dBm:
  rf95.setTxPower(23, false);
}

void loop()
{
  if (rf95.available())
  {
    // Should be a message for us now   
    uint8_t buf[RH_RF95_MAX_MESSAGE_LEN];
    uint8_t len = sizeof(buf);
    
    if (rf95.recv(buf, &len))
    {
      digitalWrite(LED, HIGH);
      RH_RF95::printBuffer("Received: ", buf, len);
      Serial.print("Got: ");
      Serial.println((char*)buf);
       Serial.print("RSSI: ");
      Serial.println(rf95.lastRssi(), DEC);
      
      // Send a reply
      uint8_t data[] = "And hello back to you";
      rf95.send(data, sizeof(data));
      rf95.waitPacketSent();
      Serial.println("Sent a reply");
      digitalWrite(LED, LOW);
    }
    else
    {
      Serial.println("Receive failed");
    }
  }
}

Maintenant ouvrez la console série sur le récepteur, tout en vérifiant également sur la console série de l'émetteur. Vous devriez voir le récepteur est ... eh bien, la réception des paquets !

FEATHER-32U4LORA-47.png
Crédit: AdaFruit Industries www.adafruit.com

Vous pouvez voir que l'exemple de bibliothèque affiche les octets hexadécimaux reçus, 48 65 6C 6C 6F 20 57 6F 72 6C 64 20 23 30 0 20 20 20 20 0 ainsi que la chaîne ""Hello World"" en ASCII.

Ensuite, il enverra une réponse à l'emetteur.

L'émetteur reçoit donc la réponse et l'affiche ""And hello back to you"" quand il reçoit celle-ci.

La séquence se répète jusqu'à ce que vous l'interrompiez.

Jetons un coup d'oeil aux exemples afin que vous sachiez comment s'adapter à votre propre configuration de la radio

Configuration des Pin de la radio LoRa

Ceci est la configuration de brochage pour tous les Feather 32u4 RFM9X's:

/* for feather32u4 */
#define RFM95_CS 8
#define RFM95_RST 4
#define RFM95_INT 7

Ceci est la configuration de brochage pour tous les Feather M0 RFM9X's:

/* for feather m0 */
#define RFM95_CS 8
#define RFM95_RST 4
#define RFM95_INT 3

La fréquence

Vous pouvez éditer la fréquence sur laquelle la radio doit communiquer, par exemple 915.0, 434.0 ou 868.0 ou n'importe quel nombre. Différents pays / zones de l'UIT ont des bandes ISM différentes, donc assurez-vous d'utiliser une fréquence autorisée dans votre zone géographique / pays.

// Change to 434.0 or other frequency, must match RX's freq!
#define RF95_FREQ 915.0

Vous pouvez ensuite instancier l'objet radio avec nos numéros de broches personnalisés.

// Singleton instance of the radio driver
RH_RF95 rf95(RFM95_CS, RFM95_INT);

Installation

Nous commençons par configurer la console série et réinitialiser la radio.

void setup() 
{
  pinMode(LED, OUTPUT);     
  pinMode(RFM95_RST, OUTPUT);
  digitalWrite(RFM95_RST, HIGH);

  while (!Serial); // wait until serial console is open, remove if not tethered to computer
  Serial.begin(9600);
  delay(100);
  Serial.println("Feather LoRa RX Test!");
  
  // manual reset
  digitalWrite(RFM95_RST, LOW);
  delay(10);
  digitalWrite(RFM95_RST, HIGH);
  delay(10);

Supprimez la ligne while (!Serial); si vous n'êtes pas relié à un ordinateur, car sinon le Feather attendra une connexion à l'ordinateur pour continuer à exécuter le programme !

Initiation à la radio

La bibliothèque est initialisée avec un appel à init(). Une fois initialisée, vous pouvez régler la fréquence d'émission/réception de la puce radio. Vous pouvez également configurer le niveau de puissance de sortie, le nombre va de 5 à 23. Commencez par le niveau de puissance le plus élevé (23), puis réduisez-le au besoin (afin d'économiser de l'énergie dans votre projet ;)

  while (!rf95.init()) {
    Serial.println("LoRa radio init failed");
    while (1);
  }
  Serial.println("LoRa radio init OK!");

  // Defaults after init are 434.0MHz, modulation GFSK_Rb250Fd250, +13dbM
  if (!rf95.setFrequency(RF95_FREQ)) {
    Serial.println("setFrequency failed");
    while (1);
  }
  Serial.print("Set Freq to: "); Serial.println(RF95_FREQ);

  // Defaults after init are 434.0MHz, 13dBm, Bw = 125 kHz, Cr = 4/5, Sf = 128chips/symbol, CRC on

  // The default transmitter power is 13dBm, using PA_BOOST.
  // If you are using RFM95/96/97/98 modules which uses the PA_BOOST transmitter pin, then 
  // you can set transmitter powers from 5 to 23 dBm:
  rf95.setTxPower(23, false);

Code de l'émetteur

Si vous utilisez l'émetteur, ce code attendra 1 seconde, puis transmettra un paquet avec "Hello World #" et un numéro de paquet incrémenté à chaque envoi.

void loop()
{
  delay(1000); // Wait 1 second between transmits, could also 'sleep' here!
  Serial.println("Transmitting..."); // Send a message to rf95_server
  
  char radiopacket[20] = "Hello World #      ";
  itoa(packetnum++, radiopacket+13, 10);
  Serial.print("Sending "); Serial.println(radiopacket);
  radiopacket[19] = 0;
  
  Serial.println("Sending..."); delay(10);
  rf95.send((uint8_t *)radiopacket, 20);

  Serial.println("Waiting for packet to complete..."); delay(10);
  rf95.waitPacketSent();

c'est assez simple, le ""delay"" fixe un temps d'attente. (vous pouvez remplacer celui avec un script de mise en veille de faible puissance).

Ensuite, il génère le paquet et ajoute un nombre qui augmente à chaque transmission (TX). Ensuite, il appelle simplement la fonction send() pour transmettre les données, et passe en paramètre le tableau de données et la longueur des données. Notez qu'il ne fait aucun adressage ou sous-réseau - si vous voulez vous assurer que le paquet va à une radio particulière, vous devrez peut-être ajouter un identifiant / adresse octet dans le message ! Ensuite, vous appelez waitPacketSent() pour attendre que la transmission radio soit terminée. Vous ne recevrez pas un accusé de réception automatique, à partir de l'autre radio, à moins qu'il ne sache renvoyer un paquet. C'est un peu comme le protocole 'UDP' en réseau- les données sont envoyées, mais ce n'est pas certain qu'il a été reçu! En outre, il n'y aura pas de nouvelles tentatives automatiques en cas d'échec sauf si vous prévoyez une fonction dédiée qui attendra une réponse avec un timeout pour un nouvel envoi si celle-ci n'est pas reçue dans un temps imparti.

Code du récepteur

Le Récepteur a le même code de configuration, mais la boucle est différente:

void loop()
{
  if (rf95.available())
  {
    // Should be a message for us now   
    uint8_t buf[RH_RF95_MAX_MESSAGE_LEN];
    uint8_t len = sizeof(buf);
    
    if (rf95.recv(buf, &len))
    {
      digitalWrite(LED, HIGH);
      RH_RF95::printBuffer("Received: ", buf, len);
      Serial.print("Got: ");
      Serial.println((char*)buf);
       Serial.print("RSSI: ");
      Serial.println(rf95.lastRssi(), DEC);

Au lieu d'émettre, il vérifie constamment s'il ya des paquets de données qui ont été reçus. available() renvoie true si un paquet avec correction d'erreur correcte a été reçu. Si c'est le cas, le récepteur l'affiche en hexadécimal et aussi comme une 'chaîne de caractères' (dans la console série). Il affiche également le RSSI qui est l'indicateur de puissance du signal du récepteur. Ce nombre sera compris entre environ -15 et environ -100. Plus le nombre est bas, (-15 étant le plus élevé que vous verrez probablement) plus le signal est fort. (ce chiffre représente en fait le taux d'atténuation du signal par une valeur numérique) Une fois terminé, il répondra automatiquement, ce qui est un moyen pour les radios de savoir qu'il y avait un accusé de réception.

// Send a reply
      uint8_t data[] = "And hello back to you";
      rf95.send(data, sizeof(data));
      rf95.waitPacketSent();
      Serial.println("Sent a reply");

Il renvoie simplement une chaîne et attend jusqu'à ce que la réponse soit complètement envoyée.


Source: Adafruit Feather 32u4 LORA créé par LadyAda pour AdaFruit Industries. Crédit [www.adafruit.com AdaFruit Industries]

Traduit par Antoine.W (PYRANOID) pour MCHobby.be

Traduit avec l'autorisation d'AdaFruit Industries - Translated with the permission from Adafruit Industries - www.adafruit.com

Toute référence, mention ou extrait de cette traduction doit être explicitement accompagné du texte suivant : «  Traduction par MCHobby (www.MCHobby.be) - Vente de kit et composants » avec un lien vers la source (donc cette page) et ce quelque soit le média utilisé.

L'utilisation commercial de la traduction (texte) et/ou réalisation, même partielle, pourrait être soumis à redevance. Dans tous les cas de figures, vous devez également obtenir l'accord du(des) détenteur initial des droits. Celui de MC Hobby s'arrêtant au travail de traduction proprement dit.