Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 39 additions & 0 deletions boards/wiscore_rak11200.json
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",
Copy link

Copilot AI Jan 21, 2026

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.

Suggested change
"ethernet",

Copilot uses AI. Check for mistakes.
"can"
Comment on lines +17 to +18
Copy link

Copilot AI Jan 21, 2026

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 CAN (Controller Area Network) capability. The connectivity list incorrectly includes "can" alongside wifi and bluetooth. According to the RAK11200 datasheet, it only supports WiFi 2.4GHz (802.11b/g/n) and Bluetooth 5.0. Please remove "can" from the connectivity array.

Suggested change
"ethernet",
"can"
"ethernet"

Copilot uses AI. Check for mistakes.
],
"frameworks": [
"arduino",
"espidf"
],
"name": "WisCore RAK11200 Board",
"upload": {
"flash_size": "4MB",
"maximum_ram_size": 327680,
"maximum_size": 4194304,
"protocols": [
"esptool",
"espota",
"ftdi"
],
"require_upload_port": true,
"speed": 460800
},
"url": "https://www.rakwireless.com",
"vendor": "RAKwireless"
}
36 changes: 36 additions & 0 deletions variants/rak11200/RAK11200Board.cpp
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
Copy link

Copilot AI Jan 21, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The RAK11200Board::begin() method is missing a call to Wire.begin(). While ESP32Board::begin() already calls Wire.begin() with PIN_BOARD_SDA and PIN_BOARD_SCL, this board class doesn't call the parent begin() method. Without calling ESP32Board::begin(), the I2C bus will not be initialized, which explains the I2C errors mentioned in the PR description. Add ESP32Board::begin() as the first line of this method.

Copilot uses AI. Check for mistakes.

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";
}
25 changes: 25 additions & 0 deletions variants/rak11200/RAK11200Board.h
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
Copy link

Copilot AI Jan 21, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P_LORA_BUSY is redefined here as GPIO13, which conflicts with the definition in variant.h (line 28) where it's set to RADIOLIB_NC. The RAK11200Board.h definition should be removed or both files need to be aligned. According to the RAK13300 module documentation, if BUSY is connected, it should be on WB_IO5 (GPIO13), but variant.h indicates it's not connected (RADIOLIB_NC). Please clarify the actual hardware configuration and make these definitions consistent.

Suggested change
#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 uses AI. Check for mistakes.
#define P_LORA_SCLK 33 // GPIO33 (ESP32 pin 9 -> SPI_SCK)
#define P_LORA_MISO 35 // GPIO35 (ESP32 pin 7 -> SPI_MISO)
#define P_LORA_MOSI 25 // GPIO25 (ESP32 pin 10 -> SPI_MOSI)
#define SX126X_POWER_EN 27 // GPIO27 (ESP32 pin 12 -> IO2)
#define PIN_VBAT_READ 36 // WB_A0 for battery reading
#define ADC_MULTIPLIER (3 * 1.73 * 1.110 * 1000)
Copy link

Copilot AI Jan 21, 2026

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.

Suggested change
#define ADC_MULTIPLIER (3 * 1.73 * 1.110 * 1000)
#define ADC_MULTIPLIER 1.85f

Copilot uses AI. Check for mistakes.

class RAK11200Board : public ESP32Board {

public:
void begin();
uint16_t getBattMilliVolts() override;
const char* getManufacturerName() const override;

};
50 changes: 50 additions & 0 deletions variants/rak11200/pins_arduino.h
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 */
147 changes: 147 additions & 0 deletions variants/rak11200/platformio.ini
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}
63 changes: 63 additions & 0 deletions variants/rak11200/target.cpp
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
}
27 changes: 27 additions & 0 deletions variants/rak11200/target.h
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();
Loading
Loading