Erfahrungsbericht: LoRa-Kommunikation mit Dragino Shields

In diesem Projekt habe ich mich mit der LoRa-Kommunikation zwischen zwei Dragino Shields beschäftigt:

Dragino LoRa/GPS Shield v1.3 (Sender)
Herstellerdaten: Datasheet Lora GPS Shield
Belegungsplan

Dragino LoRa Shield v1.4 (Empfänger)

Ziele des Projekts

  • Aufbau einer Punkt-zu-Punkt-LoRa-Kommunikation.
  • Übertragung von GPS-Daten vom Sender zum Empfänger.
  • Anzeige der empfangenen Daten auf einem OLED-Display.

Um erstmal Testdaten zwischen dem Dragino LoRa Shield v1.4 und dem Dragino LoRa/GPS Shield v1.3 auszutauschen, wurden beide Shields mit Arduino-Boards verbunden und eine einfache LoRa-Kommunikation zwischen ihnen einrichtet. Hier meine Schritt-für-Schritt-Anleitung:

1. Hardware-Setup

  • Dragino LoRa Shield v1.4: Dieses Shield an ein Arduino Uno angeschlossen.
  • Dragino LoRa/GPS Shield v1.3: Dieses Shield an ein Arduino Mega angeschlossen.

Und an beide die Antennen angebracht.

2. Bibliothek installieren

Um die LoRa-Kommunikation zu ermöglichen, muste ich die LoRa-Bibliothek in der Arduino IDE installieren.

  • Öffnen die Arduino IDE.
  • Gehe zu Sketch > Include Library > Manage Libraries.
  • Suche nach LoRa und installiere die Bibliothek von Sandeep Mistry.

3. Beispielcode für den Sender (Dragino LoRa/GPS Shield v1.3)

#include <SPI.h>
#include <LoRa.h>

void setup() {
  Serial.begin(9600);
  while (!Serial);

  if (!LoRa.begin(868E6)) { // Frequenz in Europa (868 MHz)
    Serial.println("LoRa init failed. Check your connections.");
    while (true);
  }
  Serial.println("LoRa Sender initialisiert.");
}

void loop() {
  Serial.println("Sende Testdaten...");
  LoRa.beginPacket();
  LoRa.print("Hallo, Prilchen!");
  LoRa.endPacket();

  delay(5000); // Sende alle 5 Sekunden
}

4. Beispielcode für den Empfänger (Dragino LoRa Shield v1.4)

#include <SPI.h>
#include <LoRa.h>

void setup() {
  Serial.begin(9600);
  while (!Serial);

  if (!LoRa.begin(868E6)) { // Frequenz in Europa (868 MHz)
    Serial.println("LoRa init failed. Check your connections.");
    while (true);
  }
  Serial.println("LoRa Empfänger initialisiert.");
}

void loop() {
  // Versuche, ein Paket zu empfangen
  int packetSize = LoRa.parsePacket();
  if (packetSize) {
    // Paket empfangen
    Serial.print("Empfangene Daten: ");

    // Lese die Daten aus dem Paket
    while (LoRa.available()) {
      Serial.print((char)LoRa.read());
    }

    // Zeige die Signalstärke (RSSI) des empfangenen Pakets an
    Serial.print(" mit RSSI ");
    Serial.println(LoRa.packetRssi());
  }
}

5. Testen der Kommunikation

  • Schalte beide Arduino-Boards ein.
  • Öffne den Serial Monitor in der Arduino IDE für beide Boards.
  • Der Sender sendet alle 5 Sekunden eine Nachricht.
  • Der Empfänger hat wie gewünscht die Nachricht empfangen und im Serial Monitor anzeigt.

6. Fehlerbehebung

  • Keine Kommunikation: Stelle sicher, dass beide Shields auf der gleichen Frequenz arbeiten (z.B. 868 MHz in Europa).
  • Schlechte Signalqualität: Überprüfen Sie die Antennen und stellen Sie sicher, dass die Shields nicht zu weit voneinander entfernt sind.

Versuch die GPS Daten auszulesen und zu senden

Nach dem die Datenübertragen so unkompliziert möglich war, will ich mal schauen, ob ich mit dem GPS-Modul, was mit auf dem Dragino LoRa/GPS Shield v1.3 verbaut wurde, GPS-Daten erfassen kann und diese Werte dann über LoRa zu senden, während der Dragino LoRa Shield v1.4 als Empfänger dient und diese Werte auf einem OLED Display ausgibt.
Hier meine Schritt-für-Schritt-Anleitung:

1. Bibliothek installieren

Für diese Erweiterung benötige ich zusätzlich zwei Bibliotheken:

  1. TinyGPS
  2. Adafruit SSD1306
  3. Adafruit GFX Library

Installation:

  • Öffne die Arduino IDE.
  • Gehe zu Sketch > Include Library > Manage Libraries.
  • Suche und installiere:
  • TinyGPS++ von Mikal Hart.
  • Adafruit SSD1306
  • Adafruit GFX Library

3. Sketch für den Sender (Dragino LoRa/GPS Shield v1.3)

