Hey! Sie scheinen aus United States zu kommen, möchten Sie auf die Englisch Webseite wechseln?
Switch to Englisch site
Skip to main content

Prototyping eines LoRa-Wireless-Überwachungssystems mit XinaBox Teil 2: Senden von Daten

Main23_2430ca1117f911b38f5c17bec9f5ea6d2f8e4ca1.jpg

Schnelles Prototyping eines Langstreckenfunk-Sensorsystems mit der modularen Elektronikplattform.

In Teil 1 haben wir unseren Anwendungsfall erläutert und einen Blick auf die LoRa-Wireless-Modulation geworfen. Damit haben wir unser Grundprinzip für die Verwendung dargelegt, bevor wir uns dann mit einigen der verfügbaren XinaBox-Hardwareoptionen befasst haben.

In diesem Beitrag fahren wir mit dem Programmieren eines CR02-Moduls oder „☒CHIP“ – mit integriertem Mikrocontroller und Funkgerät – und dem Senden und Empfangen von Daten in einer LoRa-Wireless-Verbindung fort.

Einrichtung

IP01CR02_9d110cd278346f520f09bc46ca9b111221d226ba.jpg

Zunächst müssen wir das Programmiergerät IP01  (174-3703)  mit dem CR02  (174-3699)  verbinden. Dafür verwenden wir einen xBUS-Steckverbinder  (174-4977) . Außerdem muss eine angemessene Antenne angebunden sein, bevor wir LoRa-Beispiele ausführen. Dies könnte z. B. eine für das 868-MHz-Band optimierte SMA-Peitschenantenne  (054-2563) sein.

AntennaDetail_f69ce59a3cdfbb14fffb614346c6fbf42399335c.jpg

Um das Senden und Empfangen zu testen, benötigen wir natürlich zwei Sätze der oben genannten Teile.

Darüber hinaus muss die Arduino IDE oder eine andere Möglichkeit zur Programmierung von Arduino-kompatiblen Platinen installiert sein. Die PlatformIO IDE sollte beispielsweise im Prinzip ebenso funktionieren.

PLWM-P2_RadioHeadDownload_e3ee16139a43e1a6071a238d2815e4fa1fcf4e55.jpg

Wir verwenden eine Bibliothek namens RadioHead, die die Möglichkeit zum Senden und Empfangen von Nachrichten als Paket über eine Vielzahl von gängigen Datenfunkgeräten bietet, einschließlich des RFM95W, das in den CR02-CHIP integriert ist, den wir verwenden. Zu diesem Zeitpunkt sieht es aus, als ob wir die unter der XinaBox Github-Organisation gehostete RadioHead-Fork verwenden müssen.

Es gibt verschiedene Möglichkeiten, neue Bibliotheken in der Arduino IDE zu installieren, aber die einfachste ist, ein ZIP-Archiv herunterzuladen und dann in der IDE Sketch → Include Library → Add .ZIP Library (Entwurf → Bibliothek einbinden → ZIP-Bibliothek hinzufügen) auszuwählen.

Im Menü Tools → Board (Werkzeuge → Platine) müssen wir „Arduino Pro or Pro Mini“ auswählen und sicherstellen, dass unter Tools → Port der richtige Port ausgewählt ist. Unter Linux sollte das IP01 als /dev/ttyUSB0 aufgeführt sein. (Vielleicht ist die Zahl auch größer, wenn ein anderes FTDI-basiertes Gerät verbunden ist).

Hello, World

CR02Blink_6c920636bc6433a7565640d72aa1ce2fe5f5518f.jpg

Nun, da das Setup abgeschlossen ist, befassen wir uns mit dem „Hello, World of hardware“-LED-Blinken!

Das CR02-Modul verfügt über eine dreifarbige LED. Das Blinkbeispiel ist also etwas umfassender als das mit der Arduino IDE bereitgestellte, im Grunde aber gleich, nur dass die einzelnen Farben abwechselnd aufleuchten. Beachten Sie, dass bei Hochladen des Sketchs die LED auf dem IP01 kurz schnell aufleuchten sollte. Ist dem nicht so, weist dies auf einen Hardwarefehler oder ein Portberechtigungsproblem hin.

Sehen wir uns nun das Senden und Empfangen von Daten über das LoRa-Funkgerät an.

LoRa-Server

CR02Server_9ddb90a28c83e8b7c44c435c711fda650038b46c.jpg

Beginnen wir also mit dem „Server“-Sketch-Beispiel. Zunächst umfasst dies die RadioHead-Bibliothek für unser Wireless-Modul, bevor wir zum Definieren einiger Konstanten übergehen, beispielsweise der Betriebsfrequenz, die beim CR02 das 868-MHz-Band ist.

#include <RH_RF95.h>

#define LED_BUILTIN 16

#define CR02_FREQUENCY 868.0

uint8_t tempdata[30];

