- Materiale necesare
- Conectarea Raspberry Pi cu LoRa
- Conectarea Arduino cu LoRa
- pyLoRa pentru Raspberry Pi
- Configurarea modulului Raspberry Pi pentru LoRa
- Programarea Raspberry Pi pentru LoRa
- Cod Arduino pentru ca LoRa să comunice cu Raspberry Pi
- Testarea comunicării LoRa între Raspberry Pi și Arduino
LoRa devine din ce în ce mai popular odată cu apariția IoT, mașinilor conectate, M2M, Industry 4.0 etc. Datorită capacității sale de a comunica la distanțe lungi cu foarte puțină putere, este de preferință folosit de designeri pentru a trimite / primi date de la o baterie Thing. Am discutat deja noțiunile de bază ale LoRa și despre modul de utilizare a LoRa cu Arduino. Deși tehnologia este inițial destinată unui nod LoRa să comunice cu un gateway LoRa, există multe scenarii în care un nod LoRa trebuie să comunice cu un alt nod LoRa pentru a face schimb de informații pe distanțe mari. Deci, în acest tutorial vom învăța cum să folosim un modul LoRa SX1278 cu Raspberry pipentru a comunica cu un alt SX1278 conectat la un microcontroler precum Arduino. Această metodă poate fi utilă în multe locuri, deoarece Arduino ar putea acționa ca un server pentru a prelua date de la senzori și a le trimite către Pi pe o distanță lungă prin LoRa și apoi Pi, care acționează ca client, poate primi aceste informații și le poate încărca în ar putea, deoarece are acces la internet. Sună interesant nu? Deci sa începem.
Materiale necesare
- SX1278 433MHz Modul LoRa - 2 Nr
- Antena LoRa de 433 MHz - 2No
- Arduino UNO- sau altă versiune
- Raspberry Pi 3
Se presupune că Raspberry Pi este deja intermitent cu un sistem de operare și se poate conecta la internet. Dacă nu, urmați tutorialul Noțiuni introductive despre Raspberry Pi înainte de a continua. Aici folosim Rasbian Jessie instalat Raspberry Pi 3.
Atenție: utilizați întotdeauna modulul SX1278 LoRa cu antene de 433 MHz; altfel modulul s-ar putea deteriora.
Conectarea Raspberry Pi cu LoRa
Înainte de a intra în pachetele software, să pregătim hardware-ul. SX1278 este un 16 pini modulul Lora care comunică folosind SPI pe 3,3V Logic. Raspberry pi funcționează, de asemenea, la nivel logic de 3,3 V și are, de asemenea, un port SPI încorporat și un regulator de 3,3 V. Deci, putem conecta direct modulul LoRa cu Raspberry Pi. Tabelul de conexiuni este prezentat mai josRaspberry Pi | Lora - Modul SX1278 |
3,3V | 3,3V |
Sol | Sol |
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 |
De asemenea, puteți utiliza schema de circuit de mai jos pentru referință. Rețineți că schema de circuite a fost creată folosind modulul RFM9x, care este foarte asemănător cu modulul SX1278, prin urmare aspectul poate diferi în imaginea de mai jos.
Conexiunile sunt destul de simple, singura problemă cu care s-ar putea confrunta este că SX1278 nu este compatibilă cu placa de rețea, prin urmare trebuie să utilizați firele de conectare direct pentru a realiza conexiunile sau să utilizați două plăci de rețea mici, așa cum se arată mai jos. De asemenea, puțini oameni sugerează să alimenteze modulul LoRa cu o șină de alimentare separată de 3,3 V, deoarece este posibil ca Pi să nu poată alimenta suficient curent. Cu toate acestea, Lora, fiind un modul de putere redusă, ar trebui să funcționeze pe șina de 3,3V a Pi, am testat același lucru și am constatat că funcționează fără nicio problemă. Dar, ia-l tot cu un praf de sare. Configurarea conexiunii mele LoRa cu Raspberry pi arată cam așa mai jos
Conectarea Arduino cu LoRa
Conexiunea pentru modulul Arduino rămâne aceeași cu cea pe care am folosit-o în tutorialul nostru anterior. Singura diferență va fi în loc să folosim biblioteca de la Sandeep Mistry, vom folosi biblioteca Rspreal bazată pe capul Radio, pe care o vom discuta mai târziu în acest proiect. Circuitul este prezentat mai jos
Din nou, puteți utiliza pinul de 3,3V pe Arduino Uno sau puteți utiliza un regulator separat de 3,3V. În acest proiect am folosit regulatorul de tensiune la bord. Tabelul de conectare a pinului este dat mai jos pentru a vă ajuta să realizați conexiunile cu ușurință.
Modul LoRa SX1278 | Consiliul UN Arduino |
3,3V | 3,3V |
Gnd | Gnd |
En / Nss | D10 |
G0 / DIO0 | D2 |
SCK | D13 |
MISO | D12 |
MOSI | D11 |
RST | D9 |
Deoarece modulul nu se potrivește într-o placă de calcul, am folosit firele de conectare direct pentru a face conexiunile. Odată ce conexiunea este realizată, Arduino LoRa va arăta așa ceva mai jos
pyLoRa pentru Raspberry Pi
Există multe pachete python pe care le puteți folosi cu LoRa. De asemenea, în mod obișnuit, Raspberry Pi este utilizat ca LoRaWAN pentru a obține date de la mai multe noduri LoRa. Dar, în acest proiect, scopul nostru este de a comunica Peer to Peer între două module Raspberry Pi sau între un Raspberry Pi și un Arduino. Deci, am decis să folosesc pachetul pyLoRa. Are module rpsreal LoRa Arduino și rpsreal LoRa Raspberry pi care pot fi utilizate pe mediul Arduino și Raspberry Pi. Deocamdată, să ne concentrăm asupra mediului Raspberry Pi.
Configurarea modulului Raspberry Pi pentru LoRa
După cum am spus mai devreme, modulul LoRa funcționează cu comunicarea SPI, deci trebuie să activăm SPI pe Pi și apoi să instalăm pachetul pylora . Urmați pașii de mai jos pentru a face același lucru, după ce ați deschis fereastra terminalului Pi. Din nou, folosesc chit pentru a mă conecta la Pi-ul meu, puteți utiliza metoda dvs. convenabilă.
Pasul 1: intrați în fereastra de configurare folosind următoarea comandă. Pentru a obține fereastra de mai jos
sudo raspi-config
Pasul 2: Navigați la opțiunile de interfață și activați SPI așa cum se arată în imaginea de mai jos. Trebuie să activăm interfața SPI deoarece așa cum am discutat, LCD-ul și PI comunică prin protocolul SPI
Pasul 3: Salvați modificările și reveniți la fereastra terminalului. Asigurați-vă că pip și python sunt actualizate și apoi instalați pachetul RPi.GPIO folosind următoarea comandă.
pip instalează RPi.GPIO
Această clasă de pachet ne va ajuta să controlăm pinul GPIO de pe Pi. Dacă este instalat cu succes, ecranul dvs. va arăta astfel
Pasul 4: În mod similar, continuați cu instalarea pachetului spidev folosind următoarea comandă. Spidev este o legare python pentru Linux care poate fi utilizată pentru a efectua comunicarea SPI pe Raspberry Pi.
pip instalează spidev
Dacă instalarea are succes, terminalul ar trebui să arate cam așa mai jos.
Pasul 5: Următorul permite instalarea pachetului pyLoRa folosind următoarea comandă pip. Acest pachet instalează modelele de radio asociate cu LoRa.
pip instalează pyLoRa
Dacă instalarea are succes, veți vedea următorul ecran.
Pachetul PyLoRa acceptă, de asemenea, comunicarea criptată care poate fi utilizată perfect cu Arduino și Raspberry Pi. Acest lucru va îmbunătăți securitatea datelor în comunicarea dvs. Dar trebuie să instalați un pachet separat după acest pas pe care nu îl fac, deoarece criptarea nu se află în sfera acestui tutorial. Puteți urmări linkurile github de mai sus pentru mai multe detalii.
După, acest pas puteți adăuga informațiile despre calea pachetului la pi și puteți încerca cu programul python dat la sfârșit. Dar nu am putut adăuga calea cu succes și, prin urmare, a trebuit să descarc manual biblioteca și să o folosesc direct pentru programele mele. Așa că a trebuit să continui cu pașii următori
Pasul 6: Descărcați și instalați pachetul python-rpi.gpio și pachetul spidev folosind comanda de mai jos.
sudo apt-get install python-rpi.gpio python3-rpi.gpio sudo apt-get install python-spidev python3-spidev
Fereastra terminalului ar trebui să afișeze așa ceva după ambele instalări.
Pasul 7: Instalați, de asemenea, git și apoi utilizați-l pentru a clona directorul python pentru Raspberry Pi. Puteți face acest lucru folosind următoarele comenzi.
sudo apt-get install git sudo git clone
Odată ce acest pas este finalizat, ar trebui să găsiți subdirectorul SX127x în folderul principal Raspberry Pi. Aceasta va avea toate fișierele necesare asociate cu biblioteca.
Programarea Raspberry Pi pentru LoRa
Într-o comunicare LoRa de la egal la egal, modulul care transmite informațiile se numește server, iar modulul care primește informațiile se numește client. În majoritatea cazurilor, Arduino va fi utilizat pe teren cu un senzor pentru măsurarea datelor, iar Pi va fi utilizat pentru a primi aceste date. Așadar, am decis să folosesc Raspberry Pi ca client și Arduino ca server în acest tutorial. Programul client Raspberry Pi complet poate fi găsit în partea de jos a acestei pagini. Aici voi încerca să explic liniile importante din program.
Atenție: asigurați-vă că fișierul programului se află în același director în care este prezent folderul bibliotecii SX127x. Puteți copia acest folder și îl puteți utiliza oriunde, dacă doriți să portați proiectul.
Programul este destul de simplu, trebuie să setăm modulul LoRa să funcționeze în 433Mhz și apoi să ascultăm pachetele primite. Dacă primim ceva, le imprimăm simplu pe consolă. Ca întotdeauna, începem programul importând bibliotecile Python necesare.
din timp import somn de la SX127x.LoRa import * de la SX127x.board_config import BOARD BOARD.setup ()
În acest caz, pachetul de timp este utilizat pentru a crea întârzieri, pachetul Lora este utilizat pentru comunicarea LoRa, iar board_config este utilizat pentru a seta parametrii plăcii și LoRa. De asemenea, configurăm placa folosind funcția BOARD.setup () .
Apoi creăm clasa PyRon LoRa cu trei definiții. De vreme ce facem linia doar pentru a face ca programul să funcționeze ca client cu zmeură, clasa are doar trei funcții și anume clasa init, start class și on_rx_done . Clasa init inițializează modulul LoRa la 433 MHz cu lățimea de bandă de 125 kHz așa cum este setat în metoda set_pa_config . Apoi pune modulul și în modul repaus pentru a economisi consumul de energie.
# Valori implicite ale intervalului mediu după inițiere sunt 434,0MHz, Bw = 125 kHz, Cr = 4/5, Sf = 128chips / symbol, CRC pe 13 dBm lora.set_pa_config (pa_select = 1) def __init __ (self, verbose = False): super (LoRaRcvCont, self).__ init __ (detaliat) self.set_mode (MODE.SLEEP) self.set_dio_mapping (* 6)
Funcția start este în cazul în care vom configura modulul ca receptor și se obține ca RSSI (puterea semnalului de recepție Indicator), starea, frecvența de funcționare etc. Am setat modulul să funcționeze în modul receptor continuu (RXCONT) din modul de repaus și apoi folosim o buclă while pentru a citi valori precum RSSI și starea modemului. De asemenea, transferăm datele din bufferul serial pe terminal.
def start (self): self.reset_ptr_rx () self.set_mode (MODE.RXCONT) în timp ce True: sleep (.5) rssi_value = self.get_rssi_value () status = self.get_modem_status () sys.stdout.flush ()
În cele din urmă, funcția on_rx_done este executată după citirea pachetului de intrare. În această funcție valorile primite sunt mutate într-o variabilă numită sarcină utilă din buffer-ul Rx după setarea steagului de recepție ridicat. Apoi, valorile primite sunt decodate cu utf-8 pentru a imprima pe shell date lizibile de către utilizator. De asemenea, punem modulul înapoi în modul de repaus până când se primește o altă valoare.
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)
Partea rămasă a programului este doar pentru a imprima valorile primite pe consolă și a termina programul folosind o întrerupere de la tastatură. Am setat din nou placa în modul repaus chiar și după terminarea programului pentru a economisi energie.
încercați: lora.start () cu excepția KeyboardInterrupt: sys.stdout.flush () print ("") sys.stderr.write ("KeyboardInterrupt \ n") în cele din urmă: sys.stdout.flush () print ("") lora. set_mode (MODE.SLEEP) BOARD.teardown ()
Cod Arduino pentru ca LoRa să comunice cu Raspberry Pi
După cum am menționat mai devreme, codul rpsreal acceptă atât Arduino, cât și Pi și, prin urmare, este posibilă comunicarea între Arduino și Pi. Funcționează pe baza Radiohead Library de la AirSpayce's. Deci, trebuie să instalați mai întâi biblioteca de cap radio pe ID-ul dvs. Arduino.
Pentru aceasta, vizitați pagina Github și descărcați biblioteca în folderul ZIP. Apoi plasați-l în dosarul bibliotecii IDE-ului dvs. Arduino. Acum, reporniți ID-ul Arduino și veți găsi exemple de fișiere pentru biblioteca de cap radio. Aici vom programa Arduino să funcționeze ca un server LoRa pentru a trimite pachete de testare de la 0 la 9. Codul complet pentru a face același lucru poate fi găsit în partea de jos a acestei pagini ca întotdeauna. Aici, voi explica câteva linii importante din program.
Începem programul importând biblioteca SPI (instalată implicit) pentru a utiliza protocolul SPI și apoi biblioteca RH_RF95 de la capul Radio pentru a efectua comunicarea LoRa. Apoi definim la care pin al Arduino am conectat pinul Chip select (CS), Reset (RST) și Interrupt (INT) al LoRa cu Arduino. În cele din urmă, definim, de asemenea, că modulul ar trebui să funcționeze în frecvență de 434 MHz și să inițializeze modulul LoRa.
#include
În interiorul funcției de configurare vom reseta modulul LoRa trăgând pinul de resetare la scăzut timp de 10 mili secunde pentru a porni în stare proaspătă. Apoi îl inițializăm cu modulul pe care l-am creat mai devreme folosind biblioteca head head. Apoi, setăm frecvența și puterea de transmisie pentru serverul LoRa. Cu cât transmisia va fi mai mare, distanța va parcurge pachetele, dar va consuma mai multă energie.
void setup () { // Initialize Serial Monitor Serial.begin (9600); // Resetați modulul LoRa pinMode (RFM95_RST, OUTPUT); digitalWrite (RFM95_RST, LOW); întârziere (10); digitalWrite (RFM95_RST, HIGH); întârziere (10); // Inițializați modulul LoRa în timp ce (! Rf95.init ()) { Serial.println ("LoRa radio init failed"); în timp ce (1); } // Setați frecvența implicită 434,0MHz dacă (! Rf95.setFrequency (RF95_FREQ)) { Serial.println ("setFrequency a eșuat"); în timp ce (1); } rf95.setTxPower (18); // Puterea de transmisie a modulului Lora }
În interiorul funcției de buclă infinită, trebuie pur și simplu să trimitem pachetul de date prin modulul LoRa. Aceste date pot fi asemănătoare valorii senzorului pentru comanda utilizatorului. Dar, pentru simplitate, vom trimite valoarea de la 0 la 9 pentru fiecare interval de 1 secundă și apoi inițializăm valoarea la 0 după ce atingem 9. Rețineți că valorile pot fi trimise numai într-un format de matrice de caractere și tipul de date ar trebui să fie unit8_t că este 1 octet la un moment dat. Codul pentru a face același lucru este prezentat mai jos
bucla void () { Serial.print ("Trimite:"); char radiopacket = char (valoare)}; rf95.send ((uint8_t *) radiopachet, 1); întârziere (1000); valoare ++; if (valoare> '9') valoare = 48; }
Testarea comunicării LoRa între Raspberry Pi și Arduino
Acum, că ne-am pregătit atât hardware-ul, cât și programul, trebuie pur și simplu să încărcăm codul Arduino pe placa UNO și schița python ar trebui să fie lansată pe pi. Configurarea mea de testare atât cu hardware-ul conectat, arată cam așa mai jos
Odată ce schița clientului Python este lansată pe Pi (folosiți doar Python 3), dacă totul funcționează corect, ar trebui să vedeți pachetele Arduino primite în pi de la fereastra shell. Ar trebui să observați „Primit: 0” până la 9, așa cum se arată în imaginea de mai jos.
Codul Raspberry pi complet cu toate bibliotecile necesare poate fi descărcat de aici.
Acum puteți muta serverul Arduino și puteți verifica intervalul modulului; de asemenea, este posibil să afișați valoarea RSSI pe shell dacă este necesar. Funcționarea completă a proiectului poate fi găsită în videoclipul legat mai jos. Acum, că știm cum să stabilim comunicații LoRa pe distanță lungă de joasă putere între Arduino și Raspberry pi, putem continua cu adăugarea senzorului pe partea Arduino și a platformei cloud pe partea Pi pentru a face un pachet IoT complet.
Sper că ați înțeles proiectul și v-a plăcut să îl construiți. Dacă aveți probleme la punerea în funcțiune, utilizați secțiunea de comentarii de mai jos sau forumurile pentru alte cereri tehnice.