Ebyte LoRa E32 per Arduino, esp32 o esp8266 : WOR (wake on radio) del microcontrollore e uno shield per Arduino – Part 6

Spread the love

Abbiamo visto come questo dispositivo (E32 UART LoRa basato sui popolari moduli wireless SX1276 / SX1278) gestisce il risparmio energetico, ma se utilizziamo il risparmio energetico solo per il dispositivo e32 stesso continua a rimanere attivo il microcontrollore, ma possiamo usare il pin AUX per risolvere questo problema problema.

Puoi trovare il modulo qui AliExpress (433MHz 5Km) - AliExpress (433MHz 8Km) - AliExpress (433MHz 16Km) - AliExpress (868MHz 915MHz 5.5Km) - AliExpress (868MHz 915MHz 8Km)

Se hai problemi, ad esempio va in freeze il dispositivo è bene mettere una restistenza di pull-up da 4.7k o meglio collegare il pin AUX al dispositivo

Per prima cosa dobbiamo cambiare alcune connessioni dallo schema di connessione originale, perché nello schema di connessione originale il pin AUX non è collegato a un pin di interrupt, metteremo il pin AUX sul pin 3 di Arduino e spostare tutti gli altri pin.

Pinout of ARDUINO Board and ATMega328PU
Pinout of ARDUINO Board and ATMega328PU

Quindi il nuovo schema di connessione diventa così:

LoRa E32-TTL-100 Arduino Fully Connected schema with AUX on interrupt
LoRa E32-TTL-100 Arduino Fully Connected schema with AUX on interrupt

Ora con l’AUX sul pin di interrupt possiamo usarlo per riattivare Arduino.

Quando si è in modalità Sospensione, l’e32 inserisce nel buffer i dati ricevuti e passa l’AUX immediatamente a LOW, quando i dati sono pronti l’AUX va in HIGH.
Questo comportamento è perfetto per riattivare il microcontrollore.

LoRa e32 AUX pin on reception

Arduino svegliati

Come il dispositivo e32, Arduino ha vari tipi di sospensione, ma per questo test useremo la modalità power-down.

Libreria PowerDown

Per gestire il risparmio energetico e la sospensione del dispositivo Arduino, esiste una bellissima libreria chiamata LowPower.

Puoi scaricarlo direttamente qui o puoi andare al repository Git .

È necessario scaricare la libreria e inserirla nella cartella delle librerie di Arduino

Come mettere a dormire Arduino

Il comando per mettere il microcontrollore in power-sown è abbastanza semplice

    // Enter power down state with ADC and BOD module disabled.
    // Wake up when wake up pin is low.
    LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);

Ma dobbiamo specificare che il dispositivo deve riattivarsi quando il pin AUX diventa LOW.

    // Allow wake up pin to trigger interrupt on low.
    attachInterrupt(1, AUX_PIN, LOW);

    // Enter power down state with ADC and BOD module disabled.
    // Wake up when wake up pin is low.
    LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);

    // Disable external pin interrupt on wake up pin.
    detachInterrupt(1);

Quindi il codice per ricevere la trasmissione diventa così:

/*
 * LoRa E32-TTL-100
 * Receive fixed transmission message on channel.
 * https://mischianti.org/it/lora-e32-per-arduino-esp32-o-esp8266-wor-wake-on-radio-del-microcontrollore-e-uno-shield-per-arduino-part-6/
 *
 * E32-TTL-100----- Arduino UNO or esp8266
 * M0         ----- 3.3v (To config) GND (To send) 7 (To dinamically manage)
 * M1         ----- 3.3v (To config) GND (To send) 6 (To dinamically manage)
 * TX         ----- RX PIN 3 (PullUP)
 * RX         ----- TX PIN 4 (PullUP & Voltage divider)
 * AUX        ----- PIN 2 (PullUP)
 * VCC        ----- 3.3v/5v
 * GND        ----- GND
 *
 */
#include "Arduino.h"
#include "LowPower.h"

#include "LoRa_E32.h"
// ---------- Arduino pins --------------
//LoRa_E32 e32ttl(4, 5, 3, 7, 6);
LoRa_E32 e32ttl(4, 5, 3); // Config without connect M0 M1
// Use pin 2 as wake up pin

const int wakeUpPin = 3;

//#include <SoftwareSerial.h>
//SoftwareSerial mySerial(4, 5); // Arduino RX <-- e32 TX, Arduino TX --> e32 RX
//LoRa_E32 e32ttl(&mySerial, 3, 7, 6);
// -------------------------------------
void printParameters(struct Configuration configuration);
void printModuleInformation(struct ModuleInformation moduleInformation);

