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