Configurazione del Modulo RF EByte E70 (esp32, STM32, Arduino, Raspberry Pi Pico)


Il modulo RF EByte E70 si distingue nel campo della comunicazione wireless, offrendo una combinazione unica di capacità a lungo raggio e basso consumo energetico. Ideale per le applicazioni IoT, questo modulo ha guadagnato popolarità tra sviluppatori e hobbisti. Questo articolo mira a guidarti attraverso i passaggi essenziali per configurare il modulo RF EByte E70 in base alle tue esigenze specifiche.

Configurazione del Modulo RF EByte E70 (esp32, esp8266, STM32, Arduino, Raspberry Pi Pico)
Configurazione del Modulo RF EByte E70 (esp32, esp8266, STM32, Arduino, Raspberry Pi Pico)

Comprendere il Modulo RF EByte E70

Prima di entrare nella configurazione, è importante comprendere le caratteristiche del modulo E70. Funziona nelle bande di frequenza sub-gigahertz, consentendo una comunicazione a lungo raggio. Il modulo supporta anche varie modalità, inclusa la modalità continua e quella a sottopacchetti, oltre a parametri regolabili come frequenza, potenza di uscita e velocità di trasmissione dei dati.

Qui i dispositivi RF E70 433/915 T S/S2 - E70 433/915 MT S

Modalità E70

Come puoi vedere, collego anche M0, M1 e M2, ma non sono necessari; puoi selezionare una modalità operativa impostando questi valori sui rispettivi pin.

Modalità (0-7)M2M1M0Introduzione alla ModalitàNota
0 Modalità RSSI000Il modulo emette il valore RSSI ogni 100ms tramite UART.La velocità dei dati nell’aria può essere regolata automaticamente in base alla velocità di baud. La velocità di baud deve essere la stessa su ricevitore e trasmettitore. Adatto per trasmissione dati continua ad alta velocità.
1 Modalità continua001UART aperta. Wireless chiuso, e trasmissione trasparente a sottopacchetti disponibile.UART aperta. Wireless chiuso, e trasmissione trasparente continua disponibile.
2 Modalità a sottopacchetti010UART aperta. Wireless chiuso, e i parametri possono essere configurati.La velocità dei dati nell’aria e la velocità di baud possono essere regolate separatamente. Adatto per trasmissione di pacchetti di dati.
3 Modalità di configurazione011La velocità di baud è fissata a 9600 8N1.UART aperta. Wireless chiuso, e trasmissione trasparente a sottopacchetti disponibile.
4 Modalità WOR100La trasmissione non è disponibile in questa modalità. Può essere riattivato da un trasmettitore in modalità 4 per ottenere ricezione a basso consumo energetico.La ricezione non è disponibile in questa modalità. Il codice preambolo verrà aggiunto automaticamente prima della trasmissione per risvegliare il ricevitore in modalità 6.
5 Modalità di configurazione (Come la Modalità 3)101
6 Modalità di risparmio energetico110Qualsiasi bordo di discesa di M2, M1 o M0 può risvegliarlo.UART chiuso. Wireless funziona in modalità di risparmio WOR. Vari livelli di tempo possono essere configurati.
7 Modalità di sospensione111Qualsiasi bordo di discesa di M2, M1 o M0 può risvegliarlo.UART chiuso, trasmissione wireless disponibile, e modalità sospensione attiva.

Per questo esperimento, è necessario impostare i dispositivi in modalità sottopacchetto.

  • M0: ALTO
  • M1: ALTO
  • M2: BASSO

Pinout E70 xxxT14S2

Per il mio test, userò una versione E70 S2 perché ha un fattore di forma comodo con un’antenna SMA integrata.

Socket stampato in 3D per breadboard

Ho creato un semplice socket con la mia stampante 3D per prototipare (e gestire) rapidamente l’E70 S2; qui è disponibile il modello 3D e il risultato su una breadboard.

È molto semplice e utilizza la stessa tecnica di altri socket che ho già creato.

Dopo la stampa, devi inserire la scritta all’interno del foro.

Socket E70 

Inseriscilo nei fori più interni e spingilo fuori per circa 3 mm.

Piega il filo verso l’esterno dell’adattatore.

Taglia la parte esterna del filo ed estrailo.

Poi reinseriscilo nei fori interni ed esterni.

Ora controlla se devi tagliare ulteriormente il filo del foro interno e piegalo.

Ripeti per tutti i pin. Il risultato è molto soddisfacente.

Utilizzare un dispositivo UART con il programma EByte

Il programma RF Setting fornito da EByte è uno strumento software specializzato per configurare dispositivi, come il modulo RF EByte E70. Questo programma consente agli utenti di personalizzare vari parametri e impostazioni relativi alla comunicazione in radiofrequenza (RF) del dispositivo. Ecco una descrizione tecnica delle sue funzionalità principali:

  1. Configurazione della Frequenza: Una delle principali funzioni è impostare la frequenza operativa del dispositivo, includendo la selezione delle bande di frequenza specifiche conformi alle normative regionali (ad es., 868 MHz per l’Europa, 915 MHz per il Nord America).
  2. Controllo della Potenza di Trasmissione: Gli utenti possono regolare il livello di potenza di trasmissione del dispositivo, fondamentale per gestire il raggio d’azione e il consumo energetico.
  3. Impostazioni di Modulazione e Banda: Il software consente la regolazione dei parametri di modulazione, inclusi banda, fattore di diffusione e tasso di codifica, per bilanciare velocità di trasmissione, raggio d’azione e resistenza alle interferenze.
  4. Impostazioni di Rete: È possibile specificare l’indirizzo e il canale.
  5. Aggiornamento e Gestione del Firmware: Il software può anche facilitare aggiornamenti del firmware per il modulo, garantendo che il dispositivo operi con le ultime funzionalità e patch di sicurezza.
  6. Diagnostica e Test: Strumenti per diagnosticare e testare le prestazioni RF del dispositivo, inclusi indicatori di intensità del segnale e test di trasmissione.
  7. Salvataggio e Caricamento delle Configurazioni: Gli utenti possono salvare le proprie configurazioni e caricarle successivamente, facilitando la gestione di più dispositivi o il ripristino delle impostazioni.

