Back to Project Kymarion
🌊 Project Kymarion

Sensor Design V2.1

Design doc June 2026 13 min read

What this page is — the build-and-test plan for V2.1, the pump + filter ASV. We prove the mechanism works on our school pond (calm / no waves) by July 18, then take the same mechanism to the coast.

Decision locked this revision — Architecture = on-boat pump + filter (old "Option A"). The pond run exists to prove the mechanism: navigate → pump a known volume → filter → recover countable particles → all sensors log together, without clogging or browning out.

On Jeznach — we take her transferable advice (filter sizing, mesh material, lab digestion + contamination control) but we are not copying her field methodology (low-volume grab jars, river-reach site criteria). Her context is a river; ours is a pond now and a nearshore coastline later, and we pump-and-filter rather than grab-and-sieve.

Legend:Locked · 🔲 Decide (still open) · ⭐ Recommended default (use unless you object) · ✏️ Fill in (a value/coord/measurement) · ☐ checkboxes = build/test actions.


0 · What the pond test proves

The pond is a mechanism shakedown, not the convergence-zone study. Success = the pump-filter loop runs end to end and the data comes off clean.


1 · Architecture — ✅ LOCKED: on-boat pump + filter


2 · Where to sample (pond + real deployment)

Jeznach's river site rules (wadeable/bridge access, streamflow gauges, up/down-stream of WWTPs, straight reaches not bends, mid-channel) don't transfer — those are river-science controls. We drop them.

Pond (July 18) — a mechanism grid, not a science design. Pick waypoints that test repeatability and navigation, not a pollution gradient:

Real deployment (coast, later). Site selection is driven by our hypothesis — current-convergence / accumulation zones — not river reaches. We'll redo §2 properly for the coast once the mechanism is proven.


3 · Filtration (pump-filter cascade) — Jeznach sizing applied

Stage Pore size Material Removes Pulled for lab?
1 — intake screen ~2 mm 316 SS perforated leaves, twigs, wildlife no
2 — pre-filter ⭐ ~800 µm–1 mm 316 SS / PET woven coarse algae, duckweed, sediment no
3 — analytical 300 µm (🔲 confirm) 316 SS / PET target 300 µm–5 mm yes — this is the count mesh

4 · Filter handling — one cartridge per site, no cross-contamination


5 · Sensor + electronics suite — THE BUILD ⭐

Taken from V2 and made electrically coherent. The headline risks aren't the sensors individually — they're voltage levels (ESP32 is 3.3 V and not 5 V-tolerant), the I2C bus sharing, and power isolation so the pump doesn't brown out the logic.

Component Role Bus / interface Power From V2 Watch-for
ESP32 (WROOM) brain 3.3 V logic GPIO are 3.3 V max, not 5 V-tolerant
Micro-SD module per-site CSV log SPI 5 V or 3.3 V confirm it has a level shifter if 5 V
NEO-M8N GPS position + timestamp tag UART 3.3 V put on UART2; WROVER pin clash (below)
YF-S201 flow volume pumped (→ concentration) digital pulse (IRQ) 5 V 5 V pulse → must divide to 3.3 V; min flow ~1 L/min
INA219 pump current → clog detect I2C 0x40 3.3 V in series w/ pump; default shunt maxes ~3.2 A
SEN0189 turbidity per-site clarity (optional) analog → ADS1115 5 V 0–4.5 V out exceeds 3.3 V — see ADS note
ADS1115 16-bit ADC for turbidity I2C 0x48 ⭐ 5 V power at 5 V so it can read the 4.5 V signal
MPU-9250 IMU heading for autonomous nav I2C 0x68 (mag 0x0C) 3.3 V magnetometer hates the pump/motors/SS mesh (below)
12 V diaphragm pump the sampler 12 V DC 12 V, ✏️ ~1–2 A inductive load → needs flyback diode
Pump switch ESP32 controls pump digital ⭐ upgrade ⭐ logic-level MOSFET (e.g. IRLZ44N) > relay
2× thrusters + drivers propulsion / steering digital (PWM/on-off) 12 V, ✏️ ~1.5–3 A ea ➕ add differential thrust = no rudder servo needed
12 V→5 V buck 5 V rail ➕ add size for 5 V load; good input caps
3S LiPo (11.1 V) single 12 V source ➕ add drives pump + thrusters + buck

Making them work together

I2C bus — ✅ no address conflicts. INA219 0x40, ADS1115 0x48, MPU-9250 0x68 (its AK8963 magnetometer at 0x0C) are all distinct, so they share one bus fine. Use ESP32 default SDA=GPIO21 / SCL=GPIO22 with 4.7 kΩ pull-ups to 3.3 V. (Even with the ADS1115 powered at 5 V, the bus is open-drain pulled to 3.3 V, so the ESP32 sees safe 3.3 V — fine.)

