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.
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
Puoi trovare tutti i tipi di schemi di collegamento negli articoli precedenti della serie.
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) | M2 | M1 | M0 | Introduzione alla Modalità | Nota |
---|---|---|---|---|---|
0 Modalità RSSI | 0 | 0 | 0 | Il 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à continua | 0 | 0 | 1 | UART aperta. Wireless chiuso, e trasmissione trasparente a sottopacchetti disponibile. | UART aperta. Wireless chiuso, e trasmissione trasparente continua disponibile. |
2 Modalità a sottopacchetti | 0 | 1 | 0 | UART 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 configurazione | 0 | 1 | 1 | La velocità di baud è fissata a 9600 8N1. | UART aperta. Wireless chiuso, e trasmissione trasparente a sottopacchetti disponibile. |
4 Modalità WOR | 1 | 0 | 0 | La 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) | 1 | 0 | 1 | – | – |
6 Modalità di risparmio energetico | 1 | 1 | 0 | Qualsiasi 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 sospensione | 1 | 1 | 1 | Qualsiasi 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.
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:
- 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).
- 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.
- 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.
- Impostazioni di Rete: È possibile specificare l’indirizzo e il canale.
- 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.
- Diagnostica e Test: Strumenti per diagnosticare e testare le prestazioni RF del dispositivo, inclusi indicatori di intensità del segnale e test di trasmissione.
- 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
----------------------------------------
C’è un bug nella versione attuale dell’E70, che impedisce di recuperare correttamente le informazioni sul modulo.
Opzioni di configurazione di base
Nome | Descrizione | Indirizzo |
---|---|---|
ADDH | Byte alto dell’indirizzo del modulo (predefinito 00H) | 00H |
ADDL | Byte basso dell’indirizzo del modulo (predefinito 00H) | 01H |
SPED | Informazioni su parità e velocità di baud e velocità di dati nell’aria | 02H |
OPTION | Tipo di trasmissione e velocità | 03H |
CHAN | Canale 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à UART | Valore costante |
---|---|
8N1 (predefinito) | MODE_00_8N1 |
8O1 | MODE_01_8O1 |
8E1 | MODE_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 |
---|---|
1200 | UART_BPS_1200 |
2400 | UART_BPS_2400 |
4800 | UART_BPS_4800 |
9600 (predefinito) | UART_BPS_9600 |
19200 | UART_BPS_19200 |
38400 | UART_BPS_38400 |
57600 | UART_BPS_57600 |
115200 | UART_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 |
5k | AIR_DATA_RATE_001_050 |
12k | AIR_DATA_RATE_010_120 |
28k | AIR_DATA_RATE_011_280 |
64k | AIR_DATA_RATE_100_640 |
168k | AIR_DATA_RATE_101_168 |
168k | AIR_DATA_RATE_110_168 |
168k | AIR_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 pacchetto | Valore costante |
---|---|
16 byte | SPS_0016_000 |
32 byte | SPS_0032_001 |
64 byte (predefinito) | SPS_0064_010 |
128 byte | SPS_0128_011 |
256 byte | SPS_0256_100 |
512 byte | SPS_0512_101 |
1024 byte | SPS_1024_110 |
2048 byte | SPS_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 fissa | Valore costante |
---|---|
Modalità di trasmissione fissa | FT_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.
2 | Interruttore FEC | Valore costante |
---|---|---|
0 | Disattiva FEC | FEC_0_OFF |
1 | Attiva 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.
6 | Modalità di guida IO (predefinito 1) | Valore costante |
---|---|---|
1 | TXD e AUX sono uscite push-pull, RXD è ingresso pull-up | IO_D_MODE_PUSH_PULLS_PULL_UPS |
0 | TXD, AUX uscite open-collector, RXD ingresso open-collector | IO_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 wireless | Valore costante |
---|---|
500 ms | WAKE_UP_500 |
1000 ms | WAKE_UP_1000 |
1500 ms | WAKE_UP_1500 |
2000 ms (predefinito) | WAKE_UP_2000 |
2500 ms | WAKE_UP_2500 |
3000 ms | WAKE_UP_3000 |
3500 ms | WAKE_UP_3500 |
4000 ms | WAKE_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 |
17dBm | POWER_17 |
13dBm | POWER_13 |
10dBm | POWER_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 |
27dBm | POWER_27 |
24dBm | POWER_24 |
21dBm | POWER_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
- EByte RF E70 433/868/900 T14S2: piedinatura, datasheet e specifiche (1.5Km)
- Adattatore per Modulo RF EByte E70: PCB, Soluzione Stampata in 3D per breadboard e configurazione
- Collegare l’EByte E70 (CC1310) ai dispositivi ESP32 c3/s3 ed un semplice sketch di esempio
- Collegamento dell’EByte E70 ai dispositivi Arduino SAMD (Nano 33, MKR…) e un semplice sketch di esempio
- Collegamento dell’EByte E70 ai dispositivi STM32 (black/blue pill) e un semplice sketch di esempio
- Collegamento dell’EByte E70 ai dispositivi Raspberry Pi Pico (rp2040) ed un semplice sketch di esempio
- Esplorazione delle potenzialità del modulo EByte RF E70 (esp32, STM32, Arduino, Raspberry Pi Pico)
- EByte RF E70 CC1310: andiamo ad esplorare la libreria (esp32, esp8266, STM32, Arduino, Raspberry Pi Pico)
- Configurazione del Modulo RF EByte E70 (esp32, STM32, Arduino, Raspberry Pi Pico)