Il programma RF Setting è uno strumento essenziale per sviluppatori e ingegneri che lavorano con la tecnologia RF, fornendo un modo completo e accessibile per adattare le prestazioni dei dispositivi RF alle esigenze specifiche delle applicazioni.

Puoi utilizzare il programma EByte che condivido anche nel repository GitHub qui.

Il programma è progettato per connettersi con il dispositivo RF tramite un’interfaccia USB-seriale o direttamente tramite la porta seriale di un microcontrollore. Per moduli come l’E70, spesso vengono utilizzati una breadboard e fili jumper per i collegamenti fisici.

Quando colleghi il programma RFSettings e ottieni il parametro, appare una schermata simile a questa.

Installazione della libreria

Puoi trovare la libreria su GitHub.

Ma, per semplicità, l’ho aggiunta anche al gestore delle librerie di Arduino.

Utilizzo della libreria

Ho creato alcuni esempi per gestire la configurazione.

Recuperare la configurazione

Per recuperare la configurazione, puoi utilizzare la funzione:

ResponseStructContainer getConfiguration();

La funzione restituisce un ResponseStructContainer contenente la classe Configuration.

struct Speed {
	uint8_t airDataRate :3; //bit 0-2
	String getAirDataRateDescription() {
		return getAirDataRateDescriptionByParams(this->airDataRate);
	}

	uint8_t uartBaudRate :3; //bit 3-5
	String getUARTBaudRateDescription() {
		return getUARTBaudRateDescriptionByParams(this->uartBaudRate);
	}

    uint8_t uartParity :2; //bit 6-7
    String getUARTParityDescription() {
        return getUARTParityDescriptionByParams(this->uartParity);
    }

};

struct Option {
	uint8_t transmissionPower :2; //bit 0-1
	String getTransmissionPowerDescription() {
		return getTransmissionPowerDescriptionByParams(this->transmissionPower);
	}

    byte ioDriveMode  		: 1; //bit 2
    String getIODroveModeDescription() {
        return getIODriveModeDescriptionDescriptionByParams(this->ioDriveMode);
    }

    byte fec       		: 1; //bit 3
    String getFECDescription() {
        return getFECDescriptionByParams(this->fec);
    }


    byte wirelessWakeupTime : 3; //bit 4-6
    String getWirelessWakeUPTimeDescription() {
        return getWirelessWakeUPTimeDescriptionByParams(this->wirelessWakeupTime);
    }

    byte fixedTransmission :1; //bit 7
    String getFixedTransmissionDescription() {
        return getFixedTransmissionDescriptionByParams(this->fixedTransmission);
    }

};

struct Channel {
    uint8_t CHAN :5; // bit 0-4
    String getChannelDescription( ) {
        return String(this->CHAN + OPERATING_FREQUENCY) + F("MHz");
    }

    uint8_t subPacketSetting :3; //bit 5-7
    String getSubPacketSetting() {
        return getSubPacketSettingByParams(this->subPacketSetting);
    }

};

struct Configuration {
	byte COMMAND = 0;

	byte ADDH = 0;
	byte ADDL = 0;

	struct Speed SPED;
    struct Channel CHAN;

	struct Option OPTION;
};

Come puoi vedere, ho anche inserito alcune funzioni per ottenere la descrizione del parametro.

/*
 * RF E70
 * Get configuration.
 * You must uncommend the correct constructor.
 *
 * by Renzo Mischianti <https://www.mischianti.org>
 *
 * https://www.mischianti.org
 *
 * E70		  ----- WeMos D1 mini	----- esp32			----- Arduino Nano 33 IoT	----- Arduino MKR	----- Raspberry Pi Pico   ----- stm32               ----- ArduinoUNO
 * M0         ----- D6 				----- 23 			----- 4 					----- 2 			----- 9 			      ----- PB0 		       	----- 8 Volt div
 * M1         ----- D7 				----- 19 			----- 5 					----- 3 			----- 10 			      ----- PB1 		       	----- 7 Volt div
 * M1         ----- D8 				----- 22 			----- 6 					----- 4 			----- 11 			      ----- PB10 		      	----- 6 Volt div
 * 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
 *
 *	Configuration can be emulated by set
 *	M0 = HIGH
 *	M1 = HIGH
 *	M2 = LOW
 *
 */

#include "Arduino.h"
#include "RF_E70.h"


// ---------- esp8266 pins --------------
//RF_E70 e70ttl(RX, TX, AUX, M0, M1, M2);  // Arduino RX <-- e70 TX, Arduino TX --> e70 RX
//RF_E70 e70ttl(D3, D4, D5, D7, D6, D7); // Arduino RX <-- e70 TX, Arduino TX --> e70 RX AUX M0 M1
//RF_E70 e70ttl(D2, D3); // Config without connect AUX and M0 M1