void wakeUp()
{
	Serial.println("WAKE!");
}

//The setup function is called once at startup of the sketch
void setup()
{
	Serial.begin(9600);
	while (!Serial) {
	    ; // wait for serial port to connect. Needed for native USB
    }
	delay(100);

	e32ttl.begin();

//	e32ttl.resetModule();
	// After set configuration comment set M0 and M1 to low
	// and reboot if you directly set HIGH M0 and M1 to program
//	ResponseStructContainer c;
//	c = e32ttl.getConfiguration();
//	Configuration configuration = *(Configuration*) c.data;
//	configuration.ADDL = 3;
//	configuration.ADDH = 0;
//	configuration.CHAN = 0x04;
//	configuration.OPTION.fixedTransmission = FT_FIXED_TRANSMISSION;
//	configuration.OPTION.wirelessWakeupTime = WAKE_UP_250;
//
//    configuration.OPTION.fec = FEC_1_ON;
//    configuration.OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS;
//    configuration.OPTION.transmissionPower = POWER_20;
//
//    configuration.SPED.airDataRate = AIR_DATA_RATE_010_24;
//    configuration.SPED.uartBaudRate = UART_BPS_9600;
//    configuration.SPED.uartParity = MODE_00_8N1;
//
//	e32ttl.setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE);
//	printParameters(configuration);
	// ---------------------------
	Serial.println();
	Serial.println("Start listening!");
    e32ttl.setMode(MODE_2_POWER_SAVING);

    // Allow wake up pin to trigger interrupt on low.
    attachInterrupt(1, wakeUp, LOW);

    // Enter power down state with ADC and BOD module disabled.
    // Wake up when wake up pin is low.
    LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);

    // Disable external pin interrupt on wake up pin.
    detachInterrupt(1);
	Serial.println("OK listening!");


}

// The loop function is called in an endless loop
void loop()
{
	if (e32ttl.available()  > 1){
		ResponseContainer rs = e32ttl.receiveMessage();
        // First of all get the data
		String message = rs.data;
		Serial.print("Received --> ");
		Serial.print(rs.status.getResponseDescription());
		Serial.print(" - ");
		Serial.println(message);
	}
	delay(125);
}

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

	Serial.print(F("HEAD : "));  Serial.print(configuration.HEAD, BIN);Serial.print(" ");Serial.print(configuration.HEAD, DEC);Serial.print(" ");Serial.println(configuration.HEAD, HEX);
	Serial.println(F(" "));
	Serial.print(F("AddH : "));  Serial.println(configuration.ADDH, DEC);
	Serial.print(F("AddL : "));  Serial.println(configuration.ADDL, DEC);
	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.getUARTBaudRate());
	Serial.print(F("SpeedAirDataRate   : "));  Serial.print(configuration.SPED.airDataRate, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getAirDataRate());

	Serial.print(F("OptionTrans        : "));  Serial.print(configuration.OPTION.fixedTransmission, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getFixedTransmissionDescription());
	Serial.print(F("OptionPullup       : "));  Serial.print(configuration.OPTION.ioDriveMode, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getIODroveModeDescription());
	Serial.print(F("OptionWakeup       : "));  Serial.print(configuration.OPTION.wirelessWakeupTime, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getWirelessWakeUPTimeDescription());
	Serial.print(F("OptionFEC          : "));  Serial.print(configuration.OPTION.fec, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getFECDescription());
	Serial.print(F("OptionPower        : "));  Serial.print(configuration.OPTION.transmissionPower, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getTransmissionPowerDescription());

	Serial.println("----------------------------------------");

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

	Serial.print(F("Freq.: "));  Serial.println(moduleInformation.frequency, HEX);
	Serial.print(F("Version  : "));  Serial.println(moduleInformation.version, HEX);
	Serial.print(F("Features : "));  Serial.println(moduleInformation.features, HEX);
	Serial.println("----------------------------------------");

}

Il risultato è che il Serial si ferma sulla linea 91, quando riceviamo il messaggio l’e32 si sveglia da solo e mette l’AUX a LOW, quindi Arduino si sveglia grazie all’interrupt sul pin AUX.

Qui lo sketch di invio completo:

/*
 * LoRa E32-TTL-100
 * Send fixed broadcast transmission message to a specified channel.
 * https://mischianti.org/it/lora-e32-per-arduino-esp32-o-esp8266-wor-wake-on-radio-del-microcontrollore-e-uno-shield-per-arduino-part-6/
 *
 */
#include "Arduino.h"
#include "LoRa_E32.h"

