UP | HOME

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.

esp-lora.png

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);
}


Author: ARI people

Created: 2023-06-04 dom 22:58

Validate