//#include <SoftwareSerial.h>
//SoftwareSerial mySerial(D2, D3); // Arduino RX <-- e70 TX, Arduino TX --> e70 RX
//RF_E70 e70ttl(&mySerial, D5, D6, D7, D8); // AUX M0 M1
// -------------------------------------

// ---------- Arduino pins --------------
//RF_E70 e70ttl(4, 5, 3, 8, 7, 6); // Arduino RX <-- e70 TX, Arduino TX --> e70 RX AUX M0 M1
//RF_E70 e70ttl(4, 5); // Config without connect AUX and M0 M1

//#include <SoftwareSerial.h>
//SoftwareSerial mySerial(4, 5); // Arduino RX <-- e70 TX, Arduino TX --> e70 RX
//RF_E70 e70ttl(&mySerial, 3, 8, 7, 6); // AUX M0 M1
// -------------------------------------

// ------------- Arduino Nano 33 IoT -------------
// RF_E70 e70ttl(&Serial1, 2, 4, 5, 6); //  RX AUX M0 M1
// -------------------------------------------------

// ------------- Arduino MKR WiFi 1010 -------------
// RF_E70 e70ttl(&Serial1, 0, 2, 3, 4); //  RX AUX M0 M1
// -------------------------------------------------

// ---------- esp32c3 pins --------------
// RF_E70 e70ttl(&Serial1,  1, 2, 3, 4,); //  RX AUX M0 M1

RF_E70 e70ttl(4, 5, &Serial1, 6, 1, 2, 3, UART_BPS_RATE_9600); //  esp32 RX <-- e70 TX, esp32 TX --> e70 RX AUX M0 M1
// -------------------------------------

// ---------- esp32 pins --------------
// RF_E70 e70ttl(&Serial2, 15, 23, 19, 22); //  RX AUX M0 M1

//RF_E70 e70ttl(&Serial2, 22, 4, 18, 21, 19, UART_BPS_RATE_9600); //  esp32 RX <-- e70 TX, esp32 TX --> e70 RX AUX M0 M1
// -------------------------------------

// ---------- Raspberry PI Pico pins --------------
// RF_E70 e70ttl(&Serial2, 2, 10, 11, 12); //  RX AUX M0 M1
// -------------------------------------

// ---------------- STM32 --------------------
// HardwareSerial Serial2(USART2);   // PA3  (RX)  PA2  (TX)
// RF_E70 e70ttl(&Serial2, PA0, PB0, PB1, PB10); //  RX AUX M0 M1
// -------------------------------------------------

void printParameters(struct Configuration configuration);
void printModuleInformation(struct ModuleInformation moduleInformation);

void setup() {
	Serial.begin(9600);
#if defined(ARDUINO_ARCH_STM32) || defined(__STM32F1__) || defined(__STM32F4__)
	Serial.dtr(false);
#endif

	while(!Serial){};
	delay(500);

	Serial.println("INIT!!");

	// Startup all pins and UART
	e70ttl.begin();

	ResponseStructContainer c;
	c = e70ttl.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 = e70ttl.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("Configuration packet: "));
    byte* byteArray = (byte*)&configuration;  // Cast the address of config to a byte pointer
    for (int i = 0; i < sizeof(Configuration); i++) {
        if (byteArray[i] < 16) {
            Serial.print('0');  // Print a leading zero for single-digit hex values
        }
        Serial.print(byteArray[i], HEX);  // Print each byte of the struct in hexadecimal
        Serial.print(" ");
    }
    Serial.println(F(" "));

	Serial.print(F("HEAD : "));  Serial.print(configuration.COMMAND, HEX);Serial.print(" ");
	Serial.println(F(" "));
	Serial.print(F("AddH : "));  Serial.println(configuration.ADDH, HEX);
	Serial.print(F("AddL : "));  Serial.println(configuration.ADDL, HEX);
	Serial.println(F(" "));
	Serial.print(F("Chan : "));  Serial.print(configuration.CHAN.CHAN, DEC); Serial.print(" -> "); Serial.println(configuration.CHAN.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("OptionFECPacketSett: "));  Serial.print(configuration.OPTION.fec, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getFECDescription());
	Serial.print(F("OptionTranPower    : "));  Serial.print(configuration.OPTION.transmissionPower, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getTransmissionPowerDescription());
	Serial.print(F("OptionIODrive: "));  Serial.print(configuration.OPTION.ioDriveMode, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getIODroveModeDescription());
	Serial.print(F("OptionFixedTransmission: "));  Serial.print(configuration.OPTION.fixedTransmission, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getFixedTransmissionDescription());
	Serial.print(F("OptionWirelessWakeUPTime: "));  Serial.print(configuration.OPTION.wirelessWakeupTime, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getWirelessWakeUPTimeDescription());


	Serial.println("----------------------------------------");
}
void printModuleInformation(struct ModuleInformation moduleInformation) {
	Serial.println("----------------------------------------");
	Serial.print(F("HEAD: "));  Serial.print(moduleInformation.COMMAND, HEX);Serial.print(" ");

	Serial.print(F("Model no.: "));  Serial.println(moduleInformation.model, HEX);
	Serial.print(F("Version  : "));  Serial.println(moduleInformation.version, HEX);
	Serial.print(F("Features : "));  Serial.println(moduleInformation.features1, HEX);
	Serial.print(F("Features : "));  Serial.println(moduleInformation.features2, HEX);
	Serial.print(F("Features : "));  Serial.println(moduleInformation.features3, HEX);
	Serial.print(F("Features : "));  Serial.println(moduleInformation.features4, HEX);
	Serial.println("----------------------------------------");
}