Als Nächstes konfigurieren wir einen LED-Pin und einen seriellen Anschluss für das Debugging in setup(), bevor wir dann zur Initialisierung des Funkmoduls und Konfiguration der Frequenz und Übertragungsleistung übergehen.

void setup()
{
  pinMode(LED_BUILTIN, OUTPUT);

  Serial.begin(115200);

  if (!CR02.init()) {
    Serial.println("init failed");
  }
  // 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:
  // Failure to do that will result in extremely low transmit powers.

  //CR02.setModemConfig(CR02.Bw31_25Cr48Sf512);
  CR02.setFrequency(CR02_FREQUENCY);
  CR02.setTxPower(23, false);
}

Es gibt außerdem eine Zeile, die das Festlegen der Verbindungsbandbreite und des LoRa-Verteilungsfaktors auf Nicht-Standardwerte ermöglicht. Kurz gesagt: Ein höherer Verteilungsfaktor bedeutet eine größere Verbindungslänge und somit eine größere Reichweite, aber auf Kosten von einer geringeren Bandbreite und einer längeren Dauer bei der drahtlosen Übertragung.

Der Standardverteilungsfaktor ist für Entwicklungszwecke gut, kann aber für die jeweilige Umgebung optimiert werden, um die beste Kombination aus Reichweite und Energieverbrauch sowie Nutzung des Spektrums zu erzielen. In der Regel gilt: Je kürzer die Übertragungszeit, umso besser. Wenn Sie jedoch wirklich sicherstellen möchten, dass Ihre Nachricht übermittelt wird, und Bandbreite und Batterielebensdauer als weniger wichtig erachten – beispielsweise im Falle eines Alarm-/Warnsystems –, dann verwenden Sie immer den höchsten Verteilungsfaktor.

Weitere Informationen zur Verwendung des setModemConfig()-Aufrufs zur Konfiguration des CR02-LoRa-Funkgeräts finden Sie in der RadioHead-Dokumentation.

Jetzt befassen wir uns mit der Hauptschleife. Hier halten wir Ausschau nach einer eingehenden Nachricht. Bei Empfang aktivieren wir die LED und geben die Nachricht dann zusammen mit dem Received Signal Strength Indicator (RSSI) an den seriellen Anschluss aus, bevor wir die LED deaktivieren und schließlich eine Antwort übermitteln. Ganz einfach!

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

      // Send a reply
      sprintf(tempdata, "%s", "Hello Client");
      CR02.send(tempdata, sizeof(tempdata));
      CR02.waitPacketSent();
      Serial.println("Sent a reply");
      digitalWrite(LED_BUILTIN, LOW);
    }
    else
    {
      Serial.println("recv failed");
    }
  }
}

LoRa-Client

CR02Client_2eb95c9cef63f0eef1740afda4520cb7b3b2e950.jpg

Das CRO2-Client-Beispiel ist sehr ähnlich und wie Sie sich vielleicht vorstellen können, wird stattdessen eine Nachricht übertragen und dann auf eine Antwort gewartet. Wenn wir einen Blick auf diese Hauptschleife werfen:

void loop()
{
  Serial.println("Sending to CR02_server");
  // Send a message to CR02_server

  sprintf(tempdata, "%s", "Hello Server");

  CR02.send(tempdata, sizeof(tempdata));

  CR02.waitPacketSent();
  // Now wait for a reply
  uint8_t buf[RH_RF95_MAX_MESSAGE_LEN];
  uint8_t len = sizeof(buf);

  if (CR02.waitAvailableTimeout(3000))
  {
    // Should be a reply message for us now
    if (CR02.recv(buf, &len))
    {
      digitalWrite(LED_BUILTIN, HIGH);
      Serial.print("got reply: ");
      Serial.println((char*)buf);
      Serial.print("RSSI: ");
      Serial.println(CR02.lastRssi(), DEC);
    }
    else
    {
      Serial.println("recv failed");
    }
  }
  else
  {
    Serial.println("No reply, is CR02_server running?");
  }
  digitalWrite(LED_BUILTIN, LOW);
  delay(400);
}

Wir sehen wieder, dass dies sehr einfach ist. Wir erhalten eine Nachrichtenantwort, zusammen mit dem RSSI des Signals vom Server.

Erweiterte Optionen

Die oben aufgeführten einfachen Beispiele bieten keine Verschlüsselung/Nachrichtenauthentifizierung oder irgendeine Form der Adressierung. Bei vielen Systemen kann dies zwar in Ordnung sein, aber wenn erweiterte Funktionen erforderlich sind, gibt es auch RadioHead-Beispiele, die Verschlüsselung nutzen und einen zuverlässigen Datagramm-Service mit einfacher Knotenadressierungsunterstützung bereitstellen. Diese wurden jedoch nicht mit dem CR02-Modul getestet, und es ist möglich, dass einige Änderungen erforderlich sind.

So geht‘s weiter

Im nächsten Beitrag in dieser Serie fügen wir Peripheriegeräte hinzu, und unser drahtloses Überwachungssystem beginnt, Gestalt anzunehmen.

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