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.
- ✅ Primary objective: "The ASV reaches a set of pond waypoints, pumps a measured volume through the filter at each, and recovers a lab-countable sample — with flow, current, GPS and SD all logging together, no clog lockout, no electronics brownout."
- ⭐ Scope = mechanism + collection. Run the full pump/flow/clog/log loop and pull a real filter for lab counting, but don't gate success on a perfect particle count (that's the recovery trial, §8).
- Success criteria:
- ☐ Reaches each waypoint and holds position long enough to pump
- ☐ Pumps a repeatable target volume — ✏️ target (e.g. 5 L), ✏️ ± tolerance
- ☐ Flow + INA219 + GPS + (turbidity) all log to SD in one synced CSV
- ☐ No brownout/reset when the pump kicks on (see §5 power)
- ☐ Clog-recovery routine fires and clears, or never trips
- Out of scope (write it down): FTIR/Raman confirmation, multi-day repeats, wave/chop handling, the real coastline sites.
1 · Architecture — ✅ LOCKED: on-boat pump + filter
- ✅ Boat goes to a waypoint, a 12 V diaphragm pump draws surface water through a staged filter, the YF-S201 logs the exact volume, the analytical mesh is pulled for lab counting. This is the mechanism for the pond and the coast.
- Why this over grab-and-sieve: it keeps the V2 hardware story, it's the method we actually want to field at convergence zones, and pumping a measured volume gives a clean concentration normalization (particles ÷ litres) instead of relying on grab-jar representativeness.
- What it requires (all covered below): pump + switch (§5), volume measurement (§5), a staged filter that won't blind instantly (§3), clog handling (§3/§5), and one removable cartridge per site/run (§4).
- Grab-and-sieve (Jeznach's river method) is set aside — noted here only so we remember we chose against it on purpose.
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:
- ⭐ 4 waypoints spread across open water + one near the inflow + one in a sheltered corner. Enough to test "go there, pump, log, move on" several times; few enough to fit one battery.
- ✏️ Fill in — the actual pond waypoints (name + GPS lat/long). Drop a pond map screenshot here.
- ⭐ 2 runs of the grid for repeatability (replaces "4 × 200 mL replicates" — we get repeatability from repeated pumped volumes, not from her jar count).
- ✏️ Fill in — sampling depth. Buoyant plastics ride the top → ⭐ surface intake (intake mouth 2–5 cm below waterline). Write down the choice.
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
- ✅ Target band: 300 µm – 5 mm (Jeznach). Samples come back fiber-dominated, so the mesh has to retain fibers, not just fragments.
- ✅ Mesh material: 316 stainless or PET. Never nylon — nylon sheds polyamide fibers into a fiber-dominated count. This matters more than it did in V2.
- ✅ 50 µm is out. Going coarser is the point.
- Why we still need stages (even though we went coarser): we're pumping raw pond water full of algae and organics. A lone 300 µm mesh would still blind fast. A short cascade spreads the load:
| 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 |
- 🔲 Decide — analytical pore size. ⭐ 300 µm (matches Jeznach's floor, low clog/contamination risk). Going to 100–200 µm catches more but reintroduces blinding + fiber-contamination risk. Confirm 300 or pick a number.
- 🔲 Decide — 3-stage (above) vs 2-stage (2 mm → 300 µm). ⭐ Start 3-stage for raw pond water; drop stage 2 if it turns out unnecessary. The 500 µm from V2 is gone (too close to a 300 µm analytical to do real work).
- ✅ Keep the INA219 clog-recovery routine — coarse mesh clogs less, but pumping raw water still fouls; cheap insurance, and it's the headline "smart" feature for judging. (Routine detail in §5.)
4 · Filter handling — one cartridge per site, no cross-contamination
- ⭐ Swappable 300 µm cartridge, one per waypoint/run. Pump → pull cartridge → drop into a labeled sealed non-plastic container → fresh cartridge → next waypoint.
- ✏️ Fill in — cartridge housing (inline filter holder spec / 3D-printed body + the mesh disc size).
- ☐ Carry a field blank cartridge (exposed, never pumped) to catch airborne fiber contamination.
- ☐ Rinse the intake/pump line with filtered water between waypoints so site N doesn't bleed into N+1.
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."
- One 3S LiPo (≈11.1–12.6 V) feeds the pump and thrusters directly, and a 12 V→5 V buck for the 5 V rail (SD, flow, turbidity, ADS1115). The ESP32's onboard 3.3 V regulator runs off that 5 V.
- ⚠️ The pump and thrusters are noisy inductive loads. If the logic buck shares the rail naively, pump inrush will sag the 12 V and reset the ESP32 mid-mission. Mitigate: dedicated buck for logic with fat input capacitance (≥470 µF bulk), keep pump/motor wiring away from signal wiring, and — cleanest — a separate small battery/BEC for electronics.
- Common ground everywhere (12 V, 5 V, 3.3 V domains tied) or the INA219 shunt reading, the MOSFET gate reference, and the flow-sensor signal won't make sense.
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 |
- ✏️ Fill in — power budget. Measure pump A and thruster A at 12 V, sum, add margin, pick LiPo mAh for runtime across the grid.
6 · Navigation & control (pond)
- ⭐ RC-drive the first pond run. It isolates the one thing we're testing (the pump-filter loop) from autonomy bugs. GPS still logs position + timestamp at each waypoint. Add autonomous waypoint nav (GPS + IMU heading) on a later pond day.
- Stop-and-sample state machine:
transit → arrive at waypoint → hold position → pump for ✏️ ___ s (or until ✏️ ___ L on the flow sensor) → confirm volume logged → pull cartridge → next waypoint → return. - ✏️ Station-keeping while pumping: calm water makes this easy — ⭐ low-throttle hold or brief drift. Note which.
7 · Lab + data pipeline (Jeznach lab methods kept)
- Per-site concentration:
Concentration = Particle Count ÷ (Pumped Volume × Recovery Efficiency)→ particles/L at each waypoint. - Lab method (Jeznach-aligned): KOH digest of organics → Nile Red stain (lab only — illegal to discharge in the field, fine in the lab) → microscope count → hot-needle test to confirm plastic. Expect mostly fibers. ✏️ confirm what we can actually run.
- ✏️ Fill in — microscope + lab access (school lab? magnification? who counts?).
- ☐ Per-site CSV: site ID, GPS, pumped volume, current trace, (turbidity), timestamp.
8 · Recovery efficiency (do this before the pond)
- ☐ Spike-and-recover in a tub: drop a known count of reference particles spanning 300 µm–5 mm — include fibers — into a measured volume, run the full pump-filter loop, count what the analytical mesh caught.
- ✏️ Fill in — reference particle source (cut/sieved known plastics, or a purchased microplastic reference set).
- Feeds the Recovery Efficiency term in §7 and the success criterion in §0.
9 · Timeline — backward from July 18
- ☐ By ~Jun 27 — design freeze. Confirm analytical mesh size (§3) + flow-sensor model (§5). Architecture's already locked.
- ☐ By ~Jun 30 — BOM ordered (§11). Mesh + buck + MOSFET + level shifter first; shipping is the long pole.
- ☐ Jul 1–9 — build + bench test. Wire the suite, prove I2C + flow + SD log together, prove the pump switches without browning out the ESP32 (the §5 power test).
- ☐ Jul 9–12 — recovery-efficiency trial (§8) in a tub.
- ☐ Jul 12–15 — full dry run (single waypoint, pond edge or tub).
- ☐ Jul 16–17 — buffer / fix.
- ☐ Jul 18 — pond deployment.
10 · Still open (everything 🔲, in one place)
Resolved this revision: ✅ architecture = pump + filter, ✅ not copying river methodology, ✅ INA219 clog-recovery kept, ⭐ RC-first nav.
- Analytical mesh size: confirm ⭐ 300 µm, or pick another.
- Filter stages: ⭐ 3-stage for raw pond water, or 2-stage?
- Flow sensor: YF-S201, or YF-S401 if our pump flow is <1 L/min?
- Pump switch: ⭐ MOSFET, or keep the V2 relay?
- Turbidity sensor: keep for per-site data, or drop to cut a variable on day one?
- Target pumped volume + pump-time per waypoint (§0/§6).
- 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
- Pump-inrush brownout — the #1 "worked on the bench, died on the pond" failure. Isolate logic power (§5).
- Frying the ESP32 — 5 V flow pulse / 4.5 V turbidity into 3.3 V pins. Level-shift / divide (§5).
- Magnetometer interference — IMU heading garbage next to the pump/motors/SS mesh (§5). RC-first sidesteps it.
- Clog-current saturation — INA219 default shunt blinds above ~3.2 A right when the filter blinds (§5).
- Filter blinding — raw pond water on a fine mesh; the cascade + clog-recovery exist for this (§3).
- Fiber contamination — fiber-dominated samples + any nylon/airborne fiber inflate counts. Nitrile gloves, cotton garments, field + procedural blanks (§4/§7).
- Cross-contamination between waypoints (§4).
- Time/power budget — waypoints × (transit + hold + pump) must fit one charge (§5).