Corso di LoRa - Configurazione e prima trasmisione
Table of Contents
Premessa
Il codice indicato nel seguito e' quello utilizzato per le prime prove di utilizzo di LoRa il cui esito e' mostrato nel seguente video pubblicato sul canale della Sezione ARI di Montecatini Terme. La figura di seguito mostra lo schema dei collegamenti.
Figure 1: Collegamento tra ESP32 e la board LoRa
Codice C++
La comunicazione tra le due board avviene tramite la seriale n.2 della ESP32. Dopo aver letto e modificato la configurazione della scheda si e' proceduto all'installazione della configurato la scheda e sia la configurazione che la comunicazione e' gestista dalla libreria LoRaE220.h scritta da Renzo Mischinati in cui il codice E220 identifica il tipo della board di LoRa.
NOTA : durante le prove entrambe le ESP utilizzate hanno avuto problemi di collegamento con il PIN GND e questo causava un errato valore di alimentazione della VCC per la board LoRa.
Lettura configurazione
Il codice seguente puo' essere compilato scegliendo l'oggetto corretto per la comunicazione che per lo schema della figura precedente e' identificato dall'etichetta \(e32pins\). Nel caso non si volesse utilizzare i PIN di default della porta Serial2 e' necessario utilizzare l'oggetto individuato dall'etichetta mySerial .
/* * LoRa E220 * Get configuration. * You must uncommend the correct constructor. * * by Renzo Mischianti <https://www.mischianti.org> * * https://www.mischianti.org * * E220 ----- WeMos D1 mini ----- esp32 ----- Arduino Nano 33 IoT ----- Arduino MKR ----- Raspberry Pi Pico ----- stm32 ----- ArduinoUNO * M0 ----- D7 (or 3.3v) ----- 19 (or 3.3v) ----- 4 (or 3.3v) ----- 2 (or 3.3v) ----- 10 (or 3.3v) ----- PB0 (or 3.3v) ----- 7 Volt div (or 3.3v) * M1 ----- D6 (or 3.3v) ----- 21 (or 3.3v) ----- 6 (or 3.3v) ----- 4 (or 3.3v) ----- 11 (or 3.3v) ----- PB10 (or 3.3v) ----- 6 Volt div (or 3.3v) * TX ----- D3 (PullUP) ----- TX2 (PullUP) ----- TX1 (PullUP) ----- 14 (PullUP) ----- 8 (PullUP) ----- PA2 TX2 (PullUP) ----- 4 (PullUP) * RX ----- D4 (PullUP) ----- RX2 (PullUP) ----- RX1 (PullUP) ----- 13 (PullUP) ----- 9 (PullUP) ----- PA3 RX2 (PullUP) ----- 5 Volt div (PullUP) * AUX ----- D5 (PullUP) ----- 18 (PullUP) ----- 2 (PullUP) ----- 0 (PullUP) ----- 2 (PullUP) ----- PA0 (PullUP) ----- 3 (PullUP) * VCC ----- 3.3v/5v ----- 3.3v/5v ----- 3.3v/5v ----- 3.3v/5v ----- 3.3v/5v ----- 3.3v/5v ----- 3.3v/5v * GND ----- GND ----- GND ----- GND ----- GND ----- GND ----- GND ----- GND * */ #include "Arduino.h" #include "LoRa_E220.h" // ---------- esp8266 pins -------------- //LoRa_E220 e220ttl(RX, TX, AUX, M0, M1); // Arduino RX <-- e220 TX, Arduino TX --> e220 RX //LoRa_E220 e220ttl(D3, D4, D5, D7, D6); // Arduino RX <-- e220 TX, Arduino TX --> e220 RX AUX M0 M1 //LoRa_E220 e220ttl(D2, D3); // Config without connect AUX and M0 M1 //#include <SoftwareSerial.h> //SoftwareSerial mySerial(D2, D3); // Arduino RX <-- e220 TX, Arduino TX --> e220 RX //LoRa_E220 e220ttl(&mySerial, D5, D7, D6); // AUX M0 M1 // ------------------------------------- // ---------- Arduino pins -------------- //LoRa_E220 e220ttl(4, 5, 3, 7, 6); // Arduino RX <-- e220 TX, Arduino TX --> e220 RX AUX M0 M1 //LoRa_E220 e220ttl(4, 5); // Config without connect AUX and M0 M1 //#include <SoftwareSerial.h> //SoftwareSerial mySerial(4, 5); // Arduino RX <-- e220 TX, Arduino TX --> e220 RX //LoRa_E220 e220ttl(&mySerial, 3, 7, 6); // AUX M0 M1 // ------------------------------------- // ------------- Arduino Nano 33 IoT ------------- // LoRa_E220 e220ttl(&Serial1, 2, 4, 6); // RX AUX M0 M1 // ------------------------------------------------- // ------------- Arduino MKR WiFi 1010 ------------- // LoRa_E220 e220ttl(&Serial1, 0, 2, 4); // RX AUX M0 M1 // ------------------------------------------------- // ---------- esp32 pins -------------- LoRa_E220 e220ttl(&Serial2, 18, 21, 19); // RX AUX M0 M1 //LoRa_E220 e220ttl(&Serial2, 22, 4, 18, 21, 19, UART_BPS_RATE_9600); // esp32 RX <-- e220 TX, esp32 TX --> e220 RX AUX M0 M1 // ------------------------------------- // ---------- Raspberry PI Pico pins -------------- // LoRa_E220 e220ttl(&Serial2, 2, 10, 11); // RX AUX M0 M1 // ------------------------------------- // ---------------- STM32 -------------------- //HardwareSerial Serial2(USART2); // PA3 (RX) PA2 (TX) //LoRa_E220 e220ttl(&Serial2, PA0, PB0, PB10); // RX AUX M0 M1 // ------------------------------------------------- void printParameters(struct Configuration configuration); void printModuleInformation(struct ModuleInformation moduleInformation); void setup() { Serial.begin(9600); while(!Serial){}; delay(500); Serial.println(); // Startup all pins and UART e220ttl.begin(); ResponseStructContainer c; c = e220ttl.getConfiguration(); // It's important get configuration pointer before all other operation Configuration configuration = *(Configuration*) c.data; Serial.println(c.status.getResponseDescription()); Serial.println(c.status.code); printParameters(configuration); ResponseStructContainer cMi; cMi = e220ttl.getModuleInformation(); // It's important get information pointer before all other operation ModuleInformation mi = *(ModuleInformation*)cMi.data; Serial.println(cMi.status.getResponseDescription()); Serial.println(cMi.status.code); printModuleInformation(mi); c.close(); cMi.close(); } void loop() { } void printParameters(struct Configuration configuration) { Serial.println("----------------------------------------"); Serial.print(F("HEAD : ")); Serial.print(configuration.COMMAND, DEC);Serial.print(" "); Serial.print(configuration.STARTING_ADDRESS, DEC);Serial.print(" ");Serial.println(configuration.LENGHT, HEX); Serial.println(F(" ")); Serial.print(F("AddH : ")); Serial.println(configuration.ADDH, DEC); Serial.print(F("AddL : ")); Serial.println(configuration.ADDL, DEC); Serial.println(F(" ")); Serial.print(F("Chan : ")); Serial.print(configuration.CHAN, DEC); Serial.print(" -> "); Serial.println(configuration.getChannelDescription()); Serial.println(F(" ")); Serial.print(F("SpeedParityBit : ")); Serial.print(configuration.SPED.uartParity, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getUARTParityDescription()); Serial.print(F("SpeedUARTDatte : ")); Serial.print(configuration.SPED.uartBaudRate, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getUARTBaudRateDescription()); Serial.print(F("SpeedAirDataRate : ")); Serial.print(configuration.SPED.airDataRate, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getAirDataRateDescription()); Serial.println(F(" ")); Serial.print(F("OptionSubPacketSett: ")); Serial.print(configuration.OPTION.subPacketSetting, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getSubPacketSetting()); Serial.print(F("OptionTranPower : ")); Serial.print(configuration.OPTION.transmissionPower, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getTransmissionPowerDescription()); Serial.print(F("OptionRSSIAmbientNo: ")); Serial.print(configuration.OPTION.RSSIAmbientNoise, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getRSSIAmbientNoiseEnable()); Serial.println(F(" ")); Serial.print(F("TransModeWORPeriod : ")); Serial.print(configuration.TRANSMISSION_MODE.WORPeriod, BIN);Serial.print(" -> "); Serial.println(configuration.TRANSMISSION_MODE.getWORPeriodByParamsDescription()); Serial.print(F("TransModeEnableLBT : ")); Serial.print(configuration.TRANSMISSION_MODE.enableLBT, BIN);Serial.print(" -> "); Serial.println(configuration.TRANSMISSION_MODE.getLBTEnableByteDescription()); Serial.print(F("TransModeEnableRSSI: ")); Serial.print(configuration.TRANSMISSION_MODE.enableRSSI, BIN);Serial.print(" -> "); Serial.println(configuration.TRANSMISSION_MODE.getRSSIEnableByteDescription()); Serial.print(F("TransModeFixedTrans: ")); Serial.print(configuration.TRANSMISSION_MODE.fixedTransmission, BIN);Serial.print(" -> "); Serial.println(configuration.TRANSMISSION_MODE.getFixedTransmissionDescription()); Serial.println("----------------------------------------"); } void printModuleInformation(struct ModuleInformation moduleInformation) { Serial.println("----------------------------------------"); Serial.print(F("HEAD: ")); Serial.print(moduleInformation.COMMAND, DEC);Serial.print(" ");Serial.print(moduleInformation.STARTING_ADDRESS, DEC);Serial.print(" ");Serial.println(moduleInformation.LENGHT, DEC); Serial.print(F("Model no.: ")); Serial.println(moduleInformation.model, DEC); Serial.print(F("Version : ")); Serial.println(moduleInformation.version, DEC); Serial.print(F("Features : ")); Serial.println(moduleInformation.features, DEC); Serial.println("----------------------------------------"); }
Risultato della lettura configurazione
Success 1 ---------------------------------------- HEAD : 193 0 8 AddH : 0 -- parte alta dell'indirizzo AddL : 3 -- parte bassa dell'indirizzo Chan : 23 -> 433MHz -- canale di trasmissione SpeedParityBit : 0 -> 8N1 (Default) SpeedUARTDatte : 11 -> 9600bps (default) SpeedAirDataRate : 10 -> 2.4kbps (default) OptionSubPacketSett: 0 -> 200bytes (default) OptionTranPower : 0 -> 22dBm (Default) OptionRSSIAmbientNo: 0 -> Disabled (default) TransModeWORPeriod : 11 -> 2000ms (default) TransModeEnableLBT : 0 -> Disabled (default) TransModeEnableRSSI: 0 -> Disabled (default) TransModeFixedTrans: 0 -> Transparent transmission (default) ---------------------------------------- Success 1 ---------------------------------------- HEAD: 193 8 3 Model no.: 32 Version : 11 Features : 22 ----------------------------------------
Configurazione e Trasmissione
Il codice di seguito permette la trasmissione e ricezzione di messaggi
#include <Arduino.h> #include "LoRa_E220.h" void setInitLoraE220(); /* impostazione dei PIN per il collegamento dell board LoRa */ LoRa_E220 e220ttl(&Serial2, 18, 21, 19); //( WeMos RX --> e220 TX - WeMos TX --> e220 RX ) AUX M0 M1 void setup() { Serial.begin(9600); delay(500); Serial.println("Hi, I'm going to send message!!"); // Startup all pins and UART e220ttl.begin(); setInitLoraE220(); // Send message ResponseStatus rs = e220ttl.sendBroadcastFixedMessage(23, "PTLUG - ARIM - Hello, world?"); // Check If there is some problem of successfully send Serial.println(rs.getResponseDescription()); } void loop() { // If something available if (e220ttl.available()>1) { // read the String message ResponseContainer rc = e220ttl.receiveMessage(); // Is something goes wrong print error if (rc.status.code!=1){ rc.status.getResponseDescription(); }else{ // Print the data received Serial.println("Ricevuto: " + rc.data); } } if (Serial.available()) { String input = Serial.readString(); Serial.println("Invio stringa: " + input); ResponseStatus rs = e220ttl.sendBroadcastFixedMessage(23, input); Serial.println(rs.getResponseDescription()); } } void setInitLoraE220(){ ResponseStructContainer c; c = e220ttl.getConfiguration(); // It's important get configuration pointer before all other operation Configuration configuration = *(Configuration*) c.data; Serial.println(c.status.getResponseDescription()); Serial.println(c.status.code); //printParameters(configuration); configuration.ADDL = 0x03; configuration.ADDH = 0x00; // configuration.NETID = 0x00; configuration.CHAN = 23; // ----------------------- IMPOSTAZIONI DELLA BOARD------------------- // ----------------------- DEFAULT TRANSPARENT ----------------------- configuration.ADDL = 0x03; configuration.ADDH = 0x00; // configuration.NETID = 0x00; configuration.CHAN = 23; configuration.SPED.uartBaudRate = UART_BPS_9600; configuration.SPED.airDataRate = AIR_DATA_RATE_010_24; configuration.SPED.uartParity = MODE_00_8N1; // configuration.OPTION.subPacketSetting = SPS_240_00; configuration.OPTION.RSSIAmbientNoise = RSSI_AMBIENT_NOISE_DISABLED; configuration.OPTION.transmissionPower = POWER_22; configuration.TRANSMISSION_MODE.enableRSSI = RSSI_DISABLED; configuration.TRANSMISSION_MODE.fixedTransmission = FT_TRANSPARENT_TRANSMISSION; // configuration.TRANSMISSION_MODE.enableRepeater = REPEATER_DISABLED; configuration.TRANSMISSION_MODE.enableLBT = LBT_DISABLED; // configuration.TRANSMISSION_MODE.WORTransceiverControl = WOR_RECEIVER; configuration.TRANSMISSION_MODE.WORPeriod = WOR_2000_011; //----/// ResponseStatus rs = e220ttl.setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE); Serial.println(rs.getResponseDescription()); Serial.println(rs.code); c = e220ttl.getConfiguration(); // It's important get configuration pointer before all other operation configuration = *(Configuration*) c.data; Serial.println(c.status.getResponseDescription()); Serial.println(c.status.code); }