Progetto di un sistema di comunicazioni Wireless Long-Range con LoRa32 – Parte 3

Nella seconda parte del progetto “Progetto di un sistema di comunicazioni Wireless Long-Range con LoRa32 - Parte 2” che abbiamo presentato in un precedente articolo, abbiamo fatto una trattazione completa della scheda di sviluppo TTGO ESP32-Paxcounter LoRa32. In questa terza parte del progetto descriveremo le fasi di programmazione di questa scheda che prevedono l’installazione delle librerie nell’IDE di Arduino e la creazione degli sketch per la configurazione e l’operatività del TX e dell’RX. Inoltre, descriveremo il funzionamento del progetto attraverso la spiegazione dei codici, infine faremo il test funzionale del sistema di comunicazione Wireless Long-Range.

PROGRAMMAZIONE DELLE SCHEDE LORA32

Come già accennato, per programmare le schede LoRa32 utilizzeremo l’IDE di Arduino e installeremo alcune librerie. Occorre innanzitutto installare il driver che consente la comunicazione seriale USB della scheda con il computer. Per questo, LoRa32 utilizza il chip convertitore seriale UART-USB integrato nella scheda CP2104. Collegate la scheda LoRa32 al computer tramite un cavo USB-micro USB. Se il sistema operativo del computer non riconosce automaticamente il chip CP2104, occorre scaricare il driver dal sito web http://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers e decomprimilo in una cartella. Su Windows si installa eseguendo "CP210xVCPInstaller_x86.exe" o "CP210xVCPInstaller_x64.exe", a seconda del sistema operativo a 32 o 64 bit; per Mac, si installa il file DMG nell'archivio caricato. Per i sistemi operativi Windows XP e Vista occorre installare il driver dal sito https://www.silabs.com/community/interface/knowledge-base.entry.html/2017/01/10/legacy_os_softwarea-bgvU. Dopo aver scollegato e ricollegato la scheda, nell’elenco delle periferiche di comunicazione in Windows dovrebbe apparire una porta COM identificabile come "Silicon Labs CP210x da USB a UART Bridge". Il prossimo step è l’installazione del software IDE di Arduino dal sito ufficiale www.arduino.cc (in questo articolo si fa riferimento alla versione software Arduino 1.8.15).

INSTALLAZIONE DELLE LIBRERIE

Installazione del firmware dell’ESP32

Aprite l’IDE di Arduino e da File > Impostazioni, alla voce “URL aggiuntive per il Gestore schede” inserite il link: https://dl.espressif.com/dl/package_esp32_index.json. Poi, con Strumenti > Scheda > Gestore Schede, digitate “esp32” nella barra di ricerca; si visualizzerà un’immagine come in Figura 1.

Figura 1: Installazione dell’ESP32

Selezionate “ESP32 by Espressif Systems“ e cliccate su “Installa" per caricare il firmware di gestione della scheda ESP32 nell’IDE di Arduino.

Installazione delle librerie di gestione del display OLED SSD1306 integrato nella scheda di sviluppo TTGO ESP32

Andate nel sito https://github.com/adafruit/Adafruit_SSD1306 e scaricate il file ZIP Adafruit_SSD1306-master.zip, Adafruit GFX; ora aprite il sito https://github.com/adafruit/Adafruit-GFX-Library e scaricate il file ZIP. Una volta scaricati i due file ZIP delle librerie dovete inserirli in Arduino selezionando per ognuno di essi Sketch -> #include Libreria -> Aggiungi libreria da file .ZIP, e installare le librerie cercandole con Strumenti -> Gestione librerie, comando che apre il Gestore delle librerie presenti in Arduino in cui dovrete cercare le librerie inserendo il nome “SSD1306” e poi “GFX” nella barra di ricerca del Gestore e installarle cliccando su “Install”.

Installazione della libreria LoRa

Cercate in Arduino la libreria LoRa con Sketch -> #include Libreria -> Gestione librerie digitando “LoRa” nella barra di ricerca. Scorrete l’elenco delle librerie e installate la libreria “LoRa by sandeep mistry”. Installate tutte le librerie, chiudete e riavviate l’IDE di Arduino.

Creazione dello sketch di trasmissione dei messaggi

In un nuovo sketch copiate il seguente codice:

//Libraries for LoRa
#include <SPI.h>
#include <LoRa.h>

//Libraries for OLED Display
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

//define the pins used by the LoRa transceiver module
#define SCK 5
#define MISO 19
#define MOSI 27
#define SS 18
#define RST 14
#define DIO0 26

//433E6 for Asia
//866E6 for Europe
//915E6 for North America
#define BAND 866E6

//OLED pins
#define OLED_SDA 21
#define OLED_SCL 22 
#define OLED_RST 16
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

//packet counter
int counter = 0;

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RST);

void setup() {
//initialize Serial Monitor
Serial.begin(115200);

//reset OLED display via software
pinMode(OLED_RST, OUTPUT);
digitalWrite(OLED_RST, LOW);
delay(20);
digitalWrite(OLED_RST, HIGH);

//initialize OLED
Wire.begin(OLED_SDA, OLED_SCL);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3c, false, false)) { // Address 0x3C for 128x32
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}

display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(0,0);
display.print("Trasmettitore LORA ");
display.display();

Serial.println("LoRa Sender Test");

//SPI LoRa pins
SPI.begin(SCK, MISO, MOSI, SS);
//setup LoRa transceiver module
LoRa.setPins(SS, RST, DIO0);

if (!LoRa.begin(BAND)) {
Serial.println("Starting LoRa failed!");
while (1);
}
Serial.println("LoRa Initializing OK!");
display.setCursor(0,10);
display.print("LoRa Initializing OK!");
display.display();
delay(2000);
}

