Übertragen Sie 900-MHz-LoRa-Frames überraschend weit ohne Funk (und andere Funk-Spielereien mit ADCs, PWMs und I2S/SPI-Bussen), einschließlich des Sendens anderer HF-Daten sowie des Empfangens von HF-Signalen (allerdings zugegebenermaßen kein LoRa-Empfänger).
Wenn Sie nach dem Hackaday 2024 Microcontroller Radio Talk suchen, können Sie hier klicken.
Wenn Sie nach LoLRa-Merch suchen (z. B. T-Shirts usw.), klicken Sie hier.
Notiz
Vorsicht
Da wir auf Harmonische und Aliasing angewiesen sind, liegen die von Ihrem Mikrocontroller ausgesendeten primären Frequenzkomponenten in Teilen des HF-Spektrums, in denen HF-Übertragungen verboten sind. Bitte filtern Sie Ihre Ausgabe oder führen Sie Ihre Tests in einem Bereich durch, in dem es unwahrscheinlich ist, dass signifikante HF-Austritte auftreten. Die gesamte EIRP-Leistung liegt im Allgemeinen bei ≪300uW über das gesamte Spektrum, verteilt auf Hunderte von Emissionsfrequenzen, aber es gibt praktisch keine Möglichkeit, dass ein Gerät, das bewusst auf diesen Frequenzen sendet, jemals die FCC Teil 15-Konformität erfüllen könnte, selbst mit Filterung.
Ich war schon immer fasziniert vom Senden und Empfangen von Funksignalen von Mikrocontrollern, die über keine eigene Funkhardware verfügen. Dieses Repo dient als Überblick über viele der Projekte, die ich für diese Dekodierung durchgeführt habe, zusammen mit Beispielcode (obwohl einige davon einer restriktiven Lizenz unterliegen).
Im Allgemeinen ist das Repo in viele Projekte aufgeteilt, jedoch nach Gerätetyp kategorisiert.
Nur-Firmware-LoRa-Übertragung für eine Vielzahl von Prozessoren. Senden Sie LoRa-Pakete ganz ohne Funk, Chips, externe Hardware oder integrierte Funkgeräte auf einer Vielzahl gängiger, kostengünstiger Prozessoren. Dieses Repository ist zwar nicht wirklich umwerfend, zeigt aber, wie Sie mithilfe eines Schieberegisters (z. B. I2S- oder SPI-Ports) oder einer APLL LoRa-Pakete senden können, die von handelsüblichen LoRa-Gateways und anderen Chips dekodiert werden können.
Es gibt zwei Hauptmodi, mit denen dieses Repository arbeitet.
Klicken Sie unten für die YouTube-Videoversion dieser Seite:
Jedes Mal, wenn ein Signal seinen Zustand von niedrig auf hoch oder von hoch auf niedrig ändert, entsteht eine Störung in den elektromagnetischen Feldern rund um dieses Kabel. Jederzeit. Der Unterschied besteht darin, dass Sie als Ingenieur Angst davor haben, es watschelnd unterdrücken und Angst vor den elektromagnetischen Störungen haben, die es verursachen könnte, oder werden Sie den Stier bei den Hörnern packen und einige künstlich hergestellte Signale aussenden? Die wichtigsten Prinzipien, die Sie verstehen müssen, sind:
Das zweite Prinzip ist die Signalmischung. Wenn Sie ein Signal erzeugen und es dann mit einer hohen Frequenz „mischen“, erhalten Sie ein „Bild“, das um diese hohe Frequenz gewickelt ist. Das Mischen kann mit Dioden, spezieller HF-Ausrüstung oder einfach nur durch Abtasten erfolgen, beispielsweise mithilfe eines Schieberegisters, das Bits mit einer konstanten Rate ausgibt.
Jetzt geschieht die wahre Magie, wenn Sie erkennen, dass diese beiden Prinzipien tatsächlich zusammenarbeiten. Sie erhalten ein Bild im Basisband, ein reflektiertes Bild um die Abtastfrequenz herum, dann um das Dreifache der Abtastfrequenz herum erhalten Sie zwei weitere Bilder, das Vorwärts- und das Rückwärtsbild. Und ×5 und ×7 usw.
Damit können wir mit einem ausreichend präzisen Takt beliebig jede gewünschte Frequenz erzeugen, vorausgesetzt, auf dem GPIO unseres Mikros ist noch genügend Bandbreite übrig, um sie zu erzeugen, selbst wenn das „eigentliche“ Signal, das wir erzeugen, eine viel, viel niedrigere Frequenz hat .
Interne Oszillatoren in Mikrocontrollern sind nicht nur ungenau, sie schwanken auch in der Frequenz. Vielleicht denken Sie, dass dies negativ ist, aber tatsächlich kann die Verwendung des in Mikros eingebauten internen Oszillators oft lebensrettend sein und Sie über EMI/EMV hinwegbringen. Da die internen Oszillatoren nicht nur ungenau, sondern auch zitternd sind, verhindern sie Harmonische einzelner Frequenzen weiter oben im Spektrum, weil die Taktrate so stark schwankt.
Kristallausgang:
RC-Ausgang:
Im folgenden Abschnitt erfahren Sie alles über die Funktionsweise von LoRa-Signalen und die Dinge, die Ihnen keiner der anderen Doktoranden im Internet jemals sagen wollte.
LoRa arbeitet typischerweise im 433-MHz- oder 900-MHz-Spektrum, normalerweise mit 125-kHz-Kanälen. Im Prinzip erzeugt LoRa Chirps, beginnend bei einer Frequenz, 62,5 kHz unter der Kanalmitte, und steigt dann über einen kurzen Zeitraum (1,024 uS bei SF7) bis zu 62,5 kHz über der Kanalmitte an.
Während LoRa mit vielen verschiedenen Kanalbreiten verwendet werden kann, werden 125 kHz und 500 kHz beide sehr gut unterstützt, während andere Kanalbreiten mit Routern wie dem LR9 nicht konfigurierbar sind.
Dieses Diagramm zeigt die Frequenz auf der X-Achse und die Zeit auf der Y-Achse (von oben nach unten)... Sie können Folgendes sehen:
Praktischerweise ist das Fenster für einen bestimmten Chirp abhängig vom Ausbreitungsfaktor stabil. Für das obige Paket ergeben sich mit SF7 1.024us pro Symbol oder für SF8 2.048us pro Symbol. Jedes Symbol/Chirp kann durch einen Phasenversatz eine Anzahl von Bits darstellen.
Die rohe „Phase“ eines Chirps ist grau codiert, um den Bitfehler zwischen den Bits besser auf höhere Schichten des Prozesses zu verteilen. Wenn Sie beispielsweise in Bezug auf die Phase, in der sich der Chirp Ihrer Meinung nach befindet, um eins daneben liegen, könnte er über einer Grenze von beispielsweise 0b1111 und 0b10000 liegen und 5-Bit-Fehler verursachen. Durch die Gray-Codierung werden die Bitfehler minimiert, die durch ein oder mehrere Abweichungen in der Phase entstehen.
Nachdem dieser rohe Bitstrom aus den einzelnen Chirps dekodiert und in LoRa-SDR-Code.h
de-grey-kodiert (siehe encodeHamming84sx
) wurde, transponieren/verschachteln wir die Bits, sodass jedes einzelne Symbol herausgenommen werden könnte (siehe diagonalInterleaveSx
). Verteilen Sie alle Fehler, damit ein einzelnes verlorenes Symbol wiederhergestellt und weiß gemacht werden kann (ich glaube, dass dies eigentlich ein wertloser Schritt in diesem Protokoll ist, korrigieren Sie mich, wenn ich falsch liege). Siehe Sx1272ComputeWhitening
. Oberhalb der Aufhellung befindet sich eine Fehlerkorrekturschicht, die dabei hilft, etwaige Bitfehler zu beheben, die auf einer niedrigeren Ebene auftreten können (siehe encodeFec
).
Insgesamt haben die Nachrichten einen Header und eine Nutzlast. Beachten Sie, dass dies etwas knifflig sein kann, da der Header manchmal andere Codierungseinstellungen verwendet als die Nutzlast. Und das ist es.
Sobald Sie richtig formatierte Pakete generiert haben, können Sie diese in Chirps kodieren und über die Leitung übertragen.
Eine detailliertere Ansicht des Protokolls finden Sie hier für eine akademischere Sichtweise und hier für einige bessere Beispiele (obwohl ich einige Probleme mit der Richtigkeit/Klarheit beider Dokumente festgestellt habe).
Ich habe das Projekt mit einem ESP32-S2 gestartet, um zu sehen, ob ich mithilfe der internen integrierten APLL ein Signal ausgeben und den APLL/2-Takt über den IOMUX weiterleiten kann, und die Antwort war, dass ich das könnte. Da dies eine einfache Rechteckwelle erzeugt und Rechteckwellen Oberwellen bei F×3, F×5, F×7 usw. im Spektrum oben haben, werden 69,53 MHz ausgegeben, wenn ich die APLL auf 139,06 MHz einstelle. Die 13. Harmonische ist 903,9 MHz oder der erste 125-kHz-LoRa-Kanal. Durch Abstimmen der niedrigstwertigen PLL-Steuerbits können wir sie dann von 903,9 MHz – 62,5 kHz auf 903,9 + 62,5 kHz abstimmen, indem wir die APLL auf 139,06 MHz – 9,62 kHz auf 139,06 MHz + 9,62 kHz abstimmen. Dadurch können wir die charakteristischen LoRa-Chirps erzeugen, und das ist tatsächlich empfangbar!
Der ESP32-S2 hat noch einen weiteren Trick: Der GPIO-Mux ist in der Lage, ein Signal oder die Umkehrung dieses Signals auszugeben. Auf diese Weise können wir das 139,06-MHz-Signal differenziell erzeugen und so die Ausgangsleistung um 3 dB steigern!
Es gibt jedoch Probleme mit dem ESP32-S2. Insbesondere Folgendes:
Darüber hinaus verfügen nur sehr wenige Prozessoren überhaupt über eine APLL, weshalb ich mich trotz dieses schnellen Erfolgs dazu entschlossen habe, weiterzumachen ...
Vor einigen Jahren habe ich eine Reihe von Projekten durchgeführt, bei denen die direkte Bitstream-Synthese für einige Dinge verwendet wurde, z. B. die Ausstrahlung von RF-Farb-NTSC-Fernsehen auf Kanal 3 mit einem ESP8266 oder die Verwendung von Ethernet-Paketen zur Übertragung von AM-Radio. Einer der netten Tricks besteht darin, dass die Übertragung eines Bitstroms über ein SPI- oder I2S-Schieberegister Aliasing bei der Abtastrate verursacht, mit Bildern bei F×3, F×5, F×7 usw. Aber das Tolle ist Ein Teil besteht darin, dass die Größe/Form der übertragenen Wellenform bei Bildern/Aliasnamen im Spektrum erhalten bleibt. Bei Kanal 3 wurde das 65-MHz-Signal um die 40-MHz-Abtastrate herum reflektiert. Harry Nyquist kann in eine Zitrone beißen.
Diese Technik bietet selbst in extrem schlechten Situationen ein unglaubliches Maß an Wiedergabetreue, was völlig unintuitiv ist. Sie können überraschend präzise Signale weit außerhalb aller Orte erzeugen, an denen Sie sie erwarten würden.
Es gibt mehrere Möglichkeiten, dies zu erreichen, aber normalerweise ist es mit einem Schieberegister am einfachsten. Ein Schieberegister wie das in einem I2S- oder SPI-Bus. Und wenn Sie DMA verwenden, können Sie das Schieberegister problemlos mit mehr Daten versorgen, ohne die CPU bei jedem Zyklus hochzufahren. Es gibt jedoch auch andere Möglichkeiten, beispielsweise das direkte Umschalten eines IO oder die Verwendung eines Timers, um einen IO zum richtigen Zeitpunkt ein- und auszuschalten. Am einfachsten ist es jedoch, Code zu schreiben, um einen Bitstrom zu generieren und ihn herauszuschieben.
Bei Schieberegistern müssen einige Überlegungen angestellt werden, z. B. die Sicherstellung, dass Endianness, Bitbreiten und Speicheranordnungen korrekt sind. Im Allgemeinen können Sie jedoch mithalten, es sei denn, es gibt eine Verzögerung, z. B. die Zeit zwischen den einzelnen Wörtern sind in der Regel in der Lage, ein Bitmuster am Ausgang ausreichend genau darzustellen, um es zu übertragen und aus einem Pin heraus zu verschieben.
Der im Video beschriebene „Lohrcut“ beinhaltet das Schreiben einer Funktion, die zu einem bestimmten Zeitpunkt die Amplitude eines Signals bestimmt. Diese Funktion kann dazu dienen, die Amplitude eines sehr hochfrequenten Signals zu bestimmen. Die Abtastrate kann dann jede physikalisch realisierbare Abtastrate sein, die verfügbar ist. Dadurch wird ein Abbild des Hochfrequenzsignals bei einem viel niedrigeren Frequenzsignal erstellt, das aus einer Leistung zwischen 0 und Fs/2 aufgebaut wird.
Ein weiteres Problem ist Flash, da auf einigen Systemen der Zugriff inkonsistent ist oder bei bestimmten Frequenzen nicht gut funktioniert. In solchen Fällen müssen die Tabellen wie beim ESP8266 in den RAM eingelesen und von dort abgespielt werden.
LoRa-Frames sind vollständig gekapselt. Wenn Sie wollten, könnten wir hier anhalten. Sie könnten sogar ein kommerzielles Gateway verwenden, aber ohne LoRaWAN könnten die Frames nicht an Broker wie The Things Network gesendet werden. Wenn Sie beispielsweise ein Raspberry Pi-Gateway betreiben, können Sie einfach alle alten LoRa-Frames akzeptieren, die Sie möchten. Wir sind jedoch noch einen Schritt weiter gegangen und haben die Weiterleitung der Pakete rund um die Welt unterstützt. LoRaWAN ist eine „Ende-zu-Ende“-Verschlüsselung, d. h. keiner Ihrer Nachbarn oder Gateways kann die Nachrichten lesen. Es ist jedoch merkwürdig: Das Things Network KANN Ihre Nachrichten lesen, weil es über die Verschlüsselungsschlüssel verfügt.
Praktischerweise können Sie GenerateLoRaWANPacket
in lib/lorawan_simple.h
aufrufen, das die gesamte erforderliche Kapselung übernimmt. Nutzen Sie einfach diese Funktion, um Ihre Frames zu generieren und zu übertragen!
Wir können diese Botschaften übermitteln. Cool. Aber um sie jetzt zu empfangen, benötigen wir entweder ein Gerät wie einen LILYGO® T-Beam Meshtastic oder ein Gateway wie einen MikroTik LR9. Letzteres ist hier wirklich interessant, da es Tausende davon auf der ganzen Welt gibt und sie mit dem Things Network verbunden sind. Das heißt, wenn wir ein ordnungsgemäß formatiertes LoRaWAN-Paket in Hörweite eines dieser Gateways übertragen, können wir den Frame anderswo auf dem Planeten empfangen!
Das Setup ist ziemlich unkompliziert. Sie müssen:
Notiz
Wir konzentrieren uns nur auf LoRa-Frames, die Frame-Zähler zurücksetzen. Wenn Sie jedoch die zuletzt übertragene Paket-ID im nichtflüchtigen Flash in Ihrem Teil speichern können, können Sie diesen Schritt vermeiden. Andernfalls ist Ihr Gerät Replay-Angriffen ausgesetzt.
Notiz
Wenn Sie den MikroTik LR9 verwenden, achten Sie darauf, ihn physisch zu öffnen und die interne Antenne anzuschließen. Ab Werk wird es mit dem Außenanschluss verbunden geliefert.
PRs sind offen, wenn Sie eines davon herausfinden können! Ich habe einfach die ganze Zeit, die ich vorhabe, in dieses Projekt investiert, bevor ich hier ankam.
Insbesondere für LoRa verhalten sich Wellen sehr gut und sollten mit Timer-Schaltkreisen im laufenden Betrieb vollständig erzeugbar sein und keine Vorberechnung erfordern, aber ich bin noch nicht dazu gekommen. Dadurch würde die Notwendigkeit entfallen, einen großen Tisch für die in ein Gerät eingeflashten Chirps zu haben.
Ich möchte auch versuchen, dieses Projekt mit maßgeschneiderten Bitmustern durchzuführen, die einfacher im laufenden Betrieb erstellt werden können. Abhängig von den genauen verwendeten Codes (möglicherweise durch den Einsatz von Technologien im Zusammenhang mit Goldcodes) könnte man sogar den gleichzeitigen Empfang vieler Signale mit genau derselben Codierung ermöglichen. Dies würde es durchaus sinnvoll machen, „printf“ auf Mikrocontrollern zu implementieren, die drahtlos von einem zentralen SDR mit sehr geringem Prozessorplatz- (und Leistungs-)Overhead empfangen werden können.
Darüber hinaus würde es Spaß machen, einen Filter hinzuzufügen oder vielleicht zu versuchen, einen Filter ohne Komponenten in eine Leiterplatte einzubauen.
Darüber hinaus wäre es sehr cool zu versuchen, einen Klasse-C-Verstärker für das 900-MHz-Signal zu bauen. Das wäre sehr cool, denn es könnte effizient, unglaublich günstig und einfach sein und außerdem einen Gewinn von bis zu 10–20 dB bieten!
Stadttests wurden am 23.02.2024, Vorstadttests am 26.02.2022 und Landtests am 27.02.2022 durchgeführt.
Bereiche sind Spitzenbereiche. Der zuverlässige Betrieb endet deutlich früher.
Für TTGO Lora32 wurde eine +3dBi-Antenne hinzugefügt. Beim MikroTik LR9 wurde die interne Antenne verwendet.
Datum | Absender | Empfänger | SF/CR | BW | Notiz | Reichweite | Durchschnittlicher End-RSSI/SNR | Basis |
---|---|---|---|---|---|---|---|---|
23.02.2024 | CH32V203 | MikroTik LR9 | SF8/CR48 | 125 | Innenstadt von Bellevue (städtisch) | 435' 132m | -98 / -9 | Boden |
23.02.2024 | CH32V203 | MikroTik LR9 | SF10/CR48 | 500 | Innenstadt von Bellevue (städtisch) | 435' 132m | -90 / -18 | Boden |
26.02.2024 | CH32V203 | TTGO Lora32 | SF8/CR48 | 125 | Miramont Park (heller Vorort + Wald) | >576' >176m | -134 / -12 | Boden |
26.02.2024 | CH32V203 | TTGO Lora32 | SF8/CR48 | 125 | Poo Poo Point Trailhead (ländlich) | >1117' >340m | -123 / -6 | Boden |
26.02.2024 | CH32V203 | TTGO Lora32 | SF8/CR48 | 125 | Vorort Issaquah (+Lichtbäume) | 2200' 669m | -133 / -10 | Boden |
27.02.2024 | CH32V203 | TTGO Lora32 | SF8/CR48 | 125 | Meadowbrook (ländlich) Rote längere Antenne | 2220' 677m | -135 / -13 | Drohne |
27.02.2024 | CH32V203 | TTGO Lora32 | SF10/CR48 | 500 | Meadowbrook (ländlich) Rote längere Antenne | 1752' 534m | -132 / -16 | Drohne |
27.02.2024 | CH32V203 | TTGO Lora32 | SF8/CR48 | 125 | Meadowbrook (ländlich) OVERVOLT 5V rote längere Antenne | 3996' 1218m | -131 / -12 | Drohne |
27.02.2024 | CH32V203 | TTGO Lora32 | SF8/CR48 | 125 | Graue, abgestimmte VNA-Antenne von Meadowbrook (ländlich). | 2719' 829m | -131 / -11 | Drohne |
27.02.2024 | ESP8266 bei 80 MHz | TTGO Lora32 | SF8/CR48 | 125 | Graue, abgestimmte VNA-Antenne von Meadowbrook (ländlich). | 2789' 850m | -138 / -13 | Drohne |
27.02.2024 | ESP8266 bei 173 MHz | TTGO Lora32 | SF7/CR48 | 125 | Graue, abgestimmte VNA-Antenne von Meadowbrook (ländlich). | 2812' 857m | -131 / -8 | Drohne |
27.02.2024 | ESP32-S2 + Bitenna | TTGO Lora32 | SF10/CR48 | 125 | Meadowbrook (ländlich) (Anmerkung 1) | 3428' 1044m | -137 / -13 | Boden |
27.02.2024 | ESP32-S2 + Bitenna | TTGO Lora32 | SF10/CR48 | 125 | Meadowbrook (ländlich) Leichter Niederschlag | >4895' >1492m | -130 / -8 | Drohne |
27.02.2024 | ESP32-S2 + Funtenna | TTGO Lora32 | SF10/CR48 | 125 | Wiesenbach (ländlich) Leichter Niederschlag | 705' / 215m | -139 / -15 | Drohne |
27.02.2024 | ESP32-S2 + Bitenna | TTGO Lora32 | SF10/CR48 | 125 | Snoqualmie Trail, Hundepark bis Ribary Creek (ländlich) Leichter Niederschlag | 8460' / 2580m | -141 / -16 | Drohne |