- Materials necessaris
- Connexió de Raspberry Pi amb LoRa
- Connexió d'Arduino amb LoRa
- pyLoRa per a Raspberry Pi
- Configuració del mòdul Raspberry Pi per a LoRa
- Programació de Raspberry Pi per a LoRa
- Codi Arduino perquè LoRa es comuniqui amb Raspberry Pi
- Prova de la comunicació LoRa entre Raspberry Pi i Arduino
LoRa és cada vegada més popular amb l’aparició d’IoT, Connected Cars, M2M, Industry 4.0, etc. A causa de la seva capacitat de comunicar-se a llargues distàncies amb una potència molt inferior, és preferible que els dissenyadors l’utilitzin per enviar / rebre dades d’una cosa que funciona amb bateria. Ja hem comentat els conceptes bàsics de LoRa i com utilitzar LoRa amb Arduino. Tot i que la tecnologia està pensada originalment perquè un node LoRa es comuniqui amb una passarel·la LoRa, hi ha molts escenaris en què un node LoRa ha de comunicar-se amb un altre node LoRa per intercanviar informació a gran distància. Per tant, en aquest tutorial aprendrem a utilitzar un mòdul LoRa SX1278 amb Raspberry piper comunicar-se amb un altre SX1278 connectat a un microcontrolador com Arduino. Aquest mètode pot ser útil en molts llocs, ja que l’Arduino podria actuar com a servidor per obtenir dades de sensors i enviar-les a Pi a gran distància a través de LoRa i, a continuació, el Pi que fa de client pot rebre aquesta informació i penjar-la al podria ja que té accés a Internet. Sona interessant oi? Comencem, doncs.
Materials necessaris
- SX1278 Mòdul LoRa a 433 MHz - 2 núm
- Antena LoRa a 433 MHz - 2Nos
- Arduino UNO- o una altra versió
- Raspberry Pi 3
Se suposa que el vostre Raspberry Pi ja està llampat amb un sistema operatiu i es pot connectar a Internet. Si no, seguiu el tutorial Introducció a Raspberry Pi abans de continuar. Aquí estem utilitzant Rasbian Jessie instal·lat Raspberry Pi 3.
Advertència: Utilitzeu sempre el mòdul LoXa SX1278 amb antenes de 433 MHz; en cas contrari, el mòdul es podria danyar.
Connexió de Raspberry Pi amb LoRa
Abans d’entrar als paquets de programari, preparem el maquinari. El SX1278 és un mòdul Lora de 16 pins que es comunica mitjançant SPI en una lògica de 3.3V. El Raspberry pi també funciona a nivell lògic de 3,3 V i també té incorporat un port SPI i un regulador de 3,3 V. Així, podem connectar directament el mòdul LoRa amb el Raspberry Pi. La taula de connexions es mostra a continuació| Raspberry Pi | Mòdul Lora - SX1278 |
| 3,3V | 3,3V |
| Terra | Terra |
| GPIO 10 | MOSI |
| GPIO 9 | MISO |
| GPIO 11 | SCK |
| GPIO 8 | Nss / Habilita |
| GPIO 4 | DIO 0 |
| GPIO 17 | DIO 1 |
| GPIO 18 | DIO 2 |
| GPIO 27 | DIO 3 |
| GPIO 22 | RST |
També podeu fer servir el diagrama del circuit següent com a referència. Tingueu en compte que el diagrama de circuits es va crear utilitzant el mòdul RFM9x, que és molt similar al mòdul SX1278, per tant l’aspecte pot diferir a la imatge següent.

Les connexions són bastant senzilles, l'únic problema que us podeu trobar és que el SX1278 no és compatible amb taulers de suport, per tant, heu d'utilitzar cables de connexió directament per fer les connexions o utilitzar dues tauletes de control petites, tal com es mostra a continuació. Poques persones també suggereixen alimentar el mòdul LoRa amb un rail d'alimentació separat de 3,3 V, ja que és possible que el Pi no pugui obtenir prou corrent. Tot i que Lora és un mòdul de baixa potència, hauria de funcionar al carril de 3,3 V de Pi, vaig provar el mateix i vaig trobar que funcionava sense cap problema. Però, encara, preneu-lo amb una mica de sal. La configuració de la meva connexió de LoRa amb Raspberry pi té un aspecte similar a continuació

Connexió d'Arduino amb LoRa
La connexió del mòdul Arduino continua sent la mateixa que la que vam fer servir al nostre tutorial anterior. L’única diferència serà en lloc d’utilitzar la biblioteca de Sandeep Mistry, utilitzarem la biblioteca Rspreal basada en el cap de ràdio que parlarem més endavant en aquest projecte. El circuit es dóna a continuació

