diff --git a/boards/wiscore_rak11200.json b/boards/wiscore_rak11200.json new file mode 100644 index 0000000000..63f050f80a --- /dev/null +++ b/boards/wiscore_rak11200.json @@ -0,0 +1,37 @@ +{ + "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" + ], + "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" +} diff --git a/variants/rak11200/RAK11200Board.cpp b/variants/rak11200/RAK11200Board.cpp new file mode 100644 index 0000000000..20b3a3c46a --- /dev/null +++ b/variants/rak11200/RAK11200Board.cpp @@ -0,0 +1,23 @@ +#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 +} + +const char* RAK11200Board::getManufacturerName() const { + return "RAK 11200"; +} diff --git a/variants/rak11200/RAK11200Board.h b/variants/rak11200/RAK11200Board.h new file mode 100644 index 0000000000..ecd00fba92 --- /dev/null +++ b/variants/rak11200/RAK11200Board.h @@ -0,0 +1,23 @@ +#pragma once + +#include +#include + +// 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) +#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 + +class RAK11200Board : public ESP32Board { + +public: + void begin(); + const char* getManufacturerName() const override; + +}; diff --git a/variants/rak11200/pins_arduino.h b/variants/rak11200/pins_arduino.h new file mode 100644 index 0000000000..7d609d91b0 --- /dev/null +++ b/variants/rak11200/pins_arduino.h @@ -0,0 +1,50 @@ +#ifndef Pins_Arduino_h +#define Pins_Arduino_h + +#ifndef _VARIANT_RAK11200_ +#define _VARIANT_RAK11200_ +#endif + +#include + +#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 */ diff --git a/variants/rak11200/platformio.ini b/variants/rak11200/platformio.ini new file mode 100644 index 0000000000..b362d6c611 --- /dev/null +++ b/variants/rak11200/platformio.ini @@ -0,0 +1,169 @@ +[rak11200] +extends = esp32_base +board = wiscore_rak11200 +board_build.partitions = min_spiffs.csv ; get around 4mb flash limit +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=21 + -D PIN_GPS_RX=19 + -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> + + + + + + +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} + + + +<../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_wifi] +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 WIFI_DEBUG_LOGGING=1 + -D WIFI_SSID='"myssid"' + -D WIFI_PWD='"mypwd"' + -D OFFLINE_QUEUE_SIZE=256 +; 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_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} diff --git a/variants/rak11200/target.cpp b/variants/rak11200/target.cpp new file mode 100644 index 0000000000..c3663d78a2 --- /dev/null +++ b/variants/rak11200/target.cpp @@ -0,0 +1,68 @@ +#include +#include "target.h" +#include + +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 + +#if defined(P_LORA_SCLK) + static SPIClass spi; + RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY, spi); +#else + RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY); +#endif + +WRAPPER_CLASS radio_driver(radio, board); + +VolatileRTCClock fallback_clock; +AutoDiscoverRTCClock rtc_clock(fallback_clock); + +#if ENV_INCLUDE_GPS + #include + 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(int8_t dbm) { + radio.setOutputPower(dbm); +} + +mesh::LocalIdentity radio_new_identity() { + RadioNoiseListener rng(radio); + return mesh::LocalIdentity(&rng); // create new random identity +} diff --git a/variants/rak11200/target.h b/variants/rak11200/target.h new file mode 100644 index 0000000000..4e3b952425 --- /dev/null +++ b/variants/rak11200/target.h @@ -0,0 +1,27 @@ +#pragma once + +#define RADIOLIB_STATIC_ONLY 1 +#include +#include +#include +#include +#include +#include + +#ifdef DISPLAY_CLASS + #include + extern DISPLAY_CLASS display; + #include + 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(int8_t dbm); +mesh::LocalIdentity radio_new_identity(); diff --git a/variants/rak11200/variant.h b/variants/rak11200/variant.h new file mode 100644 index 0000000000..b7cdb303cc --- /dev/null +++ b/variants/rak11200/variant.h @@ -0,0 +1,26 @@ +#pragma once + +// RAK11200 WisBlock ESP32 Pin Definitions +// Reference: https://docs.rakwireless.com/Product-Categories/WisBlock/RAK11200/Datasheet/ +// Reference: https://docs.rakwireless.com/Product-Categories/WisBlock/RAK13300/Datasheet/ + +// I2C Interface (I2C1 on WisBlock connector pins 19/20) +#define I2C_SDA 4 // GPIO4 +#define I2C_SCL 5 // GPIO5 + +// GPS Interface (UART1) +#define GPS_TX_PIN 21 +#define GPS_RX_PIN 19 +#define PIN_GPS_EN -1 +#define GPS_BAUD_RATE 9600 + +// User Interface +#define BUTTON_PIN 34 // WB_SW1 - User button +#define BATTERY_PIN 36 // WB_A0 - Battery voltage measurement pin +#define ADC_CHANNEL ADC1_GPIO36_CHANNEL +#define LED_PIN 12 // WB_LED1 - Status LED +#define LED_PIN_2 2 // WB_LED2 - Secondary LED + +// Board identification +#define RAK_11200 +#define RAK_BOARD