-
-
Notifications
You must be signed in to change notification settings - Fork 952
Adding the RAK13300 / RAK11200 ESP32 pair variant #800
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
930b92f
13c869a
17bf30f
f59e2b5
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||
|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,39 @@ | ||||||||
| { | ||||||||
| "build": { | ||||||||
| "arduino":{ | ||||||||
| "ldscript": "esp32_out.ld" | ||||||||
| }, | ||||||||
| "core": "esp32", | ||||||||
| "extra_flags": "-DARDUINO_ESP32_DEV", | ||||||||
| "f_cpu": "240000000L", | ||||||||
| "f_flash": "40000000L", | ||||||||
| "flash_mode": "dio", | ||||||||
| "mcu": "esp32", | ||||||||
| "variant": "WisCore_RAK11200_Board" | ||||||||
| }, | ||||||||
| "connectivity": [ | ||||||||
| "wifi", | ||||||||
| "bluetooth", | ||||||||
| "ethernet", | ||||||||
| "can" | ||||||||
|
Comment on lines
+17
to
+18
|
||||||||
| "ethernet", | |
| "can" | |
| "ethernet" |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,36 @@ | ||
| #include "RAK11200Board.h" | ||
|
|
||
| void RAK11200Board::begin() { | ||
| ESP32Board::begin(); | ||
|
|
||
| pinMode(PIN_VBAT_READ, INPUT); | ||
|
|
||
| pinMode(SX126X_POWER_EN, OUTPUT); | ||
| digitalWrite(SX126X_POWER_EN, HIGH); | ||
| delay(10); // give sx1262 some time to power up | ||
|
|
||
| #ifdef PIN_USER_BTN | ||
| pinMode(PIN_USER_BTN, INPUT_PULLUP); | ||
| #endif | ||
|
|
||
| #ifdef PIN_USER_BTN_ANA | ||
| pinMode(PIN_USER_BTN_ANA, INPUT_PULLUP); | ||
| #endif | ||
| } | ||
|
Comment on lines
+3
to
+19
|
||
|
|
||
| uint16_t RAK11200Board::getBattMilliVolts() { | ||
| analogReadResolution(12); | ||
|
|
||
| uint32_t raw = 0; | ||
| const int BATTERY_SAMPLES = 8; | ||
| for (int i = 0; i < BATTERY_SAMPLES; i++) { | ||
| raw += analogRead(PIN_VBAT_READ); | ||
| } | ||
| raw = raw / BATTERY_SAMPLES; | ||
|
|
||
| return (ADC_MULTIPLIER * raw) / 4096; | ||
| } | ||
|
|
||
| const char* RAK11200Board::getManufacturerName() const { | ||
| return "RAK 11200"; | ||
| } | ||
| Original file line number | Diff line number | Diff line change | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,25 @@ | ||||||||||||||
| #pragma once | ||||||||||||||
|
|
||||||||||||||
| #include <Arduino.h> | ||||||||||||||
| #include <helpers/ESP32Board.h> | ||||||||||||||
|
|
||||||||||||||
| // LoRa radio module pins when paired with the RAK13300 SX1262 module | ||||||||||||||
| #define P_LORA_DIO_1 22 // GPIO22 (ESP32 pin 36 -> IO6/DIO1) | ||||||||||||||
| #define P_LORA_NSS 32 // GPIO32 (ESP32 pin 8 -> SPI_CS) | ||||||||||||||
| #define P_LORA_RESET 23 // GPIO23 (ESP32 pin 37 -> IO4/NRESET) | ||||||||||||||
| #define P_LORA_BUSY 13 // GPIO13 (ESP32 pin 16 -> IO5) | ||||||||||||||
|
Comment on lines
+9
to
+10
|
||||||||||||||
| #define P_LORA_RESET 23 // GPIO23 (ESP32 pin 37 -> IO4/NRESET) | |
| #define P_LORA_BUSY 13 // GPIO13 (ESP32 pin 16 -> IO5) | |
| #define P_LORA_RESET 23 // GPIO23 (ESP32 pin 37 -> IO4/NRESET) | |
| #ifndef P_LORA_BUSY | |
| #define P_LORA_BUSY 13 // GPIO13 (ESP32 pin 16 -> IO5) | |
| #endif |
Copilot
AI
Jan 21, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Inconsistent ADC_MULTIPLIER values: variant.h defines it as 1.85 (line 20) while RAK11200Board.h defines it as (3 * 1.73 * 1.110 * 1000) which equals approximately 5763.9. These values are dramatically different and will result in incorrect battery voltage readings. According to the WisBlock RAK11200 documentation and similar RAK boards, the ADC_MULTIPLIER should typically account for the voltage divider ratio and ADC characteristics. Please verify the correct voltage divider configuration and use a consistent value across both files.
| #define ADC_MULTIPLIER (3 * 1.73 * 1.110 * 1000) | |
| #define ADC_MULTIPLIER 1.85f |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,50 @@ | ||
| #ifndef Pins_Arduino_h | ||
| #define Pins_Arduino_h | ||
|
|
||
| #ifndef _VARIANT_RAK11200_ | ||
| #define _VARIANT_RAK11200_ | ||
| #endif | ||
|
|
||
| #include <stdint.h> | ||
|
|
||
| #define EXTERNAL_NUM_INTERRUPTS 16 | ||
| #define NUM_DIGITAL_PINS 40 | ||
| #define NUM_ANALOG_INPUTS 16 | ||
|
|
||
| #define analogInputToDigitalPin(p) (((p) < 20) ? (esp32_adc2gpio[(p)]) : -1) | ||
| #define digitalPinToInterrupt(p) (((p) < 40) ? (p) : -1) | ||
| #define digitalPinHasPWM(p) (p < 34) | ||
|
|
||
| #define LED_GREEN 12 | ||
| #define LED_BLUE 2 | ||
|
|
||
| #define LED_BUILTIN LED_GREEN | ||
|
|
||
| static const uint8_t TX = 1; | ||
| static const uint8_t RX = 3; | ||
|
|
||
| #define TX1 21 | ||
| #define RX1 19 | ||
|
|
||
| #define WB_IO1 14 | ||
| #define WB_IO2 27 | ||
| #define WB_IO3 26 | ||
| #define WB_IO4 23 | ||
| #define WB_IO5 13 | ||
| #define WB_IO6 22 | ||
| #define WB_SW1 34 | ||
| #define WB_A0 36 | ||
| #define WB_A1 39 | ||
| #define WB_CS 32 | ||
| #define WB_LED1 12 | ||
| #define WB_LED2 2 | ||
|
|
||
| static const uint8_t SDA = 4; | ||
| static const uint8_t SCL = 5; | ||
|
|
||
| static const uint8_t SS = 32; | ||
| static const uint8_t MOSI = 25; | ||
| static const uint8_t MISO = 35; | ||
| static const uint8_t SCK = 33; | ||
|
|
||
| #endif /* Pins_Arduino_h */ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,147 @@ | ||
| [rak11200] | ||
| extends = esp32_base | ||
| board = wiscore_rak11200 | ||
| board_build.partitions = min_spiffs.csv ; get around 4mb flash limit | ||
| build_unflags = -Os | ||
| build_type = release | ||
| build_flags = | ||
| ${esp32_base.build_flags} | ||
| ${sensor_base.build_flags} | ||
| -I variants/rak11200 | ||
| -D RAK_11200 | ||
| -D RAK_BOARD | ||
| -D PIN_BOARD_SCL=5 | ||
| -D PIN_BOARD_SDA=4 | ||
| -D PIN_GPS_TX=1 | ||
| -D PIN_GPS_RX=3 | ||
| -D PIN_GPS_EN=-1 | ||
| -D PIN_OLED_RESET=-1 | ||
| -D RADIO_CLASS=CustomSX1262 | ||
| -D WRAPPER_CLASS=CustomSX1262Wrapper | ||
| -D LORA_TX_POWER=22 | ||
| -D SX126X_CURRENT_LIMIT=140 | ||
| -D SX126X_DIO2_AS_RF_SWITCH=true | ||
| -D SX126X_DIO3_TCXO_VOLTAGE=1.8 | ||
| -D ENV_INCLUDE_GPS=0 | ||
| -D RAK_WISBLOCK_GPS=0 | ||
| -D ENV_INCLUDE_INA3221=0 | ||
| -D ENV_INCLUDE_VL53L0X=0 ; Has a fairly long timeout of 40 seconds so we disable to prevent that startup delay | ||
| -D DISPLAY_CLASS=NullDisplayDriver | ||
| build_src_filter = ${esp32_base.build_src_filter} | ||
| +<../variants/rak11200> | ||
| +<helpers/sensors> | ||
| +<helpers/ui/NullDisplayDriver.cpp> | ||
| +<helpers/ui/MomentaryButton.cpp> | ||
| lib_deps = | ||
| ${esp32_base.lib_deps} | ||
| ${sensor_base.lib_deps} | ||
| sparkfun/SparkFun u-blox GNSS Arduino Library@^2.2.27 | ||
|
|
||
| [env:RAK_11200_Repeater] | ||
| extends = rak11200 | ||
| build_flags = | ||
| ${rak11200.build_flags} | ||
| -D ADVERT_NAME='"RAK11200 Repeater"' | ||
| -D ADVERT_LAT=0.0 | ||
| -D ADVERT_LON=0.0 | ||
| -D ADMIN_PASSWORD='"password"' | ||
| -D MAX_NEIGHBOURS=8 | ||
| ; -D MESH_PACKET_LOGGING=1 | ||
| ; -D MESH_DEBUG=1 | ||
| build_src_filter = ${rak11200.build_src_filter} | ||
| +<../examples/simple_repeater> | ||
| lib_deps = | ||
| ${rak11200.lib_deps} | ||
| ${esp32_ota.lib_deps} | ||
|
|
||
| [env:RAK_11200_room_server] | ||
| extends = rak11200 | ||
| build_flags = | ||
| ${rak11200.build_flags} | ||
| -D ADVERT_NAME='"Test Room"' | ||
| -D ADVERT_LAT=0.0 | ||
| -D ADVERT_LON=0.0 | ||
| -D ADMIN_PASSWORD='"password"' | ||
| -D ROOM_PASSWORD='"hello"' | ||
| ; -D MESH_PACKET_LOGGING=1 | ||
| ; -D MESH_DEBUG=1 | ||
| build_src_filter = ${rak11200.build_src_filter} | ||
| +<../examples/simple_room_server> | ||
| lib_deps = | ||
| ${rak11200.lib_deps} | ||
| ${esp32_ota.lib_deps} | ||
|
|
||
| [env:RAK_11200_companion_radio_usb] | ||
| extends = rak11200 | ||
| build_flags = | ||
| ${rak11200.build_flags} | ||
| -I examples/companion_radio/ui-orig | ||
| -D PIN_USER_BTN=34 | ||
| -D PIN_USER_BTN_ANA=36 | ||
| -D MAX_CONTACTS=100 | ||
| -D MAX_GROUP_CHANNELS=8 | ||
| ; NOTE: DO NOT ENABLE --> -D MESH_PACKET_LOGGING=1 | ||
| ; NOTE: DO NOT ENABLE --> -D MESH_DEBUG=1 | ||
| build_src_filter = ${rak11200.build_src_filter} | ||
| +<../examples/companion_radio/*.cpp> | ||
| +<../examples/companion_radio/ui-orig/*.cpp> | ||
| lib_deps = | ||
| ${rak11200.lib_deps} | ||
| ${esp32_ota.lib_deps} | ||
| densaugeo/base64 @ ~1.4.0 | ||
|
|
||
| [env:RAK_11200_companion_radio_ble] | ||
| extends = rak11200 | ||
| build_flags = | ||
| ${rak11200.build_flags} | ||
| -I examples/companion_radio/ui-orig | ||
| -D PIN_USER_BTN=34 | ||
| -D PIN_USER_BTN_ANA=36 | ||
| -D MAX_CONTACTS=100 | ||
| -D MAX_GROUP_CHANNELS=8 | ||
| -D BLE_PIN_CODE=123456 | ||
| -D BLE_DEBUG_LOGGING=1 | ||
| -D OFFLINE_QUEUE_SIZE=256 | ||
| ; -D MESH_PACKET_LOGGING=1 | ||
| ; -D MESH_DEBUG=1 | ||
| build_src_filter = ${rak11200.build_src_filter} | ||
| +<helpers/esp32/SerialBLEInterface.cpp> | ||
| +<../examples/companion_radio/*.cpp> | ||
| +<../examples/companion_radio/ui-orig/*.cpp> | ||
| lib_deps = | ||
| ${rak11200.lib_deps} | ||
| ${esp32_ota.lib_deps} | ||
| densaugeo/base64 @ ~1.4.0 | ||
|
|
||
| [env:RAK_11200_terminal_chat] | ||
| extends = rak11200 | ||
| build_flags = | ||
| ${rak11200.build_flags} | ||
| -D PIN_USER_BTN=34 | ||
| -D PIN_USER_BTN_ANA=36 | ||
| -D MAX_CONTACTS=100 | ||
| -D MAX_GROUP_CHANNELS=1 | ||
| ; -D MESH_PACKET_LOGGING=1 | ||
| ; -D MESH_DEBUG=1 | ||
| build_src_filter = ${rak11200.build_src_filter} | ||
| +<../examples/simple_secure_chat/main.cpp> | ||
| lib_deps = | ||
| ${rak11200.lib_deps} | ||
| ${esp32_ota.lib_deps} | ||
| densaugeo/base64 @ ~1.4.0 | ||
|
|
||
| [env:RAK_11200_sensor] | ||
| extends = rak11200 | ||
| build_flags = | ||
| ${rak11200.build_flags} | ||
| -D ADVERT_NAME='"RAK11200 Sensor"' | ||
| -D ADVERT_LAT=0.0 | ||
| -D ADVERT_LON=0.0 | ||
| -D ADMIN_PASSWORD='"password"' | ||
| ; -D MESH_PACKET_LOGGING=1 | ||
| -D MESH_DEBUG=1 | ||
| build_src_filter = ${rak11200.build_src_filter} | ||
| +<../examples/simple_sensor> | ||
| lib_deps = | ||
| ${rak11200.lib_deps} | ||
| ${esp32_ota.lib_deps} |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,63 @@ | ||
| #include <Arduino.h> | ||
| #include "target.h" | ||
| #include <helpers/ArduinoHelpers.h> | ||
|
|
||
| RAK11200Board board; | ||
|
|
||
| #ifndef PIN_USER_BTN | ||
| #define PIN_USER_BTN (-1) | ||
| #endif | ||
|
|
||
| #ifdef DISPLAY_CLASS | ||
| DISPLAY_CLASS display; | ||
| MomentaryButton user_btn(PIN_USER_BTN, 1000, true, true); | ||
|
|
||
| #if defined(PIN_USER_BTN_ANA) | ||
| MomentaryButton analog_btn(PIN_USER_BTN_ANA, 1000, 20); | ||
| #endif | ||
| #endif | ||
|
|
||
| RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY, SPI); | ||
|
|
||
| WRAPPER_CLASS radio_driver(radio, board); | ||
|
|
||
| VolatileRTCClock fallback_clock; | ||
| AutoDiscoverRTCClock rtc_clock(fallback_clock); | ||
|
|
||
| #if ENV_INCLUDE_GPS | ||
| #include <helpers/sensors/MicroNMEALocationProvider.h> | ||
| MicroNMEALocationProvider nmea = MicroNMEALocationProvider(Serial1); | ||
| EnvironmentSensorManager sensors = EnvironmentSensorManager(nmea); | ||
| #else | ||
| EnvironmentSensorManager sensors; | ||
| #endif | ||
|
|
||
| bool radio_init() { | ||
| rtc_clock.begin(Wire); | ||
|
|
||
| #if defined(P_LORA_SCLK) | ||
| return radio.std_init(&SPI); | ||
| #else | ||
| return radio.std_init(); | ||
| #endif | ||
| } | ||
|
|
||
| uint32_t radio_get_rng_seed() { | ||
| return radio.random(0x7FFFFFFF); | ||
| } | ||
|
|
||
| void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { | ||
| radio.setFrequency(freq); | ||
| radio.setSpreadingFactor(sf); | ||
| radio.setBandwidth(bw); | ||
| radio.setCodingRate(cr); | ||
| } | ||
|
|
||
| void radio_set_tx_power(uint8_t dbm) { | ||
| radio.setOutputPower(dbm); | ||
| } | ||
|
|
||
| mesh::LocalIdentity radio_new_identity() { | ||
| RadioNoiseListener rng(radio); | ||
| return mesh::LocalIdentity(&rng); // create new random identity | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,27 @@ | ||
| #pragma once | ||
|
|
||
| #define RADIOLIB_STATIC_ONLY 1 | ||
| #include <RadioLib.h> | ||
| #include <helpers/radiolib/RadioLibWrappers.h> | ||
| #include <RAK11200Board.h> | ||
| #include <helpers/radiolib/CustomSX1262Wrapper.h> | ||
| #include <helpers/AutoDiscoverRTCClock.h> | ||
| #include <helpers/sensors/EnvironmentSensorManager.h> | ||
|
|
||
| #ifdef DISPLAY_CLASS | ||
| #include <helpers/ui/NullDisplayDriver.h> | ||
| extern DISPLAY_CLASS display; | ||
| #include <helpers/ui/MomentaryButton.h> | ||
| extern MomentaryButton user_btn; | ||
| #endif | ||
|
|
||
| extern RAK11200Board board; | ||
| extern WRAPPER_CLASS radio_driver; | ||
| extern AutoDiscoverRTCClock rtc_clock; | ||
| extern EnvironmentSensorManager sensors; | ||
|
|
||
| bool radio_init(); | ||
| uint32_t radio_get_rng_seed(); | ||
| void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); | ||
| void radio_set_tx_power(uint8_t dbm); | ||
| mesh::LocalIdentity radio_new_identity(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The RAK11200 module does not have Ethernet capability. The connectivity list incorrectly includes "ethernet" alongside wifi, bluetooth, and CAN. According to the RAK11200 datasheet, it only supports WiFi 2.4GHz (802.11b/g/n) and Bluetooth 5.0. Please remove "ethernet" from the connectivity array.