Quando esegui lo sketch, il risultato sarà simile a questo:

INIT!!
Success
1
----------------------------------------
Configuration packet: C0 00 02 18 44 9C   
HEAD : C0  
AddH : 0
AddL : 2
 
Chan : 4 -> 414MHz
 
SpeedParityBit     : 0 -> 8N1 (Default)
SpeedUARTDatte     : 11 -> 9600bps (default)
SpeedAirDataRate   : 0 -> 2.5kbps (default)
 
OptionFECPacketSett: 1 -> Turn on Forward Error Correction Switch (Default)
OptionTranPower    : 0 -> 22dBm (Default)
OptionIODrive: 1 -> TXD, RXD, AUX are push-pulls/pull-ups (default)
OptionFixedTransmission: 1 -> Fixed transmission (first three bytes can be used as high/low address and channel)
OptionWirelessWakeUPTime: 1 -> 1000ms (default)
----------------------------------------
No response from device! (Check wiring)
12
----------------------------------------
HEAD: 31 Model no.: 30
Version  : 30
Features : 30
Features : 6D
Features : 73
Features : 20
----------------------------------------

Opzioni di configurazione di base

NomeDescrizioneIndirizzo
ADDHByte alto dell’indirizzo del modulo (predefinito 00H)00H
ADDLByte basso dell’indirizzo del modulo (predefinito 00H)01H
SPEDInformazioni su parità e velocità di baud e velocità di dati nell’aria02H
OPTIONTipo di trasmissione e velocità03H
CHANCanale di comunicazione (410M + CHAN*1M), predefinito 17H (433MHz), valido solo per il dispositivo a 433MHz; verifica qui sotto per la frequenza corretta del tuo dispositivo
e dimensione del pacchetto
04H

Dettaglio SPED

Bit di parità UART

La modalità UART può differire tra le parti di comunicazione.

Bit di parità UARTValore costante
8N1 (predefinito)MODE_00_8N1
8O1MODE_01_8O1
8E1MODE_10_8E1
8N1 (uguale a 00)MODE_11_8N1
Velocità di baud UART

La velocità di baud UART può essere diversa tra le parti di comunicazione (ma non è raccomandato). La velocità di baud UART non ha effetto sui parametri di trasmissione wireless e non influenzerà le caratteristiche di trasmissione/ricezione wireless.

Velocità di baud TTL UART (bps)Valore costante
1200UART_BPS_1200
2400UART_BPS_2400
4800UART_BPS_4800
9600 (predefinito)UART_BPS_9600
19200UART_BPS_19200
38400UART_BPS_38400
57600UART_BPS_57600
115200UART_BPS_115200
Velocità di dati nell’aria

Più bassa è la velocità di dati nell’aria, maggiore sarà la distanza di trasmissione, la resistenza alle interferenze sarà migliore e il tempo di trasmissione sarà più lungo; la velocità di dati nell’aria deve essere costante per entrambe le parti di comunicazione.

Velocità di dati nell’aria (bps)Valore costante
2.5k (predefinito)AIR_DATA_RATE_000_025
5kAIR_DATA_RATE_001_050
12kAIR_DATA_RATE_010_120
28kAIR_DATA_RATE_011_280
64kAIR_DATA_RATE_100_640
168kAIR_DATA_RATE_101_168
168kAIR_DATA_RATE_110_168
168kAIR_DATA_RATE_111_168

Dettaglio CHAN

Canale

Puoi visualizzare il CANALE selezionato.

Impostazione sottopacchetto

Questa impostazione determina la lunghezza massima del pacchetto.

Quando i dati sono inferiori alla lunghezza del sottopacchetto, l’uscita seriale della ricezione è un flusso continuo senza interruzioni. Se i dati sono maggiori della lunghezza del sottopacchetto, la porta seriale del ricevitore emette i dati in sottopacchetti.

Dimensione del pacchettoValore costante
16 byteSPS_0016_000
32 byteSPS_0032_001
64 byte (predefinito)SPS_0064_010
128 byteSPS_0128_011
256 byteSPS_0256_100
512 byteSPS_0512_101
1024 byteSPS_1024_110
2048 byteSPS_2048_111

Dettaglio OPTION

Tipo di trasmissione

Modalità di trasmissione: i primi tre byte di ciascun frame di dati dell’utente possono essere utilizzati come indirizzo alto/basso e canale in modalità di trasmissione fissa. Il modulo cambia indirizzo e canale durante la trasmissione e torna alle impostazioni originali al termine del processo.

Bit di abilitazione trasmissione fissaValore costante
Modalità di trasmissione fissaFT_FIXED_TRANSMISSION
Modalità di trasmissione trasparente (predefinito)FT_TRANSPARENT_TRANSMISSION
FEC

FEC: dopo aver disattivato il FEC, la velocità effettiva di trasmissione dei dati aumenta, ma la resistenza alle interferenze diminuisce. Anche la distanza di trasmissione è relativamente ridotta, e le due parti di comunicazione devono essere allineate su ON o OFF per il FEC.

2Interruttore FECValore costante
0Disattiva FECFEC_0_OFF
1Attiva FEC (predefinito)FEC_1_ON
Modalità di guida IO

