Ebyte LoRa E22 per Arduino, esp32 o esp8266: specifiche ed utilizzo base – 1
La telemetria dei dati wireless LoRa o Long Range è una tecnologia introdotta da Semtech che opera a una frequenza inferiore degli NRF24L01 (433 MHz, 868 MHz o 916 MHz contro 2,4 GHz per NRF24L01) ma copre tre volte la distanza (da 4000 a 10000 m).
Puoi trovarlo qui AliExpress (433MHz 5.5Km) - AliExpress (433MHz 10Km) - AliExpress (868MHz 915Mhz 5.5Km) - AliExpress (868MHz 915Mhz 10Km)
Testeremo l’E22-400T22D and E22-400T22S. È un modulo ricetrasmettitore wireless, funziona da 410 a 493 MHz basato sull’originale RFX SX1268 di SEMTECH, e permette la trasmissione trasparente, livello TTL. Il modulo adotta la tecnologia dello spettro di diffusione LORA.
Comeil fratello minore Ebyte e22 il modulo presenta l’algoritmo FEC Forward Error Correction, che garantisce un’elevata efficienza di codifica e buone prestazioni di correzione. In caso di interferenza improvvisa, può correggere automaticamente i pacchetti dati interferiti, garantendo una buona affidabilità. Senza FEC, quei pacchetti possono essere eliminati.
Con la crittografia e decrittografia, l’intercettazione dei dati diventa inutile. La funzione di compressione dei dati può ridurre il tempo di trasmissione e la probabilità di interferenze, migliorando l’affidabilità e l’efficienza della trasmissione.
Ma in più rispetto l’e22 ha una features denominata “carrier sense (sensore della trasmissione)” che aspetta ad eseguire la trasmissione se ci sono interferenze temporanee, può essere usato come repeater, ha un watchdog che in caso di errore riavvia il dispositivo e continuare a lavorare, ha una modalità deep sleep per un migliore risparmio energetico, e prima di tutto l’sx1268 garantisce con meno consumi più potenza.
Si può configurare o leggere la configurazione da remoto inviando pacchetti in modalità wireless.
Ed infine ha un’importante features che è l’RSSI cioè è possibile sapere l’intensità del segnale all’invio di ogni messaggio.
Modalità operativa e di trasmissione
Questo dispositivo ha alcune funzioni interessanti:
Trasmissione
Trasmissione trasparente
Questa può essere considerata come una “modalità demo”, è il valore predefinito ed è possibile inviare messaggi a tutti i dispositivi con lo stesso indirizzo e canale impostati.
Trasmissione fissa
Questo tipo di trasmissione è possibile specificare un indirizzo e un canale a cui si desidera inviare il messaggio.
Puoi inviare un messaggio a:
- Dispositivo specificato con un indirizzo predeterminato basso, un indirizzo alto (per ottenere un indirizzo di 2 byte lo hanno separato in 2 parametri) e un canale.
- Mandare messaggi di broadcast su un determinato canale.
Normal mode
Invia semplicemente un messaggio.
Wake-up mode e power-saving mode
Come puoi intuire se un dispositivo è in modalità Wake-up puoi “riattivare” uno o più dispositivi che sono in modalità di risparmio energetico con una comunicazione preambolo.
Program/sleep mode
Con questa configurazione è possibile modificare la configurazione del dispositivo.
Specifiche
Ecco le specifiche per il modulo:
Main Parameters | Value | Remarks | ||
Min. | Typical | Max | ||
Operating voltage(V) | 2.3 | 5.0 | 5.5 | ≥5.0 V ensures output power |
Communication level(V) | – | 3.3 | – | For 5V TTL, it may be at risk of burning down |
Operating temperature(℃) | -40 | – | 85 | Industrial design |
Operating frequency(MHz) | 410.125 | 433.125 | 493.125 | Support ISM band |
TX Current(mA) | – | 110 | – | Instant power consumption |
RX current(mA) | – | 12 | – | – |
Sleep current(μA) | – | 2 | – | Software is shut down |
Max Tx power(dBm) | 21.5 | 22.0 | 22.5 | – |
Receiving sensitivity(dBm) | -146 | -147 | -148 | Air data rate is 0.3 kbps |
Air data rate(bps) | 0.3k | 2.4k | 62.5k | Controlled via user’s programming |
Main parameter | Description | Remarks |
Distance for reference | 5km | Test condition:clear and open area, antenna gain: 5dBi,antenna height:2.5m,air data rate: 2.4kbps |
TX length | 240 Byte | Can be configured via command as 32/64/128/240 bytes per packet totransmit |
Buffer | 1000 Byte | – |
Modulation | LoRa | New generation LoRa modulation technology |
Communication interface | UART | TTL level |
Package | DIP | – |
Connector | 1*7*2.54mm | – |
Size | 21*36 mm | – |
Antenna | SMA | 50 ohm impedance |
- Interfaccia di comunicazione: UART – 8N1, 8E1, 8O1, otto tipi di baud rate UART, da 1200 a 115200 bps (impostazione predefinita: 9600)
Electronic parameter | Min. | Typ. | Max. | Unit | Condition |
Power supply | 3.3 | 3.6 | 5.5 | V | |
Communication level | 3.0 | 3.3 | 3.6 | V | |
Transmitting current | 95 | 100 | 105 | mA | 22dBm(160mW) |
Receiving current | 6 | 6.5 | 7 | mA | |
Sleep current | 1 | 2 | 3 | nA | |
Operating temperature | -40 | 20 | +85 | ℃ | |
Operating humidity | 10 | 60 | 90 | % | |
Storage temperature | -40 | 20 | +125 | ℃ |
Devi prestare attenzione al communication level che differisce dall’alimentazione, il secondo può ricevere una tensione sia 3.3v (esp8266 ed esp32) che 5v (Arduino), ma il primo vuole un 3.3v, quindi per connetterti ad un Arduino devi usare un Partitore di tensione (Partitore di tensione (voltage divider): calcolatore e applicazioni) per prevenire danni al dispositivo.
Pinout
1 | M0 | Input(weak pull-up) | Lavora con M1 e decide le quattro modalità operative. Non può essere lasciato libero, può essere messo a terra. |
2 | M1 | Input(weak pull-up) | Lavora con M1 e decide le quattro modalità operative. Non può essere lasciato libero, può essere messo a terra. |
3 | RXD | Input | Ingressi UART TTL, connessione a pin di uscita TXD esterno (MCU, PC). Può essere configurato come ingresso open-drain o pull-up. |
4 | TXD | Output | Uscite TTL UART, si collega all’inputpin esterno RXD (MCU, PC). Può essere configurato come uscita open-drain o push-pull |
5 | AUX | Output | Per indicare lo stato di funzionamento del modulo e riattivare l’MCU esterno. Durante la procedura di inizializzazione di autocontrollo, il pin emette una bassa tensione. Può essere configurato come uscita open-drain o output push-pull (è consentito non metterlo a terra). |
6 | VCC | Alimentazione 2.3V~5.5V DC | |
7 | GND | Terra |
Come puoi vedere, puoi impostare varie modalità tramite i pin M0 e M1.
Mode | M1 | M0 | Explanation |
---|---|---|---|
Normal | 0 | 0 | UART and wireless channel are open, transparent transmission is on |
WOR mode | 0 | 1 | Can be defined as WOR transmitter and WOR receiver |
Configuration mode | 1 | 0 | Users can access the register through the serial port to control the working state of the module |
Deep sleep mode | 1 | 1 | Sleep mode. |
Collegamento in normal mode
Per il prossimo semplice test useremo la modalità normale.
Collegamento di Wemos D1 mini (esp8266) per un utilizzo di base
esp8266 ha il vantaggio di avere la stessa tensione dell’interfaccia di comunicazione, quindi lo schema di connessione è più semplice di Arduino.
È importante aggiungere una resistenza di pull-up (4,7Kohm) per ottenere una buona stabilità.
M0 | GND (Set normal mode) |
M1 | GND (Set normal mode) |
RX | PIN D2 (PullUP 4,7KΩ) |
TX | PIN D3 (PullUP 4,7KΩ) |
AUX | Not connected |
VCC | 3.3v |
GND | GND |
Connettere l’esp32 per utilizzo base
Come il WeMos, la logica dell’esp32 lavora a 3.3v ma avendo 3 Hardware Serial possiamo usare la Serial2 per la connessione.
M0 | GND (Set normal mode) |
M1 | GND (Set normal mode) |
RX | TX2 (PullUP 4,7KΩ) |
TX | RX2 (PullUP 4,7KΩ) |
AUX | Not connected |
VCC | 3.3v |
GND | GND |
Connettere l’Arduino MKR per l’utilizzo base
M0 | GND (Set normal mode) |
M1 | GND (Set normal mode) |
TX | PIN 14 Tx (PullUP 4,7KΩ) |
RX | PIN 13 Rx (PullUP 4,7KΩ) |
AUX | PIN 1 (PullUP 4,7KΩ) |
VCC | 5V |
GND | GND |
Connettere l’Arduino UNO per utilizzo base
La tensione di lavoro di Arduino è 5v, quindi è necessario aggiungere un partitore di tensione sul pin RX del modulo LoRa per prevenire danni, è possibile ottenere maggiori informazioni qui Partitore di tensione (voltage divider): calcolatore e applicazioni.
È possibile utilizzare una resistenza da 2Kohm su GND e 1Kohm dal segnale e poi insieme su RX.
M0 | GND (Set normal mode) |
M1 | GND (Set normal mode) |
RX | PIN D2 (PullUP 4,7KΩ & Voltage divider) |
TX | PIN D3 (PullUP 4,7KΩ) |
AUX | Not connected |
VCC | 3.3v |
GND | GND |
Sketch per una semplice comunicazione
Se si imposti su 0 pin M1 e M0 si entra in modalità “Normale”, ed è possibile ricevere e trasmettere tutti i dati dal dispositivo A a B, questa modalità viene definita “Trasmissione trasparente”.
Puoi usare 2 Arduinos o 2 Wemos D1 mini o uno di ogni tipo.
All’inizio invia un messaggio e se scrivi in seriale da uno dei dispositivi il testo viene trasferito all’altro dispositivo. Puoi usare 2 Arduinos o 2 Wemos o uno e uno come preferisci.
Arduino sketch
/*
* LoRa E22
* Start device or reset to send a message
* https://mischianti.org
*
* E22 ----- Arduino UNO
* M0 ----- GND
* M1 ----- GND
* TX ----- PIN 2 (PullUP)
* RX ----- PIN 3 (PullUP & Voltage divider)
* AUX ----- Not connected
* VCC ----- 3.3v/5v
* GND ----- GND
*
*/
#include "Arduino.h"
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); // Arduino RX --> e22 TX - Arduino TX --> e22 RX
void setup() {
Serial.begin(9600);
delay(500);
Serial.println("Hi, I'm going to send message!");
mySerial.begin(9600);
mySerial.println("Hello, world?");
}
void loop() {
if (mySerial.available()) {
Serial.write(mySerial.read());
}
if (Serial.available()) {
mySerial.write(Serial.read());
}
}
Wemos D1 mini (esp8266) sketch
/*
* LoRa E22
* Start device or reset to send a message
* https://mischianti.org
*
* E22 ----- Wemos D1 mini
* M0 ----- GND
* M1 ----- GND
* TX ----- PIN D2 (PullUP)
* RX ----- PIN D3 (PullUP)
* AUX ----- Not connected
* VCC ----- 3.3v/5v
* GND ----- GND
*
*/
#include "Arduino.h"
#include <SoftwareSerial.h>
SoftwareSerial mySerial(D2, D3); // WeMos RX --> e22 TX - WeMos TX --> e22 RX
void setup() {
Serial.begin(9600);
delay(500);
Serial.println("Hi, I'm going to send message!");
mySerial.begin(9600);
mySerial.println("Hello, world?");
}
void loop() {
if (mySerial.available()) {
Serial.write(mySerial.read());
}
if (Serial.available()) {
mySerial.write(Serial.read());
}
}
Sketch per esp32
/*
* LoRa E22
* Start device or reset to send a message
* https://mischianti.org
*
* E22 ----- esp32
* M0 ----- GND
* M1 ----- GND
* TX ----- RX2 (PullUP)
* RX ----- TX2 (PullUP)
* AUX ----- Not connected
* VCC ----- 3.3v/5v
* GND ----- GND
*
*/
#include "Arduino.h"
void setup() {
Serial.begin(9600);
delay(500);
Serial.println("Hi, I'm going to send message!");
Serial2.begin(9600);
Serial2.println("Hello, world?");
}
void loop() {
if (Serial2.available()) {
Serial.write(Serial2.read());
}
if (Serial.available()) {
Serial2.write(Serial.read());
}
}
Ma questo utilizzo di base è abbastanza inutile, quindi nel prossimo capitolo useremo la mia libreria e approfondiremo le funzionalità del dispositivo.
Sketch per Arduino MKR
/*
* LoRa E22
* Start device or reset to send a message
* https://mischianti.org
*
* E22 ----- Arduino MKR
* M0 ----- 2 (or GND)
* M1 ----- 3 (or GND)
* RX ----- 14 (PullUP)
* TX ----- 13 (PullUP)
* AUX ----- 1 (PullUP)
* VCC ----- 3.3v/5v
* GND ----- GND
*
*/
#include "Arduino.h"
void setup() {
Serial.begin(9600);
delay(500);
Serial.println("Hi, I'm going to send message!");
Serial1.begin(9600);
Serial1.println("Hello, world?");
}
void loop() {
if (Serial1.available()) {
Serial.write(Serial1.read());
}
if (Serial.available()) {
Serial1.write(Serial.read());
}
}
Libreria
Qui l’ultimo esempio usando la mia libreria:
Arduino sketch
/*
* LoRa E22
* Write on serial to transfer a message to other device
* https://mischianti.org
*
* E22 ----- Arduino UNO
* M0 ----- GND
* M1 ----- GND
* TX ----- PIN 2 (PullUP)
* RX ----- PIN 3 (PullUP & Voltage divider)
* AUX ----- Not connected
* VCC ----- 3.3v/5v
* GND ----- GND
*
*/
#include "Arduino.h"
#include "LoRa_E22.h"
LoRa_E22 e22ttl(2, 3); // Arduino RX --> e22 TX - Arduino TX --> e22 RX
void setup() {
Serial.begin(9600);
delay(500);
Serial.println("Hi, I'm going to send message!");
// Startup all pins and UART
e22ttl.begin();
// Send message
ResponseStatus rs = e22ttl.sendMessage("Hello, world?");
// Check If there is some problem of successfully send
Serial.println(rs.getResponseDescription());
}
void loop() {
// If something available
if (e22ttl.available()>1) {
// read the String message
ResponseContainer rc = e22ttl.receiveMessage();
// Is something goes wrong print error
if (rc.status.code!=1){
rc.status.getResponseDescription();
}else{
// Print the data received
Serial.println(rc.data);
}
}
if (Serial.available()) {
String input = Serial.readString();
e22ttl.sendMessage(input);
}
}
Sketch Wemos D1 (esp8266)
/*
* LoRa E22
* Start device or reset to send a message
* https://mischianti.org
*
* E22 ----- Wemos D1 mini
* M0 ----- GND
* M1 ----- GND
* TX ----- PIN D2 (PullUP)
* RX ----- PIN D3 (PullUP)
* AUX ----- Not connected
* VCC ----- 3.3v/5v
* GND ----- GND
*
*/
#include "Arduino.h"
#include "LoRa_E22.h"
LoRa_E22 e22ttl(D2, D3); // WeMos RX --> e22 TX - WeMos TX --> e22 RX
void setup() {
Serial.begin(9600);
delay(500);
Serial.println("Hi, I'm going to send message!");
// Startup all pins and UART
e22ttl.begin();
// Send message
ResponseStatus rs = e22ttl.sendMessage("Hello, world?");
// Check If there is some problem of successfully send
Serial.println(rs.getResponseDescription());
}
void loop() {
// If something available
if (e22ttl.available()>1) {
// read the String message
ResponseContainer rc = e22ttl.receiveMessage();
// Is something goes wrong print error
if (rc.status.code!=1){
rc.status.getResponseDescription();
}else{
// Print the data received
Serial.println(rc.data);
}
}
if (Serial.available()) {
String input = Serial.readString();
e22ttl.sendMessage(input);
}
}
Sketch per esp32
/*
* LoRa E22
* Start device or reset to send a message
* https://mischianti.org
*
* E22 ----- esp32
* M0 ----- GND
* M1 ----- GND
* TX ----- RX2 (PullUP)
* RX ----- TX2 (PullUP)
* AUX ----- Not connected
* VCC ----- 3.3v/5v
* GND ----- GND
*
*/
#include "Arduino.h"
#include "LoRa_E22.h"
LoRa_E22 e22ttl(&Serial2); // WeMos RX --> e22 TX - WeMos TX --> e22 RX
void setup() {
Serial.begin(9600);
delay(500);
Serial.println("Hi, I'm going to send message!");
// Startup all pins and UART
e22ttl.begin();
// Send message
ResponseStatus rs = e22ttl.sendMessage("Hello, world?");
// Check If there is some problem of successfully send
Serial.println(rs.getResponseDescription());
}
void loop() {
// If something available
if (e22ttl.available()>1) {
// read the String message
ResponseContainer rc = e22ttl.receiveMessage();
// Is something goes wrong print error
if (rc.status.code!=1){
rc.status.getResponseDescription();
}else{
// Print the data received
Serial.println(rc.data);
}
}
if (Serial.available()) {
String input = Serial.readString();
e22ttl.sendMessage(input);
}
}
Sketch per Arduino MKR
/*
* LoRa E22
* Start device or reset to send a message
* https://mischianti.org
*
* E22 ----- Arduino MKR
* M0 ----- GND
* M1 ----- GND
* RX ----- 14 (PullUP)
* TX ----- 13 (PullUP)
* AUX ----- 1 (PullUP)
* VCC ----- 3.3v/5v
* GND ----- GND
*
*/
#include "Arduino.h"
#include "LoRa_E22.h"
LoRa_E22 e22ttl(&Serial1); // WeMos RX --> e22 TX - WeMos TX --> e22 RX
void setup() {
Serial.begin(9600);
delay(500);
Serial.println("Hi, I'm going to send message!");
// Startup all pins and UART
e22ttl.begin();
// Send message
ResponseStatus rs = e22ttl.sendMessage("Hello, world?");
// Check If there is some problem of successfully send
Serial.println(rs.getResponseDescription());
}
void loop() {
// If something available
if (e22ttl.available()>1) {
// read the String message
ResponseContainer rc = e22ttl.receiveMessage();
// Is something goes wrong print error
if (rc.status.code!=1){
rc.status.getResponseDescription();
}else{
// Print the data received
Serial.println(rc.data);
}
}
if (Serial.available()) {
String input = Serial.readString();
e22ttl.sendMessage(input);
}
}
Se hai già modificato la configurazione, devi ripristinare i parametri di base:
// If you have ever change configuration you must restore It
ResponseStructContainer c;
c = e22ttl.getConfiguration();
Configuration configuration = *(Configuration*) c.data;
Serial.println(c.status.getResponseDescription());
configuration.CHAN = 0x17;
configuration.OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION;
e22ttl.setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE);
ma lo vedremo meglio nel prossimo articolo.
Grazie
Ma questo tipo di utilizzo è molto riduttivo, nei prossimi articoli andremo più in profondità e inizieremo a utilizzare in modo massiccio la libreria per semplificare la configurazione e le impostazioni complesse.
- Ebyte LoRa E22 per Arduino, esp32 o esp8266: specifiche ed utilizzo base
- Ebyte LoRa E22 per Arduino, esp32 o esp8266: libreria
- Ebyte LoRa E22 per Arduino, esp32 o esp8266: configurazione
- Ebyte LoRa E22 per Arduino, esp32 o esp8266: trasmissione fissa, broadcast, monitor e RSSI
- Ebyte LoRa E22 per Arduino, esp32 o esp8266: risparmio energetico ed invio di dati strutturati
- Ebyte LoRa E22 per Arduino, esp32 o esp8266: ripetitore e configurazione remota
- Ebyte LoRa E22 per Arduino, esp32 o esp8266: WOR il microcontrollore e lo shield per Arduino
- Ebyte LoRa E22 per Arduino, esp32 o esp8266: WOR il microcontrollore e lo shield per il WeMos D1 mini
- Ebyte LoRa E22 per Arduino, esp32 o esp8266: WOR il microcontrollore e lo shield per l’esp32 dev v1
Shield e PCB