// ---------- esp8266 pins --------------
LoRa_E32 e32ttl(D2, D3, D5, D7, D6); //, D5); //, D7, D6); // Config without connect AUX and M0 M1
// -------------------------------------

void printParameters(struct Configuration configuration);
void printModuleInformation(struct ModuleInformation moduleInformation);
//The setup function is called once at startup of the sketch
void setup()
{
	Serial.begin(9600);
	while (!Serial) {
	    ; // wait for serial port to connect. Needed for native USB
    }
	delay(100);

	while (!e32ttl.begin()) {
		    delay(2000); // wait for serial port to connect. Needed for native USB
	    }

	e32ttl.setMode(MODE_1_WAKE_UP);

//	e32ttl.resetModule();
	// After set configuration comment set M0 and M1 to low
	// and reboot if you directly set HIGH M0 and M1 to program
	ResponseStructContainer c;
	c = e32ttl.getConfiguration();
	Configuration configuration = *(Configuration*) c.data;
	printParameters(configuration);

//	configuration.SPED.uartBaudRate = UART_BPS_9600;
//	configuration.SPED.airDataRate = AIR_DATA_RATE_010_24;
	configuration.ADDL = 0x01;
	configuration.ADDH = 0x00;
	configuration.CHAN = 0x04;
	configuration.OPTION.fixedTransmission = FT_FIXED_TRANSMISSION;
	configuration.OPTION.wirelessWakeupTime = WAKE_UP_750;

	    configuration.OPTION.fec = FEC_1_ON;
	    configuration.OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS;
	    configuration.OPTION.transmissionPower = POWER_20;

	    configuration.SPED.airDataRate = AIR_DATA_RATE_010_24;
	    configuration.SPED.uartBaudRate = UART_BPS_9600;
	    configuration.SPED.uartParity = MODE_00_8N1;


	e32ttl.setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE);
	printParameters(configuration);
	// ---------------------------


}
int i = 0;
// The loop function is called in an endless loop
void loop()
{
	i++;
	String mess = "Message to 00 03 04 deviceMessage to  ";
	String compMEss = mess+i;

	Serial.print(compMEss);
	Serial.print(" - ");
	ResponseStatus rs = e32ttl.sendFixedMessage(0, 3, 0x04, compMEss);
	Serial.println(rs.getResponseDescription());

	delay(8000);

}

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

	Serial.print(F("HEAD : "));  Serial.print(configuration.HEAD, BIN);Serial.print(" ");Serial.print(configuration.HEAD, DEC);Serial.print(" ");Serial.println(configuration.HEAD, HEX);
	Serial.println(F(" "));
	Serial.print(F("AddH : "));  Serial.println(configuration.ADDH, DEC);
	Serial.print(F("AddL : "));  Serial.println(configuration.ADDL, DEC);
	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.getUARTBaudRate());
	Serial.print(F("SpeedAirDataRate   : "));  Serial.print(configuration.SPED.airDataRate, BIN);Serial.print(" -> "); Serial.println(configuration.SPED.getAirDataRate());

	Serial.print(F("OptionTrans        : "));  Serial.print(configuration.OPTION.fixedTransmission, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getFixedTransmissionDescription());
	Serial.print(F("OptionPullup       : "));  Serial.print(configuration.OPTION.ioDriveMode, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getIODroveModeDescription());
	Serial.print(F("OptionWakeup       : "));  Serial.print(configuration.OPTION.wirelessWakeupTime, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getWirelessWakeUPTimeDescription());
	Serial.print(F("OptionFEC          : "));  Serial.print(configuration.OPTION.fec, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getFECDescription());
	Serial.print(F("OptionPower        : "));  Serial.print(configuration.OPTION.transmissionPower, BIN);Serial.print(" -> "); Serial.println(configuration.OPTION.getTransmissionPowerDescription());

	Serial.println("----------------------------------------");

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

	Serial.print(F("Freq.: "));  Serial.println(moduleInformation.frequency, HEX);
	Serial.print(F("Version  : "));  Serial.println(moduleInformation.version, HEX);
	Serial.print(F("Features : "));  Serial.println(moduleInformation.features, HEX);
	Serial.println("----------------------------------------");

}

Arduino UNO shield

Ho creato uno shield Arduino che semplifica molto l’utilizzo del dispositivo.

Arduino LoRa E32 shield explained
Arduino LoRa E32 shield explained

Con questa scheda è possibile utilizzare questo dispositivo immediatamente, senza problemi di connessione o partitore di tensione.

La configurazione da usare è questa:

LoRa_E32 e32ttl(4, 5, 3, 7, 6);

