Conventional robotic systems centralise control. A planner, scheduler, or feedback loop sits above sensor and actuator drivers and issues commands. This is structurally fragile: the controller is a single point of failure, latency scales with system size, and the substrate becomes increasingly difficult to grow without re-architecting the central layer.
Distributed adaptive coupling [1, 2, 3] proposes an alternative: each element of the substrate makes its own local decisions, communicates only with immediate neighbours, and degrades gracefully when sub-elements fail. Such systems are studied in the context of cellular automata, swarm robotics, and active matter, but practical implementations that combine adaptive structural coupling with self-repair routing on commodity hardware have remained scarce.
We describe a lattice in which each node simultaneously operates as a sensor (load detection), actuator (magnetic coupling), router (neighbour-only message forwarding) and energy store (supercapacitor). The lattice's only governance is a six-line phase-selection rule and a heartbeat-driven Bellman-Ford routing table per node. We provide an executable Python reference implementation, a live HTTP-observable instance running at 60 Hz, and a £3.83-per-node hardware specification using the ESP32-C3, a 5 F supercapacitor, and a Hall-effect-sensed coil with H-bridge driver.
The aim of this preprint is not to claim a solved system. It is to expose a minimal primitive — adaptive local coupling without a global controller — to external instrumentation and stress, and to enumerate the engineering observables a hardware build will need to verify.
Nodes are arranged on a hexagonal close-packed (HCP) lattice with row offset of half-spacing on alternate rows. Each interior node has six geometric neighbours at distance d; edge and corner nodes have fewer (typically 3–4). Inter-node spacing in the simulator is 10 mm; the hardware target is 15 mm, dictated by minimum PCB size for the per-node component set (§5).
Each node maintains:
| State | Type | Range |
|---|---|---|
| energy | scalar | 0 ≤ E ≤ Emax (≈18.2 J at 5 F · 2.7 V) |
| phase | integer | 0 (dormant) — 5 (fused) |
| load | scalar | applied force in newtons |
| damage | scalar | 0 ≤ D ≤ 1 (1 = destroyed) |
| alive | boolean | true while D < 1 |
| heartbeats | map[id → timestamp] | last receipt from each neighbour |
| routes | map[dest → next-hop] | destination node id → first-hop neighbour |
Crucially, no node holds global state. Each acts only on data it samples or receives directly from its six neighbours.
| Phase | Name | Use |
|---|---|---|
| 0 | Dormant | No current; no coupling; minimum draw. |
| 1 | Sensing | Low-current bias; reads neighbour heartbeats. |
| 2 | Active grip | Adaptive coupling for delicate contact. |
| 3 | Load-bearing | Stable static coupling under moderate force. |
| 4 | Rotation lock | High-current coupling resisting torque. |
| 5 | Fused permanent | Saturated; resistant to dislodgement. |
Each node selects its phase φ(n) at every control tick using the following rule, written here in compact form:
if E(n) < E_max · 0.05: return 0 # browned out
if D(n) > 0.5: return 1 # injured — sense only
if L(n) > 8 N: return 5 # fused
if L(n) > 4 N: return 4 # rotation lock
if L(n) > 1.5 N: return 3 # load-bearing
if L(n) > 0.2 N: return 2 # grip
return 1 # baseline sense
The rule is intentionally piecewise and parsimonious. Each branch references only state local to the node. There is no consensus, no leader election, no global optimisation step.
Energy flows between live adjacent nodes n, m via a resistive coupling of conductance G = 1/R with R ≈ 0.2 Ω in the simulator. Per-tick energy transfer is:
where k is a unit-scaling constant (10⁻³ in the present implementation) compensating for the fact that the simulator uses Joule potential as a proxy for capacitor voltage. In hardware, the constant is replaced by direct measurement of capacitor voltage at each node and the gradient is computed from V(n) − V(m).
Energy is consumed by phase activity at a rate proportional to phase squared:
This reflects the empirical I²R loss in coil drivers: higher coupling phases require larger continuous current.
Each node maintains a routing table mapping destination node IDs to a next-hop neighbour ID. Routes are bootstrapped at boot from the (geometric) neighbour list. Every tick, a node observes its neighbours' announced routes (via heartbeat payloads) and adopts any new destination that is not already in its own table:
for each live neighbour nb:
for each (dest, hop) in nb.routes:
if dest != self.id and dest not in self.routes:
self.routes[dest] = nb_id # next hop is nb itself
This is a degraded Bellman-Ford that does not minimise hop count — it minimises convergence time. Hop-count optimisation is left for a later iteration once the failure-recovery primitive is verified.
Every live node broadcasts a single-byte presence frame to its neighbours every THB = 16 ms (62.5 Hz). A neighbour is considered alive if at least one heartbeat has been received within Ttimeout = 150 ms. The 9× margin between heartbeat period and timeout absorbs single-frame loss without false-positive failure declarations.
On detection of a dead neighbour m by node n:
1. remove all routes (dest, hop=m) from n.routes
2. re-import routes from each surviving neighbour nb ≠ m:
for each (dest, hop) in nb.routes:
if dest != n.id and dest not in n.routes:
n.routes[dest] = nb_id
3. continue normal phase-selection cycle
The recovery is bounded by the longest path in the surviving sub-graph and by the heartbeat period: in a 100-node lattice with one node killed, route tables typically converge within 3–4 ticks (≈50–67 ms simulated, ≈50–80 ms in hardware, ESP-NOW dependent).
Damage accumulates only on a node that is operating below its load capacity:
with α ≈ 1 / 1000 ticks. A node operating at the correct phase for its load does not accumulate damage. This couples the failure model to the adaptive coupling rule: the system protects itself only if its phase decisions track applied force.
| Part | Specification | Supplier | £/unit |
|---|---|---|---|
| Microcontroller | ESP32-C3 (RISC-V, 160 MHz, Wi-Fi + ESP-NOW) | Espressif / Mouser | 1.50 |
| Energy storage | 5 F · 2.7 V supercapacitor (≈18.2 J) | Eaton HV / Farnell | 0.30 |
| Magnetic sensor | Allegro A1324 Hall-effect linear (5 mT FS) | Allegro / Mouser | 0.40 |
| Coupling coil | 1 mm enamelled wire, 30 turns, 6 mm OD ferrite core | Aliexpress wholesale | 0.20 |
| H-bridge driver | TI DRV8837 (1.8 A peak, 11 ns flip) | TI / Digi-Key | 0.60 |
| Boost regulator | TI TPS61023 (supercap → 3.3 V) | TI / Mouser | 0.50 |
| PCB | 2-layer, 15 mm hex, JLCPCB Q100 panel | JLCPCB | 0.18 |
| Passives | 0402 R, C, beads (reel cost / panel) | LCSC | 0.15 |
| PER NODE TOTAL | £3.83 | ||
| 100-node panel + JLCPCB SMT assembly (1 panel) | £633 | ||
Per node, the worst-case continuous draw at φ = 5 is approximately 1.6 W (DRV8837 driving a 1 Ω coil at 1.4 A, plus 50 mW MCU + ancillaries). A 5 F supercapacitor at 2.7 V holds 18.2 J, sufficient for ≈11 s of continuous fused operation between recharges. Phase-3 load-bearing draws ≈0.6 W and lasts ≈30 s. Idle phase-1 draws ≈30 mW and lasts ≈10 minutes between recharges. These figures imply a 100-node panel under heavy mixed load dissipates 30–50 W total, well within natural convection cooling for a 30 cm × 30 cm aluminium back-plate.
The reference simulator is a 100-node HCP lattice (10 × 10) running at 60 Hz on a single Python thread. The runtime exposes /api/dent/state, /api/dent/telemetry, and /api/dent/routes/{id} for external inspection. Live telemetry endpoint Interactive demonstrator
Starting from a uniform initial energy distribution drawn from U(0.6, 1.0) · Emax, the substrate equalises to within ≈3% energy variance across all live nodes within ≈30 ticks (500 ms). With the 4-second simulated supercap recharge wave engaged, the total energy traces a saw-tooth profile with peak-to-trough amplitude of ≈40% Emax.
Killing a randomly selected interior node and observing route re-convergence: in 1000 trials, the mean number of ticks for surviving neighbours to remove all stale routes through the dead node is 2.4 (σ = 0.7). Restoration of full any-to-any reachability across the surviving sub-graph completes within 4–5 ticks for 1-node failures, and within 8–11 ticks for clusters of up to 15 simultaneous failures.
Under a synthetic load profile applying 6 N at six corner nodes, the steady-state phase histogram shows ≈85% of the lattice in phase 1 (sensing baseline), ≈9% in phase 2 (grip), and the loaded corners holding phase 4–5. The sharp boundary between coupled and uncoupled regions matches the per-node load thresholds in §3.1.
With no induced packet loss, the heartbeat-health metric (fraction of live links responding within 50 ms) holds at 0.99 ± 0.01. Under simulated 5% random packet loss the metric drops to ≈0.95 with no observable cascading failures because the heartbeat timeout (150 ms) is 9× the heartbeat period (16 ms).
Several engineering risks remain unresolved at this preprint stage. They are listed without minimisation.
The ESP32-C3 has no hardware-synchronised clock with its peers. ESP-NOW provides millisecond-class delivery but no guaranteed ordering. Under high traffic, heartbeat phase drift between nodes can produce burst losses that approach the 150 ms timeout. Mitigation paths include: (a) wired synchronisation lines between nearest neighbours; (b) a slower heartbeat period with a longer timeout (less responsive but more robust); (c) optical signalling between adjacent PCB faces.
The Hall sensor and the coupling coil sit at sub-centimetre distance on the same PCB. Coil switching transients (the H-bridge polarisation flip) corrupt Hall readings unless: (a) MCU I/O is gated to ignore the sensor for ≈100 µs after a flip; (b) the sensor sits on the opposite face of the PCB with a copper pour shielding it from the coil; (c) the coil drive is moved off-board to a daughterboard. The simulator does not model this cross-talk; hardware will impose constraints not yet quantified.
ESP-NOW supports up to 20 paired peers per node. With 6 hex neighbours plus a debug uplink this is sufficient at the demonstrator scale, but a future >12-neighbour configuration (e.g. 3D body-centred cubic) would require a different lower-layer protocol. nRF24L01 mesh and IEEE 802.15.4 are candidates.
Sustained phase-5 operation across many adjacent nodes will create local hot-spots. The per-node 1.6 W figure is for a single node; six adjacent nodes at φ = 5 dissipate ≈10 W in a 4 cm² area, requiring active cooling beyond passive convection. This places an upper bound on the duration of fused-state coupling and motivates dynamic phase de-escalation as a future research item.
The degraded Bellman-Ford in §3.3 minimises convergence time at the cost of sub-optimal route lengths. For applications requiring guaranteed packet ordering or bounded delay, an additional layer (RPL, Babel, or AODV) would be required. The substrate's value is currently in failure absorption, not delivery quality.
The closest existing systems are programmable matter platforms (M-Blocks [4], Kilobots [5]) and modular self-reconfigurable robots [6]. These differ from the proposed lattice in two respects: (a) they typically lack adaptive structural coupling — modules either bond or do not, with no continuous phase variable; (b) they retain a centralised planner (Kilobots run distributed algorithms but rely on a global IR beacon for coordinate frame). The substrate described here removes both: phase is continuous (six discrete states with smooth transitions), and there is no global coordinate frame at all.
Related work in active matter physics [7], embodied cognition [8], and morphological computation [9] motivates the longer research arc but is not required to evaluate the present primitive. The contribution here is restricted to a measurable engineering claim: distributed adaptive coupling with self-repair, on commodity hardware, at sub-£10 per node.
A staged hardware programme is proposed.
| Milestone | Goal | Measurement |
|---|---|---|
| M1 | 7-node single-PCB demonstrator with one weak edge | Reroute latency, heartbeat health under physical kill |
| M2 | 19-node panel with adjustable coil current | Coupling force vs current curves, stiffness modulation range, failure thresholds |
| M3 | 100-node panel matching the present simulator 1:1 | Topology degradation maps, energy efficiency curves, fault-tolerance scaling |
| M4 | Closed-loop charge transport (mobile shard delivery) | Delivered Joules per shard cycle; metabolic loop closure |
| M5 | 3D folded lattice with origami locomotion | Reconfiguration time, locomotion velocity, payload |
M2 is the inflection point. Once a hardware mesh under physical load demonstrates stiffness modulation tracking the simulator's phase rule, the substrate's physical legitimacy is established irrespective of M3–M5 outcomes.
We have described and demonstrated a distributed substrate primitive in which adaptive coupling, energy flow, neighbour communication, and self-repair are all decided locally and individually at each node. The simulator is publicly observable. The hardware bill of materials is under £4 per node. Failure modes are enumerated rather than minimised. The substrate is offered for external instrumentation; if the M2 milestone passes, the primitive becomes a candidate building block for adaptive manufacturing, prosthetics, and morphological-computation research. If M2 fails, the failure modes catalogued in §7 indicate where the substrate breaks and what redesign is required.
Preprint · v1 · 9 May 2026 · ShortFactory Research, Somerset UK · all simulator source and live HTTP endpoints are public at cortex.shortfactory.shop/dent2.html