Why direction cannot be computed, only measured
A gas or smoke concentration in an enclosed space is a scalar field with a spatial gradient - strongest near the source, weaker away from it. A single omnidirectional sensor samples that field at one point and reports one number. No amount of processing recovers a direction from it, because the direction was never in the measurement.
Conventional practice solves this by installing more sensors until the spatial resolution is adequate, which converts a directional-sensing problem into a capital and cabling problem. The alternative is to add one mechanical degree of freedom instead of an array: if the sensor's response can be steered, the variation between orientations carries the direction.
Because the gas elements sit behind apertures cut into one face of the enclosure, rotating the enclosure changes which part of the volume each aperture faces, and biases each element's response toward wherever it is currently pointing.
Six stops, and why each one is acknowledged
A sweep is six stops at sixty-degree intervals, taking thirty to sixty seconds in total - comfortably inside the precursor window of every hazard class the system targets, including an open flame.
The important detail is not the count but the handshake. The platform queues a rotate-to command; the base controller claims it, performs the move, and marks it done with a completion timestamp once the head has physically arrived. Only then does the sensing node sample. It never samples after a fixed delay.
That acknowledgement gating is what makes every reading attributable to a confirmed heading rather than an assumed settling time. A sweep session that times out is discarded rather than believed - a wrong bearing stated confidently is worse than no bearing at all.
- Six angularly spaced stops at 60° intervals
- Each move acknowledged as arrived before the sample is taken
- Shortest angular path, wrapped to ±180°
- Trapezoidal velocity profile - accelerate, cruise, decelerate
- A timed-out session is discarded, not used
Two controllers that share a shaft and nothing else
The rotation is driven by a second microcontroller in the rotating base, with its own battery and its own ground - deliberately not by the sensing controller. The two share a mechanical shaft coupling and no electrical conductor whatsoever, coordinating only through a command queue on the platform.
There are two independent reasons. The first is electrical: a micro-stepping driver switching an inductive motor winding is a poor neighbour for a high-impedance converter reading a resistive sensing divider, and separation means no switching transient, ground bounce or inductive kick can reach the sensing signal path.
The second is fault containment. A stalled motor, an obstructed head or a driver fault stays inside the rotating base and cannot corrupt a measurement. The motion sub-system can be tested, replaced or upgraded without touching the sensing firmware - and rotational capability can be retrofitted to an existing static node simply by installing a base underneath it.
The stepping arithmetic, and a drift bug avoided
A bipolar stepper with a micro-stepping driver was chosen over a DC gear-motor with an encoder and over a hobby servo, because stepping gives open-loop absolute positioning by counting steps, holding torque without a brake, and no separate position sensor - the decisive advantages for a slow, indexed, multi-stop sweep.
A 1.8-degree motor at sixteen-times micro-stepping gives 3200 micro-steps per revolution and 0.1125 degrees of mechanical resolution, roughly two orders of magnitude finer than a sampling sector. Pointing accuracy is limited by the sensing physics, not by the actuator.
The micro-steps-per-degree constant is 8.888…, which is not an integer. The running step count is therefore accumulated in floating point and rounded only at the end of each individual move, so the fractional remainder of one move carries into the next. Truncating each move instead would let the head's absolute heading drift cumulatively over an unbounded number of sweeps - a failure that appears only after months of operation, and only as a bearing that is quietly wrong.
From six samples to a bearing, a confidence and a coordinate
The stop recording the strongest response is the peak sector, and its heading is the bearing. Confidence comes from prominence: how far the peak stands above the sweep mean, relative to the span between that mean and the sweep floor. A sharp single-direction peak yields high confidence; a flat sweep yields a low but never zero one, so the system reports that a direction was computed on weak evidence rather than silently discarding an ambiguous result.
A bearing is a direction, not a location. Range is estimated by inverse-magnitude scaling within bounds configured for the installation, and combined with the node's registered position to give a source coordinate: x = x₀ + r·cos θ, y = y₀ + r·sin θ.
The azimuth is well constrained by the sweep; the radial distance is markedly less certain. The confidence figure is therefore carried alongside the coordinate through every downstream stage - the twin, the spread forecast, the operator recommendation - so that no later stage overstates the precision of the physical measurement underneath it.
What can go wrong, and what is done about it
The mechanism has identifiable error sources, and pretending otherwise would be the wrong kind of confidence.
- Air currents can carry a plume away from the true bearing. A skewed sweep is broad, so it reports lower confidence, and repeated sweeps reveal a persistent direction over time.
- Heading drift is addressed by the floating-point step accumulation, by returning to a known rest heading after every sweep, and by an available inertial heading reference for cross-checking.
- Mechanical slip or stall is addressed by the acknowledged-move protocol - the node samples only after the base confirms arrival.
- A six-stop sweep resolves to sixty degrees, which is enough to send a responder to the correct quadrant. A finer sweep is available on demand by commanding more stops, at a proportional time cost.