Modalità di guida IO: questo bit viene utilizzato per il resistore di pull-up interno del modulo. Aumenta anche l’adattabilità del livello in caso di open drain, ma in alcuni casi potrebbe essere necessario un resistore di pull-up esterno.

6Modalità di guida IO (predefinito 1)Valore costante
1TXD e AUX sono uscite push-pull, RXD è ingresso pull-upIO_D_MODE_PUSH_PULLS_PULL_UPS
0TXD, AUX uscite open-collector, RXD ingresso open-collectorIO_D_MODE_OPEN_COLLECTOR
Ciclo WOR

Se il WOR è in trasmissione: dopo che il ricevitore WOR riceve i dati wireless e li emette tramite la porta seriale, aspetta 1000 ms prima di rientrare nel ciclo WOR. Durante questo periodo, gli utenti possono inviare dati alla porta seriale e riceverli tramite la trasmissione wireless.

  • Periodo T = (1 + WOR) * 500 ms, massimo 4000 ms, minimo 500 ms.
  • Più lungo è l’intervallo di monitoraggio del ciclo WOR, minore sarà il consumo energetico medio, ma maggiore sarà il ritardo di trasmissione dei dati.
  • Trasmettitore e ricevitore devono essere impostati allo stesso valore (molto importante).
Tempo di risveglio wirelessValore costante
500 msWAKE_UP_500
1000 msWAKE_UP_1000
1500 msWAKE_UP_1500
2000 ms (predefinito)WAKE_UP_2000
2500 msWAKE_UP_2500
3000 msWAKE_UP_3000
3500 msWAKE_UP_3500
4000 msWAKE_UP_4000
Potenza di trasmissione

Puoi cambiare questo set di costanti applicando una definizione come segue:

#define E70_22 // valore predefinito senza impostazione 

Applicabile per E70 con 22dBm come potenza massima.
La trasmissione a bassa potenza non è raccomandata a causa della bassa efficienza dell’alimentazione.

Potenza di trasmissione (approssimativa)Valore costante
22dBm (predefinito)POWER_22
17dBmPOWER_17
13dBmPOWER_13
10dBmPOWER_10

Applicabile per E70 con 30dBm come potenza massima.
La trasmissione a bassa potenza non è raccomandata a causa della bassa efficienza dell’alimentazione.

#define E70_30
Potenza di trasmissione (approssimativa)Valore costante
30dBm (predefinito)POWER_30
27dBmPOWER_27
24dBmPOWER_24
21dBmPOWER_21

È possibile configurare anche la frequenza del canale con questa definizione:

// One of 
#define FREQUENCY_433 
#define FREQUENCY_868
#define FREQUENCY_900
#define FREQUENCY_915

Impostare la configurazione

Allo stesso modo, setConfiguration richiede una struttura di configurazione, quindi il modo migliore per gestire la configurazione è recuperare quella corrente, applicare solo le modifiche necessarie e impostarla di nuovo.

		ResponseStatus setConfiguration(Configuration configuration, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);

configuration è la struttura mostrata in precedenza, mentre saveType permette di scegliere se la modifica è permanente o solo per la sessione corrente.

	ResponseStructContainer c;
	c = e70ttl.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 = 0x00;  // First part of address
	configuration.ADDH = 0x00; // Second part


	configuration.SPED.uartBaudRate = UART_BPS_9600; // Serial baud rate
	configuration.SPED.airDataRate = AIR_DATA_RATE_000_025; // Air baud rate
	configuration.SPED.uartParity = MODE_00_8N1; // Parity bit

	configuration.CHAN.CHAN = 4;
	configuration.CHAN.subPacketSetting = SPS_0064_010;

	configuration.OPTION.fec = FEC_1_ON; // Packet size
	configuration.OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION; // Need to send special command
	configuration.OPTION.transmissionPower = POWER_30; // Device power
	configuration.OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; // IO Drive
	configuration.OPTION.wirelessWakeupTime = WAKE_UP_1000; // Wake up time

	// Set configuration changed and set to not hold the configuration
	ResponseStatus rs = e70ttl.setConfiguration(configuration, WRITE_CFG_PWR_DWN_LOSE);
	Serial.println(rs.getResponseDescription());
	Serial.println(rs.code);
	printParameters(configuration);
    c.close()

I parametri sono tutti gestiti come costanti, come descritto in precedenza.

Un esempio completo è fornito all’interno della libreria.

/*
 * RF E70
 * Set configuration.
 *
 * You must uncommend the correct constructor.
 *
 * by Renzo Mischianti <https://www.mischianti.org>
 *
 * https://www.mischianti.org
 *
 * E70		  ----- WeMos D1 mini	----- esp32			----- Arduino Nano 33 IoT	----- Arduino MKR	----- Raspberry Pi Pico   ----- stm32               ----- ArduinoUNO
 * M0         ----- D6 				----- 23 			----- 4 					----- 2 			----- 9 			      ----- PB0 		       	----- 8 Volt div
 * M1         ----- D7 				----- 19 			----- 5 					----- 3 			----- 10 			      ----- PB1 		       	----- 7 Volt div
 * M1         ----- D8 				----- 22 			----- 6 					----- 4 			----- 11 			      ----- PB10 		      	----- 6 Volt div
 * 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
 *
 *	Configuration can be emulated by set
 *	M0 = HIGH
 *	M1 = HIGH
 *	M2 = LOW
 *
 */
#include "Arduino.h"
#include "RF_E70.h"

