From 848243004abba348b809f10a82b5c91237ff00a0 Mon Sep 17 00:00:00 2001 From: Brad Bosch Date: Fri, 8 Aug 2025 13:40:53 -0500 Subject: [PATCH 1/4] Add support for a new variant constructed by soldering a Pro Micro type nRF52840 board directly to an E22 module. --- .../easy-nrf52-promicro_e22/platformio.ini | 11 + .../diy/easy-nrf52-promicro_e22/variant.cpp | 38 ++++ .../diy/easy-nrf52-promicro_e22/variant.h | 192 ++++++++++++++++++ 3 files changed, 241 insertions(+) create mode 100644 variants/nrf52840/diy/easy-nrf52-promicro_e22/platformio.ini create mode 100644 variants/nrf52840/diy/easy-nrf52-promicro_e22/variant.cpp create mode 100644 variants/nrf52840/diy/easy-nrf52-promicro_e22/variant.h diff --git a/variants/nrf52840/diy/easy-nrf52-promicro_e22/platformio.ini b/variants/nrf52840/diy/easy-nrf52-promicro_e22/platformio.ini new file mode 100644 index 000000000..7f5ae80ce --- /dev/null +++ b/variants/nrf52840/diy/easy-nrf52-promicro_e22/platformio.ini @@ -0,0 +1,11 @@ +; DIY no custom PCB, easy construction node based on Pro Micro Supermini NRF52840 Development Board + E22 900M30S +[env:easy-pro_micro_nrf_e22] +extends = nrf52840_base +board = promicro-nrf52840 +build_flags = ${nrf52840_base.build_flags} + -I variants/nrf52840/diy/easy-nrf52-pro-micro_e22 + -D NRF52_PROMICRO_DIY +build_src_filter = ${nrf52_base.build_src_filter} +<../variants//nrf52840/diy/easy-nrf52-pro-micro_e22> +lib_deps = + ${nrf52840_base.lib_deps} +debug_tool = jlink diff --git a/variants/nrf52840/diy/easy-nrf52-promicro_e22/variant.cpp b/variants/nrf52840/diy/easy-nrf52-promicro_e22/variant.cpp new file mode 100644 index 000000000..5869ed1d4 --- /dev/null +++ b/variants/nrf52840/diy/easy-nrf52-promicro_e22/variant.cpp @@ -0,0 +1,38 @@ +/* + Copyright (c) 2014-2015 Arduino LLC. All right reserved. + Copyright (c) 2016 Sandeep Mistry All right reserved. + Copyright (c) 2018, Adafruit Industries (adafruit.com) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "variant.h" +#include "nrf.h" +#include "wiring_constants.h" +#include "wiring_digital.h" + +const uint32_t g_ADigitalPinMap[] = { + // P0 + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + + // P1 + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47}; + +void initVariant() +{ + // 3V3 Power Rail + pinMode(PIN_3V3_EN, OUTPUT); + digitalWrite(PIN_3V3_EN, HIGH); +} diff --git a/variants/nrf52840/diy/easy-nrf52-promicro_e22/variant.h b/variants/nrf52840/diy/easy-nrf52-promicro_e22/variant.h new file mode 100644 index 000000000..c02e4606f --- /dev/null +++ b/variants/nrf52840/diy/easy-nrf52-promicro_e22/variant.h @@ -0,0 +1,192 @@ +/* +A DIY, easy, no PCB, basic but powerful node based on E22 900M33S and +Pro Micro compatible NRF52840 dev boards such as the Tenstar Robot +Supermini or Nice Nano. + +Without adding GPS or other peripherals, this node should run about 45 +hours on a 1S 1000 mAh battery. + +This node can be constructed by directly soldering the development +board directly to an EBYTE E22 900m30S. There will be 7 directly +soldered pads, 3 header pins, and only 1 wire connection required. + +You can power the node via USB or a battery, or you can install a power +connector on the GND and VCC pads of the E22; a JST PH or XH socket +should fit. It may be easiest to install this first if you want it. + +Note that the E22-900M33S will output near it's specified power level +only when supplied with 5-5.5 volts. If you take advantage of the +battery charger on the Pro Micro board and power everything from a 1S +Lithium battery, the E22-900M33S will output a maximum of about 1 +Watt. + +Be sure to perform the initial flash of the Meshtastic firmware before +proceeding with the assembly to protect the E22 and ensure that the +TXEN pad is not driven when it shouldn't be. + +Detailed build instructions can be found here: +https://github.com/brad112358/easy_E22?tab=readme-ov-file#easy-diy-e22-nrf52840-build-instructions + +*/ + +#ifndef _VARIANT_EASY_PROMICRO_DIY_ +#define _VARIANT_EASY_PROMICRO_DIY_ + +/** Master clock frequency */ +#define VARIANT_MCK (64000000ul) + +// #define USE_LFXO // Board uses 32khz crystal for LF +#define USE_LFRC // Board uses RC for LF + +#define PROMICRO_DIY_TCXO + +/*---------------------------------------------------------------------------- + * Headers + *----------------------------------------------------------------------------*/ + +#include "WVariant.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/* +E22/NRF52 PRO MICRO PIN ASSIGNMENT + +| Pin   | Function   |   | Pin     | Function     | +| ----- | ----------- | --- | -------- | ------------ | +| Gnd   |             |   | vbat     |             | +| P0.06 | Serial2 RX |   | vbat     |             | +| P0.08 | Serial2 TX |   | Gnd     |             | +| Gnd   |             |   | reset   |             | +| Gnd   | GND         |   | ext_vcc | *see 0.13   | +| P0.17 | Free pin   |   | P0.31   | BATTERY_PIN | +| P0.20 | Free pin   |   | P0.29   | DI01         | +| P0.22 | Free pin   |   | P0.02   | BUSY         | +| P0.24 | Free pin   |   | P1.15   | NRST         | +| P1.00 | TXEN        |   | P1.13   | MISO         | +| P0.11 | RXEN        |   | P1.11   | MOSI         | +| P1.04 | SDA         |   | P0.10   | SCK         | +| P1.06 | SCL         |   | P0.09   | NSS         | +|       |             |   |         |             | +|       | Mid board   |   |         | Internal     | +| P1.01 | GPS_TX     |   | 0.15     | LED         | +| P1.02 | GPS_RX     |   | 0.13     | 3V3_EN       | +| P1.07 | GPS_EN     |   |         |             | +*/ + +// Number of pins defined in PinDescription array +#define PINS_COUNT (48) +#define NUM_DIGITAL_PINS (48) +#define NUM_ANALOG_INPUTS (1) +#define NUM_ANALOG_OUTPUTS (0) + +// Pin 13 enables 3.3V periphery. +#define PIN_3V3_EN (0 + 13) // P0.13 + +// Battery +#define BATTERY_PIN (0 + 31) // P0.31 +#define ADC_CHANNEL ADC1_GPIO4_CHANNEL +#define ADC_RESOLUTION 14 +#define BATTERY_SENSE_RESOLUTION_BITS 12 +#define BATTERY_SENSE_RESOLUTION 4096.0 +// Definition of milliVolt per LSB => 3.0V ADC range and 12-bit ADC resolution = 3000mV/4096 +#define VBAT_MV_PER_LSB (0.73242188F) +// Voltage divider value => 1.5M + 1M voltage divider on VBAT = (1.5M / (1M + 1.5M)) +#define VBAT_DIVIDER (0.6F) +// Compensation factor for the VBAT divider +#define VBAT_DIVIDER_COMP (2.02) // 2 + magic for current drain of input +// Fixed calculation of milliVolt from compensation value +#define REAL_VBAT_MV_PER_LSB (VBAT_DIVIDER_COMP * VBAT_MV_PER_LSB) +#undef AREF_VOLTAGE +#define AREF_VOLTAGE 3.0 +#define VBAT_AR_INTERNAL AR_INTERNAL_3_0 +#define ADC_MULTIPLIER VBAT_DIVIDER_COMP // REAL_VBAT_MV_PER_LSB +#define VBAT_RAW_TO_SCALED(x) (REAL_VBAT_MV_PER_LSB * x) + +// WIRE IC AND IIC PINS +#define WIRE_INTERFACES_COUNT 1 + +#define PIN_WIRE_SDA (32 + 4) // P1.04 +#define PIN_WIRE_SCL (32 + 6) // P1.06 + +// LED +#define PIN_LED1 (0 + 15) // P0.15 +#define LED_BUILTIN PIN_LED1 +// Actually red +#define LED_BLUE PIN_LED1 +#define LED_STATE_ON 1 // State when LED is lit + +// Button +//#define BUTTON_PIN // no button + +// GPS +#define PIN_GPS_TX (32 + 1) // P1.01 +#define PIN_GPS_RX (32 + 2) // P1.02 + +#define PIN_GPS_EN (32 + 7) // P1.07 +#define GPS_POWER_TOGGLE +#define GPS_UBLOX +// define GPS_DEBUG + +// UART interfaces +#define PIN_SERIAL1_RX PIN_GPS_TX +#define PIN_SERIAL1_TX PIN_GPS_RX + +#define PIN_SERIAL2_RX (0 + 6) // P0.06 +#define PIN_SERIAL2_TX (0 + 8) // P0.08 + +// Serial interfaces +#define SPI_INTERFACES_COUNT 1 + +#define PIN_SPI_MISO (32 + 13) // P1.13 +#define PIN_SPI_MOSI (32 + 11) // P1.11 +#define PIN_SPI_SCK (0 + 10) // P0.10 + +#define LORA_MISO PIN_SPI_MISO +#define LORA_MOSI PIN_SPI_MOSI +#define LORA_SCK PIN_SPI_SCK +#define LORA_CS (0 + 9) // P0.09 NSS + +// LORA MODULE +#define USE_SX1262 + +#define LORA_DIO0 (0 + 2) // P0.02 BUSY +#define LORA_DIO1 (0 + 29) // P0.29 IRQ +#define LORA_RESET (32 + 15) // P1.15 NRST + +// SX126X CONFIG +#undef TX_GAIN_LORA +#define TX_GAIN_LORA 22 // 8 for E22 900M30S, 25 for 900M33S, 22 for 3.7V battery powered 900M33S, 0 for 900M22S +#define SX126X_MAX_POWER 8 // 8 for 900M33S, 22 for 900M30S and 900M22S; defaults to 22 if not defined + +#define SX126X_CS LORA_CS +#define SX126X_DIO1 LORA_DIO1 +#define SX126X_BUSY LORA_DIO0 +#define SX126X_RESET LORA_RESET +#define SX126X_RXEN (0 + 11) // P0.11 +#define SX126X_TXEN (32 + 0) // P1.00 + +/* +| Mfr | Module | TCXO | RF Switch | Notes | +| ------------ | ---------------- | ---- | --------- | ------------------------------------- | +| Ebyte | E22-900M22S | Yes | Ext | | +| Ebyte | E22-900M30S | Yes | Ext | | +| Ebyte | E22-900M33S | Yes | Ext | MAX_POWER must be set to 8 for this! | + +On the SX1262, DIO3 sets the voltage for an external TCXO, if one is present. If one is not present, use TCXO_OPTIONAL to try both +settings. +*/ + +#define SX126X_DIO3_TCXO_VOLTAGE 1.8 +#define TCXO_OPTIONAL // make it so that the firmware can try both TCXO and XTAL + +#ifdef __cplusplus +} +#endif + +/*---------------------------------------------------------------------------- + * Arduino objects - C++ only + *----------------------------------------------------------------------------*/ + +#endif From 0991296b689259b22fc3b5d5904ea63577fc40b3 Mon Sep 17 00:00:00 2001 From: Brad Bosch Date: Sat, 9 Aug 2025 08:52:59 -0500 Subject: [PATCH 2/4] Don't use existing model --- variants/nrf52840/diy/easy-nrf52-promicro_e22/platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/variants/nrf52840/diy/easy-nrf52-promicro_e22/platformio.ini b/variants/nrf52840/diy/easy-nrf52-promicro_e22/platformio.ini index 7f5ae80ce..077237039 100644 --- a/variants/nrf52840/diy/easy-nrf52-promicro_e22/platformio.ini +++ b/variants/nrf52840/diy/easy-nrf52-promicro_e22/platformio.ini @@ -4,7 +4,7 @@ extends = nrf52840_base board = promicro-nrf52840 build_flags = ${nrf52840_base.build_flags} -I variants/nrf52840/diy/easy-nrf52-pro-micro_e22 - -D NRF52_PROMICRO_DIY + -D PRIVATE_HW build_src_filter = ${nrf52_base.build_src_filter} +<../variants//nrf52840/diy/easy-nrf52-pro-micro_e22> lib_deps = ${nrf52840_base.lib_deps} From 5524ce1d97116ed387d9d1059cb9bbf7238d0ad9 Mon Sep 17 00:00:00 2001 From: Brad Bosch Date: Sat, 9 Aug 2025 13:04:19 -0500 Subject: [PATCH 3/4] Oops, missed part of rename --- variants/nrf52840/diy/easy-nrf52-promicro_e22/platformio.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/variants/nrf52840/diy/easy-nrf52-promicro_e22/platformio.ini b/variants/nrf52840/diy/easy-nrf52-promicro_e22/platformio.ini index 077237039..e23963120 100644 --- a/variants/nrf52840/diy/easy-nrf52-promicro_e22/platformio.ini +++ b/variants/nrf52840/diy/easy-nrf52-promicro_e22/platformio.ini @@ -3,9 +3,9 @@ extends = nrf52840_base board = promicro-nrf52840 build_flags = ${nrf52840_base.build_flags} - -I variants/nrf52840/diy/easy-nrf52-pro-micro_e22 + -I variants/nrf52840/diy/easy-nrf52-promicro_e22 -D PRIVATE_HW -build_src_filter = ${nrf52_base.build_src_filter} +<../variants//nrf52840/diy/easy-nrf52-pro-micro_e22> +build_src_filter = ${nrf52_base.build_src_filter} +<../variants//nrf52840/diy/easy-nrf52-promicro_e22> lib_deps = ${nrf52840_base.lib_deps} debug_tool = jlink From b2e1dbcca81456c68b6ae473db048aa313f4a3bd Mon Sep 17 00:00:00 2001 From: Brad Bosch Date: Mon, 11 Aug 2025 14:09:48 -0500 Subject: [PATCH 4/4] Fix formatting --- .../diy/easy-nrf52-promicro_e22/variant.h | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/variants/nrf52840/diy/easy-nrf52-promicro_e22/variant.h b/variants/nrf52840/diy/easy-nrf52-promicro_e22/variant.h index c02e4606f..451936d51 100644 --- a/variants/nrf52840/diy/easy-nrf52-promicro_e22/variant.h +++ b/variants/nrf52840/diy/easy-nrf52-promicro_e22/variant.h @@ -118,7 +118,7 @@ E22/NRF52 PRO MICRO PIN ASSIGNMENT #define LED_STATE_ON 1 // State when LED is lit // Button -//#define BUTTON_PIN // no button +// #define BUTTON_PIN // no button // GPS #define PIN_GPS_TX (32 + 1) // P1.01 @@ -139,8 +139,8 @@ E22/NRF52 PRO MICRO PIN ASSIGNMENT // Serial interfaces #define SPI_INTERFACES_COUNT 1 -#define PIN_SPI_MISO (32 + 13) // P1.13 -#define PIN_SPI_MOSI (32 + 11) // P1.11 +#define PIN_SPI_MISO (32 + 13) // P1.13 +#define PIN_SPI_MOSI (32 + 11) // P1.11 #define PIN_SPI_SCK (0 + 10) // P0.10 #define LORA_MISO PIN_SPI_MISO @@ -151,21 +151,21 @@ E22/NRF52 PRO MICRO PIN ASSIGNMENT // LORA MODULE #define USE_SX1262 -#define LORA_DIO0 (0 + 2) // P0.02 BUSY -#define LORA_DIO1 (0 + 29) // P0.29 IRQ -#define LORA_RESET (32 + 15) // P1.15 NRST +#define LORA_DIO0 (0 + 2) // P0.02 BUSY +#define LORA_DIO1 (0 + 29) // P0.29 IRQ +#define LORA_RESET (32 + 15) // P1.15 NRST // SX126X CONFIG #undef TX_GAIN_LORA -#define TX_GAIN_LORA 22 // 8 for E22 900M30S, 25 for 900M33S, 22 for 3.7V battery powered 900M33S, 0 for 900M22S +#define TX_GAIN_LORA 22 // 8 for E22 900M30S, 25 for 900M33S, 22 for 3.7V battery powered 900M33S, 0 for 900M22S #define SX126X_MAX_POWER 8 // 8 for 900M33S, 22 for 900M30S and 900M22S; defaults to 22 if not defined #define SX126X_CS LORA_CS #define SX126X_DIO1 LORA_DIO1 #define SX126X_BUSY LORA_DIO0 #define SX126X_RESET LORA_RESET -#define SX126X_RXEN (0 + 11) // P0.11 -#define SX126X_TXEN (32 + 0) // P1.00 +#define SX126X_RXEN (0 + 11) // P0.11 +#define SX126X_TXEN (32 + 0) // P1.00 /* | Mfr | Module | TCXO | RF Switch | Notes |