#include <SPI.h>
#include <LoRa.h>
#include <SoftwareSerial.h>
#include <TinyGPS++.h>

// GPS-Modul über SoftwareSerial verbinden (RX, TX)
SoftwareSerial gpsSerial(8, 9); // RX an Pin 8, TX an Pin 9
TinyGPSPlus gps;

void setup() {
  Serial.begin(9600);
  gpsSerial.begin(9600); // GPS-Modul initialisieren

  // LoRa initialisieren
  if (!LoRa.begin(868E6)) { // Frequenz in Europa (868 MHz)
    Serial.println("LoRa init failed. Check your connections.");
    while (true);
  }
  Serial.println("LoRa Sender mit GPS initialisiert.");
}

void loop() {
  // GPS-Daten lesen
  while (gpsSerial.available() > 0) {
    gps.encode(gpsSerial.read());
  }

  // Wenn GPS-Daten verfügbar sind, sende sie über LoRa
  if (gps.location.isValid()) {
    String gpsData = "Lat: " + String(gps.location.lat(), 6) + 
                     ", Lon: " + String(gps.location.lng(), 6) +
                     ", Alt: " + String(gps.altitude.meters(), 2) + "m";

    Serial.println("Sende GPS-Daten: " + gpsData);

    LoRa.beginPacket();
    LoRa.print(gpsData);
    LoRa.endPacket();
  } else {
    Serial.println("Keine gültigen GPS-Daten verfügbar.");
    LoRa.beginPacket();
    LoRa.print(„keine gpsData“);
    LoRa.endPacket();
   }

  delay(5000); // Sende alle 5 Sekunden
}

4. Sketch für den Empfänger (Dragino LoRa Shield v1.4)

#include <SPI.h>
#include <LoRa.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// OLED-Display-Einstellungen
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET    -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {
  Serial.begin(9600);
  while (!Serial);

  // LoRa initialisieren
  if (!LoRa.begin(868E6)) { // Frequenz in Europa (868 MHz)
    Serial.println("LoRa init failed. Check your connections.");
    while (true);
  }
  Serial.println("LoRa Empfänger initialisiert.");

  // OLED-Display initialisieren
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // I2C-Adresse des Displays (0x3C oder 0x3D)
    Serial.println("OLED-Display nicht gefunden. Überprüfen Sie die Verbindungen.");
    while (true);
  }
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.println("LoRa Empfänger bereit.");
  display.display();
}

void loop() {
  // Versuche, ein Paket zu empfangen
  int packetSize = LoRa.parsePacket();
  if (packetSize) {
    String gpsData = "";

    // Lese die Daten aus dem Paket
    while (LoRa.available()) {
      gpsData += (char)LoRa.read();
    }

    // Zeige die empfangenen GPS-Daten auf dem OLED-Display an
    display.clearDisplay();
    display.setCursor(0, 0);
    display.println("Empfangene GPS-Daten:");
    display.println(gpsData);
    display.display();

    // Zeige die Daten auch im Serial Monitor an
    Serial.println("Empfangene GPS-Daten: " + gpsData);
  }
}

Ergebnisse:

  1. LoRa-Kommunikation:
    • Die LoRa-Übertragung auf 868 MHz (für Europa) funktioniert einwandfrei.
    • Datenpakete wurden erfolgreich zwischen den beiden Shields ausgetauscht.
  2. GPS-Modul:
    Das GPS-Modul des Dragino LoRa/GPS Shield v1.3 hat trotz mehrerer Versuche keine gültigen Daten geliefert.
    Mögliche Ursachen: Hardware-Defekt oder Probleme mit der Antenne.
  3. OLED-Display:
    • Ein 0,96-Zoll-OLED-Display (I2C) wurde erfolgreich integriert, leider nur die Strings aber ohne die GPS-Daten wurden angezeigt.

Herausforderungen

  • GPS-Modul: Trotz klarer Sicht zum Himmel und langer Wartezeit wurden keine gültigen GPS-Daten empfangen. Dies deutet auf ein mögliches Hardware-Problem hin.
  • Jumper-Konfiguration: Die korrekte Einstellung der Jumper auf dem Shield war entscheidend, um Konflikte zwischen LoRa und GPS zu vermeiden. Da ich leider kein Hersteller Datenblatt gefunden habe, schaue ich mal, wann ich wieder Zeit finde mir das mal genauer anzuschauen.

Fazit

Da ich in diesem kleinen Projekt zum ersten Mal die LoRa-Kommunikation näher betrachtet und auch zum Senden bekommen habe, werde ich die Seite trotzdem schon mal online stellen.
Das GPS-Modul wird evtl. in einem späteren Projekt weiter untersucht, sowie die LoRa-Kommunikation über größere Entfernungen getestet.

Update:
Habe inzwischen weitere Informationen gefunden.
Werden dann wohl mal hier rein schauen:

https://github.com/dragino/Arduino-Profile-Examples/blob/master/libraries/Dragino/examples/GPS/tinygps_example/tinygps_example.ino

https://www.instructables.com/Dragino-LoRa-GPS-Tracker-1

,
Schlagwörter