// ---------- esp8266 pins --------------
//RF_E70 e70ttl(RX, TX, AUX, M0, M1, M2);  // Arduino RX <-- e70 TX, Arduino TX --> e70 RX
//RF_E70 e70ttl(D3, D4, D5, D7, D6, D7); // Arduino RX <-- e70 TX, Arduino TX --> e70 RX AUX M0 M1
//RF_E70 e70ttl(D2, D3); // Config without connect AUX and M0 M1

//#include <SoftwareSerial.h>
//SoftwareSerial mySerial(D2, D3); // Arduino RX <-- e70 TX, Arduino TX --> e70 RX
//RF_E70 e70ttl(&mySerial, D5, D6, D7, D8); // AUX M0 M1
// -------------------------------------

// ---------- Arduino pins --------------
//RF_E70 e70ttl(4, 5, 3, 8, 7, 6); // Arduino RX <-- e70 TX, Arduino TX --> e70 RX AUX M0 M1
//RF_E70 e70ttl(4, 5); // Config without connect AUX and M0 M1

//#include <SoftwareSerial.h>
//SoftwareSerial mySerial(4, 5); // Arduino RX <-- e70 TX, Arduino TX --> e70 RX
//RF_E70 e70ttl(&mySerial, 3, 8, 7, 6); // AUX M0 M1
// -------------------------------------

// ------------- Arduino Nano 33 IoT -------------
// RF_E70 e70ttl(&Serial1, 2, 4, 5, 6); //  RX AUX M0 M1
// -------------------------------------------------

// ------------- Arduino MKR WiFi 1010 -------------
// RF_E70 e70ttl(&Serial1, 0, 2, 3, 4); //  RX AUX M0 M1
// -------------------------------------------------

// ---------- esp32c3 pins --------------
// RF_E70 e70ttl(&Serial1,  1, 2, 3, 4,); //  RX AUX M0 M1

//RF_E70 e70ttl(4, 5, &Serial1, 6, 1, 2, 3, UART_BPS_RATE_9600); //  esp32 RX <-- e70 TX, esp32 TX --> e70 RX AUX M0 M1
// -------------------------------------

// ---------- esp32 pins --------------
 RF_E70 e70ttl(&Serial2, 15, 23, 19, 22); //  RX AUX M0 M1

//RF_E70 e70ttl(&Serial2, 22, 4, 18, 21, 19, UART_BPS_RATE_9600); //  esp32 RX <-- e70 TX, esp32 TX --> e70 RX AUX M0 M1
// -------------------------------------

// ---------- Raspberry PI Pico pins --------------
// RF_E70 e70ttl(&Serial2, 2, 10, 11, 12); //  RX AUX M0 M1
// -------------------------------------

// ---------------- STM32 --------------------
// HardwareSerial Serial2(USART2);   // PA3  (RX)  PA2  (TX)
// RF_E70 e70ttl(&Serial2, PA0, PB0, PB1, PB10); //  RX AUX M0 M1
// -------------------------------------------------

void printParameters(struct Configuration configuration);
void printModuleInformation(struct ModuleInformation moduleInformation);

void setup() {
	Serial.begin(9600);
#if defined(ARDUINO_ARCH_STM32) || defined(__STM32F1__) || defined(__STM32F4__)
	Serial.dtr(false);
#endif

	while(!Serial){};
	delay(500);

	Serial.println();


	// Startup all pins and UART
	e70ttl.begin();

	Serial.println("Retrieve configuration!");
	ResponseStructContainer c;
	c = e70ttl.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);

//	----------------------- DEFAULT TRANSPARENT -----------------------
	configuration.ADDL = 0x00;  // First part of address
	configuration.ADDH = 0x00; // Second part


	configuration.SPED.uartBaudRate = UART_BPS_9600; // Serial baud rate
	configuration.SPED.airDataRate = AIR_DATA_RATE_000_025; // Air baud rate
	configuration.SPED.uartParity = MODE_00_8N1; // Parity bit

	configuration.CHAN.CHAN = 4;
	configuration.CHAN.subPacketSetting = SPS_0064_010;

	configuration.OPTION.fec = FEC_1_ON; // Packet size
	configuration.OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION; // Need to send special command
	configuration.OPTION.transmissionPower = POWER_22; // Device power
	configuration.OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; // IO Drive
	configuration.OPTION.wirelessWakeupTime = WAKE_UP_1000; // Wake up time
