- Nødvendig materiale
- Koble Raspberry Pi med LoRa
- Koble Arduino med LoRa
- pyLoRa for Raspberry Pi
- Konfigurere Raspberry Pi for LoRa-modulen
- Programmering Raspberry Pi for LoRa
- Arduino-kode for LoRa for å kommunisere med Raspberry Pi
- Testing av LoRa-kommunikasjon mellom Raspberry Pi og Arduino
LoRa blir stadig mer populært med fremveksten av IoT, Connected Cars, M2M, Industry 4.0 etc. På grunn av sin evne til å kommunisere til lange avstander med veldig mindre strøm, brukes den fortrinnsvis av designere til å sende / motta data fra et batteridrevet Thing. Vi har allerede diskutert det grunnleggende om LoRa og hvordan du bruker LoRa med Arduino. Selv om teknologien opprinnelig er ment for en LoRa-node for å kommunisere med en LoRa-gateway, er det mange scenarier der en LoRa-node må kommunisere med en annen LoRa-node for å utveksle informasjon over lang avstand. Så i denne opplæringen vil vi lære hvordan du bruker en LoRa-modul SX1278 med Raspberry pifor å kommunisere med en annen SX1278 koblet til en mikrokontroller som Arduino. Denne metoden kan være nyttig mange steder siden Arduino kan fungere som en server for å hente data fra sensorer og sende den til Pi over lang avstand gjennom LoRa, og deretter kan Pi som fungerer som klient motta denne informasjonen og laste den opp til kunne siden den har tilgang til internett. Høres interessant ut, ikke sant? Så la oss komme i gang.
Nødvendig materiale
- SX1278 433MHz LoRa-modul - 2 nr
- 433MHz LoRa-antenne - 2Nos
- Arduino UNO- eller annen versjon
- Raspberry Pi 3
Det antas at Raspberry Pi allerede har blinket med et operativsystem og er i stand til å koble til internett. Hvis ikke, følg veiledningen Komme i gang med Raspberry Pi før du fortsetter. Her bruker vi Rasbian Jessie installert Raspberry Pi 3.
Advarsel: Bruk alltid SX1278 LoRa-modulen med 433 MHz-antenner; ellers kan modulen bli skadet.
Koble Raspberry Pi med LoRa
Før vi går inn i programvarepakkene, la oss gjøre maskinvaren klar. Den SX1278 er et 16-pinners Lora modul som kommuniserer ved hjelp SPI på 3.3V Logic. Raspberry pi opererer også på 3,3 V logisk nivå og har også innebygd SPI-port og 3,3 V regulator. Så vi kan koble LoRa-modulen direkte til Raspberry Pi. Tilkoblingstabellen er vist nedenforBringebær Pi | Lora - SX1278-modul |
3,3V | 3,3V |
Bakke | Bakke |
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å bruke kretsskjemaet nedenfor for referanse. Merk at kretsskjemaet ble opprettet ved hjelp av RFM9x-modulen, som er veldig lik SX1278-modulen, og utseendet kan derfor variere i bildet nedenfor.
Tilkoblingene er ganske rett frem, det eneste problemet du kan møte er at SX1278 ikke er brødbordkompatibel, derfor må du bruke tilkoblingskabler direkte for å opprette tilkoblinger eller bruke to små brødbord som vist nedenfor. Også få mennesker foreslår å drive LoRa-modulen med separat 3,3 V strømskinne, da Pi kanskje ikke kan skaffe nok strøm. Imidlertid, Lora som en laveffektsmodul, burde fungere på 3.3V-skinnen til Pi, jeg testet det samme og fant ut at det fungerte uten problemer. Men ta det fremdeles med en klype salt. Min tilkoblingsoppsett av LoRa med Raspberry pi ser omtrent slik ut nedenfor
Koble Arduino med LoRa
Tilkoblingen for Arduino-modulen forblir den samme som den vi brukte i vår forrige opplæring. Den eneste forskjellen vil være i stedet for å bruke biblioteket fra Sandeep Mistry, vi vil bruke Rspreal-biblioteket basert på Radio-hodet som vi vil diskutere senere i dette prosjektet. Kretsen er gitt nedenfor
Igjen kan du bruke 3.3V-pinnen på Arduino Uno eller bruke en separat 3.3V-regulator. I dette prosjektet har jeg brukt den innebygde spenningsregulatoren. Pin-tilkoblingstabellen er gitt nedenfor for å hjelpe deg med å gjøre tilkoblingene enkelt.
LoRa SX1278-modul | Arduino UNO-styret |
3,3V | 3,3V |
Gnd | Gnd |
En / Nss | D10 |
G0 / DIO0 | D2 |
SCK | D13 |
MISO | D12 |
MOSI | D11 |
RST | D9 |
Siden modulen ikke passer i et brødbrett, har jeg brukt tilkoblingskablene direkte for å lage tilkoblingene. Når forbindelsen er opprettet, vil Arduino LoRa- oppsett se ut som dette nedenfor
pyLoRa for Raspberry Pi
Det er mange pythonpakker du kan bruke med LoRa. Også Raspberry Pi brukes ofte som LoRaWAN for å få data fra flere LoRa-noder. Men i dette prosjektet er vårt mål å gjøre Peer to Peer-kommunikasjon mellom to Raspberry Pi-moduler eller mellom en Raspberry Pi og en Arduino. Så jeg bestemte meg for å bruke pyLoRa-pakken. Den har en rpsreal LoRa Arduino og rpsreal LoRa Raspberry pi-moduler som kan brukes på Arduino og Raspberry Pi-miljøet. For nå, la oss fokusere på Raspberry Pi-miljøet.
Konfigurere Raspberry Pi for LoRa-modulen
Som fortalt tidligere modul arbeider med SPI kommunikasjon Lora, så vi må gjøre det mulig SPI på Pi og deretter installere pylora pakken. Følg trinnene nedenfor for å gjøre det samme etter at du har åpnet terminalvinduet til Pi. Igjen bruker jeg kitt for å koble til Pi-en din, du kan bruke den praktiske metoden din.
Trinn 1: Gå inn i konfigurasjonsvinduet ved hjelp av følgende kommando. For å få opp vinduet nedenfor
sudo raspi-config
Trinn 2: Naviger til grensesnittalternativer og aktiver SPI som vist på bildet nedenfor. Vi må aktivere SPI-grensesnittet fordi LCD og PI kommuniserer gjennom SPI-protokollen som vi diskuterte
Trinn 3: Lagre endringene og gå tilbake til terminalvinduet. Forsikre deg om at pip og python er oppdatert, og installer deretter RPi.GPIO- pakken med følgende kommando.
pip installere RPi.GPIO
Denne pakkeklassen vil hjelpe oss med å kontrollere GPIO-pinnen på Pi. Hvis du har installert skjermen, vil den se slik ut
Trinn 4: Fortsett med å installere spidev- pakken med følgende kommando. Spidev er en pythonbinding for Linux som kan brukes til å utføre SPI-kommunikasjon på Raspberry Pi.
pip install spidev
Hvis installasjonen er vellykket, skal terminalen se slik ut nedenfor.
Trinn 5: Neste kan vi installere pyLoRa-pakken ved hjelp av følgende pip-kommando. Denne pakken installerer radiomodellene tilknyttet LoRa.
pip installer pyLoRa
Hvis installasjonen er vellykket, vil du se følgende skjermbilde.
PyLoRa-pakken støtter også kryptert kommunikasjon som kan brukes med Arduino og Raspberry Pi sømløst. Dette vil forbedre datasikkerheten i kommunikasjonen din. Men du må installere en egen pakke etter dette trinnet, noe jeg ikke gjør siden kryptering ikke er innenfor rammen av denne opplæringen. Du kan følge ovennevnte github-lenker for mer informasjon.
Etter dette trinnet kan du legge til informasjon om pakkebanen til pi og prøve med python-programmet gitt på slutten. Men jeg klarte ikke å legge til banen med hell, og måtte derfor laste ned bibliotek manuelt og bruke det samme direkte til programmene mine. Så jeg måtte fortsette med følgende trinn
Trinn 6: Last ned og installer python-rpi.gpio-pakken og spidev-pakken ved hjelp av kommandoen nedenfor.
sudo apt-get install python-rpi.gpio python3-rpi.gpio sudo apt-get install python-spidev python3-spidev
Terminalvinduet skal vise noe slikt etter begge installasjonene.
Trinn 7: Installer også git og bruk den til å klone python-katalogen for vår Raspberry Pi. Du kan gjøre det ved hjelp av følgende kommandoer.
sudo apt-get install git sudo git klone
Når dette trinnet er fullført , bør du finne underkatalogen SX127x i Raspberry Pi-hjemmemappen. Dette vil ha alle nødvendige filer tilknyttet biblioteket.
Programmering Raspberry Pi for LoRa
I en peer to peer LoRa-kommunikasjon kalles modulen som overfører informasjonen en server og modulen som mottar informasjonen kalles en klient. I de fleste tilfeller vil Arduino brukes i felt med en sensor for å måle data, og Pi vil bli brukt til å motta disse dataene. Så jeg bestemte meg for å bruke Raspberry Pi som klient og Arduino som server i denne opplæringen. Hele Raspberry Pi-klientprogrammet finner du nederst på denne siden. Her vil jeg prøve å forklare de viktige linjene i programmet.
Forsiktig: Forsikre deg om at programfilen er i samme katalog som SX127x biblioteksmappen er tilstede. Du kan kopiere denne mappen og bruke den hvor som helst hvis du ønsker å portere prosjektet.
Programmet er ganske enkelt, vi må sette LoRa-modulen til å fungere i 433 MHz og deretter lytte etter innkommende pakker. Hvis vi mottar noe, skriver vi dem enkelt ut på konsollen. Som alltid starter vi programmet med å importere de nødvendige python-bibliotekene.
fra tid importerer søvn fra SX127x.LoRa import * fra SX127x.board_config import BOARD BOARD.setup ()
I dette tilfellet brukes tidspakken til å skape forsinkelser, Lora-pakken brukes til LoRa-kommunikasjon, og board_config brukes til å stille inn tavle- og LoRa-parametere. Vi setter også opp kortet med funksjonen BOARD.setup () .
Deretter lager vi python LoRa-klassen med tre definisjoner. Siden vi bare har innrykk for å få programmet til å fungere som en bringebærklient, har klassen bare tre funksjoner, nemlig init-klassen, startklassen og on_rx_done- klassen. Init-klassen initialiserer LoRa-modulen i 433MHz med 125kHz båndbredde som angitt i set_pa_config- metoden. Da setter den også modulen i hvilemodus for å spare strømforbruk.
# Medium Range Defaults after init er 434.0MHz, Bw = 125 kHz, Cr = 4/5, Sf = 128chips / symbol, CRC on 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)
Startfunksjonen er der vi konfigurerer modulen som mottaker og får som RSSI (mottaks signalstyrkeindikator), status, driftsfrekvens osv. Vi setter modulen til å fungere i kontinuerlig mottakermodus (RXCONT) fra hvilemodus, og bruker deretter en stund-loop for å lese verdier som RSSI og modemstatus. Vi skyller også dataene i den serielle bufferen 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 blir on_rx_done- funksjonen utført etter at den innkommende pakken er lest. I denne funksjonen blir de mottatte verdiene flyttet til en variabel kalt nyttelast fra Rx-bufferen etter å ha satt mottaksflagget høyt. Deretter dekodes de mottatte verdiene med utf-8 for å skrive ut lesbare data på skallet. Vi setter også modulen i hvilemodus til en annen verdi er mottatt.
def on_rx_done (self): print ("\ nMottatt:") self.clear_irq_flags (RxDone = 1) nyttelast = self.read_payload (nocheck = True) utskrift (byte (nyttelast).decode ("utf-8", 'ignorere'))) self.set_mode (MODE.SLEEP) self.reset_ptr_rx () self.set_mode (MODE.RXCONT)
Den gjenværende delen av programmet er bare å skrive ut de mottatte verdiene på konsollen og avslutte programmet ved hjelp av et tastaturavbrudd. Vi setter brettet igjen i hvilemodus selv etter avslutning av programmet for å spare strøm.
prøv: lora.start () unntatt KeyboardInterrupt: sys.stdout.flush () print ("") sys.stderr.write ("KeyboardInterrupt \ n") til slutt: sys.stdout.flush () print ("") lora. set_mode (MODE.SLEEP) BOARD.teardown ()
Arduino-kode for LoRa for å kommunisere med Raspberry Pi
Som jeg nevnte tidligere støtter rpsreal- koden både Arduino og Pi, og kommunikasjon mellom Arduino og Pi er derfor mulig. Det fungerer basert på Radiohead Library fra AirSpayce. Så du må installere radiohodebiblioteket først på Arduino IDE.
For å gjøre det, besøk Github-siden og last ned biblioteket i ZIP-mappen. Plasser den deretter i biblioteksmappen til din Arduino IDE. Start Arduino IDE på nytt, og du finner eksempler på filer for Radio head-biblioteket. Her vil vi programmere Arduino til å fungere som en LoRa-server for å sende testpakker som 0 til 9. Fullstendig kode for å gjøre det samme finner du nederst på denne siden som alltid. Her vil jeg forklare noen viktige linjer i programmet.
Vi starter programmet med å importere SPI-biblioteket (installert som standard) for å bruke SPI-protokollen og deretter RH_RF95-biblioteket fra Radio-hodet for å utføre LoRa-kommunikasjon. Deretter definerer vi hvilken pin av Arduino vi har koblet Chip select (CS), Reset (RST) og Interrupt (INT) pin av LoRa med Arduino. Til slutt definerer vi også at modulen skal fungere i 434MHz frekvens og initialisere LoRa-modulen.
#inkludere
Inne i oppsettfunksjonen vil vi tilbakestille LoRa-modulen ved å trekke tilbakestillingspinnen til lav i 10 milli sekund for å starte fersk. Deretter initialiserer vi den med modulen som vi opprettet tidligere ved hjelp av Radio head-bibliotek. Deretter setter vi frekvensen og overføringseffekten for LoRa-serveren. Høyere overføring mer avstand pakkene dine vil reise, men vil forbruke mer strøm.
ugyldig oppsett () { // Initialiser Serial Monitor Serial.begin (9600); // Tilbakestill LoRa-modul pinMode (RFM95_RST, OUTPUT); digitalWrite (RFM95_RST, LAV); forsinkelse (10); digitalWrite (RFM95_RST, HIGH); forsinkelse (10); // Initialiser LoRa-modul mens (! Rf95.init ()) { Serial.println ("LoRa radio init mislyktes"); mens (1); } // Still inn standardfrekvensen 434.0MHz hvis (! Rf95.setFrequency (RF95_FREQ)) { Serial.println ("setFrequency failed"); mens (1); } rf95.setTxPower (18); // Overføringskraft til Lora-modulen }
Inne i den uendelige sløyfefunksjonen , må vi ganske enkelt sende datapakken gjennom LoRa-modulen. Disse dataene kan være omtrent som sensorverdien til brukerkommandoen. Men for enkelhets skyld vil vi sende char-verdi 0 til 9 for hvert intervall på 1 sekund og deretter initialisere verdien tilbake til 0 etter å ha nådd 9. Vær oppmerksom på at verdiene bare kan sendes i et char-array-format, og datatypen skal være unit8_t som er 1 byte om gangen. Koden for å gjøre det samme er vist nedenfor
ugyldig sløyfe () { Serial.print ("Send:"); char radiopacket = char (verdi)}; rf95.send ((uint8_t *) radiopakke, 1); forsinkelse (1000); verdi ++; hvis (verdi> '9') verdi = 48; }
Testing av LoRa-kommunikasjon mellom Raspberry Pi og Arduino
Nå som vi har klargjort både maskinvare og program, må vi bare laste opp Arduino-koden til UNO-kortet, og pythonskissen skal lanseres på pi. Testoppsettet mitt med både tilkoblet maskinvare ser ut som dette nedenfor
Når python-klientskissen er lansert på Pi (bruk bare python 3), hvis alt fungerer som det skal, bør du se Arduino-pakkene mottatt i pi gjennom skallvinduet. Du bør legge merke til "Mottatt: 0" til 9 som vist på bildet nedenfor.
Den komplette Raspberry pi-koden med alle nødvendige biblioteker kan lastes ned herfra.
Du kan nå flytte Arduino-serveren og sjekke rekkevidden til modulen; det er også mulig å vise RSSI-verdien på skallet om nødvendig. Den komplette arbeider av prosjektet kan bli funnet i videoen linket under. Nå som vi vet hvordan vi skal etablere LoRa-kommunikasjon over lang avstand med lav effekt mellom Arduino og Raspberry pi, kan vi fortsette med å legge til sensor på Arduino-siden og skyplattform på Pi-siden for å lage en komplett IoT-pakke.
Håper du forsto prosjektet og likte å bygge det. Hvis du har problemer med å få det til å fungere, bruk kommentarseksjonen nedenfor eller forumene for andre tekniske spørsmål.