- Materiali richiesti
- Collegamento di Raspberry Pi con LoRa
- Collegamento di Arduino con LoRa
- pyLoRa per Raspberry Pi
- Configurazione del Raspberry Pi per il modulo LoRa
- Programmazione di Raspberry Pi per LoRa
- Codice Arduino per LoRa per comunicare con Raspberry Pi
- Test della comunicazione LoRa tra Raspberry Pi e Arduino
LoRa sta diventando sempre più popolare con l'avvento di IoT, Connected Cars, M2M, Industry 4.0 ecc. A causa della sua capacità di comunicare a lunghe distanze con una potenza molto inferiore, è preferibilmente utilizzato dai progettisti per inviare / ricevere dati da una Thing alimentata a batteria. Abbiamo già discusso le basi di LoRa e come utilizzare LoRa con Arduino. Sebbene la tecnologia sia originariamente concepita per consentire a un nodo LoRa di comunicare con un gateway LoRa, ci sono molti scenari in cui un nodo LoRa deve comunicare con un altro nodo LoRa per scambiare informazioni a lunga distanza. Quindi, in questo tutorial impareremo come utilizzare un modulo LoRa SX1278 con Raspberry piper comunicare con un altro SX1278 collegato a un microcontrollore come Arduino. Questo metodo può tornare utile in molti luoghi poiché Arduino potrebbe fungere da server per recuperare i dati dai sensori e inviarli a Pi su una lunga distanza tramite LoRa e quindi il Pi che agisce come un client può ricevere queste informazioni e caricarle sul potrebbe dal momento che ha accesso a Internet. Sembra interessante, vero? Quindi iniziamo.
Materiali richiesti
- SX1278 Modulo LoRa 433 MHz - 2 n
- Antenna LoRa 433MHz - 2Nos
- Arduino UNO o altra versione
- Raspberry Pi 3
Si presume che il tuo Raspberry Pi sia già dotato di un sistema operativo e sia in grado di connettersi a Internet. In caso contrario, segui il tutorial Introduzione a Raspberry Pi prima di procedere. Qui stiamo usando Rasbian Jessie installato Raspberry Pi 3.
Avvertenza: utilizzare sempre il modulo LoRa SX1278 con antenne a 433 MHz; altrimenti il modulo potrebbe danneggiarsi.
Collegamento di Raspberry Pi con LoRa
Prima di entrare nei pacchetti software, prepariamo l'hardware. L' SX1278 è un modulo Lora a 16 pin che comunica utilizzando SPI su 3.3V Logic. Il Raspberry pi funziona anche a livello logico 3,3 V e ha anche una porta SPI incorporata e un regolatore 3,3 V. Quindi possiamo collegare direttamente il modulo LoRa con il Raspberry Pi. La tabella dei collegamenti è mostrata di seguitoRaspberry Pi | Lora - Modulo SX1278 |
3,3V | 3,3V |
Terra | Terra |
GPIO 10 | MOSI |
GPIO 9 | MISO |
GPIO 11 | SCK |
GPIO 8 | Nss / Abilita |
GPIO 4 | DIO 0 |
GPIO 17 | DIO 1 |
GPIO 18 | DIO 2 |
GPIO 27 | DIO 3 |
GPIO 22 | RST |
È inoltre possibile utilizzare lo schema del circuito seguente come riferimento. Si noti che lo schema del circuito è stato creato utilizzando il modulo RFM9x che è molto simile al modulo SX1278, quindi l'aspetto potrebbe differire nell'immagine sottostante.
Le connessioni sono piuttosto semplici, l'unico problema che potresti incontrare è che l'SX1278 non è compatibile con la breadboard, quindi devi utilizzare i cavi di collegamento direttamente per effettuare i collegamenti o utilizzare due piccole breadboard come mostrato di seguito. Inoltre, poche persone suggeriscono di alimentare il modulo LoRa con una barra di alimentazione separata da 3,3 V poiché il Pi potrebbe non essere in grado di fornire corrente sufficiente. Tuttavia, essendo Lora un modulo a bassa potenza, dovrebbe funzionare sulla guida 3.3V di Pi, ho provato lo stesso e ho scoperto che funziona senza problemi. Ma prendilo ancora con un pizzico di sale. La mia configurazione di connessione di LoRa con Raspberry Pi è simile a questa qui sotto
Collegamento di Arduino con LoRa
La connessione per il modulo Arduino rimane la stessa che abbiamo utilizzato nel nostro precedente tutorial. L'unica differenza sarà che invece di usare la libreria di Sandeep Mistry useremo la libreria Rspreal basata su Radio head di cui parleremo più avanti in questo progetto. Il circuito è dato di seguito
Anche in questo caso è possibile utilizzare il pin 3.3V su Arduino Uno o utilizzare un regolatore 3.3V separato. In questo progetto ho utilizzato il regolatore di tensione di bordo. La tabella di connessione dei pin è fornita di seguito per aiutarti a effettuare facilmente i collegamenti.
Modulo LoRa SX1278 | Scheda Arduino UNO |
3,3V | 3,3V |
Gnd | Gnd |
En / Nss | D10 |
G0 / DIO0 | D2 |
SCK | D13 |
MISO | D12 |
MOSI | D11 |
RST | D9 |
Poiché il modulo non si adatta a una breadboard, ho utilizzato direttamente i cavi di collegamento per effettuare i collegamenti. Una volta stabilita la connessione, la configurazione di Arduino LoRa sarà simile a questa di seguito
pyLoRa per Raspberry Pi
Ci sono molti pacchetti Python che puoi usare con LoRa. Inoltre comunemente il Raspberry Pi viene utilizzato come LoRaWAN per ottenere dati da più nodi LoRa. Ma, in questo progetto, il nostro obiettivo è fare comunicazioni Peer to Peer tra due moduli Raspberry Pi o tra un Raspberry Pi e un Arduino. Quindi, ho deciso di utilizzare il pacchetto pyLoRa. Ha un rpsreal LoRa Arduino e rpsreal LoRa Raspberry pi moduli che possono essere utilizzati su Arduino e l'ambiente Raspberry Pi. Per ora, concentriamoci sull'ambiente Raspberry Pi.
Configurazione del Raspberry Pi per il modulo LoRa
Come detto in precedenza, il modulo LoRa funziona con la comunicazione SPI, quindi dobbiamo abilitare SPI su Pi e quindi installare il pacchetto pylora . Segui i passaggi seguenti per fare lo stesso, dopo aver aperto la finestra del terminale di Pi. Ancora una volta, sto usando lo stucco per connettermi al mio Pi, puoi usare il tuo metodo conveniente.
Passaggio 1: accedi alla finestra di configurazione utilizzando il seguente comando. Per ottenere la finestra sottostante
sudo raspi-config
Passaggio 2: accedere alle opzioni di interfacciamento e abilitare SPI come mostrato nell'immagine sottostante. Dobbiamo abilitare l'interfaccia SPI perché, come abbiamo discusso, LCD e PI comunicano tramite il protocollo SPI
Passaggio 3: salva le modifiche e torna alla finestra del terminale. Assicurati che pip e python siano aggiornati e quindi installa il pacchetto RPi.GPIO utilizzando il seguente comando.
pip installa RPi.GPIO
Questa classe di pacchetti ci aiuterà a controllare il pin GPIO sul Pi. Se installato correttamente, lo schermo sarà simile a questo
Passaggio 4: allo stesso modo procedere con l'installazione del pacchetto spidev utilizzando il seguente comando. Spidev è un'associazione Python per Linux che può essere utilizzata per eseguire comunicazioni SPI su Raspberry Pi.
pip installa spidev
Se l'installazione ha esito positivo, il terminale dovrebbe essere simile a questo di seguito.
Passaggio 5: Successivamente, installa il pacchetto pyLoRa utilizzando il seguente comando pip. Questo pacchetto installa i modelli Radio associati a LoRa.
pip installa pyLoRa
Se l'installazione è andata a buon fine vedrai la seguente schermata.
Il pacchetto PyLoRa supporta anche la comunicazione crittografata che può essere utilizzata senza problemi con Arduino e Raspberry Pi. Ciò migliorerà la sicurezza dei dati nella tua comunicazione. Ma devi installare un pacchetto separato dopo questo passaggio, cosa che non sto facendo poiché la crittografia non è nell'ambito di questo tutorial. Puoi seguire i collegamenti GitHub sopra per maggiori dettagli.
Dopo questo passaggio è possibile aggiungere le informazioni sul percorso del pacchetto a pi e provare con il programma python fornito alla fine. Ma non sono stato in grado di aggiungere il percorso con successo e quindi ho dovuto scaricare manualmente la libreria e utilizzare la stessa direttamente per i miei programmi. Quindi ho dovuto procedere con i seguenti passaggi
Passaggio 6: scarica e installa il pacchetto python-rpi.gpio e il pacchetto spidev utilizzando il comando seguente.
sudo apt-get install python-rpi.gpio python3-rpi.gpio sudo apt-get install python-spidev python3-spidev
La finestra del terminale dovrebbe visualizzare qualcosa di simile dopo entrambe le installazioni.
Passaggio 7: installa anche git e poi usalo per clonare la directory python per il nostro Raspberry Pi. Puoi farlo usando i seguenti comandi.
sudo apt-get install git sudo git clone
Una volta completato questo passaggio , dovresti trovare la sottodirectory SX127x nella cartella principale di Raspberry Pi. Questo avrà tutti i file richiesti associati alla libreria.
Programmazione di Raspberry Pi per LoRa
In una comunicazione LoRa peer to peer il modulo che sta trasmettendo le informazioni è chiamato server e il modulo che riceve le informazioni è chiamato client. Nella maggior parte dei casi l'Arduino verrà utilizzato sul campo con un sensore per misurare i dati e il Pi verrà utilizzato per ricevere questi dati. Quindi, ho deciso di utilizzare Raspberry Pi come client e Arduino come server in questo tutorial. Il programma client completo di Raspberry Pi è disponibile in fondo a questa pagina. Qui cercherò di spiegare le linee importanti del programma.
Attenzione: assicurati che il file di programma si trovi nella stessa directory in cui è presente la cartella della libreria SX127x. Puoi copiare questa cartella e usarla ovunque se desideri trasferire il progetto.
Il programma è piuttosto semplice, dobbiamo impostare il modulo LoRa in modo che funzioni a 433 Mhz e quindi ascoltare i pacchetti in arrivo. Se riceviamo qualcosa, li stampiamo semplicemente sulla console. Come sempre iniziamo il programma importando le librerie python richieste.
from time import sleep from SX127x.LoRa import * from SX127x.board_config import BOARD BOARD.setup ()
In questo caso il pacchetto time viene utilizzato per creare ritardi, il pacchetto Lora viene utilizzato per la comunicazione LoRa e board_config viene utilizzato per impostare i parametri board e LoRa. Configuriamo anche la scheda utilizzando la funzione BOARD.setup () .
Successivamente creiamo la classe LoRa python con tre definizioni. Dal momento che indentiamo solo per far funzionare il programma come un client raspberry, la classe ha solo tre funzioni: la classe init, la classe start e la classe on_rx_done . La classe init inizializza il modulo LoRa a 433 MHz con una larghezza di banda di 125 kHz come impostato nel metodo set_pa_config . Quindi mette anche il modulo in modalità di sospensione per risparmiare il consumo di energia.
# I valori predefiniti per intervallo medio dopo init sono 434,0 MHz, Bw = 125 kHz, Cr = 4/5, Sf = 128chips / simbolo, CRC su 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)
La funzione di avvio è dove configuriamo il modulo come ricevitore e otteniamo come RSSI (Indicatore di potenza del segnale di ricezione), stato, frequenza operativa ecc. Impostiamo il modulo in modo che funzioni in modalità ricevitore continuo (RXCONT) dalla modalità sleep e quindi utilizziamo un ciclo while per leggere valori come RSSI e stato del modem. Svuotiamo anche i dati nel buffer seriale sul terminale.
def start (self): self.reset_ptr_rx () self.set_mode (MODE.RXCONT) mentre True: sleep (.5) rssi_value = self.get_rssi_value () status = self.get_modem_status () sys.stdout.flush ()
Infine la funzione on_rx_done viene eseguita dopo la lettura del pacchetto in arrivo. In questa funzione i valori ricevuti vengono spostati in una variabile chiamata payload dal buffer Rx dopo aver impostato alto il flag di ricezione. Quindi i valori ricevuti vengono decodificati con utf-8 per stampare un dato leggibile dall'utente sulla shell. Inoltre, rimettiamo il modulo in modalità di sospensione fino a quando non viene ricevuto un altro valore.
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)
La parte rimanente del programma serve solo a stampare i valori ricevuti sulla console e terminare il programma utilizzando un interrupt da tastiera. Abbiamo nuovamente impostato la scheda in modalità sleep anche dopo la fine del programma per risparmiare energia.
prova: lora.start () tranne KeyboardInterrupt: sys.stdout.flush () print ("") sys.stderr.write ("KeyboardInterrupt \ n") infine: sys.stdout.flush () print ("") lora. set_mode (MODE.SLEEP) BOARD.teardown ()
Codice Arduino per LoRa per comunicare con Raspberry Pi
Come accennato in precedenza, il codice rpsreal supporta sia Arduino che Pi e quindi è possibile la comunicazione tra Arduino e Pi. Funziona sulla base della libreria Radiohead di AirSpayce. Quindi devi prima installare la libreria delle testine radio sul tuo IDE Arduino.
Per farlo visita la pagina Github e scarica la libreria nella cartella ZIP. Quindi posizionalo nella cartella della libreria del tuo IDE Arduino. Ora riavvia l'IDE di Arduino e troverai i file di esempio per la libreria Radio head. Qui programmeremo Arduino in modo che funzioni come un server LoRa per inviare pacchetti di prova come da 0 a 9. Il codice completo per fare lo stesso può essere trovato in fondo a questa pagina come sempre. Di seguito spiegherò alcune importanti righe del programma.
Iniziamo il programma importando la libreria SPI (installata di default) per utilizzare il protocollo SPI e poi la libreria RH_RF95 dalla testata Radio per eseguire la comunicazione LoRa. Definiamo quindi a quale pin di Arduino abbiamo collegato i pin Chip select (CS), Reset (RST) e Interrupt (INT) del LoRa con Arduino. Infine definiamo anche che il modulo dovrebbe funzionare in frequenza 434MHz e inizializziamo il modulo LoRa.
#includere
All'interno della funzione di configurazione ripristineremo il modulo LoRa tirando il suo pin di ripristino verso il basso per 10 milli secondo per ricominciare da capo. Quindi lo inizializziamo con il modulo che abbiamo creato in precedenza utilizzando la libreria Radio head. Quindi, impostiamo la frequenza e la potenza di trasmissione per il server LoRa. Maggiore è la trasmissione, maggiore sarà la distanza percorsa dai pacchetti, ma consumeranno più energia.
void setup () { // Initialize Serial Monitor Serial.begin (9600); // Reimposta modulo LoRa pinMode (RFM95_RST, OUTPUT); digitalWrite (RFM95_RST, LOW); ritardo (10); digitalWrite (RFM95_RST, HIGH); ritardo (10); // Inizializza il modulo LoRa while (! Rf95.init ()) { Serial.println ("LoRa radio init failed"); mentre (1); } // Imposta la frequenza predefinita 434.0MHz if (! Rf95.setFrequency (RF95_FREQ)) { Serial.println ("setFrequency failed"); mentre (1); } rf95.setTxPower (18); // Potenza di trasmissione del modulo Lora }
All'interno della funzione loop infinito, dobbiamo semplicemente inviare il pacchetto di dati attraverso il modulo LoRa. Questi dati possono essere qualsiasi cosa come il valore del sensore del comando utente. Ma per semplicità invieremo un valore di caratteri da 0 a 9 per ogni intervallo di 1 secondo e quindi inizializzeremo il valore di nuovo a 0 dopo aver raggiunto 9. Nota che i valori possono essere inviati solo in un formato di array di caratteri e il tipo di dati dovrebbe essere unit8_t che è 1 byte alla volta. Il codice per fare lo stesso è mostrato di seguito
void loop () { Serial.print ("Send:"); char radiopacket = char (valore)}; rf95.send ((uint8_t *) radiopacket, 1); ritardo (1000); valore ++; se (valore> '9') valore = 48; }
Test della comunicazione LoRa tra Raspberry Pi e Arduino
Ora, che abbiamo pronto sia il nostro hardware che il nostro programma, dobbiamo semplicemente caricare il codice Arduino sulla scheda UNO e lo sketch python dovrebbe essere lanciato su pi. La mia configurazione di prova con entrambi gli hardware collegati è simile a questa sotto
Una volta che lo sketch del client python è stato avviato sul Pi (usa solo python 3), se tutto funziona correttamente dovresti vedere i pacchetti Arduino ricevuti in pi attraverso la finestra della shell. Dovresti notare "Ricevuto: 0" a 9 come mostrato nell'immagine qui sotto.
Il codice Raspberry Pi completo con tutte le librerie richieste può essere scaricato da qui.
Ora puoi spostare il server Arduino e controllare la portata del modulo; è anche possibile visualizzare il valore RSSI sulla shell, se necessario. Il funzionamento completo del progetto si trova nel video linkato di seguito. Ora che sappiamo come stabilire una comunicazione LoRa a bassa potenza a lunga distanza tra Arduino e Raspberry pi, possiamo procedere con l'aggiunta del sensore sul lato Arduino e della piattaforma cloud sul lato Pi per creare un pacchetto IoT completo.
Spero che tu abbia capito il progetto e ti sia piaciuto realizzarlo. Se hai problemi a farlo funzionare, usa la sezione commenti qui sotto o il forum per altri quesiti tecnici.