void loop() {

Serial.print("Sending packet: ");
Serial.println(counter);

//Send LoRa packet to receiver
LoRa.beginPacket();
LoRa.print("Test invio messaggio ");
LoRa.print(counter);
LoRa.endPacket();

display.clearDisplay();
display.setCursor(0,0);
display.println("LORA SENDER");
display.setCursor(0,20);
display.setTextSize(1);
display.print("LoRa packet sent.");
display.setCursor(0,30);
display.print("Counter:");
display.setCursor(50,30);
display.print(counter); 
display.display();

counter++;

delay(10000);
}

Caricamento del codice nella scheda TX TTGO ESP32 LoRa

Con un cavo USB-microUSB collegate la scheda TX al computer. Per caricare il codice nell’ESP32 occorre selezionare la scheda TTGO ESP32 nell’IDE, quindi da Strumenti -> Scheda, selezionate "TTGO LoRa32-OLED V1”, poi selezionate la porta COM (su Windows) o ttyUSB (su Mac) corrispondente al driver “Silicon Labs CP210x USB to UART Bridge VCP”. Salvate lo sketch con il nome “TX_LongRange”, o come volete. Predisponete la scheda in modalità di programmazione collegando con un jumper il pin GPIO0 a massa e premete il pulsante RST di reset della scheda; infine, nell’IDE di Arduino cliccate sul pulsante -> (carica) per avviare la compilazione e l’upload del codice. Terminato il caricamento del codice, disconnettete dalla massa il pin GPIO0; aprite il monitor seriale impostato su un baud rate di 115200 b/s e premete il pulsante RST. Sul monitor seriale vedrete un’immagine simile a quella riportata in Figura 2 che riporta la sequenza di pacchetti di dati che il trasmettitore LoRa32 TX sta inviando via radio. Sul display OLED del TX apparirà il conteggio dei pacchetti inviati, come illustrato in Figura 3.

Figura 2: Sequenza di pacchetti inviati dal trasmettitore TTGO LoRa32

 

Figura 3: Invio dei pacchetti dal TX

Descrizione del codice del TX

Il codice riportato nello sketch del TX ha la funzione di inviare ogni 10 secondi il messaggio “Test invio messaggio” dalla scheda TTGO ESP32 trasmettitore alla scheda TTGO ESP32 ricevitore TTGO che sarà visualizzato sul suo display OLED.

Il codice inizia includendo le librerie per l’interfacciamento di comunicazione fra il chip ESP32 e il chip LoRa.

#includi <SPI.h>
#include <LoRa.h>


Poi vengono incluse le librerie per la gestione e la comunicazione I2C del display OLED.

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>


Si definiscono i pin utilizzati dal modulo tranceiver LoRa e la banda fi frequenze operativa per l’Europa:

#define SCK 5
#define MISO 19
#define MOSI 27
#define SS 18
#define RST 14
#define DIO0 26
Select the LoRa frequency:

#define BAND 866E6


Si definiscono i pin utilizzati dall’OLED per la comunicazione I”C e per impostare le dimensioni.

#define OLED_SDA 21
#define OLED_SCL 22 
#define OLED_RST 16

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels


Viene creata una variabile contatore per tenere traccia del numero di pacchetti LoRa inviati.

int counter = 0;


Viene creato l’oggetto “display” del metodo Adafruit_SSD1306.

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RST);


Funzione setup()

Per utilizzare l'OLED è necessario eseguire un ripristino tramite software utilizzando il pin RST. Per eseguire questo ripristino, è necessario dichiarare il pin RST come uscita, impostarlo su LOW per alcuni millisecondi e quindi impostarlo nuovamente su HIGH.

pinMode(OLED_RST, OUTPUT);
digitalWrite(OLED_RST, LOW);
delay(20);
digitalWrite(OLED_RST, HIGH);


Con Wire.begin() avvia una comunicazione I2C utilizzando i pin definiti OLED_SDA e OLED_SCL pins.

Wire.begin(OLED_SDA, OLED_SCL);

Successivamente, inizializza il display con i seguenti parametri. I parametri impostati come false assicurano che la libreria non utilizzi i pin I2C predefiniti e utilizzi i pin GPIO 4 e GPIO 15 definiti nel codice.

if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3c, false, false)) { // Address 0x3C for 128x32
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}


Viene scritto il messaggio “Trasmettitore LORA” sull’OLED.

display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(0,0);
display.print("LORA SENDER ");
display.display();


Inizializza il monitor seriale per il debug.

Serial.begin(115200);
Serial.println("LoRa Sender Test");


Definisce i pin SPI utilizzati dal chip LoRa.

SPI.begin(SCK, MISO, MOSI, SS);


E imposta il modulo transceiver LoRa.

LoRa.setPins(SS, RST, DIO0);


Infine, inizializza il modulo transceiver LoRa usando il metodo LoRa.begin() sull'oggetto LoRa e passa la frequenza come argomento.

if (!LoRa.begin(BAND)) {
Serial.println("Starting LoRa failed!");
while (1);
}


Viene scritto sull’OLED il messaggio di inizializzazione avvenuta con successo del modulo Lora.

display.setCursor(0,10);
display.print("LoRa Initializing OK!");
display.display();


Funzione loop()

Con la funzione loop() vengono inviati i pacchetti di dati del messaggio. Inizializza un pacchetto con il metodo beginPacket().

LoRa.beginPacket();


Scrive i dati nel pacchetto usando il metodo LoRa.print() per inviare un messaggio di test seguito dal contatore. [...]

ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 2414 parole ed è riservato agli ABBONATI. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici che potrai leggere in formato PDF per un anno. ABBONATI ORA, è semplice e sicuro.

Scarica subito una copia gratis

Una risposta

  1. DarioIII 30 Luglio 2022

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend