TORUS is an Unattended Air Ground Visual Sensor (UAGVIS) platform. This document tracks the whole system: the fielded TORUS-SN ground node (hardware + Zephyr firmware), the TORUS-MEG gateway and TORUS-CCISRT command layer (concept + datasheets), and the Isaac Sim deployment simulation.
The current board supersedes the original ESP32-C3/SX1268 concept in the README. It is an 80 × 55 mm 4-layer node: ESP32-S3-WROOM-1 host, LR1110 (LoRa 433 MHz + GNSS + WiFi-scan), OPA2134/MCP4017 geophone AFE with LM393 hardware wake, 2× INMP441 I2S microphones, DS3231 RTC, TP4056 + AMS1117 power, 3× TPS22918 gated rails. 91 parts, 68 nets.
hw/torus_design.py defines parts, nets,
footprints, GPIO→pad mapping, net classes, and an explicit engineering-flags list.gen_sch.py; ERC clean. ERC caught a real
design bug (missing VBAT monitoring divider), fixed with R29/R30/C54.release.sh runs N builds
and keeps the best (router is non-deterministic), polish.py post-processes
(fab-layer refs, redundant via removal, silk fixes, island removal).hw/gerbers/, hw/fabrication/, hw/3d_models/setup-kicad10.sh → kpython / kcli.sh), all API breaks handled.| Finding | Count | Assessment |
|---|---|---|
| Copper-to-edge clearance | 5 | Edge-launch SMA / USB-C pads, by design, waivable |
| Clearance | 11 | Sub-0.2 mm squeezes near the LR1110 fanout, review, likely acceptable |
| Solder-mask bridges | 2 | Cosmetic; check fab's minimum mask sliver |
| Shorting items | 1 | Zone-pair bookkeeping artifact |
| Unconnected items | 3 | LR1110_IRQ, short VCC_LR1110 stub, one zone pair, ~10 min of hand routing |
src/main.c: duty-cycled main loop,
watchdog, interrupt-driven wake (LoRa DIO1, RTC alarm), power-gate management.src/lora_handler.c on the Zephyr LoRa API
(SX126x driver): config, TX, sleep/wake.src/gps_handler.c: UART NMEA sentence parser.boards/riscv/torus_iot_edge (device tree,
Kconfig, CMake) with user & developer guides; builds with
west build -b torus_iot_edge.docs/.The firmware/hardware gap is the project's main debt: everything in
src/ and boards/ targets the earlier ESP32-C3 + SX1268 + AB1805 +
LC76G + SPI-camera design. The built board is ESP32-S3 (Xtensa) + LR1110 + DS3231 +
I2S mics + I2C digipot, with no camera. The application architecture carries over;
the BSP and every driver binding must be ported.
torus-ccisrt/
ships a shared event schema, ingest adapter, persistent store with replay, correlation /
track fusion, capability-based roles (viewer, field-operator, operator, analyst, admin,
root, gateway), OpenTelemetry telemetry from nodes and the gateway, a live web COP, and an
Electron shell. Verified end-to-end by npm run smoke.torus-isaac-sim/ ships a
dependency-free planner (ring placement, seismic detection model, SVG output) with rural
and urban scenarios, plus an NVIDIA Isaac Sim scene script for the full twin.| # | Task | Effort |
|---|---|---|
| 0.1 | Hand-finish the 3 unconnected nets (LR1110_IRQ, VCC_LR1110 stub, zone pair) in the KiCad GUI | ~10 min |
| 0.2 | Verify the 6 engineering FLAGS: MINI-1→WROOM-1 substitution impact; USB on GPIO35/36 vs native GPIO19/20; MCP4017, SKY13350, SPF5189Z pin orders; LR1110 pad geometry vs production datasheet | hours |
| 0.3 | Decide the USB programming path: move D±to GPIO19/20 or add a USB-UART bridge | design call |
| 0.4 | Review AMS1117 quiescent current against sleep-current targets (original spec targeted ~8-9 µA; an LDO swap may be needed) | design call |
| 0.5 | Review the 11 LR1110-area clearance violations against the chosen fab's rules | ~1 h |
| # | Task | Notes |
|---|---|---|
| 1.1 | New Zephyr board for ESP32-S3 (Xtensa) | Replace the RISC-V torus_iot_edge BSP; new device tree from torus_design.py pin map |
| 1.2 | LR1110 driver integration | LoRa + GNSS scan + WiFi scan; Semtech SWL2001/LR11xx driver port, replaces SX126x path |
| 1.3 | I2S stereo capture for 2× INMP441 | New acoustic subsystem; feeds TinyML classification |
| 1.4 | DS3231 RTC support | Replaces AB1805 handler; wire 32 kHz output usage for LR1110 GNSS |
| 1.5 | MCP4017 gain control over I2C | Replaces SPI MCP41010 driver |
| 1.6 | Wake-on-seismic path (LM393 → GPIO wake) and TPS22918 rail gating | Deep-sleep state machine update |
| 1.7 | Retire camera support | TORUS-SN carries no camera; drop the Arducam code path |
| 1.8 | Battery telemetry via ADC_VBAT divider | New on this rev (R29/R30) |
| # | Task | Notes |
|---|---|---|
| 2.1 | TORUS-MEG gateway detailed design & build | Take the datasheet concept to schematic/PCB; 433 MHz concentrator, Jetson carrier, power; implement cluster membership, leader election, and HA failover; P2P vs LoRaWAN decision pending |
| 2.1b | TORUS-CCISRT command software build | Fusion core + COP + field app from the C2 datasheet; define the SN/MEG event schema first |
| 2.2 | Enclosure design | Autodesk Fusion, importing hw/3d_models/TORUS-SN.step |
| 2.3 | Update README to the TORUS-SN architecture | Still documents the superseded ESP32-C3/SX1268 design |
| 2.4 | gen_bom.py, BOM with manufacturer part numbers | Planned in torus_design.py header; current BOM is value/footprint only |
| 2.5 | Push the 3 unpushed commits on main | KiCad 10 migration + GLB export work |
| 2.6 | Bring-up & validation plan execution | Power, peripherals, AFE calibration, LoRa range, GNSS TTFF, sleep-current measurement (README §9) |
| 2.7 | Isaac Sim twin: terrain import + physics seismic | Extend torus-isaac-sim beyond the starter: GIS/heightmap terrain, PhysX-based detection, visual-mast sensors |
| 2.8 | SN-V2 SDR carrier hardware design | Design brief done (hw/variants/sn-v2-sdr.md); Zynq + AD9363 phase 1 carrier stacked on the V1 board; no schematic/PCB yet |
| 2.9 | SN-V3 wired optical hardware design | Design brief done (hw/variants/sn-v3-optical.md); host swap for RMII EMAC + 100BASE-FX PHY, or ADIN1110 T1L fallback; no schematic/PCB yet |
| 2.10 | SN-V4 transducer interlock daughterboard | Design brief done (hw/variants/sn-v4-transducer.md); hardware three-condition interlock, fail-safe de-energized; no schematic/PCB yet |
| Piece | Location / command |
|---|---|
| KiCad 10 (AppImage) | /opt/kicad · wrappers: kpython, kcli.sh (setup-kicad10.sh) |
| Full hardware build | hw/build.sh (REUSE_SES=1 skips ~3 min routing) |
| Best-of-N release | hw/release.sh |
| Schematic + BOM | hw/build_sch.sh |
| Firmware build | west build -b torus_iot_edge |
Pipeline gotchas already solved (encoded in the scripts, don't fight them):
zone fill must run as a subprocess on the saved board; kicad-cli exports
without refilling zones; Freerouting hangs on stacked pre-placed vias; several library
footprints ship board-blanketing antenna keepouts that must be stripped.
Trademarks & third-party notice. TORUS is an independent platform. Company names and product model numbers referenced in this document (including but not limited to Semtech, Teledyne FLIR, R.T. Clark, InvenSense, Texas Instruments, Microchip, Espressif, Analog Devices / Maxim Integrated, and NVIDIA) are used solely for engineering and bill-of-materials identification and imply no affiliation with or endorsement by those companies. Supply of any such third-party product or component to the designers, manufacturers, integrators, or evaluators of the TORUS platform remains at the sole discretion of the respective owning company, organisation, or legal entity. All trademarks are the property of their respective owners.