//	----------------------- FIXED SENDER -----------------------
//	configuration.ADDL = 0x02;  // First part of address
//	configuration.ADDH = 0x00; // Second part
//
//
//	configuration.SPED.uartBaudRate = UART_BPS_9600; // Serial baud rate
//	configuration.SPED.airDataRate = AIR_DATA_RATE_000_025; // Air baud rate
//	configuration.SPED.uartParity = MODE_00_8N1; // Parity bit
//
//	configuration.CHAN.CHAN = 4;
//	configuration.CHAN.subPacketSetting = SPS_0064_010;
//
//	configuration.OPTION.fec = FEC_1_ON; // Packet size
//	configuration.OPTION.fixedTransmission = FT_FIXED_TRANSMISSION; // Need to send special command
//	configuration.OPTION.transmissionPower = POWER_22; // Device power
//	configuration.OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; // IO Drive
//	configuration.OPTION.wirelessWakeupTime = WAKE_UP_1000; // Wake up time
//
//	----------------------- FIXED RECEIVER -----------------------
//	configuration.ADDL = 0x03;  // First part of address
//	configuration.ADDH = 0x00; // Second part
//
//
//	configuration.SPED.uartBaudRate = UART_BPS_9600; // Serial baud rate
//	configuration.SPED.airDataRate = AIR_DATA_RATE_000_025; // Air baud rate
//	configuration.SPED.uartParity = MODE_00_8N1; // Parity bit
//
//	configuration.CHAN.CHAN = 4;
//	configuration.CHAN.subPacketSetting = SPS_0064_010;
//
//	configuration.OPTION.fec = FEC_1_ON; // Packet size
//	configuration.OPTION.fixedTransmission = FT_FIXED_TRANSMISSION; // Need to send special command
//	configuration.OPTION.transmissionPower = POWER_22; // Device power
//	configuration.OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; // IO Drive
//	configuration.OPTION.wirelessWakeupTime = WAKE_UP_1000; // Wake up time
//
//	----------------------- CONTINOUS RECEIVER & SENDER -----------------------
//	configuration.ADDL = 0x01;  // First part of address
//	configuration.ADDH = 0x00; // Second part
//
//
//	configuration.SPED.uartBaudRate = UART_BPS_9600; // Serial baud rate
//	configuration.SPED.airDataRate = AIR_DATA_RATE_000_025; // Air baud rate
//	configuration.SPED.uartParity = MODE_00_8N1; // Parity bit
//
//	configuration.CHAN.CHAN = 4;
//	configuration.CHAN.subPacketSetting = SPS_0064_010;
//
//	configuration.OPTION.fec = FEC_1_ON; // Packet size
//	configuration.OPTION.fixedTransmission = FT_FIXED_TRANSMISSION; // Need to send special command
//	configuration.OPTION.transmissionPower = POWER_22; // Device power
//	configuration.OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; // IO Drive
//	configuration.OPTION.wirelessWakeupTime = WAKE_UP_1000; // Wake up time
//
//	----------------------- BROADCAST MESSAGE 1 -----------------------
//	configuration.ADDL = 0x04;  // First part of address
//	configuration.ADDH = 0x00; // Second part
//
//
//	configuration.SPED.uartBaudRate = UART_BPS_9600; // Serial baud rate
//	configuration.SPED.airDataRate = AIR_DATA_RATE_000_025; // Air baud rate
//	configuration.SPED.uartParity = MODE_00_8N1; // Parity bit
//
//	configuration.CHAN.CHAN = 4;
//	configuration.CHAN.subPacketSetting = SPS_0064_010;
//
//	configuration.OPTION.fec = FEC_1_ON; // Packet size
//	configuration.OPTION.fixedTransmission = FT_FIXED_TRANSMISSION; // Need to send special command
//	configuration.OPTION.transmissionPower = POWER_22; // Device power
//	configuration.OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; // IO Drive
//	configuration.OPTION.wirelessWakeupTime = WAKE_UP_1000; // Wake up time
//	----------------------- BROADCAST MESSAGE 2 -----------------------
//	configuration.ADDL = 0x05;  // First part of address
//	configuration.ADDH = 0x00; // Second part
//
//
//	configuration.SPED.uartBaudRate = UART_BPS_9600; // Serial baud rate
//	configuration.SPED.airDataRate = AIR_DATA_RATE_000_025; // Air baud rate
//	configuration.SPED.uartParity = MODE_00_8N1; // Parity bit
//
//	configuration.CHAN.CHAN = 4;
//	configuration.CHAN.subPacketSetting = SPS_0064_010;
//
//	configuration.OPTION.fec = FEC_1_ON; // Packet size
//	configuration.OPTION.fixedTransmission = FT_FIXED_TRANSMISSION; // Need to send special command
//	configuration.OPTION.transmissionPower = POWER_22; // Device power
//	configuration.OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; // IO Drive
//	configuration.OPTION.wirelessWakeupTime = WAKE_UP_1000; // Wake up time
//	----------------------- BROADCAST MESSAGE 3 -----------------------
//	configuration.ADDL = 0x05;  // First part of address
//	configuration.ADDH = 0x00; // Second part
//
//
//	configuration.SPED.uartBaudRate = UART_BPS_9600; // Serial baud rate
//	configuration.SPED.airDataRate = AIR_DATA_RATE_000_025; // Air baud rate
//	configuration.SPED.uartParity = MODE_00_8N1; // Parity bit
//
//	configuration.CHAN.CHAN = 4;
//	configuration.CHAN.subPacketSetting = SPS_0064_010;
//
//	configuration.OPTION.fec = FEC_1_ON; // Packet size
//	configuration.OPTION.fixedTransmission = FT_FIXED_TRANSMISSION; // Need to send special command
//	configuration.OPTION.transmissionPower = POWER_22; // Device power
//	configuration.OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; // IO Drive
//	configuration.OPTION.wirelessWakeupTime = WAKE_UP_1000; // Wake up time
//	----------------------- MONITORING -----------------------
//	configuration.ADDL = BROADCAST_ADDRESS;  // First part of address
//	configuration.ADDH = BROADCAST_ADDRESS; // Second part
//
//
//	configuration.SPED.uartBaudRate = UART_BPS_9600; // Serial baud rate
//	configuration.SPED.airDataRate = AIR_DATA_RATE_000_025; // Air baud rate
//	configuration.SPED.uartParity = MODE_00_8N1; // Parity bit
//
//	configuration.CHAN.CHAN = 4;
//	configuration.CHAN.subPacketSetting = SPS_0064_010;
//
//	configuration.OPTION.fec = FEC_1_ON; // Packet size
//	configuration.OPTION.fixedTransmission = FT_FIXED_TRANSMISSION; // Need to send special command
//	configuration.OPTION.transmissionPower = POWER_22; // Device power
//	configuration.OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; // IO Drive
//	configuration.OPTION.wirelessWakeupTime = WAKE_UP_1000; // Wake up time

	Serial.println("Set configuration!");
	// Set configuration changed and set to not hold the configuration
	ResponseStatus rs = e70ttl.setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE);
	Serial.println(rs.getResponseDescription());
	Serial.println(rs.code);

	Serial.println("Retrieve configuration!");
	c = e70ttl.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);

	printParameters(configuration);
	c.close();
}

