- Erforderliche Materialien
- Raspberry Pi mit LoRa verbinden
- Arduino mit LoRa verbinden
- pyLoRa für Raspberry Pi
- Konfigurieren des Raspberry Pi für LoRa-Moduls
- Programmierung von Raspberry Pi für LoRa
- Arduino Code für LoRa zur Kommunikation mit Raspberry Pi
- Testen der LoRa-Kommunikation zwischen Raspberry Pi und Arduino
LoRa wird mit dem Aufkommen von IoT, Connected Cars, M2M, Industrie 4.0 usw. immer beliebter. Aufgrund seiner Fähigkeit, mit sehr wenig Strom über große Entfernungen zu kommunizieren, wird es vorzugsweise von Designern zum Senden / Empfangen von Daten von einem batteriebetriebenen Ding verwendet. Wir haben bereits die Grundlagen von LoRa und die Verwendung von LoRa mit Arduino besprochen. Obwohl die Technologie ursprünglich für die Kommunikation eines LoRa-Knotens mit einem LoRa-Gateway vorgesehen ist, gibt es viele Szenarien, in denen ein LoRa-Knoten mit einem anderen LoRa-Knoten kommunizieren muss, um Informationen über große Entfernungen auszutauschen. In diesem Tutorial erfahren Sie, wie Sie ein LoRa-Modul SX1278 mit Raspberry pi verwendenzur Kommunikation mit einem anderen SX1278, der an einen Mikrocontroller wie Arduino angeschlossen ist. Diese Methode kann an vielen Stellen nützlich sein, da der Arduino als Server fungieren kann, um Daten von Sensoren abzurufen und über eine lange Distanz über LoRa an Pi zu senden. Der Pi, der als Client fungiert, kann diese Informationen empfangen und auf den Computer hochladen könnte da es Zugang zum Internet hat. Klingt interessant, oder? Also lasst uns anfangen.
Erforderliche Materialien
- SX1278 433MHz LoRa-Modul - 2 Nr
- 433 MHz LoRa-Antenne - 2Nos
- Arduino UNO- oder andere Version
- Himbeer Pi 3
Es wird davon ausgegangen, dass Ihr Raspberry Pi bereits mit einem Betriebssystem geflasht ist und eine Verbindung zum Internet herstellen kann. Wenn nicht, befolgen Sie das Tutorial Erste Schritte mit Raspberry Pi, bevor Sie fortfahren. Hier verwenden wir Rasbian Jessie installiert Raspberry Pi 3.
Warnung: Verwenden Sie Ihr SX1278 LoRa-Modul immer mit 433-MHz-Antennen. Andernfalls kann das Modul beschädigt werden.
Raspberry Pi mit LoRa verbinden
Bevor wir uns mit den Softwarepaketen befassen, bereiten wir die Hardware vor. Das SX1278 ist ein 16- poliges Lora-Modul, das über SPI auf 3,3-V-Logik kommuniziert. Der Raspberry pi arbeitet auch mit einem 3,3-V-Logikpegel und verfügt über einen eingebauten SPI-Anschluss und einen 3,3-V-Regler. So können wir das LoRa-Modul direkt mit dem Raspberry Pi verbinden. Die Verbindungstabelle ist unten dargestelltHimbeer-Pi | Lora - SX1278 Modul |
3,3V | 3,3V |
Boden | Boden |
GPIO 10 | MOSI |
GPIO 9 | MISO |
GPIO 11 | SCK |
GPIO 8 | Nss / Enable |
GPIO 4 | DIO 0 |
GPIO 17 | DIO 1 |
GPIO 18 | DIO 2 |
GPIO 27 | DIO 3 |
GPIO 22 | RST |
Sie können auch den folgenden Schaltplan als Referenz verwenden. Man beachte, dass der Schaltplan erstellt wurde, die unter Verwendung von RFM9x Modul, das auf den sehr ähnlich ist SX1278 Modul, daher könnte Aussehen im Bild unten abweichen.
Die Verbindungen sind ziemlich einfach. Das einzige Problem, mit dem Sie möglicherweise konfrontiert sind, ist, dass der SX1278 nicht mit Steckbrettern kompatibel ist. Daher müssen Sie Verbindungskabel direkt verwenden, um die Verbindungen herzustellen, oder zwei kleine Steckbretter verwenden, wie unten gezeigt. Außerdem schlagen nur wenige Leute vor, das LoRa-Modul mit einer separaten 3,3-V-Stromschiene zu versorgen, da der Pi möglicherweise nicht genügend Strom liefern kann. Da Lora ein Low-Power-Modul ist, sollte es auf der 3,3-V-Schiene von Pi funktionieren. Ich habe dasselbe getestet und festgestellt, dass es problemlos funktioniert. Aber nehmen Sie es trotzdem mit einer Prise Salz. Mein Verbindungsaufbau von LoRa mit Raspberry pi sieht ungefähr so aus
Arduino mit LoRa verbinden
Die Verbindung für das Arduino-Modul bleibt die gleiche wie in unserem vorherigen Tutorial. Der einzige Unterschied besteht darin, dass wir anstelle der Bibliothek von Sandeep Mistry die Rspreal-Bibliothek verwenden, die auf Radio Head basiert und die wir später in diesem Projekt diskutieren werden. Die Schaltung ist unten angegeben
Auch hier können Sie den 3,3-V-Pin von Arduino Uno oder einen separaten 3,3-V-Regler verwenden. In diesem Projekt habe ich den integrierten Spannungsregler verwendet. Die unten stehende Pin-Verbindungstabelle soll Ihnen helfen, die Verbindungen einfach herzustellen.
LoRa SX1278-Modul | Arduino UNO Board |
3,3V | 3,3V |
Gnd | Gnd |
En / Nss | D10 |
G0 / DIO0 | D2 |
SCK | D13 |
MISO | D12 |
MOSI | D11 |
RST | D9 |
Da das Modul nicht in ein Steckbrett passt, habe ich die Verbindungsdrähte direkt verwendet, um die Verbindungen herzustellen. Sobald die Verbindung hergestellt ist, sieht das Arduino LoRa- Setup ungefähr so aus
pyLoRa für Raspberry Pi
Es gibt viele Python-Pakete, die Sie mit LoRa verwenden können. Außerdem wird der Raspberry Pi häufig als LoRaWAN verwendet, um Daten von mehreren LoRa-Knoten abzurufen. In diesem Projekt ist es jedoch unser Ziel, Peer-to-Peer-Kommunikation zwischen zwei Raspberry Pi-Modulen oder zwischen einem Raspberry Pi und einem Arduino durchzuführen. Also habe ich mich für das pyLoRa-Paket entschieden. Es verfügt über ein rpsreal LoRa Arduino- und ein rpsreal LoRa Raspberry Pi-Modul, die in der Arduino- und der Raspberry Pi-Umgebung verwendet werden können. Konzentrieren wir uns zunächst auf die Raspberry Pi-Umgebung.
Konfigurieren des Raspberry Pi für LoRa-Moduls
Wie bereits erwähnt, funktioniert das LoRa-Modul mit der SPI-Kommunikation. Daher müssen wir SPI auf Pi aktivieren und dann das Pylora- Paket installieren. Führen Sie die folgenden Schritte aus, um dasselbe zu tun, nachdem Sie das Terminalfenster von Pi geöffnet haben. Wieder verwende ich Kitt, um mich mit meinem Pi zu verbinden. Sie können Ihre bequeme Methode verwenden.
Schritt 1: Rufen Sie das Konfigurationsfenster mit dem folgenden Befehl auf. Um das folgende Fenster zu erhalten
sudo raspi-config
Schritt 2: Navigieren Sie zu den Schnittstellenoptionen und aktivieren Sie SPI wie in der Abbildung unten gezeigt. Wir müssen die SPI-Schnittstelle aktivieren, da LCD und PI, wie bereits erwähnt, über das SPI-Protokoll kommunizieren
Schritt 3: Speichern Sie die Änderungen und kehren Sie zum Terminalfenster zurück. Stellen Sie sicher, dass pip und python aktualisiert sind, und installieren Sie das RPi.GPIO- Paket mit dem folgenden Befehl.
pip installiere RPi.GPIO
Diese Paketklasse hilft uns, den GPIO-Pin auf dem Pi zu steuern. Nach erfolgreicher Installation sieht Ihr Bildschirm folgendermaßen aus
Schritt 4: Fahren Sie in ähnlicher Weise mit der Installation des spidev- Pakets mit dem folgenden Befehl fort. Spidev ist eine Python-Bindung für Linux, mit der SPI-Kommunikation auf Raspberry Pi durchgeführt werden kann.
pip install spidev
Wenn die Installation erfolgreich ist, sollte das Terminal wie folgt aussehen.
Schritt 5: Als Nächstes können Sie das pyLoRa-Paket mit dem folgenden Befehl pip installieren. Dieses Paket installiert die mit LoRa verknüpften Funkmodelle.
pip install pyLoRa
Wenn die Installation erfolgreich ist, wird der folgende Bildschirm angezeigt.
Das PyLoRa-Paket unterstützt auch verschlüsselte Kommunikation, die nahtlos mit Arduino und Raspberry Pi verwendet werden kann. Dies verbessert die Datensicherheit in Ihrer Kommunikation. Nach diesem Schritt müssen Sie jedoch ein separates Paket installieren, was ich nicht mache, da die Verschlüsselung nicht im Umfang dieses Tutorials enthalten ist. Sie können den obigen Github-Links folgen, um weitere Informationen zu erhalten.
Nach diesem Schritt können Sie die Paketpfadinformationen zu pi hinzufügen und es mit dem am Ende angegebenen Python-Programm versuchen. Ich konnte den Pfad jedoch nicht erfolgreich hinzufügen und musste daher die Bibliothek manuell herunterladen und direkt für meine Programme verwenden. Also musste ich mit den folgenden Schritten fortfahren
Schritt 6: Laden Sie das Paket python-rpi.gpio und das Paket spidev mit dem folgenden Befehl herunter und installieren Sie es.
sudo apt-get installiere python-rpi.gpio python3-rpi.gpio sudo apt-get installiere python-spidev python3-spidev
Das Terminalfenster sollte nach beiden Installationen ungefähr so aussehen.
Schritt 7: Installieren Sie auch git und verwenden Sie es, um das Python-Verzeichnis für unseren Raspberry Pi zu klonen. Sie können dies mit den folgenden Befehlen tun.
sudo apt-get install git sudo git klon
Sobald dieser Schritt abgeschlossen ist , sollten Sie das SX127x-Unterverzeichnis im Raspberry Pi-Ausgangsordner finden. Dadurch werden alle erforderlichen Dateien mit der Bibliothek verknüpft.
Programmierung von Raspberry Pi für LoRa
Bei einer Peer-to-Peer-LoRa-Kommunikation wird das Modul, das die Informationen überträgt, als Server und das Modul, das die Informationen empfängt, als Client bezeichnet. In den meisten Fällen wird der Arduino vor Ort mit einem Sensor zum Messen von Daten verwendet, und der Pi wird zum Empfangen dieser Daten verwendet. Daher habe ich mich in diesem Tutorial für den Raspberry Pi als Client und den Arduino als Server entschieden. Das vollständige Raspberry Pi-Client-Programm finden Sie unten auf dieser Seite. Hier werde ich versuchen, die wichtigen Zeilen im Programm zu erklären.
Achtung: Stellen Sie sicher, dass sich die Programmdatei in demselben Verzeichnis befindet, in dem sich der SX127x-Bibliotheksordner befindet. Sie können diesen Ordner kopieren und überall verwenden, wenn Sie das Projekt portieren möchten.
Das Programm ist ziemlich einfach. Wir müssen das LoRa-Modul so einstellen, dass es mit 433 MHz arbeitet, und dann auf eingehende Pakete warten. Wenn wir etwas erhalten, drucken wir es einfach auf die Konsole. Wie immer beginnen wir das Programm mit dem Import der erforderlichen Python-Bibliotheken.
ab Zeit importieren Schlaf von SX127x.LoRa importieren * von SX127x.board_config importieren BOARD BOARD.setup ()
In diesem Fall wird das Zeitpaket zum Erstellen von Verzögerungen verwendet, das Lora-Paket wird für die LoRa-Kommunikation verwendet und die board_config wird zum Festlegen der Board- und LoRa-Parameter verwendet. Wir richten die Karte auch mit der Funktion BOARD.setup () ein .
Als nächstes erstellen wir die Python LoRa-Klasse mit drei Definitionen. Da wir nur einrücken, damit das Programm als Himbeer-Client funktioniert, hat die Klasse nur drei Funktionen, nämlich die init-Klasse, die start-Klasse und die on_rx_done- Klasse. Die init-Klasse initialisiert das LoRa-Modul in 433 MHz mit einer Bandbreite von 125 kHz, wie in der Methode set_pa_config festgelegt . Anschließend wird das Modul in den Ruhemodus versetzt, um Strom zu sparen.
# Die Standardeinstellungen für den mittleren Bereich nach init sind 434,0 MHz, Bw = 125 kHz, Cr = 4/5, Sf = 128 Chips / Symbol, CRC auf 13 dBm lora.set_pa_config (pa_select = 1) def __init __ (self, verbose = False): super (LoRaRcvCont, self).__ init __ (ausführlich) self.set_mode (MODE.SLEEP) self.set_dio_mapping (* 6)
Die Startfunktion ist, wo wir das Modul als Empfänger und erhalten wie RSSI (Empfangssignalstärke - Indikator), Status, Betriebsfrequenz usw. konfigurieren. Wir stellen das Modul so ein, dass es im kontinuierlichen Empfängermodus (RXCONT) aus dem Ruhemodus arbeitet, und verwenden dann eine while-Schleife, um Werte wie RSSI und Modemstatus zu lesen. Wir spülen auch die Daten im seriellen Puffer auf das Terminal.
def start (self): self.reset_ptr_rx () self.set_mode (MODE.RXCONT) während True: sleep (.5) rssi_value = self.get_rssi_value () status = self.get_modem_status () sys.stdout.flush ()
Schließlich wird die Funktion on_rx_done ausgeführt, nachdem das eingehende Paket gelesen wurde. In dieser Funktion werden die empfangenen Werte aus dem Empfangspuffer in eine Variable namens Payload verschoben, nachdem das Empfangsflag hoch gesetzt wurde. Dann werden die empfangenen Werte mit utf-8 decodiert, um vom Benutzer lesbare Daten auf der Shell zu drucken. Wir versetzen das Modul auch wieder in den Ruhemodus, bis ein anderer Wert empfangen wird.
def on_rx_done (self): print ("\ nReceived:") self.clear_irq_flags (RxDone = 1) payload = self.read_payload (nocheck = True) print (Bytes (payload).decode ("utf-8", 'ignore'))) self.set_mode (MODE.SLEEP) self.reset_ptr_rx () self.set_mode (MODE.RXCONT)
Der verbleibende Teil des Programms besteht lediglich darin , die empfangenen Werte auf der Konsole auszudrucken und das Programm mit einem Tastaturinterrupt zu beenden. Wir versetzen die Karte auch nach Beendigung des Programms wieder in den Ruhemodus, um Strom zu sparen.
versuchen Sie: lora.start () außer KeyboardInterrupt: sys.stdout.flush () print ("") sys.stderr.write ("KeyboardInterrupt \ n") schließlich: sys.stdout.flush () print ("") lora. set_mode (MODE.SLEEP) BOARD.teardown ()
Arduino Code für LoRa zur Kommunikation mit Raspberry Pi
Wie bereits erwähnt, unterstützt der rpsreal- Code sowohl Arduino als auch Pi, sodass eine Kommunikation zwischen Arduino und Pi möglich ist. Es basiert auf der Radiohead Library von AirSpayce. Sie müssen also zuerst die Funkkopfbibliothek auf Ihrer Arduino IDE installieren.
Besuchen Sie dazu die Github-Seite und laden Sie die Bibliothek im ZIP-Ordner herunter. Legen Sie es dann in den Bibliotheksordner Ihrer Arduino IDE. Starten Sie nun die Arduino IDE neu und Sie finden Beispieldateien für die Radio Head Library. Hier programmieren wir den Arduino so, dass er als LoRa-Server arbeitet, um Testpakete wie 0 bis 9 zu senden. Der vollständige Code, um dasselbe zu tun, befindet sich wie immer unten auf dieser Seite. Hier werde ich einige wichtige Zeilen im Programm erklären.
Wir beginnen das Programm mit dem Import der SPI-Bibliothek (standardmäßig installiert), um das SPI-Protokoll zu verwenden, und dann der RH_RF95-Bibliothek von Radio Head, um die LoRa-Kommunikation durchzuführen. Dann definieren wir, mit welchem Pin von Arduino wir den Pin Select (CS), Reset (RST) und Interrupt (INT) Pin des LoRa mit Arduino verbunden haben. Schließlich definieren wir auch, dass das Modul mit einer Frequenz von 434 MHz arbeiten soll, und initialisieren das LoRa-Modul.
#einschließen
Innerhalb der Setup- Funktion setzen wir das LoRa-Modul zurück, indem wir seinen Reset-Pin 10 Millisekunden lang auf Low ziehen, um neu zu starten. Dann initialisieren wir es mit dem Modul, das wir zuvor mit der Radio Head Library erstellt haben. Anschließend stellen wir die Frequenz und Sendeleistung für den LoRa-Server ein. Je höher die Übertragungsentfernung, desto mehr werden Ihre Pakete zurücklegen, verbrauchen jedoch mehr Strom.
void setup () { // Serial Monitor initialisieren Serial.begin (9600); // LoRa-Modul zurücksetzen pinMode (RFM95_RST, OUTPUT); digitalWrite (RFM95_RST, LOW); Verzögerung (10); digitalWrite (RFM95_RST, HIGH); Verzögerung (10); // LoRa-Modul initialisieren while (! Rf95.init ()) { Serial.println ("LoRa-Funkinitialisierung fehlgeschlagen"); während (1); } // Standardfrequenz 434,0 MHz einstellen if (! Rf95.setFrequency (RF95_FREQ)) { Serial.println ("setFrequency failed"); während (1); } rf95.setTxPower (18); // Sendeleistung des Lora-Moduls }
Innerhalb der Endlosschleifenfunktion müssen wir das Datenpaket einfach über das LoRa-Modul senden. Diese Daten können so etwas wie der Sensorwert des Benutzerbefehls sein. Der Einfachheit halber senden wir den Zeichenwert 0 bis 9 für jedes 1-Sekunden-Intervall und initialisieren den Wert nach Erreichen von 9 wieder auf 0. Beachten Sie, dass die Werte nur in einem Zeichenarray-Format gesendet werden können und der Datentyp unit8_t sein sollte ist jeweils 1 Byte. Der Code, um dasselbe zu tun, ist unten gezeigt
void loop () { Serial.print ("Send:"); char radiopacket = char (Wert)}; rf95.send ((uint8_t *) radiopacket, 1); Verzögerung (1000); Wert ++; if (Wert> '9') Wert = 48; }}
Testen der LoRa-Kommunikation zwischen Raspberry Pi und Arduino
Nachdem wir sowohl unsere Hardware als auch unser Programm fertig haben, müssen wir einfach den Arduino-Code auf das UNO-Board hochladen und die Python-Skizze sollte auf pi gestartet werden. Mein Testaufbau mit beiden angeschlossenen Hardware sieht ungefähr so aus
Sobald die Python-Client-Skizze auf dem Pi gestartet wurde (verwenden Sie nur Python 3), sollten Sie, wenn alles ordnungsgemäß funktioniert, die in pi empfangenen Arduino-Pakete über das Shell-Fenster sehen. Sie sollten "Received: 0" bis 9 wie in der Abbildung unten gezeigt bemerken.
Der vollständige Raspberry Pi-Code mit allen erforderlichen Bibliotheken kann hier heruntergeladen werden.
Sie können jetzt den Arduino-Server verschieben und den Bereich des Moduls überprüfen. Bei Bedarf kann der RSSI-Wert auch auf der Shell angezeigt werden. Die vollständige Arbeitsweise des Projekts finden Sie im unten verlinkten Video. Nachdem wir nun wissen, wie man eine LoRa-Fernkommunikation mit geringem Stromverbrauch zwischen Arduino und Raspberry pi herstellt, können wir einen Sensor auf der Arduino-Seite und eine Cloud-Plattform auf der Pi-Seite hinzufügen, um ein vollständiges IoT-Paket zu erstellen.
Ich hoffe, Sie haben das Projekt verstanden und es genossen, es zu bauen. Wenn Sie Probleme haben, es zum Laufen zu bringen, verwenden Sie den Kommentarbereich unten oder die Foren für andere technische Fragen.