- Potrebni materiali
- Povezava Raspberry Pi z LoRa
- Povezovanje Arduina z LoRa
- pyLoRa za Raspberry Pi
- Konfiguriranje modula Raspberry Pi za LoRa
- Programiranje Raspberry Pi za LoRa
- Koda Arduino za LoRa za komunikacijo z Raspberry Pi
- Testiranje komunikacije LoRa med Raspberry Pi in Arduino
LoRa postaja vse bolj priljubljena s prihodom IoT, Connected Cars, M2M, Industry 4.0 itd. Zaradi svoje zmožnosti komuniciranja na velike razdalje z zelo malo moči jo oblikovalci raje uporabljajo za pošiljanje / sprejemanje podatkov iz baterije, ki jo poganja Thing. O osnovah LoRa in kako uporabljati LoRa z Arduinom smo že razpravljali. Čeprav je tehnologija prvotno namenjena vozlišču LoRa za komunikacijo s prehodom LoRa, obstaja veliko scenarijev, v katerih mora vozlišče LoRa komunicirati z drugim vozliščem LoRa za izmenjavo informacij na velike razdalje. Torej, v tej vadnici bomo izvedeli, kako uporabljati modul LoRa SX1278 z Raspberry piza komunikacijo z drugim SX1278, povezanim z mikrokrmilnikom, kot je Arduino. Ta metoda je lahko koristna marsikje, saj bi lahko Arduino deloval kot strežnik za pridobivanje podatkov s senzorjev in pošiljanje na daljinsko razdaljo prek LoRa, nato pa Pi, ki deluje kot odjemalec, lahko prejme te podatke in jih naloži na lahko, saj ima dostop do interneta. Sliši se zanimivo, kajne? Torej, začnimo.
Potrebni materiali
- SX1278 433MHz LoRa modul - 2 št
- 433MHz LoRa antena - 2 št
- Arduino UNO- ali druga različica
- Raspberry Pi 3
Predpostavlja se, da je vaš Raspberry Pi že nameščen z operacijskim sistemom in se lahko poveže z internetom. V nasprotnem primeru sledite navodilom za začetek uporabe Raspberry Pi. Tu uporabljamo Rasbian Jessie, nameščen Raspberry Pi 3.
Opozorilo: Modul SX1278 LoRa vedno uporabljajte s 433 MHz antenami; sicer se modul lahko poškoduje.
Povezava Raspberry Pi z LoRa
Preden vstopimo v programske pakete, pripravimo strojno opremo. SX1278 je 16-priklop A Lora modul, ki komunicira z uporabo SPI na 3.3V logika. Raspberry pi deluje tudi na 3.3V logični ravni in ima vgrajena vrata SPI in regulator 3.3V. Tako lahko modul LoRa neposredno povežemo z Raspberry Pi. Tabela povezav je prikazana spodajRaspberry Pi | Lora - modul SX1278 |
3.3V | 3.3V |
Tla | Tla |
GPIO 10 | MOSI |
GPIO 9 | MISO |
GPIO 11 | SCK |
GPIO 8 | Nss / Omogoči |
GPIO 4 | DIO 0 |
GPIO 17 | DIO 1 |
GPIO 18 | DIO 2 |
GPIO 27 | DIO 3 |
GPIO 22 | RST |
Za referenco lahko uporabite tudi spodnji diagram vezja. Shema vezja je bila ustvarjena z uporabo modula RFM9x, ki je zelo podoben modulu SX1278, zato se lahko videz na spodnji sliki razlikuje.
Povezave so precej naravnost, edina težava, s katero se lahko soočite, je ta, da SX1278 ni združljiv z nameščenimi ploščami, zato morate za povezave uporabiti neposredno povezovalne žice ali pa uporabite dve majhni plošči, kot je prikazano spodaj. Prav tako malo ljudi predlaga, da modul LoRa napajate z ločeno 3.3V napajalno tirnico, saj Pi morda ne bo mogel napajati dovolj toka. Kljub temu da bi Lora kot nizkoenergijski modul morala delati na 3.3V tirnici Pi, sem jo preizkusil in ugotovil, da deluje brez težav. Ampak, vseeno ga vzemite s ščepcem soli. Moja nastavitev povezave LoRa z Raspberry pi je videti spodaj približno tako
Povezovanje Arduina z LoRa
Povezava za modul Arduino ostaja enaka tisti, ki smo jo uporabili v prejšnji vadnici. Edina razlika bo v tem, da bomo namesto knjižnice Sandeep Mistry uporabili knjižnico Rspreal, ki temelji na radijski glavi, o čemer bomo razpravljali kasneje v tem projektu. Vezje je navedeno spodaj
Spet lahko uporabite 3,3 V pin na Arduino Uno ali uporabite ločen 3,3 V regulator. V tem projektu sem uporabil vgrajeni regulator napetosti. Spodnja tabela priključnih sponk je navedena za lažje povezovanje.
LoRa SX1278 modul | Odbor Arduino UNO |
3.3V | 3.3V |
Gnd | Gnd |
En / Nss | D10 |
G0 / DIO0 | D2 |
SCK | D13 |
MISO | D12 |
MOSI | D11 |
RST | D9 |
Ker modul ne ustreza plošči, sem za povezovanje uporabil neposredno povezovalne žice. Po vzpostavitvi povezave bo nastavitev Arduino LoRa spodaj videti približno tako
pyLoRa za Raspberry Pi
Obstaja veliko paketov python, ki jih lahko uporabljate z LoRa. Tudi Raspberry Pi se pogosto uporablja kot LoRaWAN za pridobivanje podatkov iz več vozlišč LoRa. Toda v tem projektu želimo doseči medsebojno komunikacijo med dvema moduloma Raspberry Pi ali med Raspberry Pi in Arduinom. Tako sem se odločil za uporabo paketa pyLoRa. Ima rpsreal LoRa Arduino in rpsreal LoRa Raspberry pi modula, ki se lahko uporabljata v okolju Arduino in Raspberry Pi. Zaenkrat se osredotočimo na okolje Raspberry Pi.
Konfiguriranje modula Raspberry Pi za LoRa
Kot smo že povedali, modul LoRa deluje s komunikacijo SPI, zato moramo omogočiti SPI na Pi in nato namestiti paket pylora . Sledite spodnjim korakom, da to storite po odprtju terminalskega okna Pi. Spet uporabljam kito za povezavo z mojim Pi-jem, ki ga lahko uporabite na svoj priročen način.
1. korak: Vstopite v konfiguracijsko okno z naslednjim ukazom. Da bi dobili spodnje okno
sudo raspi-config
2. korak: Pomaknite se do možnosti povezovanja in omogočite SPI, kot je prikazano na spodnji sliki. Moramo omogočiti SPI vmesnik, ker je, kot smo razpravljali o LCD in PI sporoci preko SPI protokol
3. korak: Shranite spremembe in se vrnite v okno terminala. Prepričajte se, da sta pip in python posodobljena, in nato z naslednjim ukazom namestite paket RPi.GPIO .
pip namestite RPi.GPIO
Ta razred paketov nam bo pomagal nadzorovati GPIO pin na Pi. Če je zaslon uspešno nameščen, bo videti tako
4. korak: Podobno nadaljujte z namestitvijo paketa spidev z naslednjim ukazom. Spidev je python vezava za Linux, ki jo lahko uporabimo za izvajanje SPI komunikacije na Raspberry Pi.
pip namestite spidev
Če je namestitev uspešna, mora biti terminal videti približno takole spodaj.
5. korak: Nato omogočite namestitev paketa pyLoRa z naslednjim ukazom pip. Ta paket namesti radijske modele, povezane z LoRa.
pip namestite pyLoRa
Če je namestitev uspešna, se prikaže naslednji zaslon.
Paket PyLoRa podpira tudi šifrirano komunikacijo, ki jo je mogoče brez težav uporabljati z Arduino in Raspberry Pi. To bo izboljšalo varnost podatkov v vaši komunikaciji. Toda po tem koraku morate namestiti ločen paket, česar jaz ne delam, saj šifriranje ni v obsegu te vadnice. Za več podrobnosti lahko sledite zgornjim povezavam github.
Po tem koraku lahko dodate podatke o poti paketa v pi in poskusite s programom python, navedenim na koncu. Toda poti nisem mogel uspešno dodati, zato sem moral ročno prenesti knjižnico in jo uporabiti neposredno za svoje programe. Zato sem moral nadaljevati z naslednjimi koraki
6. korak: Prenesite in namestite paket python-rpi.gpio in paket spidev z uporabo spodnjega ukaza.
sudo apt-get namestite python-rpi.gpio python3-rpi.gpio sudo apt-get namestite python-spidev python3-spidev
Okno terminala mora po obeh namestitvah prikazati nekaj takega.
7. korak: Namestite tudi git in ga nato uporabite za kloniranje imenika python za našo Raspberry Pi. To lahko storite z naslednjimi ukazi.
sudo apt-get install git sudo git klon
Ko je ta korak končan , v domači mapi Raspberry Pi poiščite podimenik SX127x. Tu bodo vse potrebne datoteke povezane s knjižnico.
Programiranje Raspberry Pi za LoRa
V medsebojni komunikaciji LoRa modul, ki prenaša informacije, imenujemo strežnik, modul, ki prejema informacije, pa odjemalec. V večini primerov bo Arduino uporabljen na terenu s senzorjem za merjenje podatkov, Pi pa za prejem teh podatkov. Tako sem se odločil, da v tej vadnici uporabim Raspberry Pi kot odjemalca in Arduino kot strežnik. Celoten program Raspberry Pi odjemalec lahko najdete na dnu te strani. Tu bom poskusil razložiti pomembne vrstice v programu.
Pozor: Preverite, ali je programska datoteka v istem imeniku, v katerem je mapa knjižnice SX127x. To mapo lahko kopirate in jo uporabite kjer koli, če želite prenesti projekt.
Program je precej preprost, modul LoRa moramo nastaviti tako, da deluje na 433 MHz, nato pa prisluhniti dohodnim paketom. Če kaj prejmemo, jih preprosto natisnemo na konzolo. Kot vedno začnemo program z uvozom zahtevanih knjižnic python.
od časa do uvoza spanje iz SX127x.LoRa uvoz * iz SX127x.board_config uvoz BOARD BOARD.setup ()
V tem primeru se za ustvarjanje zamud uporablja časovni paket, za komunikacijo LoRa se uporablja paket Lora, za nastavitev parametrov plošče in LoRa pa board_config. Prav tako nastavitev odbor z BOARD.setup () funkcijo.
Nato izdelamo razred python LoRa s tremi definicijami. Ker imamo samo zamik, da program deluje kot malinov odjemalec, ima razred le tri funkcije, in sicer razred init, razred start in on_rx_done . Razred init inicializira LoRa modul v 433MHz s pasovno širino 125kHz, kot je nastavljena v metodi set_pa_config . Nato modul tudi preklopi v način spanja, da prihrani porabo energije.
# Privzete privzete vrednosti za srednji doseg po vklopu so 434,0 MHz, Bw = 125 kHz, Cr = 4/5, Sf = 128 čipov / simbol, CRC na 13 dBm lora.set_pa_config (pa_select = 1) def __init __ (self, verbose = False): super (LoRaRcvCont, self).__ init __ (podrobno) self.set_mode (MODE.SLEEP) self.set_dio_mapping (* 6)
Funkcija zagona je, če modul konfiguriramo kot sprejemnik in dobimo RSSI (indikator moči sprejemnega signala), stanje, delovno frekvenco itd. Modul nastavimo tako, da deluje v načinu neprekinjenega sprejemnika (RXCONT) iz načina spanja, nato pa z zanko while beremo vrednosti, kot sta RSSI in stanje modema. Podatke v zaporedju medpomnilnika tudi splaknemo na terminal.
def start (self): self.reset_ptr_rx () self.set_mode (MODE.RXCONT) while True: sleep (.5) rssi_value = self.get_rssi_value () status = self.get_modem_status () sys.stdout.flush ()
Končno se funkcija on_rx_done zažene po branju dohodnega paketa. V tej funkciji se prejete vrednosti premaknejo v spremenljivko, imenovano koristni tovor, iz vmesnega pomnilnika Rx, potem ko je visoko zastavico sprejema. Nato prejete vrednosti dekodirajo z utf-8, da na lupino natisnejo uporabniku berljive podatke. Modul vrnemo tudi v način spanja, dokler ne prejmemo druge vrednosti.
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)
Preostali del programa je samo tiskanje prejetih vrednosti na konzolo in zaključek programa s prekinitvijo tipkovnice. Za varčevanje z energijo smo ploščo spet nastavili v način spanja tudi po prenehanju programa.
poskusite: lora.start () razen KeyboardInterrupt: sys.stdout.flush () print ("") sys.stderr.write ("KeyboardInterrupt \ n") končno: sys.stdout.flush () print ("") lora. set_mode (MODE.SLEEP) BOARD.teardown ()
Koda Arduino za LoRa za komunikacijo z Raspberry Pi
Kot sem že omenil, koda rpsreal podpira tako Arduino kot Pi, zato je možna komunikacija med Arduino in Pi. Deluje na podlagi knjižnice Radiohead iz AirSpayce's. Torej morate najprej namestiti knjižnico radijske glave v svoj Arduino IDE.
Če želite to narediti, obiščite stran Github in prenesite knjižnico v mapo ZIP. Nato ga položite v knjižnično mapo vašega Arduino IDE. Zdaj znova zaženite Arduino IDE in našli boste primere datotek za knjižnico radijske glave. Tu bomo Arduino programirali tako, da bo deloval kot strežnik LoRa za pošiljanje testnih paketov, kot je od 0 do 9. Celotno kodo, ki naredi enako, najdete na dnu te strani kot vedno. Tukaj bom razložil nekaj pomembnih vrstic v programu.
Program začnemo z uvozom knjižnice SPI (privzeto nameščene) za uporabo protokola SPI in nato knjižnice RH_RF95 iz radijske glave za izvajanje komunikacije LoRa. Nato določimo, na kateri pin Arduina smo povezali čip select (CS), Reset (RST) in Interrupt (INT) LoRa z Arduino. Na koncu določimo še, da mora modul delovati na frekvenci 434 MHz in inicializiramo modul LoRa.
#include
Znotraj nastavitvene funkcije bomo modul LoRa ponastavili tako, da ga za 10 milijonov sekund povlečemo na ponastavitveni zatič, da se začne nov. Nato ga inicializiramo z modulom, ki smo ga prej ustvarili s knjižnico Radio head. Nato nastavimo frekvenco in moč prenosa za strežnik LoRa. Višji kot je prenos, večjo razdaljo bodo prejeli vaši paketi, vendar bodo porabili več energije.
void setup () { // Inicializirajte Serial Monitor Serial.begin (9600); // Ponastavi modul LoRa pinMode (RFM95_RST, IZHOD); digitalWrite (RFM95_RST, LOW); zamuda (10); digitalWrite (RFM95_RST, HIGH); zamuda (10); // Inicializiramo LoRa modul, medtem ko (! Rf95.init ()) { Serial.println ("LoRa radio init failed"); medtem ko (1); } // Nastavi privzeto frekvenco 434,0 MHz, če (! Rf95.setFrequency (RF95_FREQ)) { Serial.println ("setFrequency failed"); medtem ko (1); } rf95.setTxPower (18); // prenosna moč modula Lora }
Znotraj funkcije neskončne zanke moramo preprosto poslati podatkovni paket prek modula LoRa. Ti podatki so lahko kakršna koli vrednost senzorja uporabniškega ukaza. Toda zaradi poenostavitve bomo poslali vrednost char od 0 do 9 za vsak 1-sekundni interval in nato po doseganju vrednosti vrednost inicializirali nazaj na 0, vrednost pa je mogoče poslati samo v obliki matrike char in vrsta podatkov mora biti unit8_t je 1 bajt naenkrat. Koda, ki stori enako, je prikazana spodaj
void loop () { Serial.print ("Send:"); char radiopacket = char (vrednost)}; rf95.send ((uint8_t *) radiopaket, 1); zamuda (1000); vrednost ++; if (vrednost> '9') vrednost = 48; }
Testiranje komunikacije LoRa med Raspberry Pi in Arduino
Zdaj, ko smo pripravili tako strojno opremo kot program, moramo preprosto naložiti kodo Arduino na tablo UNO in skico python je treba zagnati na pi. Moja testna nastavitev s priključeno strojno opremo je videti spodaj približno tako
Ko se skica odjemalca python zažene na Pi (uporabite samo python 3), če vse deluje pravilno, boste v oknu lupine videli pakete Arduino, prejete v pi. Opazili boste, da je »Prejeto: 0« do 9, kot je prikazano na spodnji sliki.
Popolno kodo Raspberry pi z vsemi zahtevanimi knjižnicami lahko prenesete od tukaj.
Zdaj lahko premaknete strežnik Arduino in preverite domet modula; po potrebi je mogoče na lupini prikazati tudi vrednost RSSI. Popolno delovanje projekta je mogoče najti v video s povezavo spodaj. Zdaj, ko vemo, kako vzpostaviti LoRa komunikacijo z nizko porabo med Arduino in Raspberry pi, lahko nadaljujemo z dodajanjem senzorja na strani Arduino in platforme v oblaku na strani Pi, da izdelamo celoten paket IoT.
Upam, da ste projekt razumeli in ste ga radi zgradili. Če imate težave z delovanjem, uporabite spodnji razdelek za komentarje ali forume za druga tehnična vprašanja.