-
Notifications
You must be signed in to change notification settings - Fork 3
14 ‐ RSPB Mortality Tracker
The RSPB tracker is a wildlife GPS/Satellite tracker designed for bird monitoring. It uses a nano-power architecture: the device spends most of its time completely powered off. An external timer chip (TPL5111) periodically wakes the tracker to perform a short operational cycle, then the device powers down again.
TPL5111 Timer (every ~1h45)
|
v
+-------------+ +----------------+ +------------------+ +-----------+
| BOOT | --> | PRE-OPERATIONAL| --> | OPERATIONAL | --> | POWER OFF |
| Check modulo| | Check battery | | GNSS + TX cycle | | Wait next |
| counter | | level | | (limited by | | TPL5111 |
+------+------+ +-------+--------+ | NTIME_SAT) | | wakeup |
| | +--------+---------+ +-----------+
| | |
v v v
Not our turn? Battery critical? TX limit reached?
--> POWER OFF --> POWER OFF --> POWER OFF
immediately immediately (session done)
The TPL5111 is an external nano-power timer that physically controls the power supply. When the tracker powers down, the TPL5111 keeps counting and will re-power the device after its configured interval (~1h45min).
To further reduce energy usage, not every wakeup results in an active cycle.
The BOOT_COUNTER_MODULO parameter controls this:
Wakeup 1 Wakeup 2 Wakeup 3 Wakeup 4 Wakeup 5
(skip) (skip) (skip) ACTIVE! (skip) ...
| | | | |
v v v v v
increment increment increment modulo=4 increment
counter + counter + counter + --> RUN! counter +
power off power off power off GPS + TX power off
With modulo=4 and 1h45 interval:
Active cycle every ~7 hours
The tracker operates in three distinct modes depending on battery voltage. Each mode has different behavior to maximize device lifetime.
Battery Level
============
100% |########################################|
| NORMAL MODE | Full operation:
| GPS fix + Sensor data | GNSS, Sensors, Satellite TX
| + Satellite transmission |
| |
LB% |---- LB_THRESHOLD (default: 10%) -------|
| LOW BATTERY MODE | Reduced operation:
| Doppler TX only (no GPS) | Battery voltage only
| Fewer messages per session |
| |
LBP12|---- LB_CRITICAL_THRESH (default: 5%) |
| CRITICAL MODE | No operation:
| Immediate power off | Preserve battery for
| No TX, no GPS, nothing | solar recharge
0% |_________________________________________|
When battery is above LB_THRESHOLD:
WAKEUP
|
v
+--------+ +-------+ +--------+ +--------+ +--------+
| GNSS | --> | Got | --> | TX #1 | --> | TX #2 | --> | TX #3 | --> POWER OFF
| acquire | | fix! | | (GPS+ | | (GPS+ | | (GPS+ |
| position| | Stop | | sensor)| | sensor)| | sensor)|
| (1 fix) | | GNSS | | 60s | | 60s | | |
+----+----+ +-------+ +--------+ +--------+ +--------+
|
| No fix after timeout?
v
TX with "NO FIX" status --> POWER OFF
What happens:
- GNSS module powers on, acquires one satellite fix (position)
- With
GNSS_SESSION_SINGLE_FIX=1, GNSS stops after the first fix (saves power) - The tracker sends
SHUTDOWN_NTIME_SATsatellite transmissions (default: 5) - Each transmission contains GPS position + sensor data
- Transmissions are spaced by
TR_NOMinterval (default: 60 seconds) - After the last transmission, the device powers down
NTIME_SAT vs NTRY_PER_MESSAGE: Both count radio transmissions. NTIME_SAT is the total TX budget per session. NTRY_PER_MESSAGE controls how many times the same data is repeated (burst) to increase reception probability. Example: NTIME_SAT=5, NTRY=2 → data A sent 2x, then data A sent 2x again (new TR_NOM interval), then data A sent 1x → shutdown after 5 total TX.
Parameters controlling Normal mode:
| Parameter | DTE Key | Default | RSPB | Description |
|---|---|---|---|---|
| GNSS_SESSION_SINGLE_FIX | GNP30 | 0 (off) | 1 | Stop GNSS after first fix |
| SHUTDOWN_NTIME_SAT | PWP05 | 0 (off) | 5 | Total satellite TX before powerdown (includes NTRY repetitions) |
| TR_NOM | ARP05 | 60s | 60s | Interval between TX messages |
| GNSS_COLD_ACQ_TIMEOUT | GNP09 | 530s | 180s | Max time for cold GPS fix |
| GNSS_ACQ_TIMEOUT | GNP05 | 120s | 90s | Max time for warm GPS fix |
| GNSS_DYN_MODEL | GNP11 | 0 (portable) | 6 (airborne) | GPS motion model for birds |
| GNSS_HACCFILT_THR | GNP21 | 5m | 10m | Accept fix with this accuracy |
| NTRY_PER_MESSAGE | ARP19 | 0 | 0 | Burst repetitions per data. 0 recommended = unlimited replay until the SHUTDOWN_NTIME_SAT powerdown (a finite N < NTIME_SAT stalls the session until SHUTDOWN_TIMER) |
| ARGOS_RX_EN | ARP32 | 1 (on) | 0 | Satellite downlink — not implemented on SMD builds; keep 0 |
When battery drops below LB_THRESHOLD and LB_EN=1:
WAKEUP
|
v
+----------+ +----------+ +----------+
| Doppler | --> | Doppler | --> | POWER |
| TX #1 | | TX #2 | | OFF |
| (battery | | (battery | | |
| voltage)| | voltage)| | |
| 90s | | | | |
+----------+ +----------+ +----------+
NO GPS, NO SENSORS
Just battery voltage in a small Doppler packet (3 bytes)
Satellites use Doppler shift to estimate position
What happens:
- No GNSS module powered (saves significant energy)
- No sensor acquisition
- The tracker sends
LB_SHUTDOWN_NTIME_SATDoppler messages (default: 2) - Each Doppler message contains only battery voltage (24 bits / 3 bytes)
- The Argos satellite system uses Doppler frequency shift to estimate position
- Messages are spaced by
TR_LBinterval (default: 90 seconds) - After the last message, the device powers down
Parameters controlling Low Battery mode:
| Parameter | DTE Key | Default | RSPB | Description |
|---|---|---|---|---|
| LB_EN | LBP01 | 0 (off) | 1 | Enable low battery mode |
| LB_THRESHOLD | LBP02 | 10% | 10% | Battery % to enter LB mode |
| LB_GNSS_EN | LBP06 | 1 (on) | 0 | Disable GNSS in LB mode |
| LB_SHUTDOWN_NTIME_SAT | LBP14 | 0 (off) | 2 | Number of Doppler TX before powerdown |
| TR_LB | ARP06 | 240s | 90s | Interval between Doppler TX |
When battery SOC drops below LB_CRITICAL_THRESH:
WAKEUP
|
v
IMMEDIATE POWER OFF
(no GPS, no TX, nothing)
Wait for solar recharge
What happens:
- The device detects critically low battery at boot
- Immediately powers down without any operation
- The TPL5111 will keep waking the device periodically
- Once solar panels recharge the battery above critical threshold, the device will resume Low Battery or Normal mode
Exception: If a magnet is detected (reed switch engaged) while in critical battery state, the device enters configuration mode instead of powering off. This allows reconfiguring a depleted device via BLE without waiting for solar recharge.
Parameters controlling Critical mode:
| Parameter | DTE Key | Default | Description |
|---|---|---|---|
| LB_CRITICAL_THRESH | LBP12 | 5% | SOC percentage threshold for critical mode |
The SHUTDOWN_TIMER is an independent safety mechanism that runs in parallel
with the NTIME_SAT counter. It prevents the device from staying awake
indefinitely if something goes wrong (e.g., satellite TX keeps failing).
WAKEUP
|
+---> Start SHUTDOWN_TIMER (600s = 10 minutes)
|
+---> Start normal operation (GPS + TX cycle)
|
| Which triggers first?
| =======================
|
+---> NTIME_SAT reached (e.g., 3 TX done) --> POWER OFF (normal case)
|
+---> SHUTDOWN_TIMER expired (600s) --> POWER OFF (safety net)
| Parameter | DTE Key | Default | RSPB | Description |
|---|---|---|---|---|
| SHUTDOWN_TIMER | PWP01 | 0 (off) | 600s | Max seconds awake per cycle |
The TPL5111 architecture means the MCU loses all RAM state at each power-off, including the real-time clock. There is no battery-backed RTC crystal on the RSPB board. To maintain approximate time between wakeups, the firmware implements a pseudo RTC chain using a flash-persisted parameter.
Boot N Boot N+1
====== ========
Read LAST_KNOWN_RTC from flash Read LAST_KNOWN_RTC from flash
(e.g., 1708444800) (e.g., 1708451100)
| |
v v
Add WAKEUP_PERIOD Add WAKEUP_PERIOD
(+ 3600 seconds) (+ 3600 seconds)
| |
v v
rtc->settime(1708451100) rtc->settime(1708457400)
"Approximate time set" "Approximate time set"
| |
v v
... GNSS fix acquired ... ... GNSS fix acquired ...
Exact time from satellite! Exact time from satellite!
| |
v v
Save LAST_KNOWN_RTC to flash Save LAST_KNOWN_RTC to flash
(real timestamp from GNSS) (real timestamp from GNSS)
The pseudo RTC chain needs a starting value. There are two ways to seed it:
-
First GNSS fix: When the device gets its first GPS fix,
LAST_KNOWN_RTCis automatically saved to flash during the power-off phase. Subsequent boots use this as the base. -
Manual seed via RTCW command: Before deployment, send the current Unix timestamp via DTE:
$RTCW#00A;1708444800\rThis sets the RTC immediately and also saves
LAST_KNOWN_RTCto flash, seeding the chain without needing a GNSS fix first.
The pseudo RTC drifts by the difference between the configured WAKEUP_PERIOD and
the actual TPL5111 timer interval. Typical drift is a few seconds per cycle. Each
successful GNSS fix corrects the drift completely.
If the device fails to get a GNSS fix for several cycles, the time will gradually drift but remain usable for pass prediction and timestamping.
| Parameter | DTE Key | Description |
|---|---|---|
| LAST_KNOWN_RTC | PWP06 | Flash-persisted Unix timestamp. Updated on GNSS fix, PMU powerdown, and RTCW. Available on all boards. |
| WAKEUP_PERIOD | PWP04 | TPL5111 period in seconds (~3600s, build_rspb.sh default). Added to LAST_KNOWN_RTC at boot. RSPB only.
|
| RTC_CURRENT_TIME | SYT01 | Live RTC value readable via STATR. |
Note:
LAST_KNOWN_RTCis now persisted on all board variants (not just RSPB). On LinkIt V4 boards (no TPL5111), the last known RTC is restored directly at boot without adding a wakeup period. This enables MGA-ANO GNSS assistance data validation and faster time-to-first-fix after reset/crash.
To check the current RTC time:
$STATR#005;SYT01\r
$O;STATR#010;SYT01=1708451100\r
Time
|
| T+0s TPL5111 wakes device
| Boot, check modulo counter (is it our turn?)
| --> YES (counter % 4 == 0)
|
| T+0.1s Pre-operational: check battery
| --> Battery OK (Normal mode)
|
| T+1s GNSS module powered on
| Searching for satellites...
|
| T+45s First GPS fix acquired! (typical TTFF)
| GNSS module powered off (GNSS_SESSION_SINGLE_FIX=1)
|
| T+46s Satellite TX #1: GPS position + sensor data
|
| T+106s Satellite TX #2: GPS position + sensor data (+60s TR_NOM)
|
| T+166s Satellite TX #3: GPS position + sensor data (+60s TR_NOM)
| SHUTDOWN_NTIME_SAT reached (3/3)
| --> POWER OFF
|
| T+166s Total awake time: ~2.8 minutes
| Device sleeps until next TPL5111 wakeup (~7h later)
|
v
Time
|
| T+0s TPL5111 wakes device
| Boot, check modulo counter --> YES
|
| T+0.1s Pre-operational: check battery
| --> Battery LOW (Low Battery mode)
|
| T+1s Doppler TX #1: battery voltage (3 bytes)
| No GPS, no sensors
|
| T+91s Doppler TX #2: battery voltage (+90s TR_LB)
| LB_SHUTDOWN_NTIME_SAT reached (2/2)
| --> POWER OFF
|
| T+91s Total awake time: ~1.5 minutes
|
v
| Parameter | DTE Key | Type | Range | Default | RSPB | Description |
|---|---|---|---|---|---|---|
| SHUTDOWN_TIMER | PWP01 | UINT | 0-86400 | 0 | 600 | Safety timeout (seconds). Forces powerdown if session exceeds this. 0=disabled. |
| BOOT_COUNTER | PWP02 | UINT | - | 0 | - | Read-only. Current boot count since last active cycle. |
| BOOT_COUNTER_MODULO | PWP03 | UINT | 2-1000 | 2 | 4 | Run active cycle every N wakeups. Higher = less frequent = more battery savings. |
| WAKEUP_PERIOD | PWP04 | UINT | - | 3600 | - | Writable (PWP04); compiled default via build_rspb.sh. TPL5111 wakeup period in seconds (~1h = 3600s); must match the resistor. |
| SHUTDOWN_NTIME_SAT | PWP05 | UINT | 0-65535 | 0 | 3 | Number of satellite TX messages per normal session before powerdown. 0=disabled. |
| Parameter | DTE Key | Type | Range | Default | RSPB | Description |
|---|---|---|---|---|---|---|
| GNSS_EN | GNP01 | BOOL | 0/1 | 1 | 1 | Enable GNSS module. |
| GNSS_ACQ_TIMEOUT | GNP05 | UINT | 10-600 | 120 | 90 | Warm/hot start timeout (seconds). |
| GNSS_COLD_ACQ_TIMEOUT | GNP09 | UINT | 10-600 | 530 | 180 | Cold start timeout (seconds). First fix or no backup battery. |
| GNSS_DYN_MODEL | GNP11 | ENUM | 0-10 | 0 | 6 | Motion dynamics model. 0=Portable, 6=Airborne 1G (birds). |
| GNSS_HACCFILT_THR | GNP21 | UINT | 0+ | 5 | 10 | Horizontal accuracy filter (meters). Accept fix if hAcc < this value. |
| GNSS_MIN_NUM_FIXES | GNP22 | UINT | 1+ | 1 | 1 | Consecutive valid fixes required before accepting. |
| GNSS_SESSION_SINGLE_FIX | GNP30 | BOOL | 0/1 | 0 | 1 | Stop GNSS after first successful fix in session. Saves battery. |
| Parameter | DTE Key | Type | Range | Default | RSPB | Description |
|---|---|---|---|---|---|---|
| TR_NOM | ARP05 | UINT | 30-1200 | 60 | 60 | Normal mode: interval between TX messages (seconds). |
| NTRY_PER_MESSAGE | ARP19 | UINT | 0-86400 | 0 | 0 | Number of times each message is repeated on air (0 = unlimited replay in LEGACY/DUTY_CYCLE/PASS_PREDICTION). RSPB recommended: 0 — replay until the SHUTDOWN_NTIME_SAT powerdown fires. SHUTDOWN_NTIME_SAT (e.g. 3 < 5) goes inert before the TX-count powerdown, so the session idles until SHUTDOWN_TIMER; if a finite N is needed, keep N ≥ SHUTDOWN_NTIME_SAT. |
| ARGOS_RX_EN | ARP32 | BOOL | 0/1 | 1 | 0 | Satellite downlink (RX) — not implemented on SMD builds (RX service never started); keep 0. |
First-message gate exemption. Unlike the turtle/LinkIt builds, RSPB is exempt from the "no TX until a valid GPS fix corrects the clock" gate: a boot-modulo session that fails to fix GPS still transmits its empty (0xFF) position + mortality/sensor packet (alive signal). The gate is compile-time
#ifndef BOARD_RSPB.
| Parameter | DTE Key | Type | Range | Default | RSPB | Description |
|---|---|---|---|---|---|---|
| LB_EN | LBP01 | BOOL | 0/1 | 0 | 1 | Enable low battery mode. When battery < threshold, switch to LB behavior. |
| LB_THRESHOLD | LBP02 | UINT | 0-100 | 10 | 10 | Battery percentage to enter Low Battery mode. |
| LB_GNSS_EN | LBP06 | BOOL | 0/1 | 1 | 0 | Enable GNSS in LB mode. 0 = Doppler-only (no GPS position). |
| LB_SHUTDOWN_NTIME_SAT | LBP14 | UINT | 0-65535 | 0 | 2 | Number of Doppler TX per LB session before powerdown. 0=disabled. |
| TR_LB | ARP06 | UINT | 30-1200 | 240 | 90 | LB mode: interval between Doppler TX (seconds). |
| LB_CRITICAL_THRESH | LBP12 | UINT | 0-100 | 5 | 5 | Battery SOC (%) for critical mode. Below this = immediate poweroff. |
| Parameter | DTE Key | Type | Range | Default | RSPB | Description |
|---|---|---|---|---|---|---|
| UNDERWATER_EN | UNP01 | BOOL | 0/1 | 0 | 0 | Underwater detection. Disabled for aerial birds. |
| DRY_TIME_BEFORE_TX | UNP02 | UINT | 0+ | 1 | 0 | Seconds at surface before TX allowed. 0 = TX immediately. |
| Parameter | DTE Key | Type | Range | Default | RSPB | Description |
|---|---|---|---|---|---|---|
| LED_MODE | LDP01 | ENUM | 0-3 | 1 | 0 | Status LED. 0=OFF, 1=24h mode. Disabled on birds (invisible + wastes energy). |
| EXT_LED_MODE | LDP02 | ENUM | 0-3 | 3 | 0 | External LED. 0=OFF. Disabled on birds. |
These LED patterns fire regardless of the LED_MODE setting — they are critical feedback signals:
| Moment | LED Pattern | Color | Duration | Description |
|---|---|---|---|---|
| Boot modulo skip | Flash | Yellow | 300ms | Device alive but not its turn to run. Powers off after. |
| Boot active cycle | Solid | White | ~1s | Normal boot, proceeding to operational cycle |
| Post-OTA reboot | Flashing fast | Green | 3s | Firmware update applied successfully after reboot |
| OTA BLE transfer | Alternating | Blue/White | During transfer | Firmware upload via BLE in progress |
| OTA CRC verified | Solid | Green | 1.5s | Upload OK, device will reset to apply firmware |
| OTA CRC failed | Flashing | Red | Until next state | Upload corrupted, transfer aborted |
| Battery critical | Solid | Yellow | Until powerdown | SOC below critical threshold, immediate powerdown |
Note: For deployed RSPB trackers,
LED_MODE=0(OFF) is recommended to save battery and avoid disturbing the bird. The LED patterns above are brief (<3s) and only occur during boot or OTA — no LED activity during normal GPS/TX cycles. Surface/dive LEDs (green/blue flash) only apply to underwater-enabled trackers (LinkIt V4 UW), not RSPB.
Requires ENABLE_MORTALITY_SENSOR=1 (auto-enabled on RSPB). Combines AXL activity, body temperature, and GPS stationarity to compute a mortality confidence percentage (0-100%).
WARNING: Mortality detection requires AXL (AXP01=1), Thermistor (THP01=1), and GNSS (GNP01=1) to be enabled. If any sensor is disabled, the algorithm works with partial data only (biased toward ALIVE).
| Parameter | DTE Key | Type | Range | Default | RSPB | Description |
|---|---|---|---|---|---|---|
| MORTALITY_ENABLE | MTP01 | BOOL | 0/1 | 0 | 1 | Enable mortality detection. |
| MORTALITY_ACTIVITY_THRESH | MTP02 | UINT | 0-255 | 10 | 10 | Activity score below which = immobile. |
| MORTALITY_TEMP_THRESH | MTP03 | FLOAT | 0-60 | 25.0 | 25.0 | Body temp below which = hypothermic (°C). Live bird ~40°C. |
| MORTALITY_GPS_DISTANCE_THRESH | MTP04 | UINT | 0-10000 | 50 | 50 | GPS movement below which = stationary (meters). |
| MORTALITY_CONFIRM_DAYS | MTP05 | UINT | 1-30 | 3 | 3 | Days of high confidence before CONFIRMED. |
| MORTALITY_DUTY_CYCLE_MODULO | MTP06 | UINT | 0-100 | 0 | 6 | New BOOT_COUNTER_MODULO when confirmed. 0=never modify. |
| MORTALITY_ORIGINAL_MODULO | MTP07 | UINT | - | 0 | - | Backup of original modulo (auto, read-only). |
Each active session computes a session score (0-100) from three independent indicators:
| Indicator | Points | Condition |
|---|---|---|
| Immobility | 40 pts | AXL activity < MORTALITY_ACTIVITY_THRESH (default 10) |
| Hypothermia | 30 pts | Thermistor temp < MORTALITY_TEMP_THRESH (default 25°C) |
| Stationarity | 30 pts | GPS moved < MORTALITY_GPS_DISTANCE_THRESH (default 50m) AND speed < 0.1 m/s |
Confidence is computed as an exponential moving average:
confidence = (old_confidence * 7 + session_score * 3) / 10
70% weight on history, 30% on current session. This smooths out single bad readings.
confidence >= 50%
ALIVE ─────────────────────────────> SUSPECTED
^ |
| confidence < 50% |
+──────────────────────────────────────+
| |
| consecutive_days >= CONFIRM_DAYS |
| v
+──────────────────────────── CONFIRMED
bird shows life again
Daily evaluation (once per UTC calendar day):
- If
confidence >= 80%→ incrementconsecutive_days - Otherwise → decrement
consecutive_days(floor at 0) - If
consecutive_days >= MORTALITY_CONFIRM_DAYS(default 3) → status = CONFIRMED
When mortality is CONFIRMED and MORTALITY_DUTY_CYCLE_MODULO > 0 (RSPB only):
- Save current
BOOT_COUNTER_MODULOtoMORTALITY_ORIGINAL_MODULO - Set
BOOT_COUNTER_MODULO = MORTALITY_DUTY_CYCLE_MODULO(e.g., 6) - Device wakes less frequently → saves battery on dead bird
If the bird recovers (status returns to ALIVE):
- Restore
BOOT_COUNTER_MODULOfromMORTALITY_ORIGINAL_MODULO - Clear
MORTALITY_ORIGINAL_MODULOto 0
Mortality state (confidence, consecutive_days, status, last positions) is persisted to flash
via a dedicated FsLog partition ("MORTALITY", 64KB). On each evaluation, a MortalityLogEntry
is written. On boot, the last entry is read to restore state across TPL5111 power cycles.
This ensures the confirmation counter survives the complete power-off between wakeups.
The service listens to peer events from:
- AXL sensor → caches activity level (port[4])
- Thermistor → caches body temperature
- GNSS → caches position + speed
Evaluation triggers when GPS data is available AND at least one other sensor has reported. If a sensor is disabled, its indicator scores 0 (biased toward ALIVE). A dead bird will eventually be detected across subsequent sessions even with partial data.
The service writes a MortalityLogEntry to mortality.log on each evaluation, readable via $DUMPD:
| Field | Type | Description |
|---|---|---|
| confidence | uint8 | Current confidence (0-100%) |
| consecutive_days | uint8 | Days with high confidence |
| status | uint8 | 0=ALIVE, 1=SUSPECTED, 2=CONFIRMED |
| last_activity | uint8 | Last AXL activity reading (0-255) |
| last_body_temp | uint16 | Last thermistor reading (raw) |
| last_lat | double | Last GPS latitude |
| last_lon | double | Last GPS longitude |
| last_eval_epoch | uint32 | Epoch of last daily evaluation |
-
Compile-time:
ENABLE_MORTALITY_SENSOR=OFF(default) → zero code on non-RSPB boards -
Runtime:
MORTALITY_ENABLE=false(default) → service disabled, zero impact -
Duty cycle:
MORTALITY_DUTY_CYCLE_MODULO=0(default) → never touches duty cycle
RSPB Satellite Messages:
Three dedicated RSPB packet types (see Satellite Message Format for full decoding):
| Type | Name | Modulation | Bits | When Used |
|---|---|---|---|---|
4 (100) |
RSPB Long | LDA2 | 192 (181 data + 3 reserved + 8 CRC) | Normal mode with GPS fix |
5 (101) |
RSPB Short | LDK | 122 | Normal mode, compact (configurable via RSP01) |
6 (110) |
RSPB Doppler | VLDA4 | 24 | Low battery / no GPS — bird status only |
RSPB Long (with GPS, 192-bit LDA2 frame):
[Type 3b][Time 16b][GPS 51b][Battery 8b][Pressure 29b][Thermistor 14b][AXL X 15b][AXL Y 15b][AXL Z 15b][Activity 8b][Mortality% 7b][reserved 3b][CRC8 8b]
3 + 16 + 51 + 8 + 29 + 14 + 15 + 15 + 15 + 8 + 7 + 3 + 8 = 192 bits (24 bytes)
The CRC8 covers bits 0..183. See 11 — Satellite Communication § F.2 Error correction & CRC for the algorithm.
RSPB Short (with GPS, 122 bits):
[Type 3b][Time 16b][GPS 51b][Battery 8b][Pressure 15b][Thermistor 14b][Activity 8b][Mortality% 7b]
RSPB Doppler (no GPS):
[Type 3b = 110][Battery SOC 7b][Activity 7b][Mortality% 7b] = 24 bits
Mortality confidence (7 bits, 0-100%) is always transmitted in all three packet types when the sensor is enabled, regardless of status — this allows satellite operators to observe the confidence trend.
Note on Low Battery Doppler: Without GPS, the mortality algorithm can only use activity + temperature (max ~70% confidence). The RSPB Doppler still sends the current confidence and activity so operators can see the bird's status remotely.
Note: AXL X/Y/Z axes (15 bits each) are included in RSPB Long for orientation analysis. AXL temperature is dropped. The activity score (8 bits) is included in both Long and Short packets.
| Parameter | DTE Key | Type | Default | RSPB | Description |
|---|---|---|---|---|---|
| PROFILE_NAME | IDP11 | TEXT | FACTORY | RSPB_DEPLOY_V1 | Human-readable deployment profile name. |
Parameters are sent via BLE (Bluetooth) or USB using DTE commands.
Each command starts with $PARMW# followed by the hex-encoded length of the
payload, then a semicolon, then key=value pairs separated by commas.
Send these commands one by one via BLE (LinkIt app) or USB terminal:
GNSS timeouts (faster, save battery on GPS failure)
$PARMW#00E;GNP09=180,GNP05=90\r
Safety shutdown timer (10 minutes max per cycle)
$PARMW#00A;PWP01=600\r
Duty cycle: active every 4th wakeup (~7 hours)
$PARMW#009;PWP03=4\r
GNSS for bird flight (airborne model, relaxed accuracy)
$PARMW#015;GNP11=6,GNP21=10,GNP22=1\r
Argos TX: no RX, 3 repetitions, no surface wait
$PARMW#016;ARP32=0,ARP19=3,UNP02=0\r
Disable underwater detection
$PARMW#009;UNP01=0\r
LEDs off (invisible on bird, save energy)
$PARMW#00E;LDP01=0,LDP02=0\r
Session shutdown: 3 TX then powerdown, no GNSS re-acquisition
$PARMW#013;PWP05=3,GNP30=1\r
Low battery: enable, no GPS, 2 Doppler TX, 90s interval
$PARMW#01C;LBP01=1,LBP06=0,LBP14=2,ARP06=90\r
Profile name
$PARMW#015;IDP11=RSPB_DEPLOY_V1\r
To verify a parameter was set correctly:
$PARMR#005;PWP05\r
Response: $O;PARMR#007;PWP05=3\r
To read all parameters at once:
$PARMR#000;\r
Perform these steps before attaching the tracker to the bird. Device must be in Configuration mode (BLE connected).
$PWRON#001;2\r
Place device flat on a level surface, then:
$SCALW#005;0,3,0\r # Auto-calibrate (measures 200 samples, ~3 seconds)
Verify:
$SCALR#003;0,1\r # X calibrated → should be ~0.00g
$SCALR#003;0,2\r # Y calibrated → should be ~0.00g
$SCALR#003;0,3\r # Z calibrated → should be ~1.00g
$SCALW#005;0,6,0\r # Save to flash
Pass criteria: X ≈ 0.00g, Y ≈ 0.00g, Z ≈ 1.00g (±0.05g)
Look up current sea level pressure from a nearby weather station (hPa):
$SCALW#00D;1,0,1013.250000\r # Set sea level pressure
$SCALR#003;1,0\r # Verify → 1013.250000
Place device at a known temperature (e.g., next to a reference thermometer showing 23.5°C):
$SCALW#009;7,1,23.5\r # Calibrate at 23.5°C (firmware measures 10 samples)
$SCALR#003;7,0\r # Read offset → e.g., -1.2 (sensor was reading 1.2° too high)
Pass criteria: $SENSR#002;16,1\r → thermistor_temp ≈ reference temp (±0.5°C)
$SENSR#004;255,10\r
Check in response:
- Battery: 3200-4200 mV, SOC 0-100%
- Pressure: ~1013 hPa
- Accel: X≈0, Y≈0, Z≈1
- Thermistor: ≈ reference temperature
- sensor_status (field 19): bits 0-4 set (≥ 0x1F)
The RSPB board has specific power rail behavior distinct from LinkIt V4:
- SENSORS_PWR_PIN is always ON at boot. The I2C pull-ups (R21, R24) are connected to the DCDC_3V3 rail controlled by this pin — cutting it would disable I2C communication with all sensors. (FIXME: future HW revision should route pull-ups to an always-on rail.)
-
POWER_CONTROL_PIN controls the main board power rail (SMD, sensors, peripherals). During deep idle (
enter_deep_idle()innrf_pmu.cpp), this pin is driven LOW to cut the rail. On wake (exit_deep_idle()), it is restored HIGH. This provides the lowest quiescent current between TPL5111 wakeups. - VPA_EN (SMD voltage power amplifier): driven LOW when the SMD is powered off to prevent leakage; released to high-impedance when the SMD is powered on so the PA supply operates normally.
-
Deep idle (
enter_deep_idle()/exit_deep_idle()innrf_pmu.cpp): cuts the POWER_CONTROL_PIN rail, puts unused GPIOs in safe state, and enters System OFF. On TPL5111 wakeup,exit_deep_idle()restores the rail before any peripheral access.
| Phase | Duration | Current | Energy per cycle |
|---|---|---|---|
| Boot + modulo check (skip) | ~50ms | 5 mA | ~0.07 uAh |
| Boot + pre-operational | ~0.2s | 5 mA | ~0.3 uAh |
| GNSS acquisition (typical) | ~45s | 25 mA | ~312 uAh |
| GNSS acquisition (worst: cold) | 180s | 25 mA | ~1250 uAh |
| Satellite TX (x3, 60s interval) | ~180s | 15 mA avg | ~750 uAh |
| Total per active cycle (typical) | ~3 min | - | ~1.1 mAh |
| Total per active cycle (worst) | ~6 min | - | ~2.3 mAh |
With modulo=4 (one active cycle per ~7h): ~3-8 mAh per day NCR18650 battery (3400 mAh): theoretical ~400-1000 days without solar. With solar panels: effectively indefinite in good conditions.
- Check
SHUTDOWN_NTIME_SAT(PWP05) is not 0 — if 0, only SHUTDOWN_TIMER controls session end - Check
GNSS_EN(GNP01) is 1 - Check
ARGOS_RX_EN(ARP32) — if 1, device spends 15min listening before TX
- Check GNSS timeouts:
GNP09(cold) andGNP05(warm) may be too short - Check
GNSS_HACCFILT_THR(GNP21) — if too low, fixes are rejected - Check
GNSS_DYN_MODEL(GNP11) — wrong model can prevent lock
- Increase
BOOT_COUNTER_MODULO(PWP03) for less frequent cycles - Reduce
SHUTDOWN_NTIME_SAT(PWP05) for fewer TX per session - Ensure
ARGOS_RX_EN(ARP32) is 0 - Ensure LEDs are off:
LDP01=0,LDP02=0 - Reduce
GNSS_COLD_ACQ_TIMEOUT(GNP09) to fail faster on bad GPS conditions
- Check
LB_EN(LBP01) is 1 - Check
LB_THRESHOLD(LBP02) — battery % must be below this value
-
SHUTDOWN_TIMER(PWP01) should be > 0 as a safety net - Recommended: 600s (10 minutes)