Una vegada més, podeu utilitzar el pin de 3,3V a Arduino Uno o utilitzar un regulador de 3,3V separat. En aquest projecte he utilitzat el regulador de tensió incorporat. A continuació es mostra la taula de connexions de pins per ajudar-vos a fer les connexions fàcilment.
| Mòdul LoRa SX1278 | Junta Arduino UNO |
| 3,3V | 3,3V |
| Gnd | Gnd |
| En / Nss | D10 |
| G0 / DIO0 | D2 |
| SCK | D13 |
| MISO | D12 |
| MOSI | D11 |
| RST | D9 |
Com que el mòdul no s'adapta a una taula de treball, he utilitzat els cables de connexió directament per fer les connexions. Un cop feta la connexió, la configuració d' Arduino LoRa es mostrarà a continuació

pyLoRa per a Raspberry Pi
Hi ha molts paquets python que podeu utilitzar amb LoRa. Normalment, Raspberry Pi s'utilitza com a LoRaWAN per obtenir dades de diversos nodes LoRa. Però, en aquest projecte, el nostre objectiu és fer una comunicació Peer to Peer entre dos mòduls Raspberry Pi o entre un Raspberry Pi i un Arduino. Per tant, vaig decidir utilitzar el paquet pyLoRa. Té mòduls rpsreal LoRa Arduino i rpsreal LoRa Raspberry pi que es poden utilitzar a l'entorn Arduino i Raspberry Pi. De moment, centrem-nos en l’entorn Raspberry Pi.
Configuració del mòdul Raspberry Pi per a LoRa
Com s’ha dit anteriorment, el mòdul LoRa funciona amb la comunicació SPI, per tant, hem d’habilitar SPI a Pi i després instal·lar el paquet pylora . Seguiu els passos següents per fer el mateix, després d'obrir la finestra del terminal de Pi. Una vegada més, estic fent servir massilla per connectar-me al meu Pi. Podeu utilitzar el vostre mètode convenient.
Pas 1: accediu a la finestra de configuració mitjançant l'ordre següent. Per obtenir la finestra següent
sudo raspi-config


Pas 2: aneu a les opcions d'interfície i activeu SPI tal com es mostra a la imatge següent. Hem d’ habilitar la interfície SPI perquè tal com hem comentat, la pantalla LCD i PI es comuniquen a través del protocol SPI

Pas 3: deseu els canvis i torneu a la finestra del terminal. Assegureu-vos que pip i python s’actualitzen i, a continuació, instal·leu el paquet RPi.GPIO mitjançant l’ordre següent.
instal·lar pip RPi.GPIO
Aquesta classe de paquets ens ajudarà a controlar el pin GPIO al Pi. Si s’instal·la correctament, la pantalla tindrà aquest aspecte

Pas 4: procediu de la mateixa manera amb la instal·lació del paquet spidev mitjançant l'ordre següent. Spidev és un enllaç de Python per a Linux que es pot utilitzar per realitzar comunicacions SPI a Raspberry Pi.
pip instal·lar spidev
Si la instal·lació té èxit, el terminal hauria de tenir un aspecte semblant a continuació.

Pas 5: El següent permet instal·lar el paquet pyLoRa mitjançant l'ordre pip següent. Aquest paquet instal·la els models de ràdio associats amb LoRa.
pip instal·lar pyLoRa
Si la instal·lació té èxit, veureu la pantalla següent.

El paquet PyLoRa també admet la comunicació xifrada que es pot utilitzar amb Arduino i Raspberry Pi sense problemes. Això millorarà la seguretat de les dades a la vostra comunicació. Però heu d'instal·lar un paquet separat després d'aquest pas, cosa que no estic fent, ja que el xifratge no és a l'abast d'aquest tutorial. Podeu seguir els enllaços de github anteriors per obtenir més informació.
Després, aquest pas podeu afegir la informació del camí del paquet a pi i provar amb el programa python que es dóna al final. Però no vaig poder afegir el camí amb èxit i, per tant, vaig haver de descarregar manualment la biblioteca i utilitzar-la directament per als meus programes. Per tant, vaig haver de seguir els passos següents
Pas 6: descarregueu i instal·leu el paquet python-rpi.gpio i el paquet spidev mitjançant l'ordre següent.
sudo apt-get install python-rpi.gpio python3-rpi.gpio sudo apt-get install python-spidev python3-spidev
La finestra del terminal hauria de mostrar alguna cosa així després de les dues instal·lacions.


Pas 7: instal·leu també git i utilitzeu-lo per clonar el directori python del nostre Raspberry Pi. Podeu fer-ho mitjançant les ordres següents.
sudo apt-get install git sudo git clone

