- Nødvendige materialer
- Forbinder Raspberry Pi med LoRa
- Forbinder Arduino med LoRa
- pyLoRa til Raspberry Pi
- Konfiguration af Raspberry Pi for LoRa-modulet
- Programmering af Raspberry Pi til LoRa
- Arduino-kode til LoRa til at kommunikere med Raspberry Pi
- Test af LoRa-kommunikation mellem Raspberry Pi og Arduino
LoRa bliver stadig mere populært med fremkomsten af IoT, Connected Cars, M2M, Industry 4.0 osv. På grund af sin evne til at kommunikere til lange afstande med meget mindre strøm bruges det fortrinsvis af designere til at sende / modtage data fra et batteridrevet ting. Vi har allerede diskuteret det grundlæggende i LoRa og hvordan man bruger LoRa med Arduino. Selvom teknologien oprindeligt er beregnet til en LoRa-node til at kommunikere med en LoRa-gateway, er der mange scenarier, hvor en LoRa-node skal kommunikere med en anden LoRa-node for at udveksle information over lang afstand. Så i denne vejledning lærer vi, hvordan man bruger et LoRa-modul SX1278 med Raspberry piat kommunikere med en anden SX1278 tilsluttet en mikrocontroller som Arduino. Denne metode kan komme til nytte mange steder, da Arduino kunne fungere som en server til at hente data fra sensorer og sende dem til Pi over en lang afstand gennem LoRa, og derefter kan Pi, der fungerer som klient, modtage disse oplysninger og uploade den til kunne da det har adgang til internet. Lyder interessant, ikke? Så lad os komme i gang.
Nødvendige materialer
- SX1278 433MHz LoRa-modul - 2 nr
- 433MHz LoRa-antenne - 2Nr
- Arduino UNO- eller anden version
- Hindbær Pi 3
Det antages, at din Raspberry Pi allerede har blinket med et operativsystem og er i stand til at oprette forbindelse til internettet. Hvis ikke, følg vejledningen Kom godt i gang med Raspberry Pi, inden du fortsætter. Her bruger vi Rasbian Jessie installeret Raspberry Pi 3.
Advarsel: Brug altid dit SX1278 LoRa-modul med 433 MHz-antenner; ellers kan modulet blive beskadiget.
Forbinder Raspberry Pi med LoRa
Lad os gøre hardwaren klar, før vi går ind i softwarepakkerne. Den SX1278 er en 16-polet Lora modul, der kommunikerer ved hjælp af SPI på 3.3V Logic. Raspberry pi fungerer også i 3.3V logikniveau og har også indbygget SPI-port og 3.3V regulator. Så vi kan forbinde LoRa-modulet direkte med Raspberry Pi. Forbindelsestabellen er vist nedenforHindbær Pi | Lora - SX1278-modul |
3.3V | 3.3V |
Jord | Jord |
GPIO 10 | MOSI |
GPIO 9 | MISO |
GPIO 11 | SCK |
GPIO 8 | Nss / Aktiver |
GPIO 4 | DIO 0 |
GPIO 17 | DIO 1 |
GPIO 18 | DIO 2 |
GPIO 27 | DIO 3 |
GPIO 22 | RST |
Du kan også bruge kredsløbsdiagrammet nedenfor til reference. Bemærk, at kredsløbsdiagrammet blev oprettet ved hjælp af RFM9x-modulet, der minder meget om SX1278-modulet, og derfor kan udseendet variere i nedenstående billede.
Forbindelserne er ret lige fremad, det eneste problem, du måske står over for, er, at SX1278 ikke er breadboard-kompatibel, hvorfor du skal bruge tilslutningsledninger direkte til at oprette forbindelser eller bruge to små breadboards som vist nedenfor. Også få mennesker foreslår at drive LoRa-modulet med separat 3,3 V strømskinne, da Pi muligvis ikke kan skaffe tilstrækkelig strøm. Men Lora, der er et laveffektmodul, skal fungere på Pi's 3.3V-skinne, jeg testede det samme og fandt det fungere uden problemer. Men tag det stadig med en knivspids salt. Min forbindelsesopsætning af LoRa med Raspberry pi ser sådan ud nedenfor
Forbinder Arduino med LoRa
Forbindelsen til Arduino-modulet forbliver den samme som den, vi brugte i vores tidligere tutorial. Den eneste forskel vil være i stedet for at bruge biblioteket fra Sandeep Mistry, vi bruger Rspreal-biblioteket baseret på Radio-hoved, som vi vil diskutere senere i dette projekt. Kredsløbet er nedenfor
Igen kan du bruge 3.3V-stiften på Arduino Uno eller bruge en separat 3.3V-regulator. I dette projekt har jeg brugt den indbyggede spændingsregulator. Pin-forbindelsestabellen er angivet nedenfor for at hjælpe dig med at gøre forbindelserne let.
LoRa SX1278-modul | Arduino UNO bestyrelse |
3.3V | 3.3V |
Gnd | Gnd |
En / Nss | D10 |
G0 / DIO0 | D2 |
SCK | D13 |
MISO | D12 |
MOSI | D11 |
RST | D9 |
Da modulet ikke passer i et brødbræt, har jeg brugt forbindelsesledningerne direkte til at oprette forbindelserne. Når forbindelsen er oprettet, vil Arduino LoRa- opsætningen se sådan ud nedenfor
pyLoRa til Raspberry Pi
Der er mange pythonpakker, som du kan bruge med LoRa. Også Raspberry Pi bruges ofte som en LoRaWAN til at hente data fra flere LoRa-noder. Men i dette projekt er vores mål at gøre Peer to Peer-kommunikation mellem to Raspberry Pi-moduler eller mellem en Raspberry Pi og en Arduino. Så jeg besluttede at bruge pyLoRa-pakken. Den har et rpsreal LoRa Arduino og rpsreal LoRa Raspberry pi-moduler, som kan bruges på Arduino og Raspberry Pi-miljøet. Lad os indtil videre fokusere på Raspberry Pi-miljøet.
Konfiguration af Raspberry Pi for LoRa-modulet
Som tidligere fortalt fungerer LoRa-modulet med SPI-kommunikation, så vi er nødt til at aktivere SPI på Pi og derefter installere pylora- pakken. Følg nedenstående trin for at gøre det samme efter åbning af terminalvinduet i Pi. Igen bruger jeg kit til at oprette forbindelse til min Pi, du kan bruge din bekvemme metode.
Trin 1: Gå ind i konfigurationsvinduet ved hjælp af følgende kommando. For at få nedenstående vindue
sudo raspi-config
Trin 2: Naviger til grænseflademuligheder, og aktiver SPI som vist på billedet nedenfor. Vi er nødt til at aktivere SPI-grænsefladen, fordi som vi diskuterede kommunikerer LCD og PI via SPI-protokol
Trin 3: Gem ændringerne, og kom tilbage til terminalvinduet. Sørg for, at pip og python opdateres, og installer derefter RPi.GPIO- pakken ved hjælp af følgende kommando.
pip installere RPi.GPIO
Denne pakkeklasse hjælper os med at kontrollere GPIO-pin på Pi. Hvis den er installeret, ser din skærm sådan ud
Trin 4: Fortsæt på samme måde med installation af spidev- pakken ved hjælp af følgende kommando. Spidev er en pythonbinding til Linux, som kan bruges til at udføre SPI-kommunikation på Raspberry Pi.
pip install spidev
Hvis installationen er vellykket, skal terminalen se sådan ud nedenfor.
Trin 5: Lad os derefter installere pyLoRa-pakken ved hjælp af følgende pip-kommando. Denne pakke installerer de radiomodeller, der er tilknyttet LoRa.
pip installer pyLoRa
Hvis installationen er vellykket, ser du følgende skærmbillede.
PyLoRa-pakken understøtter også krypteret kommunikation, som kan bruges med Arduino og Raspberry Pi problemfrit. Dette forbedrer datasikkerheden i din kommunikation. Men du skal installere en separat pakke efter dette trin, som jeg ikke laver, da kryptering ikke er inden for denne tutorial. Du kan følge ovenstående github-links for at få flere detaljer.
Efter dette trin kan du tilføje pakkeoplysninger til pi og prøve med det python-program, der er givet i slutningen. Men jeg kunne ikke tilføje stien med succes og måtte derfor manuelt downloade bibliotek og bruge det samme direkte til mine programmer. Så jeg måtte fortsætte med følgende trin
Trin 6: Download og installer python-rpi.gpio-pakken og spidev-pakken ved hjælp af nedenstående kommando.
sudo apt-get install python-rpi.gpio python3-rpi.gpio sudo apt-get install python-spidev python3-spidev
Terminalvinduet skal vise noget som dette efter begge installationerne.
Trin 7: Installer også git, og brug den derefter til at klone python-biblioteket til vores Raspberry Pi. Du kan gøre det ved hjælp af følgende kommandoer.
sudo apt-get install git sudo git klon
Når dette trin er afsluttet, skal du finde SX127x-undermappen i Raspberry Pi-hjemmemappen. Dette vil have alle de nødvendige filer tilknyttet biblioteket.
Programmering af Raspberry Pi til LoRa
I en peer-to-peer-LoRa-kommunikation kaldes det modul, der transmitterer informationen, en server, og det modul, der modtager informationen, kaldes en klient. I de fleste tilfælde vil Arduino blive brugt i marken med en sensor til at måle data, og Pi vil blive brugt til at modtage disse data. Så jeg besluttede at bruge Raspberry Pi som klient og Arduino som server i denne vejledning. Det komplette Raspberry Pi-klientprogram findes nederst på denne side. Her vil jeg prøve at forklare de vigtige linjer i programmet.
Forsigtig: Sørg for, at programfilen er i samme bibliotek, hvor SX127x-biblioteksmappen findes. Du kan kopiere denne mappe og bruge den hvor som helst, hvis du vil overføre projektet.
Programmet er ret simpelt, vi skal indstille LoRa-modulet til at arbejde i 433Mhz og derefter lytte efter indgående pakker. Hvis vi modtager noget, udskriver vi dem enkelt på konsollen. Som altid starter vi programmet med at importere de krævede pythonbiblioteker.
fra tid importerer sleep fra SX127x.LoRa import * fra SX127x.board_config import BOARD BOARD.setup ()
I dette tilfælde den tid pakke bliver brugt til at skabe forsinkelser, det Lora pakken er brugt til Lora kommunikation og board_config bruges til at indstille bestyrelsen og Lora parametre. Vi opsætter også tavlen ved hjælp af funktionen BOARD.setup () .
Dernæst opretter vi python LoRa-klassen med tre definitioner. Da vi kun indrykker for at få programmet til at fungere som en hindbærklient, har klassen kun tre funktioner, nemlig init-klassen, startklassen og on_rx_done- klassen. Init-klassen initialiserer LoRa-modulet i 433MHz med 125kHz båndbredde som angivet i set_pa_config- metoden. Derefter sætter det også modulet i dvaletilstand for at spare strømforbrug.
# Medium Range Standardværdier efter init er 434.0MHz, Bw = 125 kHz, Cr = 4/5, Sf = 128chips / symbol, CRC på 13 dBm lora.set_pa_config (pa_select = 1) def __init __ (self, verbose = False): super (LoRaRcvCont, self).__ init __ (verbose) self.set_mode (MODE.SLEEP) self.set_dio_mapping (* 6)
Startfunktionen er, hvor vi konfigurerer modulet som modtager og opnår ligesom RSSI (Modtagelses signalstyrkeindikator), status, driftsfrekvens osv. Vi indstiller modulet til at arbejde i kontinuerlig modtagertilstand (RXCONT) fra dvaletilstand og bruger derefter et stykke løb til at læse værdier som RSSI og modemstatus. Vi skyller også dataene i den serielle buffer ud på terminalen.
def start (selv): self.reset_ptr_rx () self.set_mode (MODE.RXCONT) mens True: sleep (.5) rssi_value = self.get_rssi_value () status = self.get_modem_status () sys.stdout.flush ()
Endelig bliver on_rx_done- funktionen udført, efter at den indkommende pakke er læst. I denne funktion flyttes de modtagne værdier til en variabel kaldet nyttelast fra Rx-bufferen efter at have indstillet det modtagende flag højt. Derefter dekodes de modtagne værdier med utf-8 for at udskrive en brugerlæsbar data på skallen. Vi sætter også modulet tilbage i dvaletilstand, indtil en anden værdi er modtaget.
def on_rx_done (self): print ("\ nModtaget:") self.clear_irq_flags (RxDone = 1) nyttelast = self.read_payload (nocheck = True) print (bytes (nyttelast).decode ("utf-8", 'ignorere'))) self.set_mode (MODE.SLEEP) self.reset_ptr_rx () self.set_mode (MODE.RXCONT)
Den resterende del af programmet er bare at udskrive de modtagne værdier på konsollen og afslutte programmet ved hjælp af en tastaturafbrydelse. Vi sætter tavlen igen i dvaletilstand, selv efter at programmet er afsluttet for at spare strøm.
prøv: lora.start () undtagen KeyboardInterrupt: sys.stdout.flush () print ("") sys.stderr.write ("KeyboardInterrupt \ n") endelig: sys.stdout.flush () print ("") lora. set_mode (MODE.SLEEP) BOARD.teardown ()
Arduino-kode til LoRa til at kommunikere med Raspberry Pi
Som jeg nævnte tidligere understøtter rpsreal- koden både Arduino og Pi, og derfor er kommunikation mellem Arduino og Pi mulig. Det fungerer baseret på Radiohead Library fra AirSpayce's. Så du skal først installere radiohovedbiblioteket på din Arduino IDE.
For at gøre det skal du besøge Github-siden og downloade biblioteket i ZIP-mappen. Placer den derefter i biblioteksmappen på din Arduino IDE. Genstart nu Arduino IDE, og du finder eksempler på filer til Radio-hovedbiblioteket. Her vil vi programmere Arduino til at fungere som en LoRa-server til at sende testpakker som 0 til 9. Den komplette kode til at gøre det samme findes nederst på denne side som altid. Her vil jeg forklare nogle få vigtige linjer i programmet.
Vi starter programmet med at importere SPI-biblioteket (installeret som standard) for at bruge SPI-protokollen og derefter RH_RF95-biblioteket fra Radio-hovedet for at udføre LoRa-kommunikation. Derefter definerer vi, hvilken pin Arduino vi har tilsluttet Chip select (CS), Reset (RST) og Interrupt (INT) pin på LoRa med Arduino. Endelig definerer vi også, at modulet skal fungere i 434MHz frekvens og initialisere LoRa-modulet.
#omfatte
Inde i opsætningsfunktionen nulstiller vi LoRa-modulet ved at trække dets reset-pin til lavt i 10 milli sekund for at starte frisk. Derefter initialiseres det med det modul, som vi oprettede tidligere ved hjælp af Radio-hovedbiblioteket. Derefter indstiller vi frekvensen og transmissionskraften til LoRa-serveren. Højere transmission mere afstand, dine pakker kører, men bruger mere strøm.
ugyldig opsætning () { // Initialiser Serial Monitor Serial.begin (9600); // Nulstil LoRa-modul pinMode (RFM95_RST, OUTPUT); digitalWrite (RFM95_RST, LOW); forsinkelse (10); digitalWrite (RFM95_RST, HIGH); forsinkelse (10); // Initialiser LoRa-modulet mens (! Rf95.init ()) { Serial.println ("LoRa radio init mislykkedes"); mens (1); } // Indstil standardfrekvensen 434.0MHz hvis (! Rf95.setFrequency (RF95_FREQ)) { Serial.println ("setFrequency failed"); mens (1); } rf95.setTxPower (18); // Lora-modulets transmissionskraft }
Inde i den uendelige loop- funktion skal vi simpelthen sende datapakken gennem LoRa-modulet. Disse data kan være ligesom sensorværdien af brugerkommandoen. Men for enkelhedens skyld sender vi char-værdi 0 til 9 for hvert 1 sekund-interval og initialiserer derefter værdien tilbage til 0 efter at have nået 9. Bemærk at værdierne kun kan sendes i et char-array-format, og datatypen skal være unit8_t det er 1 byte ad gangen. Koden til at gøre det samme vises nedenfor
ugyldig sløjfe () { Serial.print ("Send:"); char radiopacket = char (værdi)}; rf95.send ((uint8_t *) radiopakke, 1); forsinkelse (1000); værdi ++; hvis (værdi> '9') værdi = 48; }
Test af LoRa-kommunikation mellem Raspberry Pi og Arduino
Nu hvor vi både fik vores hardware og program klar, skal vi blot uploade Arduino-koden til UNO-kortet, og python-skitsen skal lanceres på pi. Min testopsætning med både hardware tilsluttet ser sådan ud nedenfor
Når python-klientskitsen er lanceret på Pi (brug kun python 3), hvis alt fungerer korrekt, skal du se Arduino-pakkerne modtaget i pi gennem shell-vinduet. Du skal bemærke "Modtaget: 0" til 9 som vist på billedet nedenfor.
Den komplette hindbær pi-kode med alle de nødvendige biblioteker kan downloades herfra.
Du kan nu flytte Arduino-serveren og kontrollere modulets rækkevidde; det er også muligt at vise RSSI-værdien på skallen, hvis det kræves. Den komplette bearbejdning af projektet kan findes i den linkede video nedenfor. Nu hvor vi ved, hvordan man opretter LoRa-kommunikation over lang afstand med lav effekt mellem Arduino og Raspberry pi, kan vi fortsætte med at tilføje sensor på Arduino-siden og skyplatform på Pi-siden for at lave en komplet IoT-pakke.
Håber du forstod projektet og nød at bygge det. Hvis du har problemer med at få det til at fungere, skal du bruge kommentarsektionen nedenfor eller foraerne til andre tekniske krav.