DesignSpark Electrical Logolinkedin
Ask a Question

Prototyper la surveillance de liaison sans fil LoRa avec XinaBox, troisième partie : ajout d'E/S et de tests

Prototypage rapide d'un système de capteurs sans fil longue portée avec la plate-forme électronique modulaire.

Dans la première partie, nous avons présenté notre exemple d'utilisation et nous avons étudié la modulation sans fil LoRa, en expliquant pourquoi nous l'utilisons, avant d'explorer certaines des options matérielles XinaBox disponibles. Dans la deuxième partie, nous avons programmé un module CR02 ou "☒CHIP", qui intègre un microcontrôleur et une radio, puis envoyé et reçu des données via une liaison sans fil LoRa.

Dans cette troisième et dernière partie, nous ajoutons un capteur de température pour l'entrée du côté transmission de la liaison sans fil, avec un "photorelais" pour commander un indicateur ou une sortie d'alarme du côté réception.

Matériel utilisé

Nous utiliserons les mêmes modules CR02 pour le microcontrôleur avec LoRa, ainsi que des modules USB-UART IP01 pour la programmation et le test.

Le module de capteur que nous utiliserons est le XinaBox SW02 (174-3745). Il intègre un Bosch BME680, qui est en fait un capteur mixte de température, d'humidité, de pression d'air et de composés organiques volatils (COV). Toutefois, dans cet exemple, nous allons simplement l'utiliser pour mesurer la température, car cela nous permet de déclencher plus facilement des changements pendant le test.

Pour la sortie, nous utiliserons un XinaBox OC03 (174-3715). Celui-ci fournit une commande optiquement isolée d'un relais, et peut commuter des charges jusqu'à 40 V à 2 A. Il peut ainsi être utilisé pour commuter directement un indicateur industriel standard ou un avertisseur sonore, etc., qui fonctionnent généralement sur 24 V, ou il peut également être utilisé pour commander un relais 12 ou 24 V qui commute le courant secteur.

Avec deux modules CR02 (174-3699), ils nous permettent de surveiller l'environnement et de déclencher une alarme lorsque la température à un emplacement distant dépasse un point de consigne donné.

Bibliothèques Arduino

Dans l'article précédent, nous avons installé la bibliothèque Radiohead pour ajouter la prise en charge de la radio CR02 LoRa à Arduino IDE. Pour utiliser les modules SW02 et OC03, nous devons également installer :

Le moyen le plus rapide de les installer est de télécharger un fichier ZIP pour chacun d'entre eux puis, dans Arduino IDE, de sélectionner Sketch → Include Library → Add .ZIP Library (Code > Inclure une bibliothèque > Ajouter une bibliothèque .ZIP)... Après le redémarrage de l'IDE, de nouveaux exemples de code doivent être disponibles via File → Examples → Examples from Custom Libraries (Fichier > Exemples > Exemples provenant de bibliothèques personnalisées).

Test matériel

Nous devons donc tout d'abord nous assurer que, dans le menu Tools (Outils), nous avons sélectionné :

  • Carte : Arduino Pro ou Pro Mini
  • Processeur : ATmega328P (5 V, 16 MHz)
  • Port : /dev/ttyUSB0 (ou tout autre port par lequer IP01 est énuméré)

Si nous chargeons ensuite l'exemple SW02_Temperature_Measurement, le compilons/vérifions, le transférons, puis que nous ouvrons Serial Monitor, les relevés de température devraient s'afficher.

Pour tester notre module de sortie, nous pouvons charger l'exemple OC03_ToggleOutput, le compiler et le transférer, puis ouvrir à nouveau Serial Monitor. Cette fois-ci, seul le message OC03 Test s'affiche. Si nous mesurons la résistance entre les bornes de sortie, nous devrions voir que le photorelais se ferme pendant 2 s, s'ouvre pendant 2 s, puis répète l'opération.

Maintenant que nous avons configuré notre environnement de développement et vérifié que le matériel fonctionne, passons à l'intégration des E/S avec la transmission et la réception LoRa.

Capteur et transmission

#include <xCore.h>
#include <xSW02.h>
#include <RH_RF95.h>

#define LED_BUILTIN 16
#define CR02_FREQUENCY 868.0

const int DELAY_TIME = 2000;
const float MAX_TEMP = 30.00;

xSW02 SW02;
RH_RF95 CR02;

void setup(){
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(115200);
  
  // SW02 sensor setup
  Wire.begin();
  SW02.begin();

  // CR02 radio setup
  if (!CR02.init()){
    Serial.println("CRO2 init failed");
  }
  CR02.setFrequency(CR02_FREQUENCY);
  CR02.setTxPower(23, false);
  
  // Delay for sensor to normalise
  delay(5000);
}

void loop(){
  float temp;
  byte txdata[1];
  
  // Read SW02 sensor
  SW02.poll();
  temp = SW02.getTempC();
  
  // Print temperature to the Serial Monitor   
  Serial.print(temp);
  Serial.println(" C");

  // Set status (0x00 if temp OK and 0x01 if high)
  if (temp <= MAX_TEMP) {
    digitalWrite(LED_BUILTIN, LOW);
    txdata[0] = { 0x00 };
  }
  else {
    digitalWrite(LED_BUILTIN, HIGH);
    txdata[0] = { 0x01 };
  }

  // Transmit status
  CR02.send(txdata, sizeof(txdata));

  // Delay between sensor reads
  delay(DELAY_TIME);
}

