mirror of https://github.com/meshcore-dev/MeshCore
committed by
GitHub
92 changed files with 3339 additions and 393 deletions
@ -0,0 +1,74 @@ |
|||
{ |
|||
"build": { |
|||
"arduino": { |
|||
"ldscript": "nrf52840_s140_v6.ld" |
|||
}, |
|||
"core": "nRF5", |
|||
"cpu": "cortex-m4", |
|||
"extra_flags": "-DARDUINO_NRF52840_FEATHER -DNRF52840_XXAA", |
|||
"f_cpu": "64000000L", |
|||
"hwids": [ |
|||
[ |
|||
"0x239A", |
|||
"0x8029" |
|||
], |
|||
[ |
|||
"0x239A", |
|||
"0x0029" |
|||
], |
|||
[ |
|||
"0x239A", |
|||
"0x002A" |
|||
], |
|||
[ |
|||
"0x239A", |
|||
"0x802A" |
|||
] |
|||
], |
|||
"usb_product": "Meshtiny", |
|||
"mcu": "nrf52840", |
|||
"variant": "meshtiny", |
|||
"bsp": { |
|||
"name": "adafruit" |
|||
}, |
|||
"softdevice": { |
|||
"sd_flags": "-DS140", |
|||
"sd_name": "s140", |
|||
"sd_version": "6.1.1", |
|||
"sd_fwid": "0x00B6" |
|||
}, |
|||
"bootloader": { |
|||
"settings_addr": "0xFF000" |
|||
} |
|||
}, |
|||
"connectivity": [ |
|||
"bluetooth" |
|||
], |
|||
"debug": { |
|||
"jlink_device": "nRF52840_xxAA", |
|||
"svd_path": "nrf52840.svd", |
|||
"openocd_target": "nrf52840-mdk-rs" |
|||
}, |
|||
"frameworks": [ |
|||
"arduino", |
|||
"freertos" |
|||
], |
|||
"name": "Meshtiny", |
|||
"upload": { |
|||
"maximum_ram_size": 248832, |
|||
"maximum_size": 815104, |
|||
"speed": 115200, |
|||
"protocol": "nrfutil", |
|||
"protocols": [ |
|||
"jlink", |
|||
"nrfjprog", |
|||
"nrfutil", |
|||
"stlink" |
|||
], |
|||
"use_1200bps_touch": true, |
|||
"require_upload_port": true, |
|||
"wait_for_upload_port": true |
|||
}, |
|||
"url": "https://shop.mtoolstec.com/product/meshtiny", |
|||
"vendor": "MTools Tec" |
|||
} |
|||
@ -0,0 +1,72 @@ |
|||
{ |
|||
"build": { |
|||
"arduino": { |
|||
"ldscript": "nrf52840_s140_v6.ld" |
|||
}, |
|||
"core": "nRF5", |
|||
"cpu": "cortex-m4", |
|||
"extra_flags": "-DARDUINO_NRF52840_FEATHER -DNRF52840_XXAA", |
|||
"f_cpu": "64000000L", |
|||
"hwids": [ |
|||
[ |
|||
"0x239A", |
|||
"0x8029" |
|||
], |
|||
[ |
|||
"0x239A", |
|||
"0x0029" |
|||
], |
|||
[ |
|||
"0x239A", |
|||
"0x002A" |
|||
], |
|||
[ |
|||
"0x239A", |
|||
"0x802A" |
|||
] |
|||
], |
|||
"usb_product": "WisCore RAK3401 Board", |
|||
"mcu": "nrf52840", |
|||
"variant": "WisCore_RAK3401_Board", |
|||
"bsp": { |
|||
"name": "adafruit" |
|||
}, |
|||
"softdevice": { |
|||
"sd_flags": "-DS140", |
|||
"sd_name": "s140", |
|||
"sd_version": "6.1.1", |
|||
"sd_fwid": "0x00B6" |
|||
}, |
|||
"bootloader": { |
|||
"settings_addr": "0xFF000" |
|||
} |
|||
}, |
|||
"connectivity": [ |
|||
"bluetooth" |
|||
], |
|||
"debug": { |
|||
"jlink_device": "nRF52840_xxAA", |
|||
"svd_path": "nrf52840.svd" |
|||
}, |
|||
"frameworks": [ |
|||
"arduino" |
|||
], |
|||
"name": "WisCore RAK3401 Board", |
|||
"upload": { |
|||
"maximum_ram_size": 248832, |
|||
"maximum_size": 815104, |
|||
"speed": 115200, |
|||
"protocol": "nrfutil", |
|||
"protocols": [ |
|||
"jlink", |
|||
"nrfjprog", |
|||
"nrfutil", |
|||
"stlink" |
|||
], |
|||
"use_1200bps_touch": true, |
|||
"require_upload_port": true, |
|||
"wait_for_upload_port": true |
|||
}, |
|||
"url": "https://www.rakwireless.com", |
|||
"vendor": "RAKwireless" |
|||
} |
|||
@ -0,0 +1,213 @@ |
|||
# nRF52 Power Management |
|||
|
|||
## Overview |
|||
|
|||
The nRF52 Power Management module provides battery protection features to prevent over-discharge, minimise likelihood of brownout and flash corruption conditions existing, and enable safe voltage-based recovery. |
|||
|
|||
## Features |
|||
|
|||
### Boot Voltage Protection |
|||
- Checks battery voltage immediately after boot and before mesh operations commence |
|||
- If voltage is below a configurable threshold (e.g., 3300mV), the device configures voltage wake (LPCOMP + VBUS) and enters protective shutdown (SYSTEMOFF) |
|||
- Prevents boot loops when battery is critically low |
|||
- Skipped when external power (USB VBUS) is detected |
|||
|
|||
### Voltage Wake (LPCOMP + VBUS) |
|||
- Configures the nRF52's Low Power Comparator (LPCOMP) before entering SYSTEMOFF |
|||
- Enables USB VBUS detection so external power can wake the device |
|||
- Device automatically wakes when battery voltage rises above recovery threshold or when VBUS is detected |
|||
|
|||
### Early Boot Register Capture |
|||
- Captures RESETREAS (reset reason) and GPREGRET2 (shutdown reason) before SystemInit() clears them |
|||
- Allows firmware to determine why it booted (cold boot, watchdog, LPCOMP wake, etc.) |
|||
- Allows firmware to determine why it last shut down (user request, low voltage, boot protection) |
|||
|
|||
### Shutdown Reason Tracking |
|||
Shutdown reason codes (stored in GPREGRET2): |
|||
| Code | Name | Description | |
|||
|------|------|-------------| |
|||
| 0x00 | NONE | Normal boot / no previous shutdown | |
|||
| 0x4C | LOW_VOLTAGE | Runtime low voltage threshold reached | |
|||
| 0x55 | USER | User requested powerOff() | |
|||
| 0x42 | BOOT_PROTECT | Boot voltage protection triggered | |
|||
|
|||
## Supported Boards |
|||
|
|||
| Board | Implemented | LPCOMP wake | VBUS wake | |
|||
|-------|-------------|-------------|-----------| |
|||
| Seeed Studio XIAO nRF52840 (`xiao_nrf52`) | Yes | Yes | Yes | |
|||
| RAK4631 (`rak4631`) | Yes | Yes | Yes | |
|||
| Heltec T114 (`heltec_t114`) | Yes | Yes | Yes | |
|||
| Promicro nRF52840 | No | No | No | |
|||
| RAK WisMesh Tag | No | No | No | |
|||
| Heltec Mesh Solar | No | No | No | |
|||
| LilyGo T-Echo / T-Echo Lite | No | No | No | |
|||
| SenseCAP Solar | No | No | No | |
|||
| WIO Tracker L1 / L1 E-Ink | No | No | No | |
|||
| WIO WM1110 | No | No | No | |
|||
| Mesh Pocket | No | No | No | |
|||
| Nano G2 Ultra | No | No | No | |
|||
| ThinkNode M1/M3/M6 | No | No | No | |
|||
| T1000-E | No | No | No | |
|||
| Ikoka Nano/Stick/Handheld (nRF) | No | No | No | |
|||
| Keepteen LT1 | No | No | No | |
|||
| Minewsemi ME25LS01 | No | No | No | |
|||
|
|||
Notes: |
|||
- "Implemented" reflects Phase 1 (boot lockout + shutdown reason capture). |
|||
- User power-off on Heltec T114 does not enable LPCOMP wake. |
|||
- VBUS detection is used to skip boot lockout on external power, and VBUS wake is configured alongside LPCOMP when supported hardware exposes VBUS to the nRF52. |
|||
|
|||
## Technical Details |
|||
|
|||
### Architecture |
|||
|
|||
The power management functionality is integrated into the `NRF52Board` base class in `src/helpers/NRF52Board.cpp`. Board variants provide hardware-specific configuration via a `PowerMgtConfig` struct and override `initiateShutdown(uint8_t reason)` to perform board-specific power-down work and conditionally enable voltage wake (LPCOMP + VBUS). |
|||
|
|||
### Early Boot Capture |
|||
|
|||
A static constructor with priority 101 in `NRF52Board.cpp` captures the RESETREAS and GPREGRET2 registers before: |
|||
- SystemInit() (priority 102) - which clears RESETREAS |
|||
- Static C++ constructors (default priority 65535) |
|||
|
|||
This ensures we capture the true reset reason before any initialisation code runs. |
|||
|
|||
### Board Implementation |
|||
|
|||
To enable power management on a board variant: |
|||
|
|||
1. **Enable in platformio.ini**: |
|||
```ini |
|||
-D NRF52_POWER_MANAGEMENT |
|||
``` |
|||
|
|||
2. **Define configuration in variant.h**: |
|||
```c |
|||
#define PWRMGT_VOLTAGE_BOOTLOCK 3300 // Won't boot below this voltage (mV) |
|||
#define PWRMGT_LPCOMP_AIN 7 // AIN channel for voltage sensing |
|||
#define PWRMGT_LPCOMP_REFSEL 2 // REFSEL (0-6=1/8..7/8, 7=ARef, 8-15=1/16..15/16) |
|||
``` |
|||
|
|||
3. **Implement in board .cpp file**: |
|||
```cpp |
|||
#ifdef NRF52_POWER_MANAGEMENT |
|||
const PowerMgtConfig power_config = { |
|||
.lpcomp_ain_channel = PWRMGT_LPCOMP_AIN, |
|||
.lpcomp_refsel = PWRMGT_LPCOMP_REFSEL, |
|||
.voltage_bootlock = PWRMGT_VOLTAGE_BOOTLOCK |
|||
}; |
|||
|
|||
void MyBoard::initiateShutdown(uint8_t reason) { |
|||
// Board-specific shutdown preparation (e.g., disable peripherals) |
|||
bool enable_lpcomp = (reason == SHUTDOWN_REASON_LOW_VOLTAGE || |
|||
reason == SHUTDOWN_REASON_BOOT_PROTECT); |
|||
|
|||
if (enable_lpcomp) { |
|||
configureVoltageWake(power_config.lpcomp_ain_channel, power_config.lpcomp_refsel); |
|||
} |
|||
|
|||
enterSystemOff(reason); |
|||
} |
|||
#endif |
|||
|
|||
void MyBoard::begin() { |
|||
NRF52Board::begin(); // or NRF52BoardDCDC::begin() |
|||
// ... board setup ... |
|||
|
|||
#ifdef NRF52_POWER_MANAGEMENT |
|||
checkBootVoltage(&power_config); |
|||
#endif |
|||
} |
|||
``` |
|||
|
|||
For user-initiated shutdowns, `powerOff()` remains board-specific. Power management only arms LPCOMP for automated shutdown reasons (boot protection/low voltage). |
|||
|
|||
4. **Declare override in board .h file**: |
|||
```cpp |
|||
#ifdef NRF52_POWER_MANAGEMENT |
|||
void initiateShutdown(uint8_t reason) override; |
|||
#endif |
|||
``` |
|||
|
|||
### Voltage Wake Configuration |
|||
|
|||
The LPCOMP (Low Power Comparator) is configured to: |
|||
- Monitor the specified AIN channel (0-7 corresponding to P0.02-P0.05, P0.28-P0.31) |
|||
- Compare against VDD fraction reference (REFSEL: 0-6=1/8..7/8, 7=ARef, 8-15=1/16..15/16) |
|||
- Detect UP events (voltage rising above threshold) |
|||
- Use 50mV hysteresis for noise immunity |
|||
- Wake the device from SYSTEMOFF when triggered |
|||
|
|||
VBUS wake is enabled via the POWER peripheral USBDETECTED event whenever `configureVoltageWake()` is used. This requires USB VBUS to be routed to the nRF52 (typical on nRF52840 boards with native USB). |
|||
|
|||
**LPCOMP Reference Selection (PWRMGT_LPCOMP_REFSEL)**: |
|||
| REFSEL | Fraction | VBAT @ 1M/1M divider (VDD=3.0-3.3) | VBAT @ 1.5M/1M divider (VDD=3.0-3.3) | |
|||
|--------|----------|------------------------------------|--------------------------------------| |
|||
| 0 | 1/8 | 0.75-0.82 V | 0.94-1.03 V | |
|||
| 1 | 2/8 | 1.50-1.65 V | 1.88-2.06 V | |
|||
| 2 | 3/8 | 2.25-2.47 V | 2.81-3.09 V | |
|||
| 3 | 4/8 | 3.00-3.30 V | 3.75-4.12 V | |
|||
| 4 | 5/8 | 3.75-4.12 V | 4.69-5.16 V | |
|||
| 5 | 6/8 | 4.50-4.95 V | 5.62-6.19 V | |
|||
| 6 | 7/8 | 5.25-5.77 V | 6.56-7.22 V | |
|||
| 7 | ARef | - | - | |
|||
| 8 | 1/16 | 0.38-0.41 V | 0.47-0.52 V | |
|||
| 9 | 3/16 | 1.12-1.24 V | 1.41-1.55 V | |
|||
| 10 | 5/16 | 1.88-2.06 V | 2.34-2.58 V | |
|||
| 11 | 7/16 | 2.62-2.89 V | 3.28-3.61 V | |
|||
| 12 | 9/16 | 3.38-3.71 V | 4.22-4.64 V | |
|||
| 13 | 11/16 | 4.12-4.54 V | 5.16-5.67 V | |
|||
| 14 | 13/16 | 4.88-5.36 V | 6.09-6.70 V | |
|||
| 15 | 15/16 | 5.62-6.19 V | 7.03-7.73 V | |
|||
|
|||
**Important**: For boards with a voltage divider on the battery sense pin, LPCOMP measures the divided voltage. Use: |
|||
`VBAT_threshold ≈ (VDD * fraction) * divider_scale`, where `divider_scale = (Rtop + Rbottom) / Rbottom` (e.g., 2.0 for 1M/1M, 2.5 for 1.5M/1M, 3.0 for XIAO). |
|||
|
|||
### SoftDevice Compatibility |
|||
|
|||
The power management code checks whether SoftDevice is enabled and uses the appropriate API: |
|||
- When SD enabled: `sd_power_*` functions |
|||
- When SD disabled: Direct register access (NRF_POWER->*) |
|||
|
|||
This ensures compatibility regardless of BLE stack state. |
|||
|
|||
## CLI Commands |
|||
|
|||
Power management status can be queried via the CLI: |
|||
|
|||
| Command | Description | |
|||
|---------|-------------| |
|||
| `get pwrmgt.support` | Returns "supported" or "unsupported" | |
|||
| `get pwrmgt.source` | Returns current power source - "battery" or "external" (5V/USB power) | |
|||
| `get pwrmgt.bootreason` | Returns reset and shutdown reason strings | |
|||
| `get pwrmgt.bootmv` | Returns boot voltage in millivolts | |
|||
|
|||
On boards without power management enabled, all commands except `get pwrmgt.support` return: |
|||
``` |
|||
ERROR: Power management not supported |
|||
``` |
|||
|
|||
## Debug Output |
|||
|
|||
When `MESH_DEBUG=1` is enabled, the power management module outputs: |
|||
``` |
|||
DEBUG: PWRMGT: Reset = Wake from LPCOMP (0x20000); Shutdown = Low Voltage (0x4C) |
|||
DEBUG: PWRMGT: Boot voltage = 3450 mV (threshold = 3300 mV) |
|||
DEBUG: PWRMGT: LPCOMP wake configured (AIN7, ref=3/8 VDD) |
|||
``` |
|||
|
|||
## Phase 2 (Planned) |
|||
|
|||
- Runtime voltage monitoring |
|||
- Voltage state machine (Normal -> Warning -> Critical -> Shutdown) |
|||
- Configurable thresholds |
|||
- Load shedding callbacks for power reduction |
|||
- Deep sleep integration |
|||
- Scheduled wake-up |
|||
- Extended sleep with periodic monitoring |
|||
|
|||
## References |
|||
|
|||
- [nRF52840 Product Specification - POWER](https://infocenter.nordicsemi.com/topic/ps_nrf52840/power.html) |
|||
- [nRF52840 Product Specification - LPCOMP](https://infocenter.nordicsemi.com/topic/ps_nrf52840/lpcomp.html) |
|||
- [SoftDevice S140 API - Power Management](https://infocenter.nordicsemi.com/topic/sdk_nrf5_v17.1.0/group__nrf__sdm__api.html) |
|||
@ -0,0 +1,44 @@ |
|||
#include "MeshtinyBoard.h" |
|||
|
|||
#include <Arduino.h> |
|||
#include <Wire.h> |
|||
#include <bluefruit.h> |
|||
|
|||
static BLEDfu bledfu; |
|||
|
|||
static void connect_callback(uint16_t conn_handle) { |
|||
(void)conn_handle; |
|||
MESH_DEBUG_PRINTLN("BLE client connected"); |
|||
} |
|||
|
|||
static void disconnect_callback(uint16_t conn_handle, uint8_t reason) { |
|||
(void)conn_handle; |
|||
(void)reason; |
|||
|
|||
MESH_DEBUG_PRINTLN("BLE client disconnected"); |
|||
} |
|||
|
|||
void MeshtinyBoard::begin() { |
|||
NRF52BoardDCDC::begin(); |
|||
btn_prev_state = HIGH; |
|||
|
|||
pinMode(PIN_VBAT_READ, INPUT); // VBAT ADC input
|
|||
|
|||
// Set all button pins to INPUT_PULLUP
|
|||
pinMode(PIN_BUTTON1, INPUT_PULLUP); |
|||
pinMode(PIN_BUTTON2, INPUT_PULLUP); |
|||
pinMode(PIN_BUTTON3, INPUT_PULLUP); |
|||
pinMode(PIN_BUTTON4, INPUT_PULLUP); |
|||
|
|||
#if defined(PIN_WIRE_SDA) && defined(PIN_WIRE_SCL) |
|||
Wire.setPins(PIN_WIRE_SDA, PIN_WIRE_SCL); |
|||
#endif |
|||
|
|||
Wire.begin(); |
|||
|
|||
pinMode(SX126X_POWER_EN, OUTPUT); |
|||
digitalWrite(SX126X_POWER_EN, HIGH); |
|||
delay(10); // give sx1262 some time to power up
|
|||
} |
|||
|
|||
|
|||
@ -0,0 +1,66 @@ |
|||
#pragma once |
|||
|
|||
#include <Arduino.h> |
|||
#include <MeshCore.h> |
|||
#include <helpers/NRF52Board.h> |
|||
|
|||
class MeshtinyBoard : public NRF52BoardDCDC, public NRF52BoardOTA { |
|||
protected: |
|||
uint8_t btn_prev_state; |
|||
|
|||
public: |
|||
MeshtinyBoard() : NRF52BoardOTA("Meshtiny OTA") {} |
|||
void begin(); |
|||
|
|||
#if defined(P_LORA_TX_LED) |
|||
void onBeforeTransmit() override { |
|||
digitalWrite(P_LORA_TX_LED, HIGH); // turn TX LED on
|
|||
} |
|||
void onAfterTransmit() override { |
|||
digitalWrite(P_LORA_TX_LED, LOW); // turn TX LED off
|
|||
} |
|||
#endif |
|||
|
|||
uint16_t getBattMilliVolts() override { |
|||
int adcvalue = 0; |
|||
analogReadResolution(12); |
|||
analogReference(AR_INTERNAL_3_0); |
|||
delay(10); |
|||
adcvalue = analogRead(PIN_VBAT_READ); |
|||
return (adcvalue * ADC_MULTIPLIER * AREF_VOLTAGE) / 4.096; |
|||
} |
|||
|
|||
const char *getManufacturerName() const override { return "Meshtiny"; } |
|||
|
|||
void reboot() override { NVIC_SystemReset(); } |
|||
|
|||
void powerOff() override { |
|||
|
|||
#ifdef PIN_USER_BTN |
|||
while (digitalRead(PIN_USER_BTN) == LOW) { |
|||
delay(10); |
|||
} |
|||
#endif |
|||
|
|||
#ifdef PIN_3V3_EN |
|||
pinMode(PIN_3V3_EN, OUTPUT); |
|||
digitalWrite(PIN_3V3_EN, LOW); |
|||
#endif |
|||
|
|||
|
|||
#ifdef PIN_LED1 |
|||
digitalWrite(PIN_LED1, LOW); |
|||
#endif |
|||
|
|||
#ifdef PIN_LED2 |
|||
digitalWrite(PIN_LED2, LOW); |
|||
#endif |
|||
|
|||
#ifdef PIN_USER_BTN |
|||
nrf_gpio_cfg_sense_input(g_ADigitalPinMap[PIN_USER_BTN], NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_SENSE_LOW); |
|||
#endif |
|||
|
|||
sd_power_system_off(); |
|||
} |
|||
|
|||
}; |
|||
@ -0,0 +1,68 @@ |
|||
[Meshtiny] |
|||
extends = nrf52_base |
|||
board = meshtiny |
|||
board_build.ldscript = boards/nrf52840_s140_v6.ld |
|||
build_flags = ${nrf52_base.build_flags} |
|||
-I lib/nrf52/s140_nrf52_6.1.1_API/include |
|||
-I lib/nrf52/s140_nrf52_6.1.1_API/include/nrf52 |
|||
-I variants/meshtiny |
|||
-D RADIO_CLASS=CustomSX1262 |
|||
-D WRAPPER_CLASS=CustomSX1262Wrapper |
|||
-D LORA_TX_POWER=22 |
|||
-D SX126X_CURRENT_LIMIT=140 |
|||
-D SX126X_RX_BOOSTED_GAIN=1 |
|||
-D PIN_3V3_EN=34 |
|||
-D MESHTINY |
|||
-D UI_HAS_JOYSTICK |
|||
build_src_filter = ${nrf52_base.build_src_filter} |
|||
+<../variants/meshtiny> |
|||
+<helpers/ui/SSD1306Display.cpp> |
|||
+<helpers/ui/buzzer.cpp> |
|||
+<helpers/sensors> |
|||
lib_deps = |
|||
${nrf52_base.lib_deps} |
|||
adafruit/Adafruit SSD1306 @ ^2.5.13 |
|||
end2endzone/NonBlockingRTTTL@^1.3.0 |
|||
|
|||
[env:Meshtiny_companion_radio_usb] |
|||
extends = Meshtiny |
|||
build_flags = |
|||
${Meshtiny.build_flags} |
|||
-I examples/companion_radio/ui-new |
|||
-D MESHTINY |
|||
-D PIN_BUZZER=30 |
|||
-D DISPLAY_CLASS=SSD1306Display |
|||
-D MAX_CONTACTS=350 |
|||
-D MAX_GROUP_CHANNELS=40 |
|||
-D OFFLINE_QUEUE_SIZE=256 |
|||
; -D MESH_PACKET_LOGGING=1 |
|||
; -D MESH_DEBUG=1 |
|||
build_src_filter = ${Meshtiny.build_src_filter} |
|||
+<../examples/companion_radio/*.cpp> |
|||
+<../examples/companion_radio/ui-new/*.cpp> |
|||
lib_deps = |
|||
${Meshtiny.lib_deps} |
|||
densaugeo/base64 @ ~1.4.0 |
|||
|
|||
[env:Meshtiny_companion_radio_ble] |
|||
extends = Meshtiny |
|||
build_flags = |
|||
${Meshtiny.build_flags} |
|||
-I examples/companion_radio/ui-new |
|||
-D MESHTINY |
|||
-D PIN_BUZZER=30 |
|||
-D DISPLAY_CLASS=SSD1306Display |
|||
-D MAX_CONTACTS=350 |
|||
-D MAX_GROUP_CHANNELS=40 |
|||
-D BLE_PIN_CODE=123456 |
|||
-D OFFLINE_QUEUE_SIZE=256 |
|||
; -D MESH_PACKET_LOGGING=1 |
|||
; -D MESH_DEBUG=1 |
|||
; -D BLE_DEBUG_LOGGING=1 |
|||
build_src_filter = ${Meshtiny.build_src_filter} |
|||
+<helpers/nrf52/SerialBLEInterface.cpp> |
|||
+<../examples/companion_radio/*.cpp> |
|||
+<../examples/companion_radio/ui-new/*.cpp> |
|||
lib_deps = |
|||
${Meshtiny.lib_deps} |
|||
densaugeo/base64 @ ~1.4.0 |
|||
@ -0,0 +1,47 @@ |
|||
#include "target.h" |
|||
|
|||
#include <Arduino.h> |
|||
#include <helpers/ArduinoHelpers.h> |
|||
|
|||
MeshtinyBoard board; |
|||
|
|||
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); |
|||
EnvironmentSensorManager sensors = EnvironmentSensorManager(); |
|||
|
|||
#ifdef DISPLAY_CLASS |
|||
DISPLAY_CLASS display; |
|||
MomentaryButton user_btn(ENCODER_PRESS, 1000, true, true); |
|||
MomentaryButton joystick_left(ENCODER_LEFT, 1000, true, true); |
|||
MomentaryButton joystick_right(ENCODER_RIGHT, 1000, true, true); |
|||
MomentaryButton back_btn(PIN_SIDE_BUTTON, 1000, true, true); |
|||
#endif |
|||
|
|||
bool radio_init() { |
|||
rtc_clock.begin(Wire); |
|||
return radio.std_init(&SPI); |
|||
} |
|||
|
|||
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
|
|||
} |
|||
@ -0,0 +1,33 @@ |
|||
#pragma once |
|||
|
|||
#define RADIOLIB_STATIC_ONLY 1 |
|||
#include <MeshtinyBoard.h> |
|||
#include <RadioLib.h> |
|||
#include <helpers/ArduinoHelpers.h> |
|||
#include <helpers/AutoDiscoverRTCClock.h> |
|||
#include <helpers/radiolib/CustomSX1262Wrapper.h> |
|||
#include <helpers/radiolib/RadioLibWrappers.h> |
|||
#ifdef DISPLAY_CLASS |
|||
#include <helpers/ui/MomentaryButton.h> |
|||
#include <helpers/ui/SSD1306Display.h> |
|||
#endif |
|||
#include <helpers/sensors/EnvironmentSensorManager.h> |
|||
|
|||
extern MeshtinyBoard board; |
|||
extern WRAPPER_CLASS radio_driver; |
|||
extern AutoDiscoverRTCClock rtc_clock; |
|||
extern EnvironmentSensorManager sensors; |
|||
|
|||
#ifdef DISPLAY_CLASS |
|||
extern DISPLAY_CLASS display; |
|||
extern MomentaryButton user_btn; |
|||
extern MomentaryButton joystick_left; |
|||
extern MomentaryButton joystick_right; |
|||
extern MomentaryButton back_btn; |
|||
#endif |
|||
|
|||
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(); |
|||
@ -0,0 +1,51 @@ |
|||
/*
|
|||
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() { |
|||
// LED1 & LED2
|
|||
#ifdef PIN_LED1 |
|||
pinMode(PIN_LED1, OUTPUT); |
|||
ledOff(PIN_LED1); |
|||
#endif |
|||
|
|||
#ifdef PIN_LED2 |
|||
pinMode(PIN_LED2, OUTPUT); |
|||
ledOff(PIN_LED2); |
|||
#endif |
|||
|
|||
// 3V3 Power Rail - nothing connected on meshtiny
|
|||
pinMode(PIN_3V3_EN, OUTPUT); |
|||
digitalWrite(PIN_3V3_EN, LOW); |
|||
} |
|||
@ -0,0 +1,98 @@ |
|||
#ifndef _MESHTINY_H_ |
|||
#define _MESHTINY_H_ |
|||
|
|||
/** Master clock frequency */ |
|||
#define VARIANT_MCK (64000000ul) |
|||
|
|||
#define USE_LFXO // Board uses 32khz crystal for LF
|
|||
|
|||
/*----------------------------------------------------------------------------
|
|||
* Headers |
|||
*----------------------------------------------------------------------------*/ |
|||
|
|||
#include "WVariant.h" |
|||
|
|||
#define PINS_COUNT (48) |
|||
#define NUM_DIGITAL_PINS (48) |
|||
#define NUM_ANALOG_INPUTS (6) |
|||
#define NUM_ANALOG_OUTPUTS (0) |
|||
|
|||
// LEDs
|
|||
#define PIN_LED1 (35) // Green LED
|
|||
#define PIN_LED2 (36) // Blue LED
|
|||
|
|||
#define LED_RED (-1) |
|||
#define LED_GREEN PIN_LED1 |
|||
#define LED_BLUE (-1) // Disable annoying flashing caused by Bluefruit
|
|||
|
|||
#define P_LORA_TX_LED PIN_LED2 // Blue LED
|
|||
// #define PIN_STATUS_LED LED_GREEN // disable status led.
|
|||
#define LED_BUILTIN LED_GREEN |
|||
#define PIN_LED LED_BUILTIN |
|||
#define LED_PIN LED_BUILTIN |
|||
#define LED_STATE_ON HIGH |
|||
|
|||
// Buttons
|
|||
#define PIN_BUTTON1 (9) // side button
|
|||
#define PIN_BUTTON2 (4) // encoder left
|
|||
#define PIN_BUTTON3 (26) // encoder right
|
|||
#define PIN_BUTTON4 (28) // encoder press
|
|||
#define PIN_SIDE_BUTTON PIN_BUTTON1 |
|||
#define ENCODER_LEFT PIN_BUTTON2 |
|||
#define ENCODER_RIGHT PIN_BUTTON3 |
|||
#define ENCODER_PRESS PIN_BUTTON4 |
|||
#define PIN_USER_BTN PIN_SIDE_BUTTON |
|||
|
|||
// VBAT sensing
|
|||
#define PIN_VBAT_READ (5) |
|||
#define BATTERY_SENSE_RESOLUTION_BITS 12 |
|||
#define BATTERY_SENSE_RESOLUTION 4096.0 |
|||
#define AREF_VOLTAGE 3.0 |
|||
#define VBAT_AR_INTERNAL AR_INTERNAL_3_0 |
|||
#define ADC_MULTIPLIER 1.73 |
|||
#define ADC_RESOLUTION 14 |
|||
|
|||
// Serial interfaces
|
|||
#define PIN_SERIAL1_RX (15) |
|||
#define PIN_SERIAL1_TX (16) |
|||
#define PIN_SERIAL2_RX (8) // Connected to Jlink CDC
|
|||
#define PIN_SERIAL2_TX (6) |
|||
|
|||
// SPI Interfaces
|
|||
#define SPI_INTERFACES_COUNT 2 |
|||
|
|||
#define PIN_SPI_MISO (45) |
|||
#define PIN_SPI_MOSI (44) |
|||
#define PIN_SPI_SCK (43) |
|||
|
|||
#define PIN_SPI1_MISO (29) |
|||
#define PIN_SPI1_MOSI (30) |
|||
#define PIN_SPI1_SCK (3) |
|||
|
|||
// LoRa SX1262 module pins
|
|||
#define P_LORA_SCLK PIN_SPI_SCK |
|||
#define P_LORA_MISO PIN_SPI_MISO |
|||
#define P_LORA_MOSI PIN_SPI_MOSI |
|||
#define P_LORA_DIO_1 (47) |
|||
#define P_LORA_RESET (38) |
|||
#define P_LORA_BUSY (46) |
|||
#define P_LORA_NSS (42) |
|||
#define SX126X_POWER_EN (37) |
|||
|
|||
#define SX126X_RXEN RADIOLIB_NC |
|||
#define SX126X_TXEN RADIOLIB_NC |
|||
|
|||
#define SX126X_DIO2_AS_RF_SWITCH true |
|||
#define SX126X_DIO3_TCXO_VOLTAGE (1.8f) |
|||
|
|||
// Wire Interfaces
|
|||
#define WIRE_INTERFACES_COUNT 1 |
|||
#define PIN_WIRE_SDA (13) |
|||
#define PIN_WIRE_SCL (14) |
|||
#define PIN_BOARD_SDA (13) |
|||
#define PIN_BOARD_SCL (14) |
|||
|
|||
// Power control
|
|||
#define PIN_3V3_EN (34) // nothing connected on meshtiny board
|
|||
|
|||
#endif // _MESHTINY_H_
|
|||
@ -0,0 +1,96 @@ |
|||
#pragma once |
|||
|
|||
#include <Arduino.h> |
|||
#include <helpers/RefCountedDigitalPin.h> |
|||
#include <helpers/ESP32Board.h> |
|||
|
|||
// built-ins
|
|||
#ifndef PIN_VBAT_READ |
|||
#define PIN_VBAT_READ 1 |
|||
#endif |
|||
#ifndef PIN_ADC_CTRL |
|||
#define PIN_ADC_CTRL 36 |
|||
#endif |
|||
#define PIN_ADC_CTRL_ACTIVE LOW |
|||
#define PIN_ADC_CTRL_INACTIVE HIGH |
|||
#define ADC_MULTIPLIER (3 * 1.73 * 1.187 * 1000) |
|||
#define BATTERY_SAMPLES 8 |
|||
|
|||
#include <driver/rtc_io.h> |
|||
|
|||
class RAK3112Board : public ESP32Board { |
|||
private: |
|||
bool adc_active_state; |
|||
|
|||
public: |
|||
RefCountedDigitalPin periph_power; |
|||
|
|||
RAK3112Board() : periph_power(PIN_VEXT_EN) { } |
|||
|
|||
void begin() { |
|||
ESP32Board::begin(); |
|||
|
|||
// Auto-detect correct ADC_CTRL pin polarity (different for boards >3.2)
|
|||
pinMode(PIN_ADC_CTRL, INPUT); |
|||
adc_active_state = !digitalRead(PIN_ADC_CTRL); |
|||
|
|||
pinMode(PIN_ADC_CTRL, OUTPUT); |
|||
digitalWrite(PIN_ADC_CTRL, !adc_active_state); // Initially inactive
|
|||
|
|||
periph_power.begin(); |
|||
|
|||
esp_reset_reason_t reason = esp_reset_reason(); |
|||
if (reason == ESP_RST_DEEPSLEEP) { |
|||
long wakeup_source = esp_sleep_get_ext1_wakeup_status(); |
|||
if (wakeup_source & (1 << P_LORA_DIO_1)) { // received a LoRa packet (while in deep sleep)
|
|||
startup_reason = BD_STARTUP_RX_PACKET; |
|||
} |
|||
|
|||
rtc_gpio_hold_dis((gpio_num_t)P_LORA_NSS); |
|||
rtc_gpio_deinit((gpio_num_t)P_LORA_DIO_1); |
|||
} |
|||
} |
|||
|
|||
void enterDeepSleep(uint32_t secs, int pin_wake_btn = -1) { |
|||
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON); |
|||
|
|||
// Make sure the DIO1 and NSS GPIOs are hold on required levels during deep sleep
|
|||
rtc_gpio_set_direction((gpio_num_t)P_LORA_DIO_1, RTC_GPIO_MODE_INPUT_ONLY); |
|||
rtc_gpio_pulldown_en((gpio_num_t)P_LORA_DIO_1); |
|||
|
|||
rtc_gpio_hold_en((gpio_num_t)P_LORA_NSS); |
|||
|
|||
if (pin_wake_btn < 0) { |
|||
esp_sleep_enable_ext1_wakeup( (1L << P_LORA_DIO_1), ESP_EXT1_WAKEUP_ANY_HIGH); // wake up on: recv LoRa packet
|
|||
} else { |
|||
esp_sleep_enable_ext1_wakeup( (1L << P_LORA_DIO_1) | (1L << pin_wake_btn), ESP_EXT1_WAKEUP_ANY_HIGH); // wake up on: recv LoRa packet OR wake btn
|
|||
} |
|||
|
|||
if (secs > 0) { |
|||
esp_sleep_enable_timer_wakeup(secs * 1000000); |
|||
} |
|||
|
|||
// Finally set ESP32 into sleep
|
|||
esp_deep_sleep_start(); // CPU halts here and never returns!
|
|||
} |
|||
|
|||
void powerOff() override { |
|||
enterDeepSleep(0); |
|||
} |
|||
|
|||
uint16_t getBattMilliVolts() override { |
|||
analogReadResolution(12); |
|||
|
|||
uint32_t raw = 0; |
|||
for (int i = 0; i < BATTERY_SAMPLES; i++) { |
|||
raw += analogRead(PIN_VBAT_READ); |
|||
} |
|||
raw = raw / BATTERY_SAMPLES; |
|||
|
|||
return (ADC_MULTIPLIER * raw) / 4096; |
|||
} |
|||
|
|||
const char* getManufacturerName() const override { |
|||
return "RAK 3112"; |
|||
} |
|||
}; |
|||
@ -0,0 +1,223 @@ |
|||
[rak3112] |
|||
extends = esp32_base |
|||
board = esp32-s3-devkitc-1 |
|||
build_flags = |
|||
${esp32_base.build_flags} |
|||
${sensor_base.build_flags} |
|||
-I variants/rak3112 |
|||
-D RAK_3112=1 |
|||
-D ESP32_CPU_FREQ=80 |
|||
-D P_LORA_DIO_1=47 |
|||
-D P_LORA_NSS=7 |
|||
-D P_LORA_RESET=8 |
|||
-D P_LORA_BUSY=48 |
|||
-D P_LORA_SCLK=5 |
|||
-D P_LORA_MISO=3 |
|||
-D P_LORA_MOSI=6 |
|||
-D RADIO_CLASS=CustomSX1262 |
|||
-D WRAPPER_CLASS=CustomSX1262Wrapper |
|||
-D LORA_TX_POWER=22 |
|||
-D P_LORA_TX_LED=46 |
|||
-D PIN_BOARD_SDA=9 |
|||
-D PIN_BOARD_SCL=40 |
|||
-D PIN_USER_BTN=-1 |
|||
-D PIN_VEXT_EN=14 |
|||
-D SX126X_DIO2_AS_RF_SWITCH=true |
|||
-D SX126X_DIO3_TCXO_VOLTAGE=1.8 |
|||
-D SX126X_CURRENT_LIMIT=140 |
|||
-D SX126X_RX_BOOSTED_GAIN=1 |
|||
-D PIN_GPS_RX=43 |
|||
-D PIN_GPS_TX=44 |
|||
; -D PIN_GPS_EN=26 |
|||
build_src_filter = ${esp32_base.build_src_filter} |
|||
+<../variants/rak3112> |
|||
+<helpers/sensors> |
|||
lib_deps = |
|||
${esp32_base.lib_deps} |
|||
${sensor_base.lib_deps} |
|||
|
|||
[env:RAK3112_repeater] |
|||
extends = rak3112 |
|||
build_flags = |
|||
${rak3112.build_flags} |
|||
-D DISPLAY_CLASS=SSD1306Display |
|||
-D ADVERT_NAME='"RAK3112 Repeater"' |
|||
-D ADVERT_LAT=0.0 |
|||
-D ADVERT_LON=0.0 |
|||
-D ADMIN_PASSWORD='"password"' |
|||
-D MAX_NEIGHBOURS=50 |
|||
; -D MESH_PACKET_LOGGING=1 |
|||
; -D MESH_DEBUG=1 |
|||
build_src_filter = ${rak3112.build_src_filter} |
|||
+<helpers/ui/SSD1306Display.cpp> |
|||
+<../examples/simple_repeater> |
|||
lib_deps = |
|||
${rak3112.lib_deps} |
|||
${esp32_ota.lib_deps} |
|||
bakercp/CRC32 @ ^2.0.0 |
|||
|
|||
[env:RAK3112_repeater_bridge_rs232] |
|||
extends = rak3112 |
|||
build_flags = |
|||
${rak3112.build_flags} |
|||
-D DISPLAY_CLASS=SSD1306Display |
|||
-D ADVERT_NAME='"RS232 Bridge"' |
|||
-D ADVERT_LAT=0.0 |
|||
-D ADVERT_LON=0.0 |
|||
-D ADMIN_PASSWORD='"password"' |
|||
-D MAX_NEIGHBOURS=50 |
|||
-D WITH_RS232_BRIDGE=Serial2 |
|||
-D WITH_RS232_BRIDGE_RX=5 |
|||
-D WITH_RS232_BRIDGE_TX=6 |
|||
; -D BRIDGE_DEBUG=1 |
|||
; -D MESH_PACKET_LOGGING=1 |
|||
; -D MESH_DEBUG=1 |
|||
build_src_filter = ${rak3112.build_src_filter} |
|||
+<helpers/bridges/RS232Bridge.cpp> |
|||
+<helpers/ui/SSD1306Display.cpp> |
|||
+<../examples/simple_repeater> |
|||
lib_deps = |
|||
${rak3112.lib_deps} |
|||
${esp32_ota.lib_deps} |
|||
|
|||
[env:RAK3112_repeater_bridge_espnow] |
|||
extends = rak3112 |
|||
build_flags = |
|||
${rak3112.build_flags} |
|||
-D DISPLAY_CLASS=SSD1306Display |
|||
-D ADVERT_NAME='"ESPNow Bridge"' |
|||
-D ADVERT_LAT=0.0 |
|||
-D ADVERT_LON=0.0 |
|||
-D ADMIN_PASSWORD='"password"' |
|||
-D MAX_NEIGHBOURS=50 |
|||
-D WITH_ESPNOW_BRIDGE=1 |
|||
; -D BRIDGE_DEBUG=1 |
|||
; -D MESH_PACKET_LOGGING=1 |
|||
; -D MESH_DEBUG=1 |
|||
build_src_filter = ${rak3112.build_src_filter} |
|||
+<helpers/bridges/ESPNowBridge.cpp> |
|||
+<helpers/ui/SSD1306Display.cpp> |
|||
+<../examples/simple_repeater> |
|||
lib_deps = |
|||
${rak3112.lib_deps} |
|||
${esp32_ota.lib_deps} |
|||
|
|||
[env:RAK3112_room_server] |
|||
extends = rak3112 |
|||
build_flags = |
|||
${rak3112.build_flags} |
|||
-D DISPLAY_CLASS=SSD1306Display |
|||
-D ADVERT_NAME='"RAK3112 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 = ${rak3112.build_src_filter} |
|||
+<helpers/ui/SSD1306Display.cpp> |
|||
+<../examples/simple_room_server> |
|||
lib_deps = |
|||
${rak3112.lib_deps} |
|||
${esp32_ota.lib_deps} |
|||
|
|||
[env:RAK3112_terminal_chat] |
|||
extends = rak3112 |
|||
build_flags = |
|||
${rak3112.build_flags} |
|||
-D MAX_CONTACTS=350 |
|||
-D MAX_GROUP_CHANNELS=1 |
|||
; -D MESH_PACKET_LOGGING=1 |
|||
; -D MESH_DEBUG=1 |
|||
build_src_filter = ${rak3112.build_src_filter} |
|||
+<../examples/simple_secure_chat/main.cpp> |
|||
lib_deps = |
|||
${rak3112.lib_deps} |
|||
densaugeo/base64 @ ~1.4.0 |
|||
|
|||
[env:RAK3112_companion_radio_usb] |
|||
extends = rak3112 |
|||
build_flags = |
|||
${rak3112.build_flags} |
|||
-I examples/companion_radio/ui-new |
|||
-D MAX_CONTACTS=350 |
|||
-D MAX_GROUP_CHANNELS=40 |
|||
-D DISPLAY_CLASS=SSD1306Display |
|||
; NOTE: DO NOT ENABLE --> -D MESH_PACKET_LOGGING=1 |
|||
; NOTE: DO NOT ENABLE --> -D MESH_DEBUG=1 |
|||
build_src_filter = ${rak3112.build_src_filter} |
|||
+<helpers/ui/SSD1306Display.cpp> |
|||
+<helpers/ui/MomentaryButton.cpp> |
|||
+<../examples/companion_radio/*.cpp> |
|||
+<../examples/companion_radio/ui-new/*.cpp> |
|||
lib_deps = |
|||
${rak3112.lib_deps} |
|||
densaugeo/base64 @ ~1.4.0 |
|||
|
|||
[env:RAK3112_companion_radio_ble] |
|||
extends = rak3112 |
|||
build_flags = |
|||
${rak3112.build_flags} |
|||
-I examples/companion_radio/ui-new |
|||
-D MAX_CONTACTS=350 |
|||
-D MAX_GROUP_CHANNELS=40 |
|||
-D DISPLAY_CLASS=SSD1306Display |
|||
-D BLE_PIN_CODE=123456 ; dynamic, random PIN |
|||
-D AUTO_SHUTDOWN_MILLIVOLTS=3400 |
|||
-D BLE_DEBUG_LOGGING=1 |
|||
-D OFFLINE_QUEUE_SIZE=256 |
|||
; -D MESH_PACKET_LOGGING=1 |
|||
; -D MESH_DEBUG=1 |
|||
build_src_filter = ${rak3112.build_src_filter} |
|||
+<helpers/ui/SSD1306Display.cpp> |
|||
+<helpers/ui/MomentaryButton.cpp> |
|||
+<helpers/esp32/*.cpp> |
|||
+<../examples/companion_radio/*.cpp> |
|||
+<../examples/companion_radio/ui-new/*.cpp> |
|||
lib_deps = |
|||
${rak3112.lib_deps} |
|||
densaugeo/base64 @ ~1.4.0 |
|||
|
|||
[env:RAK3112_companion_radio_wifi] |
|||
extends = rak3112 |
|||
build_flags = |
|||
${rak3112.build_flags} |
|||
-I examples/companion_radio/ui-new |
|||
-D MAX_CONTACTS=350 |
|||
-D MAX_GROUP_CHANNELS=40 |
|||
-D DISPLAY_CLASS=SSD1306Display |
|||
-D WIFI_DEBUG_LOGGING=1 |
|||
-D WIFI_SSID='"myssid"' |
|||
-D WIFI_PWD='"mypwd"' |
|||
-D OFFLINE_QUEUE_SIZE=256 |
|||
; -D MESH_PACKET_LOGGING=1 |
|||
; -D MESH_DEBUG=1 |
|||
build_src_filter = ${rak3112.build_src_filter} |
|||
+<helpers/ui/SSD1306Display.cpp> |
|||
+<helpers/ui/MomentaryButton.cpp> |
|||
+<helpers/esp32/*.cpp> |
|||
+<../examples/companion_radio/*.cpp> |
|||
+<../examples/companion_radio/ui-new/*.cpp> |
|||
lib_deps = |
|||
${rak3112.lib_deps} |
|||
densaugeo/base64 @ ~1.4.0 |
|||
|
|||
[env:RAK3112_sensor] |
|||
extends = rak3112 |
|||
build_flags = |
|||
${rak3112.build_flags} |
|||
-D ADVERT_NAME='"RAK3112 v3 Sensor"' |
|||
-D ADVERT_LAT=0.0 |
|||
-D ADVERT_LON=0.0 |
|||
-D ADMIN_PASSWORD='"password"' |
|||
-D ENV_PIN_SDA=33 |
|||
-D ENV_PIN_SCL=34 |
|||
-D DISPLAY_CLASS=SSD1306Display |
|||
; -D MESH_PACKET_LOGGING=1 |
|||
; -D MESH_DEBUG=1 |
|||
build_src_filter = ${rak3112.build_src_filter} |
|||
+<helpers/ui/SSD1306Display.cpp> |
|||
+<../examples/simple_sensor> |
|||
lib_deps = |
|||
${rak3112.lib_deps} |
|||
${esp32_ota.lib_deps} |
|||
@ -0,0 +1,60 @@ |
|||
#include <Arduino.h> |
|||
#include "target.h" |
|||
|
|||
RAK3112Board board; |
|||
|
|||
#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); |
|||
|
|||
ESP32RTCClock 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 |
|||
|
|||
#ifdef DISPLAY_CLASS |
|||
DISPLAY_CLASS display; |
|||
MomentaryButton user_btn(PIN_USER_BTN, 1000, true); |
|||
#endif |
|||
|
|||
bool radio_init() { |
|||
fallback_clock.begin(); |
|||
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
|
|||
} |
|||
@ -0,0 +1,30 @@ |
|||
#pragma once |
|||
|
|||
#define RADIOLIB_STATIC_ONLY 1 |
|||
#include <RadioLib.h> |
|||
#include <helpers/radiolib/RadioLibWrappers.h> |
|||
#include <RAK3112Board.h> |
|||
#include <helpers/radiolib/CustomSX1262Wrapper.h> |
|||
#include <helpers/AutoDiscoverRTCClock.h> |
|||
#include <helpers/SensorManager.h> |
|||
#include <helpers/sensors/EnvironmentSensorManager.h> |
|||
#ifdef DISPLAY_CLASS |
|||
#include <helpers/ui/SSD1306Display.h> |
|||
#include <helpers/ui/MomentaryButton.h> |
|||
#endif |
|||
|
|||
extern RAK3112Board board; |
|||
extern WRAPPER_CLASS radio_driver; |
|||
extern AutoDiscoverRTCClock rtc_clock; |
|||
extern EnvironmentSensorManager sensors; |
|||
|
|||
#ifdef DISPLAY_CLASS |
|||
extern DISPLAY_CLASS display; |
|||
extern MomentaryButton user_btn; |
|||
#endif |
|||
|
|||
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(); |
|||
@ -0,0 +1,32 @@ |
|||
#include <Arduino.h> |
|||
#include <Wire.h> |
|||
|
|||
#include "RAK3401Board.h" |
|||
|
|||
void RAK3401Board::begin() { |
|||
NRF52BoardDCDC::begin(); |
|||
pinMode(PIN_VBAT_READ, INPUT); |
|||
#ifdef PIN_USER_BTN |
|||
pinMode(PIN_USER_BTN, INPUT_PULLUP); |
|||
#endif |
|||
|
|||
#ifdef PIN_USER_BTN_ANA |
|||
pinMode(PIN_USER_BTN_ANA, INPUT_PULLUP); |
|||
#endif |
|||
|
|||
#if defined(PIN_BOARD_SDA) && defined(PIN_BOARD_SCL) |
|||
Wire.setPins(PIN_BOARD_SDA, PIN_BOARD_SCL); |
|||
#endif |
|||
|
|||
Wire.begin(); |
|||
|
|||
pinMode(PIN_3V3_EN, OUTPUT); |
|||
digitalWrite(PIN_3V3_EN, HIGH); |
|||
|
|||
#ifdef P_LORA_PA_EN |
|||
// Initialize RAK13302 1W LoRa transceiver module PA control pin
|
|||
pinMode(P_LORA_PA_EN, OUTPUT); |
|||
digitalWrite(P_LORA_PA_EN, LOW); // Start with PA disabled
|
|||
delay(10); // Allow PA module to initialize
|
|||
#endif |
|||
} |
|||
@ -0,0 +1,70 @@ |
|||
#pragma once |
|||
|
|||
#include <MeshCore.h> |
|||
#include <Arduino.h> |
|||
#include <helpers/NRF52Board.h> |
|||
|
|||
// LoRa radio module pins for RAK13302
|
|||
#define P_LORA_SCLK 3 |
|||
#define P_LORA_MISO 29 |
|||
#define P_LORA_MOSI 30 |
|||
#define P_LORA_NSS 26 |
|||
#define P_LORA_DIO_1 10 |
|||
#define P_LORA_BUSY 9 |
|||
#define P_LORA_RESET 4 |
|||
#ifndef P_LORA_PA_EN |
|||
#define P_LORA_PA_EN 31 |
|||
#endif |
|||
|
|||
//#define PIN_GPS_SDA 13 //GPS SDA pin (output option)
|
|||
//#define PIN_GPS_SCL 14 //GPS SCL pin (output option)
|
|||
// #define PIN_GPS_TX 16 //GPS TX pin
|
|||
// #define PIN_GPS_RX 15 //GPS RX pin
|
|||
#define PIN_GPS_1PPS 17 //GPS PPS pin
|
|||
#define GPS_BAUD_RATE 9600 |
|||
#define GPS_ADDRESS 0x42 //i2c address for GPS
|
|||
|
|||
#define SX126X_DIO2_AS_RF_SWITCH |
|||
#define SX126X_DIO3_TCXO_VOLTAGE 1.8 |
|||
|
|||
|
|||
// built-ins
|
|||
#define PIN_VBAT_READ 5 |
|||
#define ADC_MULTIPLIER (3 * 1.73 * 1.187 * 1000) |
|||
|
|||
#define PIN_3V3_EN (34) |
|||
#define WB_IO2 PIN_3V3_EN |
|||
|
|||
class RAK3401Board : public NRF52BoardDCDC, public NRF52BoardOTA { |
|||
public: |
|||
RAK3401Board() : NRF52BoardOTA("RAK3401_OTA") {} |
|||
void begin(); |
|||
|
|||
#define BATTERY_SAMPLES 8 |
|||
|
|||
uint16_t getBattMilliVolts() override { |
|||
analogReadResolution(12); |
|||
|
|||
uint32_t raw = 0; |
|||
for (int i = 0; i < BATTERY_SAMPLES; i++) { |
|||
raw += analogRead(PIN_VBAT_READ); |
|||
} |
|||
raw = raw / BATTERY_SAMPLES; |
|||
|
|||
return (ADC_MULTIPLIER * raw) / 4096; |
|||
} |
|||
|
|||
const char* getManufacturerName() const override { |
|||
return "RAK 3401"; |
|||
} |
|||
|
|||
#ifdef P_LORA_PA_EN |
|||
void onBeforeTransmit() override { |
|||
digitalWrite(P_LORA_PA_EN, HIGH); // Enable PA before transmission
|
|||
} |
|||
|
|||
void onAfterTransmit() override { |
|||
digitalWrite(P_LORA_PA_EN, LOW); // Disable PA after transmission to save power
|
|||
} |
|||
#endif |
|||
}; |
|||
@ -0,0 +1,127 @@ |
|||
[rak3401] |
|||
extends = nrf52_base |
|||
board = rak3401 |
|||
board_check = true |
|||
build_flags = ${nrf52_base.build_flags} |
|||
${sensor_base.build_flags} |
|||
-I variants/rak3401 |
|||
-D RAK_3401 |
|||
-D RAK13302 |
|||
-D RADIO_CLASS=CustomSX1262 |
|||
-D WRAPPER_CLASS=CustomSX1262Wrapper |
|||
-D LORA_TX_POWER=22 |
|||
-D SX126X_CURRENT_LIMIT=140 |
|||
-D SX126X_RX_BOOSTED_GAIN=1 |
|||
build_src_filter = ${nrf52_base.build_src_filter} |
|||
+<../variants/rak3401> |
|||
+<helpers/sensors> |
|||
+<helpers/ui/SSD1306Display.cpp> |
|||
+<helpers/ui/MomentaryButton.cpp> |
|||
lib_deps = |
|||
${nrf52_base.lib_deps} |
|||
${sensor_base.lib_deps} |
|||
adafruit/Adafruit SSD1306 @ ^2.5.13 |
|||
sparkfun/SparkFun u-blox GNSS Arduino Library@^2.2.27 |
|||
|
|||
[env:RAK_3401_repeater] |
|||
extends = rak3401 |
|||
build_flags = |
|||
${rak3401.build_flags} |
|||
-D DISPLAY_CLASS=SSD1306Display |
|||
-D ADVERT_NAME='"RAK3401 1W Repeater"' |
|||
-D ADVERT_LAT=0.0 |
|||
-D ADVERT_LON=0.0 |
|||
-D ADMIN_PASSWORD='"password"' |
|||
-D MAX_NEIGHBOURS=50 |
|||
;-D MESH_PACKET_LOGGING=1 |
|||
;-D MESH_DEBUG=1 |
|||
build_src_filter = ${rak3401.build_src_filter} |
|||
+<helpers/ui/SSD1306Display.cpp> |
|||
+<../examples/simple_repeater> |
|||
|
|||
[env:RAK_3401_room_server] |
|||
extends = rak3401 |
|||
build_flags = |
|||
${rak3401.build_flags} |
|||
-D DISPLAY_CLASS=SSD1306Display |
|||
-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 = ${rak3401.build_src_filter} |
|||
+<helpers/ui/SSD1306Display.cpp> |
|||
+<../examples/simple_room_server> |
|||
|
|||
[env:RAK_3401_companion_radio_usb] |
|||
extends = rak3401 |
|||
board_build.ldscript = boards/nrf52840_s140_v6_extrafs.ld |
|||
board_upload.maximum_size = 712704 |
|||
build_flags = |
|||
${rak3401.build_flags} |
|||
-I examples/companion_radio/ui-new |
|||
-D DISPLAY_CLASS=SSD1306Display |
|||
-D MAX_CONTACTS=350 |
|||
-D MAX_GROUP_CHANNELS=40 |
|||
; NOTE: DO NOT ENABLE --> -D MESH_PACKET_LOGGING=1 |
|||
; NOTE: DO NOT ENABLE --> -D MESH_DEBUG=1 |
|||
build_src_filter = ${rak3401.build_src_filter} |
|||
+<../examples/companion_radio/*.cpp> |
|||
+<../examples/companion_radio/ui-new/*.cpp> |
|||
lib_deps = |
|||
${rak3401.lib_deps} |
|||
densaugeo/base64 @ ~1.4.0 |
|||
|
|||
[env:RAK_3401_companion_radio_ble] |
|||
extends = rak3401 |
|||
board_build.ldscript = boards/nrf52840_s140_v6_extrafs.ld |
|||
board_upload.maximum_size = 712704 |
|||
build_flags = |
|||
${rak3401.build_flags} |
|||
-I examples/companion_radio/ui-new |
|||
-D DISPLAY_CLASS=SSD1306Display |
|||
-D MAX_CONTACTS=350 |
|||
-D MAX_GROUP_CHANNELS=40 |
|||
-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 = ${rak3401.build_src_filter} |
|||
+<helpers/nrf52/SerialBLEInterface.cpp> |
|||
+<../examples/companion_radio/*.cpp> |
|||
+<../examples/companion_radio/ui-new/*.cpp> |
|||
lib_deps = |
|||
${rak3401.lib_deps} |
|||
densaugeo/base64 @ ~1.4.0 |
|||
|
|||
[env:RAK_3401_terminal_chat] |
|||
extends = rak3401 |
|||
build_flags = |
|||
${rak3401.build_flags} |
|||
-D MAX_CONTACTS=100 |
|||
-D MAX_GROUP_CHANNELS=1 |
|||
;-D MESH_PACKET_LOGGING=1 |
|||
;-D MESH_DEBUG=1 |
|||
build_src_filter = ${rak3401.build_src_filter} |
|||
+<../examples/simple_secure_chat/main.cpp> |
|||
lib_deps = |
|||
${rak3401.lib_deps} |
|||
densaugeo/base64 @ ~1.4.0 |
|||
|
|||
[env:RAK_3401_sensor] |
|||
extends = rak3401 |
|||
build_flags = |
|||
${rak3401.build_flags} |
|||
-D DISPLAY_CLASS=SSD1306Display |
|||
-D ADVERT_NAME='"RAK3401 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 = ${rak3401.build_src_filter} |
|||
+<helpers/ui/SSD1306Display.cpp> |
|||
+<../examples/simple_sensor> |
|||
@ -0,0 +1,58 @@ |
|||
#include <Arduino.h> |
|||
#include "target.h" |
|||
#include <helpers/ArduinoHelpers.h> |
|||
|
|||
RAK3401Board 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); |
|||
return radio.std_init(&SPI); |
|||
} |
|||
|
|||
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
|
|||
} |
|||
@ -0,0 +1,30 @@ |
|||
#pragma once |
|||
|
|||
#define RADIOLIB_STATIC_ONLY 1 |
|||
#include <RadioLib.h> |
|||
#include <helpers/radiolib/RadioLibWrappers.h> |
|||
#include <RAK3401Board.h> |
|||
#include <helpers/radiolib/CustomSX1262Wrapper.h> |
|||
#include <helpers/AutoDiscoverRTCClock.h> |
|||
#include <helpers/sensors/EnvironmentSensorManager.h> |
|||
|
|||
#ifdef DISPLAY_CLASS |
|||
#include <helpers/ui/SSD1306Display.h> |
|||
extern DISPLAY_CLASS display; |
|||
#include <helpers/ui/MomentaryButton.h> |
|||
extern MomentaryButton user_btn; |
|||
#if defined(PIN_USER_BTN_ANA) |
|||
extern MomentaryButton analog_btn; |
|||
#endif |
|||
#endif |
|||
|
|||
extern RAK3401Board 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(); |
|||
@ -0,0 +1,52 @@ |
|||
/*
|
|||
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 "wiring_constants.h" |
|||
#include "wiring_digital.h" |
|||
#include "nrf.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() |
|||
{ |
|||
// LED1 & LED2
|
|||
pinMode(PIN_LED1, OUTPUT); |
|||
ledOff(PIN_LED1); |
|||
|
|||
pinMode(PIN_LED2, OUTPUT); |
|||
ledOff(PIN_LED2); |
|||
|
|||
// 3V3 Power Rail
|
|||
pinMode(PIN_3V3_EN, OUTPUT); |
|||
digitalWrite(PIN_3V3_EN, HIGH); |
|||
} |
|||
@ -0,0 +1,199 @@ |
|||
/*
|
|||
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 |
|||
*/ |
|||
|
|||
#ifndef _VARIANT_RAK3401_ |
|||
#define _VARIANT_RAK3401_ |
|||
|
|||
#define RAK4630 |
|||
|
|||
/** Master clock frequency */ |
|||
#define VARIANT_MCK (64000000ul) |
|||
|
|||
#define USE_LFXO // Board uses 32khz crystal for LF
|
|||
// define USE_LFRC // Board uses RC for LF
|
|||
|
|||
/*----------------------------------------------------------------------------
|
|||
* Headers |
|||
*----------------------------------------------------------------------------*/ |
|||
|
|||
#include "WVariant.h" |
|||
|
|||
#ifdef __cplusplus |
|||
extern "C" |
|||
{ |
|||
#endif // __cplusplus
|
|||
|
|||
// Number of pins defined in PinDescription array
|
|||
#define PINS_COUNT (48) |
|||
#define NUM_DIGITAL_PINS (48) |
|||
#define NUM_ANALOG_INPUTS (6) |
|||
#define NUM_ANALOG_OUTPUTS (0) |
|||
|
|||
// LEDs
|
|||
#define PIN_LED1 (35) |
|||
#define PIN_LED2 (36) |
|||
|
|||
#define LED_BUILTIN PIN_LED1 |
|||
#define LED_CONN PIN_LED2 |
|||
|
|||
#define LED_GREEN PIN_LED1 |
|||
#define LED_BLUE PIN_LED2 |
|||
|
|||
#define LED_STATE_ON 1 // State when LED is litted
|
|||
|
|||
/*
|
|||
* Analog pins |
|||
*/ |
|||
#define PIN_A0 (5) //(3)
|
|||
#define PIN_A1 (31) //(4)
|
|||
#define PIN_A2 (28) |
|||
#define PIN_A3 (29) |
|||
#define PIN_A4 (30) |
|||
#define PIN_A5 (31) |
|||
#define PIN_A6 (0xff) |
|||
#define PIN_A7 (0xff) |
|||
|
|||
static const uint8_t A0 = PIN_A0; |
|||
static const uint8_t A1 = PIN_A1; |
|||
static const uint8_t A2 = PIN_A2; |
|||
static const uint8_t A3 = PIN_A3; |
|||
static const uint8_t A4 = PIN_A4; |
|||
static const uint8_t A5 = PIN_A5; |
|||
static const uint8_t A6 = PIN_A6; |
|||
static const uint8_t A7 = PIN_A7; |
|||
#define ADC_RESOLUTION 14 |
|||
|
|||
// Other pins
|
|||
#define WB_I2C1_SDA (13) // SENSOR_SLOT IO_SLOT
|
|||
#define WB_I2C1_SCL (14) // SENSOR_SLOT IO_SLOT
|
|||
|
|||
#define PIN_AREF (2) |
|||
#define PIN_NFC1 (9) |
|||
#define WB_IO5 PIN_NFC1 |
|||
#define WB_IO4 (4) |
|||
#define PIN_NFC2 (10) |
|||
|
|||
static const uint8_t AREF = PIN_AREF; |
|||
|
|||
/*
|
|||
* Serial interfaces |
|||
*/ |
|||
// TXD1 RXD1 on Base Board
|
|||
#define PIN_SERIAL1_RX (15) |
|||
#define PIN_SERIAL1_TX (16) |
|||
|
|||
// Connected to Jlink CDC
|
|||
#define PIN_SERIAL2_RX (8) |
|||
#define PIN_SERIAL2_TX (6) |
|||
|
|||
/*
|
|||
* SPI Interfaces |
|||
*/ |
|||
#define SPI_INTERFACES_COUNT 2 |
|||
|
|||
#define PIN_SPI_MISO (45) |
|||
#define PIN_SPI_MOSI (44) |
|||
#define PIN_SPI_SCK (43) |
|||
|
|||
#define PIN_SPI1_MISO (29) |
|||
#define PIN_SPI1_MOSI (30) |
|||
#define PIN_SPI1_SCK (3) |
|||
|
|||
static const uint8_t SS = 42; |
|||
static const uint8_t MOSI = PIN_SPI_MOSI; |
|||
static const uint8_t MISO = PIN_SPI_MISO; |
|||
static const uint8_t SCK = PIN_SPI_SCK; |
|||
|
|||
/*
|
|||
* Wire Interfaces |
|||
*/ |
|||
#define WIRE_INTERFACES_COUNT 1 |
|||
|
|||
#define PIN_WIRE_SDA (WB_I2C1_SDA) |
|||
#define PIN_WIRE_SCL (WB_I2C1_SCL) |
|||
|
|||
// QSPI Pins
|
|||
// QSPI occupied by GPIO's
|
|||
#define PIN_QSPI_SCK 3 |
|||
#define PIN_QSPI_CS 26 |
|||
#define PIN_QSPI_IO0 30 |
|||
#define PIN_QSPI_IO1 29 |
|||
#define PIN_QSPI_IO2 28 |
|||
#define PIN_QSPI_IO3 2 |
|||
|
|||
// On-board QSPI Flash
|
|||
// No onboard flash
|
|||
#define EXTERNAL_FLASH_DEVICES IS25LP080D |
|||
#define EXTERNAL_FLASH_USE_QSPI |
|||
|
|||
#define P_LORA_SCK PIN_SPI1_SCK |
|||
#define P_LORA_MISO PIN_SPI1_MISO |
|||
#define P_LORA_MOSI PIN_SPI1_MOSI |
|||
#define P_LORA_CS 26 |
|||
|
|||
#define USE_SX1262 |
|||
#define SX126X_CS (26) |
|||
#define SX126X_DIO1 (10) |
|||
#define SX126X_BUSY (9) |
|||
#define SX126X_RESET (4) |
|||
|
|||
#define SX126X_POWER_EN (21) |
|||
// DIO2 controlls an antenna switch and the TCXO voltage is controlled by DIO3
|
|||
#define SX126X_DIO2_AS_RF_SWITCH |
|||
#define SX126X_DIO3_TCXO_VOLTAGE 1.8 |
|||
|
|||
// enables 3.3V periphery like GPS or IO Module
|
|||
// Do not toggle this for GPS power savings
|
|||
#define PIN_3V3_EN (34) |
|||
#define WB_IO2 PIN_3V3_EN |
|||
|
|||
// RAK1910 GPS module
|
|||
// If using the wisblock GPS module and pluged into Port A on WisBlock base
|
|||
// IO1 is hooked to PPS (pin 12 on header) = gpio 17
|
|||
// IO2 is hooked to GPS RESET = gpio 34, but it can not be used to this because IO2 is ALSO used to control 3V3_S power (1 is on).
|
|||
// Therefore must be 1 to keep peripherals powered
|
|||
// Power is on the controllable 3V3_S rail
|
|||
#define PIN_GPS_PPS (17) // Pulse per second input from the GPS
|
|||
|
|||
#define PIN_GPS_RX PIN_SERIAL1_RX |
|||
#define PIN_GPS_TX PIN_SERIAL1_TX |
|||
|
|||
// Battery
|
|||
// The battery sense is hooked to pin A0 (5)
|
|||
#define BATTERY_PIN PIN_A0 |
|||
// and has 12 bit resolution
|
|||
#define BATTERY_SENSE_RESOLUTION_BITS 12 |
|||
#define BATTERY_SENSE_RESOLUTION 4096.0 |
|||
#undef AREF_VOLTAGE |
|||
#define AREF_VOLTAGE 3.0 |
|||
#define VBAT_AR_INTERNAL AR_INTERNAL_3_0 |
|||
#define ADC_MULTIPLIER 1.73 |
|||
|
|||
#define HAS_RTC 1 |
|||
|
|||
#define RAK_4631 1 |
|||
|
|||
#ifdef __cplusplus |
|||
} |
|||
#endif |
|||
|
|||
/*----------------------------------------------------------------------------
|
|||
* Arduino objects - C++ only |
|||
*----------------------------------------------------------------------------*/ |
|||
|
|||
#endif |
|||
Loading…
Reference in new issue