Un cop completat aquest pas, haureu de trobar el subdirectori SX127x a la carpeta inicial de Raspberry Pi. Això tindrà tots els fitxers necessaris associats a la biblioteca.
Programació de Raspberry Pi per a LoRa
En una comunicació LoRa peer to peer, el mòdul que transmet la informació s'anomena servidor i el mòdul que rep la informació s'anomena client. En la majoria dels casos, l'Arduino s'utilitzarà al camp amb un sensor per mesurar les dades i el Pi s'utilitzarà per rebre aquestes dades. Per tant, vaig decidir utilitzar el Raspberry Pi com a client i l’Arduino com a servidor en aquest tutorial. El programa client complet de Raspberry Pi es troba a la part inferior d’aquesta pàgina. Aquí intentaré explicar les línies importants del programa.
Precaució: Assegureu-vos que el fitxer del programa es troba al mateix directori on hi ha la carpeta de la biblioteca SX127x. Podeu copiar aquesta carpeta i utilitzar-la en qualsevol lloc si voleu portar el projecte.
El programa és bastant senzill, hem de configurar el mòdul LoRa perquè funcioni a 433Mhz i després escoltar els paquets entrants. Si rebem alguna cosa, simplement els imprimim a la consola. Com sempre, comencem el programa important les biblioteques python necessàries.
des de la importació en temps de repòs des de SX127x.LoRa importació * des de SX127x.board_config importació BOARD BOARD.setup ()
En aquest cas, el paquet de temps s'utilitza per crear retards, el paquet de Lora s'utilitza per a la comunicació LoRa i el board_config s'utilitza per establir els paràmetres de la placa i LoRa. També configurem el tauler mitjançant la funció BOARD.setup () .
A continuació, creem la classe PyRon LoRa amb tres definicions. Com que només fem un sagnat perquè el programa funcioni com a client de gerds, la classe només té tres funcions: la classe init, la classe start i la classe on_rx_done . La classe init inicialitza el mòdul LoRa a 433 MHz amb una amplada de banda de 125 kHz tal com s’estableix al mètode set_pa_config . A continuació, també posa el mòdul en mode de repòs per estalviar consum d'energia.
# Els valors predeterminats de rang mitjà després de l'inici són 434,0 MHz, Bw = 125 kHz, Cr = 4/5, Sf = 128 xips / símbol, CRC a 13 dBm lora.set_pa_config (pa_select = 1) def __init __ (self, verbose = False): super (LoRaRcvCont, self).__ init __ (detallat) self.set_mode (MODE.SLEEP) self.set_dio_mapping (* 6)
La funció d'arrencada és on configurem el mòdul com a receptor i obtenim com RSSI (Indicador de recepció intensitat del senyal), l'estat, la freqüència de funcionament, etc. Configurem el mòdul perquè funcioni en mode de receptor continu (RXCONT) des del mode de repòs i després fem servir un bucle while per llegir valors com RSSI i l’estat del mòdem. També transferim les dades del buffer sèrie al terminal.
def start (self): self.reset_ptr_rx () self.set_mode (MODE.RXCONT) mentre és True: sleep (.5) rssi_value = self.get_rssi_value () status = self.get_modem_status () sys.stdout.flush ()
Finalment, la funció on_rx_done s'executa després de llegir el paquet entrant. En aquesta funció, els valors rebuts es mouen a una variable anomenada càrrega útil des de la memòria intermèdia Rx després de configurar el senyal receptor alt. A continuació, els valors rebuts es descodifiquen amb utf-8 per imprimir les dades llegibles per l'usuari a l'intèrpret d'ordres. També tornem a posar el mòdul en mode de suspensió fins que es rebi un altre valor.
def on_rx_done (self): print ("\ nReceived:") self.clear_irq_flags (RxDone = 1) payload = self.read_payload (nocheck = True) print (bytes (càrrega útil)).decode ("utf-8", 'ignora')) self.set_mode (MODE.SLEEP) self.reset_ptr_rx () self.set_mode (MODE.RXCONT)
La part restant del programa és només imprimir els valors rebuts a la consola i finalitzar el programa mitjançant una interrupció de teclat. Tornem a configurar el tauler en mode de suspensió fins i tot després de finalitzar el programa per estalviar energia.
proveu: lora.start () excepte KeyboardInterrupt: sys.stdout.flush () print ("") sys.stderr.write ("KeyboardInterrupt \ n") finalment: sys.stdout.flush () print ("") lora. set_mode (MODE.SLEEP) BOARD.teardown ()
Codi Arduino perquè LoRa es comuniqui amb Raspberry Pi
Com he esmentat anteriorment, el codi rpsreal admet Arduino i Pi i, per tant, és possible la comunicació entre Arduino i Pi. Funciona basat en la Biblioteca Radiohead d'AirSpayce's. Per tant, primer heu d’ instal·lar la biblioteca de capçaleres de ràdio al vostre IDE Arduino.
Per fer-ho, visiteu la pàgina de Github i descarregueu la biblioteca a la carpeta ZIP. A continuació, col·loqueu-lo a la carpeta de la biblioteca del vostre IDE Arduino. Ara, reinicieu l'Arduino IDE i trobareu fitxers d'exemple per a la biblioteca principal de Radio. Aquí programarem l'Arduino perquè funcioni com a servidor LoRa per enviar paquets de prova com el 0 al 9. El codi complet per fer el mateix es pot trobar a la part inferior d'aquesta pàgina com sempre. Aquí explicaré algunes línies importants del programa.
Comencem el programa important la biblioteca SPI (instal·lada per defecte) per utilitzar el protocol SPI i després la biblioteca RH_RF95 del cap de ràdio per realitzar la comunicació LoRa. A continuació, definim a quin pin d'Arduino hem connectat el pin Chip select (CS), Reset (RST) i Interrupt (INT) del LoRa amb Arduino. Finalment, també definim que el mòdul hauria de funcionar a 434 MHz de freqüència i inicialitzar el mòdul LoRa.
#incloure
Dins de la funció de configuració , restablirem el mòdul LoRa tirant del seu pin de restabliment al mínim durant 10 milis segons per començar de nou. A continuació, l’ inicialitzem amb el mòdul que hem creat anteriorment mitjançant la biblioteca de capçaleres de ràdio. A continuació, establim la freqüència i la potència de transmissió del servidor LoRa. Com més gran sigui la transmissió, més distància recorreran els vostres paquets, però consumireu més energia.
void setup () { // Initialize Serial Monitor Serial.begin (9600); // Restableix el mòdul LoRa pinMode (RFM95_RST, OUTPUT); digitalWrite (RFM95_RST, BAIX); retard (10); digitalWrite (RFM95_RST, HIGH); retard (10); // Inicialitzeu el mòdul LoRa mentre (! Rf95.init ()) { Serial.println ("L'inici de ràdio LoRa ha fallat"); mentre que (1); } // Estableix la freqüència per defecte a 434,0 MHz si (! Rf95.setFrequency (RF95_FREQ)) { Serial.println ("setFrequency fallen"); mentre que (1); } rf95.setTxPower (18); // Potència de transmissió del mòdul Lora }
Dins de la funció de bucle infinit, simplement hem d’enviar el paquet de dades a través del mòdul LoRa. Aquestes dades poden ser com el valor del sensor de l'ordre de l'usuari. Però per simplicitat, enviarem el valor de caràcter 0 a 9 per cada interval d'1 segon i, a continuació, inicialitzarem el valor a 0 després d'arribar a 9. Tingueu en compte que els valors només es poden enviar en un format de matriu de caràcters i el tipus de dades ha de ser unit8_t que és d'1 byte a la vegada. A continuació es mostra el codi per fer el mateix
bucle buit () { Serial.print ("Enviar:"); char radiopacket = char (valor)}; rf95.send ((uint8_t *) radiopacket, 1); retard (1000); valor ++; if (valor> '9') valor = 48; }
Prova de la comunicació LoRa entre Raspberry Pi i Arduino
Ara, ja que disposem tant del nostre maquinari com del programa, simplement hem de carregar el codi Arduino a la placa UNO i l’esbós de Python s’hauria de llançar a pi. La configuració de la meva prova amb el maquinari connectat té un aspecte semblant a continuació

Un cop es llanci l'esbós del client Python al Pi (utilitzeu només Python 3), si tot funciona correctament, hauríeu de veure els paquets Arduino rebuts a pi des de la finestra de l'intèrpret d'ordres. Heu de notar "Rebut: 0" a 9 com es mostra a la imatge següent.

Podeu descarregar-vos el codi Raspberry pi complet amb totes les biblioteques necessàries des d’aquí.
Ara podeu moure el servidor Arduino i comprovar l'abast del mòdul; també és possible mostrar el valor RSSI a l'intèrpret d'ordres si és necessari. El funcionament complet del projecte es pot trobar al vídeo enllaçat a continuació. Ara, ja que sabem com establir una comunicació LoRa de baixa potència a llarga distància entre Arduino i Raspberry pi, podem procedir a afegir sensor al costat Arduino i plataforma cloud al costat Pi per fer un paquet IoT complet.
Espero que hagueu entès el projecte i us hagi agradat construir-lo. Si teniu problemes per aconseguir que funcioni, utilitzeu la secció de comentaris a continuació o els fòrums per a altres consultes tècniques.