Quindi puoi usare tutti gli esempi all’interno della libreria, puoi usare i pin 6 e 7 per fare una connessione completa o disabilitarli e mettere M0 e M1 come vuoi con il dip-switch.

Milled Arduino Shield LoRa EBYTE E32 copper clad
Milled Arduino Shield LoRa EBYTE E32 copper clad
Milled Arduino Shield LoRa EBYTE E32 start soldering
Milled Arduino Shield LoRa EBYTE E32 start soldering
Milled Arduino Shield LoRa EBYTE E32 soldering complete bottom
Milled Arduino Shield LoRa EBYTE E32 soldering complete bottom
Milled Arduino Shield LoRa EBYTE E32 soldering complete
Milled Arduino Shield LoRa EBYTE E32 soldering complete
Milled Arduino Shield LoRa EBYTE E32 Check with Logic Analyzer
Milled Arduino Shield LoRa EBYTE E32 Check with Logic Analyzer

Quiesto è il primo test e sembra ok.

LoRa E32 request configuration logic analyzer Arduino
LoRa E32 request configuration logic analyzer Arduino

Ed ecco il mio regalo di Natale

PCBWay scatola di Natale
PCBWay scatola di Natale

Ora andremo a farne una produzione massiva.

Arduino shield LoRa E32 start soldering PCB
Arduino shield LoRa E32 start soldering PCB

Lo shield ha alcuni jumper e dip switch per configurare M0 e M1.
Se si desidera impostare M0 e M1 su un valore fisso, è necessario posizionare il ponticello su F, se si desidera il controllo tramite pin su P.
Se si imposta su F, è necessario impostare il dip switch sul valore relativo LOW o HIGH.

Arduino shield photo UP with description
Arduino shield photo UP with description

Shopping List

You can find here AliExpress (433MHz 5Km) - AliExpress (433MHz 8Km) - AliExpress (433MHz 16Km) - AliExpress (868MHz 915MHz 5.5Km) - AliExpress (868MHz 915MHz 8Km)

AmountPart TypeProperties
1Lora E32-TTL-100variant 1; voltage 3-5V; type Basic
1DIP SWITCHchannels 1; package dipswitch-02
2Generic male header – 3 pinspins 3; pin spacing 0.1in (2.54mm); hole size 1.0mm,0.508mm; form ♂ (male); package THT; row single
1Arduino Uno (Rev3)type Arduino UNO (Rev3)
34.7kΩ Resistorbands 4; tolerance ±5%; pin spacing 400 mil; package THT; resistance 4.7kΩ
31kΩ Resistorbands 4; tolerance ±5%; pin spacing 400 mil; package THT; resistance 1kΩ
52kΩ Resistorbands 4; tolerance ±5%; pin spacing 400 mil; package THT; resistance 2kΩ
110kΩ Resistorbands 4; tolerance ±5%; pin spacing 400 mil; package THT; resistance 10kΩ
1Momentary Tactile Push Buttonpackage [THT]
1 Generic female header – 7 pins Pin spacing 0.1in (2.54mm);
2 Generic male/female header – 8 pins Pin spacing 0.1in (2.54mm);
1 Generic male/female header – 6 pins Pin spacing 0.1in (2.54mm);
1 Generic male/female header – 10 pins Pin spacing 0.1in (2.54mm);

Puoi avere il PCB senza costi aggiuntivi ordinandolo qui su PCBWay
PCB from PCBWay

Video dell’assemblaggio

Ecco il video della saldatura.

Ecco il risultato

LoRa E32 Arduino shield mounted
LoRa E32 Arduino shield mounted

Grazie

  1. LoRa E32 per Arduino, esp32 o esp8266: specifiche ed utilizzo base
  2. LoRa E32 per Arduino, esp32 o esp8266: libreria
  3. LoRa E32 per Arduino, esp32 o esp8266: configurazione
  4. LoRa E32 per Arduino, esp32 o esp8266: trasmissione fissa
  5. LoRa E32 per Arduino, esp32 o esp8266: power saving ed invio di dati strutturati
  6. LoRa E32 per Arduino, esp32 o esp8266: WOR (wake on radio) il microcontrollore e lo shield per Arduino
  7. LoRa E32 per Arduino, esp32 o esp8266: WOR (wake on radio) il microcontrollore e lo shield per il WeMos D1 mini
  8. LoRa E32 per Arduino, esp32 o esp8266 : WOR (wake on radio) del microcontrollore e lo shield per esp32
  9. LoRa E32 per STM32: WOR (wake on radio) del microcontrollore e lo shield per STM32

Github library


Spread the love

Lascia un commento

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