void loop() {

}
void printParameters(struct Configuration configuration) {
	Serial.println("----------------------------------------");

	Serial.print(F("Configuration packet: "));
    byte* byteArray = (byte*)&configuration;  // Cast the address of config to a byte pointer
    for (int i = 0; i < sizeof(Configuration); i++) {
        if (byteArray[i] < 16) {
            Serial.print('0');  // Print a leading zero for single-digit hex values
        }
        Serial.print(byteArray[i], HEX);  // Print each byte of the struct in hexadecimal
        Serial.print(" ");
    }
    Serial.println(F(" "));

	Serial.print(F("HEAD : "));  Serial.print(configuration.COMMAND, HEX);Serial.print(" ");
	Serial.println(F(" "));
	Serial.print(F("AddH : "));  Serial.println(configuration.ADDH, HEX);
	Serial.print(F("AddL : "));  Serial.println(configuration.ADDL, HEX);
	Serial.println(F(" "));
	Serial.print(F("Chan : "));  Serial.print(configuration.CHAN.CHAN, DEC); Serial.print(" -> "); Serial.println(configuration.CHAN.getChannelDescription());
	Serial.print(F("Packet size : "));  Serial.print(configuration.CHAN.subPacketSetting, BIN); Serial.print(" -> "); Serial.println(configuration.CHAN.getSubPacketSetting());
	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("OptionFECPacketSett: "));  Serial.print(configuration.OPTION.fec, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getFECDescription());
	Serial.print(F("OptionTranPower    : "));  Serial.print(configuration.OPTION.transmissionPower, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getTransmissionPowerDescription());
	Serial.print(F("OptionIODrive: "));  Serial.print(configuration.OPTION.ioDriveMode, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getIODroveModeDescription());
	Serial.print(F("OptionFixedTransmission: "));  Serial.print(configuration.OPTION.fixedTransmission, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getFixedTransmissionDescription());
	Serial.print(F("OptionWirelessWakeUPTime: "));  Serial.print(configuration.OPTION.wirelessWakeupTime, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getWirelessWakeUPTimeDescription());


	Serial.println("----------------------------------------");
}
void printModuleInformation(struct ModuleInformation moduleInformation) {
	Serial.println("----------------------------------------");
	Serial.print(F("HEAD: "));  Serial.print(moduleInformation.COMMAND, HEX);Serial.print(" ");

	Serial.print(F("Model no.: "));  Serial.println(moduleInformation.model, HEX);
	Serial.print(F("Version  : "));  Serial.println(moduleInformation.version, HEX);
	Serial.print(F("Features : "));  Serial.println(moduleInformation.features1, HEX);
	Serial.print(F("Features : "));  Serial.println(moduleInformation.features2, HEX);
	Serial.print(F("Features : "));  Serial.println(moduleInformation.features3, HEX);
	Serial.print(F("Features : "));  Serial.println(moduleInformation.features4, HEX);
	Serial.println("----------------------------------------");
}

Quando esegui lo sketch, ottieni un risultato simile a questo:

Retrieve configuration!
Success
1
----------------------------------------
Configuration packet: C0 00 00 18 44 1C   
HEAD : C0  
AddH : 0
AddL : 0
 
Chan : 4 -> 414MHz
Packet size : 10 -> 64bytes (default)
 
SpeedParityBit     : 0 -> 8N1 (Default)
SpeedUARTDatte     : 11 -> 9600bps (default)
SpeedAirDataRate   : 0 -> 2.5kbps (default)
 
OptionFECPacketSett: 1 -> Turn on Forward Error Correction Switch (Default)
OptionTranPower    : 0 -> 22dBm (Default)
OptionIODrive: 1 -> TXD, RXD, AUX are push-pulls/pull-ups (default)
OptionFixedTransmission: 0 -> Transparent transmission (default)
OptionWirelessWakeUPTime: 1 -> 1000ms (default)
----------------------------------------
Set configuration!
Success
1
Retrieve configuration!
Success
1
----------------------------------------
Configuration packet: C0 00 00 18 44 1C   
HEAD : C0  
AddH : 0
AddL : 0
 
Chan : 4 -> 414MHz
Packet size : 10 -> 64bytes (default)
 
SpeedParityBit     : 0 -> 8N1 (Default)
SpeedUARTDatte     : 11 -> 9600bps (default)
SpeedAirDataRate   : 0 -> 2.5kbps (default)
 
OptionFECPacketSett: 1 -> Turn on Forward Error Correction Switch (Default)
OptionTranPower    : 0 -> 22dBm (Default)
OptionIODrive: 1 -> TXD, RXD, AUX are push-pulls/pull-ups (default)
OptionFixedTransmission: 0 -> Transparent transmission (default)
OptionWirelessWakeUPTime: 1 -> 1000ms (default)
----------------------------------------

Grazie


Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *