
BPV4 Collar 2nd board
rees3901/BluepawsV4
version 4 of my on-going cat tracker project. this differs in structure in that both the TX collar and Rx homehub will be in the same repo to ensure intercompatability

version 4 of my on-going cat tracker project. this differs in structure in that both the TX collar and Rx homehub will be in the same repo to ensure intercompatability
BPV4 CollarEVAL is an open-source printed circuit board by rees3901, from the rees3901/BluepawsV4 repository on GitHub. It is a 2-layer board of 100 × 50 mm with 58 parts on 82 nets, routed with 584 tracks and 51 vias.
It is built around the RAK4630, TPS62840DLCR and BQ24074RGTR, with the LIS2DW12TR-MS, USBLC6-2SC6 and CPT-7502-65-SMT-TR among its other parts. Its parts include 17 resistors, 13 capacitors, 7 connectors, 6 ICs and 4 diodes.
Unified firmware repository for the Bluepaws animal tracker system. Both the transmitting collar and receiving home hub share a single codebase with a common TLV binary protocol and configuration library.
| Component | MCU | Radio | Connectivity |
|---|---|---|---|
| Collar | nRF52840 | SX1262 LoRa | Sequans Monarch 2 GM02SP (LTE-M/NB-IoT + GNSS), BLE |
| Home Hub | ESP32-S3 | SX1262 LoRa | WiFi, BLE beacon |
Data paths:
Battery target: 30+ days at 10-minute wake intervals.
| Part | Role | Key Specs |
|---|---|---|
| nRF52840 (Seeed XIAO BLE Sense) | Collar MCU | ARM Cortex-M4F, BLE 5.0, 256KB RAM |
| SX1262 | LoRa transceiver | 150 MHz-960 MHz, +22 dBm, LoRa/FSK |
| Sequans Monarch 2 GM02SP | Cellular + GNSS | LTE Cat M1/NB-IoT, integrated GNSS, 1uA deep sleep, 23 dBm TX, EAL5+ secure enclave, iSIM, single 2.2V rail, global bands |
| ESP32-S3 (Seeed XIAO) | Hub MCU | Dual-core, WiFi, BLE 5.0, 512KB SRAM |
The Sequans GM02SP replaces the previous BG77 + L76K combination. A single module handles both cellular IoT and GPS positioning, simplifying the collar BOM and reducing power draw.
The separate walter PlatformIO target exercises real GM02SP LTE/GNSS on an
ESP32-S3 Walter board, with a simulated LoRa transmit step and its own independent
collar ID 1010. It does not replace or alter the WisMesh collar firmware.
See Walter setup and commissioning before provisioning
credentials or flashing. It boots idle and is not a default build/upload target.
The top level is organised by responsibility. Firmware stays under the physical
product it runs on; the two Home Hub implementations are grouped together so
that hub and home-hub no longer appear to be separate products.
BluepawsV4/
├── README.md # Repository overview
├── docs/
│ ├── protocol/ # Wire formats and commands
│ ├── firmware/collar/ # Collar design and test notes
│ ├── firmware/home-hub/ # Home Hub design and test notes
│ ├── operations/ # Runbooks and release readiness
│ └── development/ # Environment strategy and backlog
├── pcb/collar/ # Collar PCB projects and vendor libraries
├── platformio.ini # Multi-environment build config
├── shared/lib/BluepawsProtocol/ # Shared protocol & config
│ ├── README.md # Protocol implementation notes
│ ├── library.json # PlatformIO library manifest
│ ├── bp_protocol.h # Shared protocol implementation header
│ └── bp_config.h # LoRa params, profiles, timing
├── collar/ # nRF52840 collar firmware
│ ├── src/main.cpp
│ └── include/collar_pins.h
├── hub/ # All Home Hub implementations
│ ├── platformio/ # Heltec ESP32-S3 prototype + LittleFS UI
│ ├── esp-idf-p4/ # ESP32-P4 production testbed
│ ├── maps/ # Offline map-pack inputs and guidance
│ └── tests/esp-idf-p4/ # Host tests for the P4 core
├── diagnostics/The hub serves a real-time tracking dashboard over WiFi, built with Leaflet.js and Server-Sent Events (SSE).
Device Cards - each tracked animal gets a card in the left sidebar showing:
Map Features:
Connection Monitoring:
Simulates animals with live SSE telemetry for local GUI development:
node tools/mock-server.js
# http://localhost:3000
# Streams position updates every 2s + heartbeat every 5sweb/ contains the Vercel-ready Next.js and TypeScript refactor of the hub dashboard. It preserves the embedded GUI in hub/platformio/data/, reads the latest live positions from Supabase by default, and confines mock telemetry to tutorial mode.
cd web
npm install
npm run devFor Vercel, import this repository and select web as the project Root Directory. Leave the Install, Build, and Output settings at their detected Next.js defaults. See web/README.md for the exact deployment settings and the planned HTTPS Edge Function -> Supabase -> Realtime data path.
The cloud ingestion schema, device registry, and authenticated Edge Function are under supabase/. See tools/VPS_SIMULATOR.md for the Ubuntu VPS client and tools/TLV_SIMULATOR_GUI.md for the desktop packet-builder and manual HTTPS test console.
The existing Supabase BluepawsV4 project is the permanent DEV/Test environment. Production will use a separate clean Supabase project reconstructed from the version-controlled migrations in this repository. Development and simulator data must not be migrated into production.
The same GitHub repository and Vercel project are used for both environments, with Vercel environment configuration selecting the appropriate Supabase project.
See:
docs/development/DEV_TO_PROD_STRATEGY.md for the authoritative promotion strategy and decision record.docs/development/ENVIRONMENT_MATRIX.md for DEV vs PROD separation rules.docs/operations/PRODUCTION_READINESS_CHECKLIST.md for the pre-launch security and operational checklist.The canonical protocol document is:
docs/protocol/TLV_PROTOCOL_V1_2.mdThe system is moving away from production JSON telemetry. JSON remains useful for debugging, logs, exports and admin APIs, but LoRa and cellular telemetry should use the compact binary TLV packet.
Locked packet shape:
[32-byte fixed header][0-24 bytes TLV][8-byte HMAC-SHA256 tag]Packet size:
minimum = 40 bytes
maximum = 64 bytes| Offset | Size | Field | Type | Notes |
|---|---|---|---|---|
| 0 | 1 | ver | u8 | Protocol version |
| 1 | 2 | device_guid16 | u16 | Immutable collar identity |
| 3 | 2 | msg_seq_id | u16 | Per-device rolling sequence |
| 5 | 4 | time_unix | u32 | UTC timestamp |
| 9 | 1 | state | u8 | Packed status + power profile |
| 10 | 1 | flags | u8 | Core bitfield |
| 11 | 1 | tx_reason | u8 | Transmission reason enum |
| 12 | 4 | lat_e7 | i32 | Latitude x 10000000 |
| 16 | 4 | lon_e7 | i32 | Longitude x 10000000 |
| 20 | 2 | batt_mV | u16 | Battery voltage |
| 22 | 2 | acc_m | u16 | Accuracy in metres |
| 24 | 2 | fix_age_s | u16 | GNSS fix age |
| 26 | 1 | sat_count | u8 | Satellite count |
| 27 | 4 | hdr_rsvd | u8[4] | Reserved, set 0 |
| 31 | 1 | tlv_len | u8 | 0-24 TLV bytes |
The 8-byte tag is the first eight bytes of HMAC-SHA256 over the complete header and TLV section. The same authenticated binary packet is preserved across LoRa and LTE paths; path-specific RF and gateway details live only in the HTTPS JSON wrapper. See the canonical document for enums, selected TLVs, validation rules and examples.
Collar --LoRa--> Hub --REST POST--> Cloud
Collar --LTE-M/Cat-M1 REST POST--> CloudBoth paths preserve the original authenticated packet, including (device_guid16, msg_seq_id, time_unix). The hub relays the collar bytes without changing them. Redundancy is intentional for reliability.
Canonical retry deduplication is handled in the cloud using:
SHA-256(complete authenticated packet)Reuse of (device_guid16, msg_seq_id, time_unix) with different packet content
is treated as an identity conflict rather than an overwrite.
Hub CSV or debug log format should be derived from decoded TLV fields, not treated as the production on-air format.
Requires PlatformIO.
# Build both targets
pio run
# Build collar only
pio run -e collar
# Build hub only
pio run -e hub
# Upload to connected device
pio run -e collar -t upload
pio run -e hub -t upload| Profile | TX Power | Interval | Cellular | Remarks |
|---|---|---|---|---|
| Normal | 19 dBm | 10 min | 1:10 | Daily tracking, balanced power and update frequency |
| PowerSave | 10 dBm | 30 min | 1:30 | At home or battery conservation, reduced TX power and longer sleep |
| Active Find | 19 dBm | 1 min | 1:5 | Cat is outside geofence or user is actively searching |
| Emergency Lost | 22 dBm | 30 s | 1:3 | User needs frequent updates for retrieval, then fallback to Active Find |
| Qty | Value | Footprint | References |
|---|---|---|---|
| 6 | 1k | Resistor_SMD:R_0402_1005Metric | R2, R5, R10, R13, R14, R17 |
| 5 | 100nF | Capacitor_SMD:C_0402_1005Metric | C3, C9, C10, C12, C13 |
| 5 | 10k | Resistor_SMD:R_0402_1005Metric | R4, R8, R9, R15, R16 |
| 4 | 10uF | Capacitor_SMD:C_0201_0603Metric | C4, C5, C11, C14 |
| 3 | Fiducial | Fiducial:Fiducial_0.5mm_Mask1mm | FID1, FID2, FID3 |
| 3 | LED | LED_SMD:LED_0402_1005Metric | D1, D3, D4 |
| 2 | 1M | Resistor_SMD:R_0402_1005Metric | R6, R7 |
| 2 | 1uF | Capacitor_SMD:C_0402_1005Metric | C2, C8 |
| 2 | 4.7k | Resistor_SMD:R_0402_1005Metric | R1, R3 |
| 2 | 5.1k | Resistor_SMD:R_0402_1005Metric | R11, R12 |
| 2 | M2_Screw | MountingHole:MountingHole_2.2mm_M2_Pad_Via | MH1, MH2 |
| 2 | SJ_2_Br | Jumper:SolderJumper-2_P1.3mm_Bridged_RoundedPad1.0x1.5mm | JP1, JP16 |
| 2 | SW_Push | Button_Switch_SMD:SW_SPST_B3U-1000P | SW1, SW2 |
| 1 | 2.2uH | Inductor_SMD:L_0201_0603Metric | L1 |
| 1 | BQ24074RGT | Package_DFN_QFN:VQFN-16-1EP_3x3mm_P0.5mm_EP1.6x1.6mm | U2 |
| 1 | C 100nF | Capacitor_SMD:C_0402_1005Metric | C6 |
| 1 | C 10uF | Capacitor_SMD:C_0201_0603Metric | C1 |
| 1 | CPT-7502-65-SMT-TR | CPT-7502-65-SMT-TR:XDCR_CPT-7502-65-SMT-TR | BZ1 |
| 1 | Conn_01x02_Pin | Connector_PinHeader_1.00mm:PinHeader_1x02_P1.00mm_Vertical | J7 |
| 1 | Conn_01x03 | Connector_JST:JST_SH_SM03B-SRSS-TB_1x03-1MP_P1.00mm_Horizontal | J1 |
| 1 | Conn_01x04 | Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_Vertical | J3 |
| 1 | Conn_01x05 | Connector_PinHeader_1.00mm:PinHeader_1x05_P1.00mm_Vertical | J2 |
| 1 | Conn_01x06 | Connector:Tag-Connect_TC2030-IDC-NL_2x03_P1.27mm_Vertical | J6 |
| 1 | Conn_01x08 | Connector_JST:JST_SH_SM08B-SRSS-TB_1x08-1MP_P1.00mm_Horizontal | J5 |
| 1 | DMG2305UX-13 | LIB_DMG2305UX-13:SOT96P240X120-3N | D2 |
| 1 | LIS2DW12TR | LIS2DW12TR:LGA12R50P4X4_200X200X70 | U6 |
| 1 | MAX17048G_T10 | MAX17048G_T10:SON50P200X200X80-9N | U1 |
| 1 | RAK4630 | RAK4630:RAK4630 | IC1 |
| 1 | TPS62840DLCR | TPS62840DLCR:SON50P200X150X100-8N | U3 |
| 1 | USBLC6-2SC6 | Package_TO_SOT_SMD:SOT-23-6 | U4 |
| 1 | USB_C_Receptacle_USB2.0_14P | Connector_USB:USB_C_Receptacle_GCT_USB4105-xx-A_16P_TopMnt_Horizontal | J4 |

rees3901/BluepawsV4
version 4 of my on-going cat tracker project. this differs in structure in that both the TX collar and Rx homehub will be in the same repo to ensure intercompatability


aliaksei-lameyka/ENKU-Clock
Open, repairable, local-first e-paper alarm clock.

marcelpetrick/sensorly-unhinged
My very first PCB: an ESP32-C6 temperature/humidity sensor prototype, exploring compact and thermally isolated layouts from one shared electrical design.


FelixStA52/BRACHIOSAURUS
Boxed Recorder Analyzing Change in Height of Ice with On Site Accelerometer and Ultrasonic Readers Utilizing Support (BRACHIOSAURUS)


Kev1n8088/OshTelemega
The Mega3080 FCU is an evolved clone of the Altus Metrum Telemega. Using the same firmware (meaning the same sensor suite), the primary developments are: - USB-C - Wago style spring terminals - Better GPS RF routing…

It measures 100 × 50 mm and has 2 copper layers, 1.6 mm thick.
58 parts, built around the RAK4630, TPS62840DLCR, BQ24074RGTR and LIS2DW12TR-MS. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the rees3901/BluepawsV4 repository on GitHub, at the commit this page was made from: the board is pcb/collar/BPV4_Collar/Eval boards/Main board/BPV4_CollarEVAL/BPV4_CollarEVAL.kicad_pcb and its schematic pcb/collar/BPV4_Collar.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository states no licence, so its author keeps all rights: ask rees3901 before reusing the design.