Flow sensor level-shift — the easiest thing to fry the ESP32 with. YF-S201 runs at 5 V and its pulse is ~5 V. Feed it through a level shifter or a simple divider (e.g. 10 kΩ / 20 kΩ → ~3.3 V) into an interrupt-capable GPIO (e.g. GPIO27). Calibrate volume gravimetrically (V2 already planned this). ✏️ Check the flow rate — YF-S201 is happy at 1–30 L/min; if our pump pushes <1 L/min through a fine mesh, swap to a YF-S401 (0.3–6 L/min) or it'll under-read.

Pump switching. ⭐ Drive the pump with a logic-level MOSFET (IRLZ44N or a MOSFET module) straight from a 3.3 V GPIO — quieter than a relay, and lets you PWM the flow if you want. Add a flyback diode (e.g. 1N5822) across the pump: it's an inductive load and the back-EMF will eventually kill an unprotected switch. If you keep the V2 relay instead, note it needs a 5 V coil and many relay boards don't trigger reliably from 3.3 V — use a "low-level-trigger" optocoupler board or a transistor.

INA219 placement + range. Wire it in series on the pump's 12 V feed (it reads bus voltage up to 26 V, fine). ✏️ Check clog current: the common breakout shunt (0.1 Ω) tops out near 3.2 A — if the pump spikes past that when blinded, the reading saturates and clog-detect goes blind exactly when you need it. Verify stall current, or use a board with a bigger shunt.

Turbidity + ADS1115 voltage. SEN0189 swings 0–4.5 V, which exceeds the ADS1115's input ceiling if the ADC is powered at 3.3 V. ⭐ Power the ADS1115 at 5 V (input ceiling rises to ~5 V, the 4.5 V signal fits) and keep the I2C pull-ups at 3.3 V as above. Mount the turbidity probe inline before the filter so it reads intake water, not post-filter. (Turbidity is optional for the mechanism test — 🔲 keep it or drop it to cut a variable on day one.)

IMU — the one sensor most likely to misbehave. The MPU-9250's magnetometer is a compass; mounted next to a 12 V pump, thruster motors, and a stainless mesh it'll read garbage (hard-iron). If you run autonomous heading: mount the IMU as far from the pump/motors/SS as possible, on a small mast if you can, and run a figure-8 hard/soft-iron calibration. ⭐ For the first pond run, you don't need it — drive by RC and let GPS course-over-ground give heading while moving. Re-add IMU heading for true autonomy. (Note: MPU-9250 is discontinued; an ICM-20948 is the modern drop-in if you ever rebuy.)

Power architecture — the thing that makes it "work in the field, not just the bench."

Starter pin map (ESP32 WROOM — adjust as needed)

Signal Pin Notes
I2C SDA / SCL GPIO21 / GPIO22 INA219, ADS1115, MPU-9250
GPS RX / TX GPIO16 / GPIO17 (UART2) WROVER users: 16/17 are PSRAM — use UART1 / other pins
SD (SPI) GPIO5 CS, 18 SCK, 23 MOSI, 19 MISO VSPI default
Flow pulse (IRQ) GPIO27 through level shifter
Pump MOSFET gate GPIO26 PWM-capable
Thruster L / R GPIO25 / GPIO33 PWM-capable; avoid input-only 34–39

6 · Navigation & control (pond)


7 · Lab + data pipeline (Jeznach lab methods kept)


8 · Recovery efficiency (do this before the pond)


9 · Timeline — backward from July 18


10 · Still open (everything 🔲, in one place)

Resolved this revision: ✅ architecture = pump + filter, ✅ not copying river methodology, ✅ INA219 clog-recovery kept, ⭐ RC-first nav.

  1. Analytical mesh size: confirm ⭐ 300 µm, or pick another.
  2. Filter stages: ⭐ 3-stage for raw pond water, or 2-stage?
  3. Flow sensor: YF-S201, or YF-S401 if our pump flow is <1 L/min?
  4. Pump switch: ⭐ MOSFET, or keep the V2 relay?
  5. Turbidity sensor: keep for per-site data, or drop to cut a variable on day one?
  6. Target pumped volume + pump-time per waypoint (§0/§6).
  7. Pond waypoints + GPS (§2) and power budget numbers (§5).

11 · BOM / procurement

Part Spec Status Source
Analytical mesh ⭐ 300 µm, 316 SS / PET 🔲 confirm size
Pre-filter mesh ~800 µm–1 mm, 316 SS / PET 🔲
Intake screen ~2 mm 316 SS reuse V2?
Cartridge housing inline holder / printed body ✏️
Logic-level MOSFET IRLZ44N (or module) ➕ new
Flyback diode 1N5822 (or similar) ➕ new
Level shifter for 5 V flow pulse → 3.3 V ➕ new
12 V→5 V buck sized for 5 V rail ➕ new
3S LiPo + charger ✏️ mAh per power budget ➕ new
2× thrusters + drivers 12 V bilge-pump thrusters or motors+ESC ➕ new
(reuse from V2) ESP32, SD, GPS, YF-S201, INA219, SEN0189, ADS1115, MPU-9250, pump ✅ have

12 · Risks / watch-items