Dans le code ci-dessus, nous :

  1. incluons les bibliothèques dont nous avons besoin et configurons certains paramètres
  2. configurons la LED CR02, le capteur et la radio LoRa
  3. obtenons la température, puis l'envoyons sur le port série
  4. réglons la variable d'état sur 0 si la température est correcte et sur 1 si le point de consigne a été dépassé
  5. transmettons l'état sur la liaison LoRa
  6. attendons le délai configuré et répétons à partir de l'étape 3

Nous aurions pu transmettre la mesure de température réelle, ce qui aurait pu être utile si nous voulions pouvoir configurer le point de consigne au niveau de la réception. Toutefois, évaluer la température du côté émission offre également certains avantages. Par exemple, nous pourrions, si nous le souhaitions, nous arranger pour que le capteur ne transmette que lorsque la limite de température est dépassée, ou pour déclencher l'alarme dès que cela se produit et transmettre une "pulsation" d'état à une fréquence moins régulière.

Veuillez noter également que nous ne transmettons qu'un seul octet, qui signifie que tout fonctionne correctement si 0x00, et que la température est trop élevée si 0x01. Nous pourrions également avoir de nombreux types d'état supplémentaires, par exemple 0x03, lorsque nous ne parvenons pas à lire le capteur, et peut-être 0x04 pour des piles faibles.

En règle générale, il est préférable de passer le moins de temps possible à transmettre, et donc de transmettre aussi peu de données que possible, afin de conserver l'énergie et l'utilisation du spectre sans fil. C'est la raison pour laquelle nous ne transmettons qu'un seul octet d'état sur la liaison radio, au lieu d'envoyer inutilement du texte ASCII explicite tel que "alarme" ou "la température est de 27 °C", etc.

Reception et Sortie

#include <RH_RF95.h>
#include <xOC03.h>
#include <xCore.h> 

#define LED_BUILTIN 16
#define CR02_FREQUENCY 868.0

RH_RF95 CR02;
xOC03 OC03;

void setup()
{
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(115200);

  // CR02 radio setup
  if (!CR02.init()) {
    Serial.println("init failed");
  }
  CR02.setFrequency(CR02_FREQUENCY);
  CR02.setTxPower(23, false);

  // OC03 setup
  Wire.begin();
  OC03.begin();
}

void loop() {
  byte buf[1];
  byte len = 1;
 
  if (CR02.available())
  {
    if (CR02.recv(buf, &len))
    {
      Serial.print("Status: ");
      
      if (buf[0] == 0x00) {
        Serial.print("OK");
        OC03.write(LOW);
        digitalWrite(LED_BUILTIN, LOW);
      }
      else if (buf[0] == 0x01) {
        Serial.print("ALARM");
        OC03.write(HIGH);
        digitalWrite(LED_BUILTIN, HIGH);
      }
      else {
        Serial.print("ERROR - unknown status");
      }
      Serial.print("   //   RSSI: ");
      Serial.println(CR02.lastRssi(), DEC);      
    }
    else
    {
      Serial.println("Receive failed!");
    }
  }
}

Sur le nœud de réception, nous :

  1. incluons les bibliothèques dont nous avons besoin et configurons certains paramètres
  2. configurons la LED intégrée au CR02 et la radio LoRa, ainsi que le module OC03
  3. recherchons les données entrantes
  4. analysons l'état
  5. envoyons l'état sur la borne et réglons le photorelais et la LED intégrée
  6. retournons à l'étape 3

Nous affichons également le RSSI (Received Signal Strength Indication, indicateur de puissance du signal reçu) sur le Serial Monitor, étant donné c'est une donnée très pratique, qui offre une indication de la qualité de la liaison radio. Lors de la mise en service, si le signal est trop faible, nous pouvons augmenter le facteur d'étalement (SF, spreading factor) du LoRa côté émission, ce qui nous permettrait d'obtenir une plus grande portée au prix d'une transmission sans fil plus longue. Si nous surveillons le RSSI au fil du temps et qu'il se dégrade, cela peut signifier que les piles sont faibles, qu'un obstacle s'est placé sur le chemin de transmission radio ou qu'il existe un problème matériel, tel qu'une antenne cassée.

En résumé

Bien qu'il s'agisse d'un exemple extrêmement simple, il montre comment nous pouvons créer très rapidement un prototype d'une solution de surveillance sans fil longue portée qui ne s'appuie pas sur les réseaux existants, ni sur des stations de base ou des passerelles supplémentaires. Dans ce cas, l'intégration d'un capteur BME680 pour la mesure de la température permet également de mesurer bien plus que cela. De nombreux autres modules xCHIP existent, et peuvent être choisis pour l'entrée ou la sortie, tous bénéficiant d'une interconnexion physique rapide et facile via des connecteurs XBus.

Andrew Back

Open source (hardware and software!) advocate, Treasurer and Director of the Free and Open Source Silicon Foundation, organiser of Wuthering Bytes technology festival and founder of the Open Source Hardware User Group.

20 Mar 2019, 8:19

Commentaires