sphere200g_p123  ·  SEA — the Drake Passage drifter

Buoy Parts Book

Every part in the Ø200 mm printed sphere — what it is, how it is wired, and why it is done that way rather than the obvious way. This describes SEA, the drifting buoy released mid-Drake Passage, which carries everything the design has. LAND-1 and LAND-2 are the same probe built to the same drawings; the table below is the complete list of what they leave out or do differently, and nothing after it repeats the distinction.

9 printed parts 668 g of filament [C] 21 Ah [C] of battery ~70 mAh a day, typical [C] 8 messages a day

What differs on LAND-1 and LAND-2

Two land stations beside reference series on King George Island, each the other's backup. Same hull, same carrier, same sensors, same pin map, same battery and the same solar crown — the differences are the keel and what the two temperature channels are pointed at. Since 2026-11-05 LAND keeps SEA's schedule and message, so it behaves as SEA and can still be released at sea.

 SEA — described in this bookLAND-1 / LAND-2
Keel530 g steel ballast in a printed collar under a bolted lidomitted — the station is bolted to a bracket instead
Droguesea anchor on a line below the hullnone
Internal screws1511 — the ballast lid's four are not needed
Transmit8× a day, every 3 h from 00 UTC — decided 2026-11-04the same, every 3 h from 00 UTC — SEA's schedule since 2026-11-05
GPS fixon every hourly wake — the track is the measurement; ceiling 120 s, 60 s after a failure, the full 120 s again after every fourth failure in a rowthe same — every hourly wake
Messageschema 3, three readings and three positions: 50 bytes, exactly one credit a send (trimmed 2026-11-04; the fixtures still to cut, BE-01)the same — schema 3, 50 bytes (schema 2 is not flown in 2026/27)
Energy~59 / ~71 / ~143 mAh a day lost, best / typical / degraded [C]the same [C]
DS18B20 probesame part, same pocket — reads water along the tracksame part, same pocket — reads ground or snow
BME280 humiditysealed inside: a condensation canaryreal outside air, so the station needs a radiation shield

Everything else in this book is the same part, in the same place, wired the same way.

Iridium antenna Ø19 × 49, out through the cap gland Pressure vent bore at z +59, on a ridge flat Solar crown — 3 pockets Voltaic P123, 66 × 66, at z +51.5 Solar deck under the antenna, z +42 to +45 modem and combiner clipped under it Equator flange, z 0 bonded, then clamped by 8 × M5 Main platform, z −27 to −30 the dry bay above it: carrier, GPS Battery platform, z −53 6 × 18650 lying across, 21 mm pitch Steel ballast, z −78 530 g keel on the cavity floor Ø200 mm
Drawn to scale, z in mm from the equator — the hull spec's own datum. The heavy things live below the waterline: the electronics deck sits 27 mm down — the carrier, the gauge and the charger ride it, and the GPS for now (its place is formally open, HULL-02: this platform or a bracket in the crown) — the cells lie on their sides at z −53, and the steel disc is on the cavity floor. Up in the crown, 42 mm above the equator and right under the antenna, the modem and the solar combiner hang clipped under the solar deck; the modem's bay is drawn at the board's own size, with no clearance yet (HULL-34). That distribution is the whole reason a floating sphere turns its solar panels back toward the sky instead of drifting upside down.

How it all connects

Sun charges a pack; the pack feeds one always-on 3.3 V rail; the two hungry parts get switched rails of their own. Everything else is signalling — two I²C buses, one serial link to the modem, one 1-Wire line and two gated analogue dividers. The drawing is the power; the table under it is every part, including the data.

P123 P123 P123 solar combiner, upper shell · 3 × SS14 · one JST-XH crosses the equator Solar charger bq24074 · Adafruit #4755 charge + power path T1.6A 6 × 18650 — 21 Ah [C] 3.0–4.2 V, six in parallel VBAT U3 TPS22918 ON = IO26 RockBLOCK 9603 pin 8 · 3.0–5.4 V 0.45 A cold start [M] helical antenna · SMA coax F1 1.1 A MCP1700 LDO 3.3 V · 1.6 µA idle JP1 3V3 — always on FireBeetle ESP32 BME280 · 0x77 BMP581 · 0x47 MAX17048 · 0x36 DS18B20 · 1-Wire U2 TPS22918 SAM-M8Q GPS ON = IO25 BMP581 #2 · 0x47 SparkFun Micro, on the GPS’s spare Qwiic port battery-side power the 3.3 V rail JP1 and JP2 are shunt jumpers — pull one and a meter goes in series with that rail. The modem rail taps VBAT before F1: a polyfuse's resistance would eat the margin against the modem's 3.0 V minimum. JP2 sits in that rail, between U3 and the plug.
Two rails leave the pack. VBAT goes straight to the modem through its own switch; everything else comes off the 3.3 V rail behind the LDO. Nothing on the 3.3 V rail is ever switched except the GPS, which takes the second barometer down with it — the three sensors on the always-on bus idle in microamps and are cheaper to leave on than to gate.

The power source, close up

The drawing above compresses the whole left-hand side into two boxes. Here is that part alone: what physically joins what, in what connector, and where the one thing that surprises people happens — the charger’s LIPO pad is not an output. It is a node the pack sits on and the loads hang off.

① HARVEST P123 #1 P123 #2 P123 #3 combiner board Voltaic P123 · 66 × 66 × 2.9 mm · IP67 · 0.64 W each Vmp 6.07 V · Imp 110 mA · Voc 7.09 V · Isc 120 mA [D] 3 × 110 mA nominal → ~190 mAh per sun-hour once derated [C] The spec solders each panel’s two leads straight to the combiner; as built, the second set sits on XH plugs (FW-29). A panel is live in any light, so it stays covered while its leads are bare. 24 AWG. Combiner = a small fabbed board in the upper shell: D1–D3 SS14, both junctions, five meter pads. The carrier has no solar role. the equator flange JST-XH at the combiner — the spec’s one connector in the solar path, on the only solar wire that crosses the equator plane. At the charger the pair is soldered into the Opt. Cap holes, VBUS and GND. ② CHARGER SOLAR IN Solar charger — bq24074 (#4755) linear — battery current ≈ panel current input window 4.35–10.5 V · CV termination 4.2 V cold-charge inhibit on its THERM pad (ADR 0018) THM cut · 0.5 A · NTC ‖ 200 k · done ×3 THERM NTC #1 ‖ 200 kΩ sits at the pack XH-2 break, labelled Cold-charge inhibit happens here, in hardware and off the carrier. The MCU never sees this sensor. As built the three chargers stop at −2.3, −2.0 and −0.4…−1.0 °C and resume just above 0 °C [C], proven in ice, accepted 2026-11-03. NTC #2 below is a SECOND sensor, not a tap off the same one: the gate and the flag that reports it must not be able to fail together, and one broken lead would otherwise remove both at the same instant. ③ LIPO LIPO — one node, not an output meteo-carrier — J5, two wires BATT+ / GND — two wires only, 22 AWG XH leads ↑ VBAT tapped BEFORE F1 → U3 → modem, ~0.5 A TX [D] ↓ F1 1.1 A → MCP1700 LDO → the 3V3 rail JST-PH MAX17048 pack in, charger out JST-PH fuse T1.6A in the pack’s + lead The chip runs from the pack on its two JST-PH ports, the cell it MEASURES; QW1’s 3.3 V feeds only its LED and pull-ups, so it is silent with no cell on it (2026-10-15). Inline, decided 2026-09-09. 10 kΩ NTC #2 → carrier IO13 / IO39 ④ PACK 6 × NCR18650GA — protected button-top 3450 mAh each [D] · ~21 Ah in parallel [C] · 3.0–4.2 V power path the LED and pull-ups’ 3.3 V, not the measured pack
Two connector families, on purpose. JST-XH combiner→charger, JST-PH pack→charger: the solar lead cannot be plugged into a battery port, and the keying does the remembering instead of the builder. One trap stays: the thermistor lead’s 2-pin XH break near the charger fits the solar plug too, so that break is labelled rather than keyed, and every panel is metered for polarity at its lead ends before it is bonded in — the second set’s three plugs were all crimped backwards on 2026-11-03 and caught by the bring-up’s cover-one check (the harness map). The spec gives the panels no connector at all — their leads soldered to the combiner, which sits in the same shell, and the XH pair soldered at its charger end; the second set was built on XH plugs, and whether the plugs stay is FW-29’s. Wire is 24 AWG on the panels’ leads, a pre-crimped 22 AWG pair down to the charger, and 20 AWG on the pack side — the pack link is the one that carries current, and most of it flows away from the charger.

The LIPO pad is not an output. The pack, the charger’s LIPO pad and the carrier’s J5 are one electrical point. Nothing draws through the charger — the LDO and the modem’s load switch hang straight off the node, and the charger merely pushes current into it when the sun is up. That is why the wiring page can say the discharge path “never passes the charger” while the drawing above it shows VBAT leaving one: same node, two ways of saying it. The practical consequence is that those two BATT+/GND wires carry the modem’s ~500 mA [D] transmit burst, not just charge current.

The carrier, close up

The board itself, seen from above, with every socket and every wire port that the connection table gives it. The ESP32 module plugs into the middle; the off-board things stand around the edge with the cable that joins each of them, pin by pin. Pins are grouped by job, not by their place on the module’s header — the physical positions are what calipers on the two modules settle, and that is a gate layout cannot start without.

meteo-carrier — one board, five copies 90 × 70 mm · every wire port is JST-XH · ground is a pour on the back, not drawn J5 ▸ solar charger bq24074, off-board 1 BATT+ · 5 GND · 22 AWG XH-5: 2, 3, 4 are dead the LIPO node — see above 1 × × × 5 F1 1.1 A U1 MCP1700 3.3 V LDO · 1.6 µA JP1 3V3 — the always-on rail VBAT — tapped before F1 U3 TPS22918 modem rail switch JP2 VBAT_RB_SW ≈0.5 A TX [D] RB_EN → U3 ON R2 100k ↓ GND J6 ▸ RockBLOCK 9603 1 → pin 8, 3.0–5.4 V 2 → pin 10, GND 3 IO17 → pin 6 TXD 4 IO16 ← pin 1 RXD 5 IO14 → pin 7 On/Off 5 wires · ~0.5 A TX [D] 1 2 3 4 5 UART + On/Off → J6 SOCK_FB — two male pin rows ESP32-WROOM-32E radio · RTC RAM FireBeetle 2 ESP32-E plugged, never soldered Low Power Pad uncut asleep ~23.5 h/day USB-C one seat only — the DevKit socket left the board on 2026-10-02 IO26 IO17 IO16 IO14 3V3 GND IO25 IO18 IO19 IO21 IO22 IO4 IO13 IO39 IO35 3V3 GND GPS_EN R1 100k ↓ GND U2 TPS22918 GPS rail switch out → 3V3_GPS SDA1 / SCL1 — I²C1 GND 1 2 3 4 QW2 ▸ SAM-M8Q GPS 0x42 · I²C1 · a bus of its own + BMP581 #2, 0x47, 2nd port rail live ~18 min a day on every probe [C]; off, its pull-ups die with it — the backfeed fix SDA0 / SCL0 — I²C0 GND 3V3 1 2 3 4 QW1 ▸ MAX17048 fuel gauge 0x36 · I²C0 · always on one Qwiic cable: supply + data the pack sits on its JST-PH ports — see the close-up above OW_DATA R3 4.7 kΩ ↑ 3V3 GND 3V3 1 2 3 J8 ▸ DS18B20 temperature probe 1 DATA · 2 GND · 3 3V3 1-Wire · through the hull sea on SEA, ground on LAND SENSE_EXC NTC_SENSE R4 10k ↓ GND R5 100k LEAK_SENSE C6 100n ↓ GND GND 1 × 3 1 × 3 J7 ▸ NTC #2, 10 kΩ at the pack 1 excite · 2 empty · 3 sense NTC #1 goes to the charger J9 ▸ leak pads, cavity wall 1 sense · 2 empty · 3 GND no bias at rest · IO35 reads SOCK_BARO · 7-way Fermion BMP581 0x47 · header soldered once INT SDO CSB SDA SCL GND 3V3 n/c n/c n/c SDA0 SCL0 GND 3V3 SCL0 SDA0 the same pair as IO21/IO22 BME280 — SOCK_BME 0x77 · a header board GND · 3V3 · SDA0 · SCL0 1×4 + 1×6 socket · 2026-10-02 power, always on a switched rail logic and data a net name with no wire = the same copper a numbered column is a port where a cable leaves
Two wires in, everything else out. The only thing that arrives on this board is BATT+/GND at J5 — the solar side never touches it since the combiner moved to the upper shell. From that node the board makes two rails: VBAT, tapped before the polyfuse so F1’s resistance never eats the modem’s margin, switched by U3 and handed straight to the RockBLOCK; and 3V3, through F1, the LDO and JP1, feeding the ESP32, both Qwiic ports, the barometer socket and the temperature probe’s lead. The GPS gets its rail from U2 and its bus from IO18/IO19, both its own, and carries the second BMP581 on its spare Qwiic port, on that same rail and bus. Every part with a price is in a socket or on a cable; the soldered parts are two switches, a reverse-pack MOSFET, a fuse, a regulator, seven resistors, eight capacitors and two Qwiic connectors — all but the regulator placed by the fab. Not drawn: Q1, the MOSFET just inside J5 that blocks a reversed pack; 100 Ω in the temperature probe’s supply and data, so a flooded cable costs a thermometer and not the station; a 4.7 nF soft-start capacitor on each switch; and J10, a five-pin service header for the meter and for reset.

The two jumpers are instruments as much as switches. A shunt on JP1 connects the 3.3 V rail; pull it and the board is dead, which is how the rule “never feed 3V3 while USB is plugged in” becomes something a tired person cannot get wrong. Put a meter across the same two pins instead of the shunt and it reads the whole board’s sleep current without cutting a trace — every microamp figure in this book is meant to be measured there — on the Klein MM325, the bench meter since 2026-10-30 with a 200 µA range at 0.1 µA, read on its 20 mA range with the board armed and asleep, because the µA range collapses the rail at a wake (FW-30). JP2 does the same for the modem rail. For flight each shunt is soldered, glued or replaced by a wire link, which of the three not yet decided: a shunt that works loose is a silently dead station. And the board carries no I²C pull-up resistors of its own: the breakouts supply them, three sets in parallel on the sensor bus and the GPS’s own pair on its bus, which is exactly why switching the GPS rail off works.

Every part — what powers it, what talks to it

PartPowerDataPins on the MCU
Solar panels ×3source — 6 V, 110 mA each——
Chargerpanels in, pack and VBAT out—off-board: BATT+ and GND to J5, nothing else
FireBeetle ESP323V3, always onit is the bus masterevery pin below is its own
BME2803V3 — 4-pin header, not QwiicI²C0, 0x77IO21 SDA0 / IO22 SCL0
BMP581 (Fermion)3V3 via SOCK_BAROI²C0, 0x47IO21 / IO22, the same pair
MAX170483V3 via Qwiic QW1, for its LED and pull-ups; the chip runs from the pack on its own JST-PHI²C0, 0x36IO21 / IO22 — it is powered by the pack it watches, and silent without one
SAM-M8Q GPS3V3_GPS — switched by U2I²C1, its own busIO25 gates U2; IO18 SDA1 / IO19 SCL1
BMP581 #2 (SparkFun)3V3_GPS — with the GPS, through its spare Qwiic portI²C1, 0x47IO18 / IO19, the GPS's pair
RockBLOCK 9603VBAT_RB_SW — switched by U3, tapped before F1UART, plus its own sleep pinIO26 gates U3; IO16 RB_TX / IO17 RB_RX; IO14 RB_ONOFF
DS18B20 probe3V3 via J8, 4.7 kΩ pull-up, 100 Ω in supply and data1-Wire — data and clock share one lineIO4 OW_DATA
NTC — carrier legnone at rest: excited only for the readanalogue dividerIO13 SENSE_EXC → J7 → IO39 NTC_SENSE
NTC — charger legthe charger's own THERM padnone — it gates in hardwarenot on the carrier at all
Leak padsnone at rest: same IO13 excitationanalogue, 100 kΩ + 100 nFIO13 → R5 → IO35 LEAK_SENSE, J9

Three things in that table are the whole argument of the design. The GPS has its own I²C bus, because leaving it on the shared one and cutting its rail backfeeds about 2 mA through its protection diodes. Both load switches carry a 100 kΩ pull-down (R1, R2), so a rail cannot come up while the ESP32 boots and its pins are undefined. And the two analogue dividers are excited by IO13 rather than wired across the battery, so at rest they draw nothing at all.

The nets in this table are the contract, not a description of it: they are the column headings of device/hardware/carrier/connection-table.csv, which is what the board is fabricated from.

01

The brain

One small computer runs the whole probe, and it spends almost all its life asleep. Every hour it wakes, reads the sensors, appends the result to a buffer that survives sleep and goes back down — up to two minutes, because every wake also takes a GPS fix. Eight times a day, every three hours from 00 UTC, every probe wakes for longer and sends the buffer.

Sleeping is not an optimisation, it is the design. Awake the ESP32 draws about 30 mA [M]; asleep it draws microamps, and the twenty-four hourly reads on their own cost about 0.3 mAh a day [C] — next to nothing. SEA's hourly fixes are another matter: ~19 mAh a day [C], a quarter of its day.

The buoy spends ~59 best / ~71 typical / ~143 degraded mAh a day [C] on the cadence of 2026-11-04 — a band rather than a number, because nobody has yet measured how a satellite session goes in Southern Ocean swell. On a typical day the eight transmit windows are about half of that bill, the hourly fixes a quarter and the sleeping floor the rest (the power budget, §1).

FireBeetle 2 ESP32-E DFRobot DFR0654-F
ESP-WROOM-32E
owned 31 per probe dfrobot.com ↗ DFRobot FireBeetle 2 ESP32-E: a small black board with an ESP32-WROOM-32E module, USB-C socket and a white JST battery connector.

socketed on the carrier · Low Power Pad uncut · 24 wakes a day, every one with a fix on SEA · RTC RAM buffers 5 days

The microcontroller — the same ESP32 silicon as an $8 dev board, on a carrier built for low power. It sleeps at about 0.6 mA as built [C], most of it two status LEDs left in on purpose — board 1 read 0.73 mA at JP1 on 2026-11-03 [M], once the BME280 was told to stop sampling through the sleep (its card); that is a tenth of a milliamp above the model's 0.62 mA at that jumper, about 3 mAh a day or 4 % of SEA's typical day [C] — and the pack carries that through a dark winter (the power budget, §1). A plain DevKit idles in the milliamps and would empty the pack before the season ended, which is why no probe carries one.

Every deployed board keeps its "Low Power Pad" uncut. That pad feeds an onboard RGB status LED idling at ~500 µA [D] on a stock board, about 12 mAh a day [C], which nobody can see inside a sealed opaque hull. Cutting it was decided on 2026-09-08 and declined on 2026-11-03: with no cut and no sun for six months a typical day, on either probe, uses about three-quarters of the pack [C], and the figure itself is soft here, because the LED is fed backwards through the module's regulator at a voltage below its rating. The floor is measured as built instead (backlog FW-30), and the pad can still be cut before the hulls are sealed if that reading says it must.

The board is built to one configuration: stock, socketed, and carrying the same firmware image as its two siblings. There is no spare board anywhere in the project, so any of the three has to be able to replace any other in the field without a rebuild.

Readings live in RTC RAM — a small block of memory that stays powered through deep sleep — so nothing is lost between wakes, and the buffer has to hold about five days of readings against a run of failed satellite passes. The board is socketed, never soldered, so a dead one can be swapped without touching the carrier.

The carrier is laid out around this module's pin list, the only module the fabbed board seats. IO32/IO33 are not broken out at all; IO0/2/12/15 are strapping pins the chip samples at boot and so cannot be driven; IO1/3 are the USB console. Every allocation fits what is left — which is why the two rail gates sit on IO25/IO26 (present on every candidate, survive deep sleep, not strapping) and why both analogue sense jobs sit on input-only ADC1 pins.

Carrier PCB meteo-carrier, rev. 4
90 × 70 mm, five identical boards
owned 5, since 2026-10-131–3 built, 4–5 bare

21 small parts placed by the fab · ports, sockets and the regulator soldered by hand · modules plugged in

The board everything plugs into. A breadboard cannot cross the Drake Passage — vibration and damp find every loose jumper — so each module gets a socket, each external wire gets a terminal, and the handful of support parts (the two load switches, pull-ups, the sense divider) get soldered down.

Pin map — the FireBeetle's pins, as the carrier uses them

PinNetWhat it does
IO16 / IO17RB_TX / RB_RXSerial link to the satellite modem
IO18 / IO19SDA1 / SCL1GPS bus (I²C1) — its own, see the backfeed note; the second BMP581 rides it
IO21 / IO22SDA0 / SCL0Sensor bus (I²C0) — BME280, MAX17048, BMP581
IO25GPS_ENTurns the GPS rail on via the load switch
IO26RB_ENTurns the modem's battery rail on, through the second load switch
IO14RB_ONOFFThe modem's own sleep input — wired as the alternative to cutting its rail
IO4OW_DATA1-Wire to the sea-temperature probe, 4.7 kΩ pull-up
IO13SENSE_EXCExcites the NTC and leak dividers — high only during a read
IO39NTC_SENSEBattery temperature (ADC1, input-only)
IO35LEAK_SENSELeak pads (ADC1, input-only)
spareIO23, IO36Unallocated. IO34 is free too, but the FireBeetle loads it with its own battery divider
02

The senses

Three chips share one two-wire bus (I²C0 on IO21/IO22), each answering to its own address, and all three stay powered all the time because they idle in microamps — the BME280 only once the firmware puts its die to sleep between reads (its card). The GPS gets a second bus of its own, and carries a second barometer on it. The two analogue sensors — battery temperature and the leak pads — hang off input-only pins on ADC1.

ADC1 is not an arbitrary choice. The ESP32's other converter, ADC2, becomes unreadable whenever the radio is active. Putting both analogue sense jobs on ADC1 means nothing in this design cares what the radio is doing.

BME280 SparkFun SEN-13905, with headers owned 5, one bad2 GY spares sparkfun.com ↗ SparkFun BME280 breakout, SEN-13905: a small red board with two soldered 0.1 inch header rows and no Qwiic connector.

I²C0 · 0x77 · 4-pin header · read every wake · never switched off · forced mode between reads

Air temperature and relative humidity, on the always-on sensor bus with the barometer and the fuel gauge. Four wires — power, ground and the two bus lines — off a 0.1 in header soldered to the board.

It is not the Qwiic board this project thought it had. Every record said SparkFun's Qwiic version until 2026-09-09; the board actually owned is SEN-13905, which carries plain headers and no Qwiic connector, so it cannot join the keyed chain the fuel gauge sits on. Nothing electrical moves — same sensor, same 0x77, same bus — but the keying does: a four-pin clip cannot be inserted backwards and a header can. It plugs into its own seat on the carrier, SOCK_BME: a four-way socket for the I²C row and a six-way one that only holds the other row (settled 2026-10-02).

Pressure is not its job — that belongs to the BMP581, which reaches an accuracy this part cannot. What it carries is temperature and humidity, and sealed inside the hull the humidity channel does double duty as a condensation canary: rising internal RH is the first sign the hull is no longer dry.

Its die must be put to sleep between reads. The Adafruit library's begin() leaves the sensor in normal mode, sampling at 16× through the ESP32's deep sleep — about half a milliamp on the floor meter. Board 1 read 1.0–1.3 mA at JP1 until the bench sketch set forced mode once and took one forced measurement per read, then 0.73 mA steady [M] (lab note 2026-11-04); the flight adapter still has the fault (FW-31). And one in five bought has been bad: a unit reading 93–97 %RH in a 50 % room [M], found twice in board 1's seat before it was labelled and kept out.

Fermion BMP581 DFRobot SEN0667 owned 6, one bad1 per probe + 1 reference dfrobot.com ↗ DFRobot Fermion BMP581: a small black board with the sensor die, two solder jumpers marked I2C_Pull_Up and I2C ADDR, and two mounting holes.

I²C0 · 0x47 · SOCK_BARO header · read every wake

The precision barometer, ±0.3 hPa [D]. Pressure is the most scientifically useful thing a small probe can produce — it is what weather models actually ingest — and it only counts if it is genuinely accurate, which is why this part exists separately from the BME280.

It also reports its own die temperature, which is not a weather number: it is the correction term. Electronics warm the air around them, and comparing die temperature to air temperature is how that self-heating gets subtracted back out.

Two practical constraints. The Fermion breakout has no Qwiic connector, so a pin header is soldered to it once and then it plugs into a socket on the carrier like the MCU does. And it only offers two I²C addresses (0x47 / 0x46), so a maximum of two can ever share a bus — which matters at calibration time, when all three flying units plus the reference are run side by side and each needs its own logger. Its address does not clash with the BME280's 0x77 or the fuel gauge's 0x36.

SparkFun BMP581, on the GPS SparkFun SEN-20171, Micro, Qwiic
the second barometer
owned 3 Micro + 2 standard1 per probe sparkfun.com ↗ SparkFun Micro Pressure Sensor BMP581, SEN-20171: a tiny red board with one Qwiic socket, a mounting hole and BMP581 in silkscreen.

I²C1 · 0x47 · on the SAM-M8Q's second Qwiic port · powered with the GPS rail · read on every wake, with the fix

A second barometer, hung on the GPS breakout's spare Qwiic port so it needs no seat of its own and no extra wire into the carrier. It is there to cross-check the Fermion, decided 2026-11-03: two readings of the same air from two dies, so a drifting barometer shows up as a widening gap rather than as a quietly wrong number.

It lives on the GPS rail, so it exists only while the GPS does. Through the night of 2026-11-03 all three boards read it on every wake: within 15 Pa of the seated BMP581 on boards 1 and 2, 29 Pa apart on board 3, whose second one sat in its bag that night, and 0.8–1.6 °C warmer on all three, the GPS module's own heat [M]. Whether it stays on that rail or moves to the always-on one is FW-29's.

Same address as the Fermion, 0x47, which works only because the two sit on different buses — the GPS's I²C1 and the sensor bus I²C0 — and is one more reason the GPS keeps a bus of its own. SparkFun's Micro BMP384 is the same red board: the silkscreen, not the shape, says which one is in hand.

DS18B20 waterproof probe 1-Wire, stainless tip
Ø6.3 × 50 mm
owned 3buy 21 per probe Waterproof DS18B20 probe: a stainless steel tip on a black cable ending in three stripped wires, red, yellow and black.

1-Wire on IO4 · 4.7 kΩ pull-up to 3V3 · J8, pin order DATA·GND·3V3 · read every wake

A sealed stainless temperature probe sitting in a pocket in the bottom of the hull. It reads water temperature along the track — something no fixed station can measure, and enough to detect crossing an ocean front, one of the mission's four questions.

The pocket is unconditional, so the probe is too. The hull spec draws the pocket and its threaded roof bore on every hull whether a sensor goes into it or not, and blanking a hole is an untested variant of a joint that has never been pressure-tested. Fitting the gland the bore was drawn for is the better job than closing it off.

"1-Wire" means data and clock share a single line: the sensor and the ESP32 take turns pulling it low, and a 4.7 kΩ resistor pulls it back up when neither is. That makes it the only sensor here needing a pin that can both drive and read — everything else analogue sits on input-only pins. It is also the reason IO4 was spent rather than one of the cheaper input-only spares.

It is potted with thermally conductive epoxy — a different, faster-setting product than the structural one. Its lead reaches the dry cavity through a PG7 gland in the pocket roof, which is a real penetration: the thread is formed in 3 mm of printed plastic and has never been pressure-tested, so no hull is printed for deployment until it has been.

SAM-M8Q GNSS SparkFun GPS-15210
u-blox M8, chip antenna
owned 3, one on each board sparkfun.com ↗ SparkFun SAM-M8Q GNSS breakout: a red square board with the u-blox module, a backup battery disc, two Qwiic connectors and the I2C, JP1 and JP2 jumpers.

I²C1 (IO18/IO19) · rail switched by IO25 · a fix on every hourly wake · ceiling 120 s, 60 s after a failure, 120 s after every fourth in a row · ~64 mA with the MCU up [C]

Position and true UTC. The position is the measurement here — the drift track is what the buoy exists to produce. UTC matters just as much: the ESP32's clock drifts by minutes over months, the buoy transmits at fixed synoptic hours, and a timestamp that has quietly slid cannot be lined up against the reference series it was deployed to compare with.

A fast fix needs a receiver that remembers where it was, and as wired this one cannot. The SparkFun board carries a small backup cell meant to keep the almanac and the clock warm between power-ups, but it holds about 2.8 days against the module's own draw [C] and the rail is live too briefly to recharge it, so after the third day every fix is a cold start, taken by the model as 45 s through the hull [C] — ~19 mAh a day on SEA's 24 fixes [C], a quarter of its typical day. The lead's rule of 2026-11-04: a fix on every hourly wake, taken as it comes, with a 120 s ceiling and 60 s on the wake after a failure. The night of 2026-11-03 showed what a warm receiver buys: with the rail live every three minutes the cell stayed up and boards 2 and 3 fixed in a median 10–14 s, 0–1 s at best, while board 1 took 44 s and found fewer satellites in the same hull [M]. The firmware can earn that at SEA's cadence by saving the receiver's navigation database to the ESP32 and restoring it at power-up (FW-23) — the largest firmware lever on SEA's budget, ~17 mAh a day [C].

Why its own bus. This is called the single most important electrical decision on the board. I²C lines are held high by pull-up resistors, and every chip has protection diodes from its pins to its own supply. Cut the GPS's power while its data lines stay on the shared sensor bus, and current flows from the bus pull-ups, through those diodes, into the dead chip — roughly 2 mA continuously [C], about 48 mAh/day — two-thirds of SEA's entire ~70 mAh typical day [C], burned by a chip that is supposed to be switched off. Switching the GPS off would have cost more than leaving it on.

The load switch makes it worse, not better: it actively pulls the switched rail to ground, which hard forward-biases those diodes instead of letting the rail float up to where they stop conducting. Series resistors were tried on paper and rejected — 1 kΩ only halves it. A bus buffer chip works but costs $2 and an SMD part.

The fix costs nothing: give the GPS the second bus. The SparkFun breakout carries its own pull-ups powered from its own supply, so killing the rail kills the pull-ups too and there is nothing left to push current anywhere. It is not free in firmware, though — whenever the rail is off, IO18/IO19 must be set to inputs with the ESP32's internal pull-ups disabled, or the problem is rebuilt from the other side.

MAX17048 fuel gauge Adafruit #5580, STEMMA QT / Qwiic
ModelGauge algorithm
owned 8, two bad, 1 suspect1 per probe adafruit.com ↗ Adafruit MAX17048 fuel gauge: a small black board with two JST-PH battery ports, two STEMMA QT connectors and a six-pin header row.

I²C0 · 0x36 · read every wake · ~4 µA hibernate [D]

Battery millivolts and a state-of-charge percentage. Worth being precise about how it works: it is not a coulomb counter — it never measures current. It watches voltage and runs it through a lithium-cell model that accounts for load sag and relaxation. That is far better than a raw voltage reading, but it is still an inference from voltage.

That model matters because voltage lies here. The modem's cold start pulls 0.45 A from the pack for a dozen seconds [M] and the gauge sags 0.1–0.19 V [M] the moment that rail comes on; a reading taken near it shows a battery far emptier than it is. And lithium cells sit on a flat plateau for most of their discharge — between roughly 30 % and 80 % the voltage barely moves, which is exactly the range you want a number for.

It has three jobs. The pack voltage rides in every message as one byte in 10 mV steps; nothing downstream needs the millivolt. The percentage drives the cadence downshift — 8 → 4 → 2 → 1 messages a day — so a run of dark weeks degrades the mission gracefully instead of killing it. And the same reading gates the low-voltage lockout: below about 3.2 V at rest (raised from 3.0 on 2026-10-02 — at 3.0 the modem under load is already below its own minimum), no transmit and no GPS, deepest hibernation, waking rarely to re-check. That reading is taken at the very top of the wake, before any rail is powered.

Why not just a resistor divider on an ADC pin? That was the alternative, but the ESP32's ADC is nonlinear and noisy, and this reading sits under the only over-discharge protection the design has. The discharge path runs battery → LDO → everything and never passes through the charger, so no hardware can cut it; a hardware disconnect was weighed and declined, because it inserts a failure point into the one path that must never break and hard-cuts mid-transmission instead of parking cleanly. Two hardenings come with the pick: a watchdog, so a hung loop cannot stay awake for weeks, and a rule for a gauge that fails: a failed read or a wedged bus is reported and not obeyed — the probe carries on as if the pack were full, and the cells' own protection boards are the floor.

The open question is not whether to keep it but whether its percentage is trustworthy at −20 °C: the cell model is characterised near room temperature, and here it is watching six cells in parallel in Antarctica. The lockout threshold is deliberately left tunable until the cold-chamber work runs.

It has to be seen to move. Two of these kept answering on the bus with a fixed, plausible millivolt reading against a cell at another voltage — one stuck at 3.547 V against 3.95, one at 3.19 against 3.55 [M] — and a frozen gauge would never fire the lockout on a dying pack, or never release it on a full one. A working one drops 0.1–0.19 V [M] within a second of the modem rail coming on, so the flight firmware reads it before and after each rail-on and treats a reading that does not move as a faulty gauge — reported, then ignored (FW-26). The first casualty traces to one mishap: a pack plugged into a gauge with + and − swapped, which also opened its fuse and killed both chargers on the chain (FW-27) — so the pack plug is metered for sign before it ever mates, on the bench and in the flight-board checklist. The second, found on board 3 three days later, has no recorded cause. A third, pulled from board 3 on 2026-11-02 while a resistive pack fuse was the real fault, is labelled suspect, its retest declined, and kept with the bad ones.

10 kΩ NTC thermistor Vishay, B 3977 K, leaded
2 at the battery pack
owned 152 per probe

IO13 excites → NTC #2 (J7) → IO39 (ADC1) → 10 kΩ → GND · NTC #1, in parallel with 200 kΩ, goes to the charger’s THERM pad, a separate part (ADR 0018)

A resistor whose resistance falls as it warms, fixed to the battery pack. It exists because charging a lithium cell below freezing plates lithium metal onto the anode and permanently damages it — and this probe lives below freezing. Discharging cold is harmless; charging cold is what destroys the pack.

The cruelty is in the timing: solar panels harvest best on cold clear days, so the conditions that produce charging current are the conditions where the pack is coldest. Left alone, the probe would ruin its own battery exactly when it was charging well. The cells’ own protection boards do not cover this — they watch voltage and current, not temperature.

The charger gates; the MCU only reports. The actual cold-charge inhibit happens in hardware, on the charger board's own THERM pad, off the carrier entirely — and on its own thermistor, the second of the two at the pack. The carrier's own divider does not protect anything; it just measures pack temperature so the firmware can set the "NTC gate state" flag in the message. Safety in hardware, reporting in software, on separate parts, so the gate and its report cannot fail together. As built the gate stops charging between −0.4 and −2.3 °C by chip and resumes just above 0 °C [C], measured in ice on all three chargers on 1–2 November and accepted on 2026-11-03 rather than trimmed (ADR 0018).

The divider is gated, and that is the clever part. A permanently wired 10 kΩ + 10 kΩ divider across the battery would waste current forever. Instead the top of the divider is driven by IO13, which goes high only for the hourly read — so at rest the whole thing draws nothing. IO13 does the same job for the leak pads.

There are two of them, and that is deliberate (decided 2026-09-08). One belongs entirely to the charger, one entirely to the carrier. Sharing a single thermistor would have hung the charge inhibit on the same node IO13 swings from 0 to 3.3 V every hour — and worse, one broken lead would have removed both the protection and the flag that reports it, in the same instant. A second $1 part keeps them independent.

Leak pads two A4-316 M3 × 10 screw heads
in potted bosses on the cavity wall, z ≈ −83
buy 6 stainless screwshull spec §11.2

IO13 excites → 100 kΩ → IO35 (ADC1) → J9 → pads · 100 nF to GND · 50 ms settle, 8-sample median

Two exposed stainless screw heads, 8 mm apart, threaded into printed bosses about 3 mm above the floor of the cavity, at the lowest point water would collect; the leads are soldered to the shanks and the bosses potted (hull spec §11.2 — bare copper there is not acceptable, it corrodes in months of salt air). Dry, nothing conducts; wet, the water bridges them and the leak bit goes out in the next message. If the seal ever fails we want the probe to say so, not die quietly.

The pads carry no standing voltage, and that is deliberate: a permanently biased pair of electrodes sitting in condensation would electrolyse — corroding themselves away and slowly draining the battery. They are excited only during the read, off the same IO13 line as the thermistor.

The 100 nF capacitor to ground is not decoration either. The ESP32's ADC wants to see a low source impedance, and the 100 kΩ excitation resistor is nowhere near low enough. The capacitor fixes that, but it and the resistor form a 10 ms time constant — which is precisely why the firmware waits 50 ms after raising IO13 and then takes the median of eight samples. Read it immediately and you measure the capacitor charging, not the water.

03

The voice

There is no phone signal in the Drake Passage, so the probe talks to satellites. Iridium is the one constellation that covers the poles, and it charges by the byte — which is why readings are batched and sent in short bursts, and why three hours of data are squeezed into exactly 50 bytes — the credit block, with no headroom by design: the die temperature rides once per message and the pack voltage as one byte, so every send costs one credit, and a message that also carries a missed window spills into a second (FW-06).

This group is also the most expensive thing on the probe by a wide margin, and the biggest single line in the power budget — about half of a typical SEA day, ~32 mAh across the eight windows [C], most of it the supercapacitor refilling at every rail-on.

RockBLOCK 9603 Ground Control, SMA version
$302
owned 2buy 1 groundcontrol.com ↗ RockBLOCK 9603: a green board carrying the silver Iridium 9603 module, two blue supercapacitors and a gold SMA connector.

UART IO16/IO17 · VBAT on pin 8, gated by IO26 · 3.0–5.4 V · 0.45 A cold start [M] · 8×/day, every 3 h from 00 UTC

The satellite modem — the only part that can get a message off Antarctica with no infrastructure at all. The ESP32 talks to it over a plain serial link using AT commands, hands it a small packet, and it uplinks to whichever Iridium satellite is overhead.

Eight transmits a day, every three hours from 00 UTC, decided 2026-11-04 after the night run. The main synoptic hours — 00/06/12/18, when the world's weather stations all report — are all still sent, so the data drops straight into an existing frame of reference; the four windows between them halve the latency and double the delivery attempts for ~26 mAh a day more [C]. Each message carries three hourly readings and three positions, so all 24 readings still get home. Four windows a day was the spec until then, and three-hourly reporting had been declined as doubling the energy for no operational gain; the power model and the track's value reversed that.

The important detail is in the firmware, not the hardware: the reading buffer is cleared only when the modem confirms the send actually succeeded. A satellite pass that fails costs a retry, never data. That single rule is what makes the whole store-and-forward design honest.

It runs straight off the battery. The module accepts 3.0–5.4 V on pin 8 and the pack is 3.0–4.2 V, so no conversion is needed at all. The 1.3 A figure you see quoted [D] is the bare Iridium module's peak — the RockBLOCK board hides it behind supercapacitors of its own, so the supply never delivers more than about half an amp: 0.45 A for about 13 s on a cold start, measured across JP2 on 2026-10-28 [M]. Those supercapacitors must never be removed; the datasheet says doing so will destroy the module.

A typical window is ~4 mAh [C], most of it the supercapacitor filling, against ~0.3 mAh for all twenty-four hourly reads combined. That is why the rail is switched off entirely between windows, gated by IO26 with a 100 kΩ pull-down holding it off while the ESP32 boots.

Cutting the rail has a price: those supercapacitors fill from empty at every power-up — 12.5 A·s at the modem's input by Ground Control's figure [D], ~9.25 A·s from a 3.7 V pack, 2.6 mAh a window [C], paid eight times a day. That is the biggest single line in SEA's budget, and whether the capacitor really empties over a three-hour gap is the largest unknown left in it (FW-07). The modem answers before its capacitor is full: first OK at 7.0 and 12.0 s on the bench and at 9.0 s from the yard [M].

How a session goes in swell has never been measured. A buoy washed by waves loses its sky view mid-pass and retries; the model costs each attempt at one minute, a failed one at 3.8 A·s against 2.8 for a success [D], and the degraded case — two failures and a backlog message per window, every fix to its timeout — swings SEA's day from ~59 to ~137 mAh, 9.9 months of pack to 4.2 [C]. Four messages have reached the backend so far, from the yard, through both modems; a session at sea is still the bench job that matters most.

Maxtena M1621HCT-P-SMA P/N 100-00003-02
Ø19 × 49 mm · $80
owned 2buy 1 maxtena.com ↗ Maxtena M1621HCT-P-SMA: a black cylindrical helical antenna about 19 mm across, with a gold SMA plug on its base.

1616–1626 MHz · 2.8 dBic · VSWR ≤ 1.5 · passive, no DC on the coax · IP67

The antenna the modem transmits through — a passive helical tuned to Iridium's band. Passive means it contains no amplifier and needs no power, so the coax carries only the radio signal and there is nothing on it that can fail.

Iridium satellites cross overhead from any direction, unlike a geostationary dish that can be aimed once. The antenna therefore needs a clear view of the entire sky, which is why it stands proud at the very top of the sphere and why nothing may sit above it.

It is ground-plane independent — most small antennas need a metal sheet beneath them to work against, and this one does not. Combined with being IP67 in its own right, that is what lets it pass straight out through the threaded gland in the crown. The hull needs no bulkhead connector face and no flat panel for it to bolt to.

Amphenol RF jumper 135110-03-06.00
RG-316 DS, 50 Ω, 6" · $26.50
owned 1buy 2 digikey.com ↗ Amphenol RF 135110-03-06.00: a short RG-316 coaxial cable with an SMA plug at one end and an SMA jack at the other.

SMA jack ↔ SMA plug · entirely inside the cavity

The short coaxial cable between antenna and modem. It looks like a trivial part and it is not — it is the one cable in the drawer with the right connector genders.

The antenna ends in a male plug, so whatever it screws into must be a socket. This cable is jack (socket) on one end and plug on the other, which is exactly the pairing needed. The $5 generic jumpers already in the drawer are male on both ends and cannot mate the antenna at any price. Its part description on the distributor's site hides the gender entirely; it took a direct question to the manufacturer to confirm.

50 Ω throughout, because a mismatched cable reflects transmit power back into the modem instead of radiating it.

04

The power plant

Sun charges a battery; the battery feeds a single always-on 3.3 V rail; the two hungry parts get switched rails of their own so they cost nothing when idle. Three domains, and the whole argument of the design is in which things are allowed to be always-on.

The buoy must survive the dark months on battery alone — ~9.9 months best, ~8.2 typical, ~4.1 degraded with zero sun [C] — so solar extends life but is never counted on. That is why every microamp of idle draw gets argued about, and why a 2 mA leak was treated as a design emergency.

Voltaic P123 solar panel 6 V, 0.64 W, ETFE
66 × 66 × 2.9 mm, IP67
owned 3 + 3 unidentifiedbuy 3 or 6 (FW-29)3 per probe voltaicsystems.com ↗ Voltaic P123 solar panel, front: a 66 by 66 mm dark textured cell behind a clear ETFE face with a thin silver border. The same panel from behind, showing the label: Model P123 R1F, Power 0.64 W, Vmp 6.07 V, Imp 0.11 A, Voc 7.09 V, Isc 0.12 A, and the V- and V+ solder pads.

Vmp 6.07 V · Imp 110 mA · Voc 7.09 V · 3 in parallel → ~190 mAh per sun-hour (the model's band 120–260) [C]

Three panels in three flat pockets cut into the crown of the sphere, wired in parallel — about 1.9 W rated together in good sun. Facing three different directions means a rolling buoy nearly always has one of them lit, which matters far more than peak output does. A second set of three went onto combiner board 2 on 2026-11-03; which panels they are is not recorded, so the buy for three probes is six less that set once it is identified (FW-29).

Parallel, never series, and that is a hard rule. In parallel the array's voltage stays at one panel's 7.09 V open-circuit, about 8.5 V on a cold day [C], which sits inside the charger's 4.35–10.5 V input window [D]. In series it would triple, to more than 21 V, far past the 10.2–10.8 V at which the charger shuts its input off [D].

ETFE-faced and IP67, so spray and UV are not a problem. The crown pockets were dimensioned around this exact panel — a 76.8 mm pocket over a 71.8 mm seat — which is why the smaller P122 in the drawer is bench stock and not a substitute.

SS14 Schottky diode 3 per probe, one per panel arrived 2026-10-15placed on 5 combiners

on the solar combiner board in the upper shell · one per panel · ~0.3–0.45 V drop

One diode in series with each panel, on the way to the charger. Panels wired in parallel while facing different directions will fight: a shaded panel stops being a source and becomes a load, draining the lit ones through the common node.

A diode only lets current pass one way, so each panel can contribute or sit idle but never take. Schottky specifically, not an ordinary silicon diode: a Schottky drops about 0.3–0.45 V where a standard one drops 0.7. When the panel only makes 6 V and every volt matters to the charger's input window, that difference is worth the part number — and it is also why the diodes must exist in exactly one place. Put a second set on the carrier "for safety" and every panel pays the drop twice, about 0.9 V off a 6 V panel.

They live on a small solar combiner board in the upper shell, next to the panels, rather than on the carrier. The fab places them on that board: SS14, a surface-mount part. A combiner built by hand on perfboard uses three through-hole 1N5817 instead — the same circuit. The spec solders the panels’ leads to it (the second set is on XH plugs as built — FW-29), it carries the three diodes and both junctions, and one JST-XH pair is the only solar wire that crosses the equator — which is one less thing threaded past the flange the hull has to seal around.

Solar charger Adafruit #4755 (bq24074)
chosen 15 Oct 2026
owned 7, two dead1 per probe, 3 in service adafruit.com ↗ Adafruit bq24074 charger #4755, from above: a small black board with a DC jack and a USB-C socket on the left, two JST-PH sockets on the right, three solder links in the middle and a row of eleven pads along the bottom edge.

off-board on standoffs · exchanges only BATT+ and GND with the carrier

Charges the pack from the panels. The probe is not wired through it: the carrier’s J5 hangs on the LIPO pad, beside the charger rather than behind it. In sunshine the charger’s current covers the probe’s small share first and the rest goes into the cells; at night the cells carry everything (Power Path).

It has two jobs, not three. It does not supply the modem: the RockBLOCK takes 3.0–5.4 V straight from the pack and buffers its own transmit burst, so a charger with no boost is the right amount of board. Three things are changed on it before it is ever powered, all with a knife and a soldering iron at pad level: the THM link is cut so the thermistor pad is free, the charge rate is moved from 1 A to 0.5 A, and a 10 kΩ thermistor in parallel with 200 kΩ is soldered to THERM and ground with its bead at a cell. The second socket, Load Out, is taped over: it is a regulated output, not a battery port. All three were done by 2026-10-29 and their gates proven in ice on 1–2 November — each stops between −0.4 and −2.3 °C and resumes just above 0 °C [C] — and the lead accepted them as built rather than trim the pair (ADR 0018). Two earlier boards died of a pack plugged in backwards: the bq24074 has no reverse protection.

Why this board and not the bq25185. On 8 September the tie went the other way, on price: both boards were believed to carry the temperature pin that inhibits cold charging. On 15 October Adafruit's own board files showed the bq25185's pin strapped to a fixed grain-sized resistor with no pad, so reaching it means surface-mount rework this project does not do. The bq24074's pad sits behind a printed link a knife can cut. The two bq25185s stay in the drawer, spares of nothing; the charger sits off-board on its own cable to the carrier's J5 port, so the swap cost no board work (ADR 0018).

Panasonic NCR18650GA 3450 mAh, protected button-top
6 in parallel per probe
owned 1920 on order 18650batterystore.com ↗

6 × 3450 mAh [D] ≈ 21 Ah [C] · ~17 Ah usable at +2 °C [C] · 21 mm bay pitch · ~8.2 months on a typical day, zero sun [C]

The entire energy reserve. Six cells in parallel — which raises capacity, not voltage, so the pack behaves electrically like one very large 3.0–4.2 V cell. They drop into six bays printed directly into the battery platform, sitting low in the hull where the water is the thermal buffer.

"Protected" means each cell carries its own tiny circuit board that disconnects it if it is shorted or drained too far. This is the last line of defence, and it protects the cell — it fires at about 2.5 V [D]. The firmware lockout fires at about 3.2 V at rest and protects the mission. They are not redundant with each other; they defend different things.

Match their charge before wiring them in parallel. Connect a full cell to a half-empty one and the difference dumps between them as current with nothing to limit it. This is also why 39 cells were bought against a need of 18 — a parallel bank wants spares that came off the same shelf at the same state of charge.

Nickel-plated cell contacts uxcell, 16.5 × 16 mm
12 per probe
1 spring + 1 plate per bay

fitted by hand after printing · bay walls raised 1.5 mm to back them

The metal ends of each printed cell bay — a spring at one end, a flat plate at the other. Plastic cannot conduct, and soldering directly to a cell is how you ruin one: the heat damages the internals near the terminal.

The spring does two jobs at once — it makes the electrical contact and it keeps the cell pressed against the plate so it cannot rattle. Nickel plating rather than bare copper because it does not oxidise into a resistive film, and a growing contact resistance in a parallel bank means one cell quietly stops contributing.

MCP1700-3302E/TO 3.3 V LDO, TO-92
250 mA, 1.6 µA quiescent
owned 10 lcsc.com ↗

J5 → Q1 → VBAT → polyfuse F1 → MCP1700 → 3V3 rail · always on

A three-legged regulator turning the battery's varying 3.0–4.2 V into a steady 3.3 V. It is here for exactly one number: it costs 1.6 µA [D] to run. A typical regulator burns more than the sleeping ESP32 does, which would make the entire sleep budget pointless.

This is the always-on rail — brain, sensor bus and the three I²C chips hang off it and are never switched. It is also the rail that must never fail: the discharge path runs battery → this regulator → everything, never through the charger, which is precisely why the charger was kept out of series with it. The only parts in that path are Q1, a MOSFET that blocks a reversed pack, and the fuse.

TPS22918 load switch TI, SOT-23-6, ×2 per probe
each with a 100 kΩ pull-down
owned, on the carriers2 per probe ti.com ↗

U2: 3V3 → GPS, ON = IO25 · U3: VBAT → modem, ON = IO26

Two of them. The first is an electronically operated switch for the GPS rail — a MOSFET plus the control circuitry to drive it cleanly. GPS is the second-hungriest thing on the probe and it is wanted for some 18 minutes a day [C]; leaving it powered would cost more than every sensor combined.

The pull-down resistor is not optional. While the ESP32 is booting its pins are undefined for a few milliseconds, and a floating gate could switch the rail on. The resistor guarantees "off" is the default state, including during a brownout or reset.

The second is identical and does the same job for the modem. It sits on VBAT, driven by IO26, and cuts the modem's power between transmit windows. Rated 2 A [D] against a 500 mA load, it drops about 26 mV [C].

Its output-discharge feature — which actively drains the rail when it switches off — is the detail that turned the shared-bus leak into a serious drain rather than a small one, because it holds the dead chip's supply at ground and keeps its protection diodes conducting. It is a good feature that happened to make a bad wiring choice worse, and it is part of why the GPS ended up on its own bus.

Pack fuse uxcell T1.6A slow-blow, soldered inline
in the pack’s + lead, before the gauge
owned 20, 14 spare3 failed (FW-28)

worst legitimate draw ≈ 0.6 A [C] · ~2.7× headroom [C] · metered 0.000 on 2k before it goes in · 0.00 V across it under load before the hull closes

A fuse in series with the whole battery bank. Its rating is set by the largest current the probe is supposed to draw — the modem's ~500 mA [D] plus an awake ESP32, about 0.6 A [C]. Anything meaningfully above that is a fault. The fuse has to be small enough to act on one: a 3 A fuse in front of a 0.6 A load would let a 2 A fault burn indefinitely, which is not protection.

A 21 Ah [C] bank into a harness short, inside a sealed hull, is the case it exists for. It is redundancy rather than the primary defence: every cell is the protected type, each board cutting at around 8 A (the boards' rating as sold; no datasheet on file), and a short pulls through all six at once so they trip together. It is fitted anyway because it is a few dollars against a fire in a hull nobody can open. The part, chosen 2026-10-13: a uxcell T1.6A square radial-lead micro fuse, slow-blow, its legs soldered into the + lead under heat-shrink, no holder — 1.6 A being the standard step nearest the ~1.5 A the record asks for.

Five of the twenty are bad — three found open, two of them with nothing to blow them, and two resistive. One opened under a reversed pack plug, which is its job. On pack 3 one went resistive — 1.1 V across it under the module's own draw, the gauge reading the charger's 4.2 V over an open cell — and its replacement, soldered with pliers on each leg as a heat sink after a first swap had also read high, dropped 0.00 V with the chain on and was open again a day later at no load [M] (lab notes 2026-11-02 and 2026-11-04). Soldering heat is the suspect, so the rule for now is a heat sink on each leg and a few seconds of iron, the fuse metered before it goes in, and the drop across it read with the board drawing before any hull closes; whether the part itself survives is FW-28's. The 2026-10-15 audit also disputes the "redundancy" above — it holds that below the ~48 A the six cells' boards need to trip, this fuse is the only protection there is — and that finding waits on triage (FW-25).

05

The hull

Two printed half-shells, glued and bolted at the equator, with four more printed parts inside and three panel frames on the crown. The hull is not packaging — it is the pressure boundary, the flotation and the mount for everything else, which makes the fasteners and the adhesive structural parts of it rather than accessories.

Four are to be built, and none has been printed yet (HULL-21): three that deploy, and a fourth sacrificed to a 48-hour submersion test that proves the bonding process actually works before three real probes depend on it.

Polymaker PolyLite ASA PF01031, yellow, 1.75 mm buy 4 kg668 g per probe [C] shop.polymaker.com ↗

Tg 98 °C [D] · 43.8 MPa X-Y / 32 MPa Z [D] · 3 mm wall, 5 perimeters · dry 7 h at 70 °C

The filament every printed part is made of. ASA rather than the usual PLA or PETG for two reasons: it does not go brittle and chalky under UV, and it bonds properly to epoxy and to itself.

The Z-strength number is the one that matters. A printed part is much weaker across its layers than along them — 32 MPa versus 43.8 [D] — and the equator seam runs exactly across the layers. That weakness is why the joint is bonded and bolted rather than trusting either alone.

High-visibility yellow, which is the right colour for something you may have to spot in a grey sea. Dry the spool for 7 hours at 70 °C before printing — ASA absorbs moisture from the air, and wet filament prints weak and stringy, which on a pressure boundary is not cosmetic.

Equator flange hardware M5 × 16 socket cap ×8 · ISO 7092 washers ×16 · plain hex nuts ×8 · A4-316 owned, all three

~619 mm seam [C] · stack closes at exactly 16.0 mm [C] · 0.00 mm proud [C] · 8 mm open-end spanner

Eight bolts clamping the two half-shells together. Their first job is holding the joint evenly closed while the epoxy cures; afterwards they are permanent mechanical backup should the bond ever let go.

A4-316 marine stainless throughout, and that is a rule, not a preference: two different metals in contact with seawater form a battery and the less noble one corrodes away. Every external fastener on the probe is the same alloy, which is also why the flange uses plain through-holes and nuts rather than brass inserts.

Plain nuts, not nylon-insert ones. Self-loosening under vibration needs the joint faces to slip sideways against each other, and a flange bonded across its full annulus cannot slip — no mechanism, no need for the locking nut.

The stack closes at exactly 16.0 mm and the bolt lands flush, so there is zero margin: a 1.6 mm washer or a nut 0.7 mm taller than specified will not fit. Use an open-end spanner — a socket fouls the curve of the hull.

Marine epoxy — West System G/flex 650 two-part, 1:1 by volume, chosen 2026-10-27
~300 g for four hulls and their coupons
1 kit ordered 2026-10-27the rest after the coupon

pot life 45 min, working time 75 min [D] · flange faces, 6 mm lap, external fillet, wire potting, gland, ballast bed

The actual seal — bolts alone do not make a hull watertight. It bonds both flange faces and the overlapping lap that backs them, fills the fillet outside, and pots every wire that passes through the shell.

Pot life is the specification, not a convenience. A 619 mm seam takes time to lay up evenly — adhesive on the lap and both flange faces, the shells aligned, eight bolts torqued in a star — and a fast epoxy that goes off in fifteen minutes will start curing before the second half is closed. G/flex is a toughened marine epoxy, 1:1 by volume, 45 minutes in the pot and 75 of working time, a 4 °C minimum and 32.7 % elongation [D], and it is sold for plastics, ABS among them.

Two things a coupon settles before a hull is bonded (HULL-05). Mixed, it is as thick as honey, 15,000 cps [D], and the lap is a 0.15 mm slip fit meant to wick the epoxy in — so a lap coupon is closed and sectioned first: the shells seat fully, the bondline is full, the tip is not dry. And it softens early, 53 °C heat deflection [D]: nothing at sea reaches that; a sealed probe in a parked car can. One kit is ≈ 260 g [C] against about 300 g for four hulls and their coupons, so the second kit waits on the coupon.

Wear gloves, without exception: amine hardeners are cumulative skin sensitisers — you can work with them for years and then abruptly become allergic — and this is a build with a student on it.

Colloidal silica thickener West System 406, or G/flex 655 pre-thickened · ~10 g per hull buy after the coupon

A very light powder stirred into the same epoxy — not a different product. Liquid epoxy sags out of a vertical groove and cures somewhere useless; thickened, it stays where it is put, which is what the external fillet running around the equator needs.

Pressure vent Amphenol LTW VENT-PS2NBK-O8001
M6 × 0.75, ePTFE, IP68
buy 4

seats from the pocket side in the crown's vent pocket · required on every probe

A small screw-in plug with a breathable membrane. A fully sealed sphere would measure only its own internal pressure, which makes the barometer — the probe's most valuable sensor — useless. The membrane lets air pressure equalise while blocking liquid water.

It has a second job the barometer does not care about: without it, the hull would balloon and crush as temperature swings, working the equator joint back and forth for months.

The thread is M6 × 0.75. Order against the part number above, not against a size remembered from a list — an M12 vent will not fit the pocket and cannot be made to.

Internal mounts M5 × 10 socket cap into
M5 × 8, Ø7.117 brass heat-set inserts
screws owned 60buy 12 inserts

15 per build · ballast lid 4 · battery platform 4 · main platform 4 · solar platform 3

What holds the four internal platforms into the shell. Printed threads strip; brass ones do not. A heat-set insert is a knurled brass sleeve pushed in with a soldering iron — the plastic melts around the knurls and locks it permanently.

The bore is cut deliberately undersize with a 1 mm sump at the bottom for the plastic the insert displaces. Melted material has to go somewhere; without the sump the insert stops proud and the platform will not seat.

The exact insert matters more than "M5 heat-set" suggests: the bore is sized for a Ø7.117 × 8.0 body, and the common generic sizes are Ø7.0 × 9.5 or Ø6.4 × 8. A narrower one spins in the mouth instead of melting in; a longer one has nowhere to go.

The boards have mounts of their own since 2026-10-17: sixteen Ø6 pillars printed on the main platform, each bored Ø3.2 for an M2.5 heat-set insert, carry the carrier, the GPS, the gauge and the charger — the bore size came off a printed test piece [M], the rest of the geometry is the build's [C] (140 inserts owned; the lab note of 2026-10-17 on the platform pillars).

These are stainless screws into brass inside a sealed dry hull, which is the one place the same-alloy rule is relaxed — a galvanic couple needs an electrolyte, and if there is water in there the probe has already failed on other grounds.

Panel-frame fasteners M3 × 6 socket cap into
M3 × Ø4.0 × 4.0 brass inserts
owned 145 of each6 per probe

6 panel-frame lugs · Ø3.5 bore cut 5.0 deep · driven from inside the cavity

Six hold the three solar-panel frames onto the crown — two per frame. They are driven outward from inside the cavity, through a hole in the shell, which makes them fasteners on a real hull penetration. A seventh held the vent cover until that part was abandoned on 2026-09-10.

The 4.0 mm length is the right one and the 5.0 is not, even though both are in the drawer: the bore is 5.0 deep, so an insert as long as its own bore has no sump and stops proud of the surface.

The screw crosses 3 mm of shell plus a 0.5 mm air gap before it reaches thread, leaving only 2.5 mm of engagement — so every fraction of a millimetre a bonded frame sits proud comes straight off that. The × 6 length absorbs about half a millimetre of it, which is the accepted margin.

Closed-cell foam pad 3 mm sheet, ~120 × 110 mm per build buy 1 A4 sheet

Bonded to the underside of the main platform, pressing down on the cells below. 18650 cells vary slightly in diameter, and a cell that can move in its bay will eventually break a contact. The foam takes up the 3 mm gap and absorbs the variation without needing each bay to be a precise fit. Closed-cell specifically — open-cell foam would soak up any condensation and hold it against the pack.

Acetone technical grade, ~100 ml per hull buy if absent

Two jobs. Dissolved with scrap ASA it makes a slurry brushed inside the empty shells — it fills the microscopic gaps between print layers that would otherwise seep, and because it is the same material it fuses rather than coats. Neat, it degreases the flange faces before bonding: epoxy will not stick to a fingerprint.

Desiccant + carbon sachets 2 × 10 g indicating silica gel + 1 activated carbon buy 4 sets

Sealed inside the cavity at assembly. Whatever warm damp air is trapped when the hull closes will condense on the electronics the first cold night. The indicating type changes colour, which makes it a test instrument as well as a consumable — opening the submersion test article and seeing the colour tells you immediately whether water got in. The carbon sachet mops up epoxy cure vapour, which otherwise sits in the cavity and upsets the humidity sensor for weeks.

06

The keel

A sphere floats happily in any orientation, which is exactly wrong here: the solar panels, the antenna and the vent are all on one side of it. Weight low in the hull fixes that permanently, with no moving parts and nothing to run flat.

Steel bench block OWDEN, stepped puck
Ø76.5 × 16.2 mm, 69.04 cm³
owned 1530 g [M]

seam 2.0 mm clear calm, 10.5 mm under at the drogue's 400 g · freeboard to the vent bore 61.0 mm calm, 48.5 at full pull [C]

The ballast — half a kilo of steel in the foot of the sphere. It pulls the centre of gravity below the centre of buoyancy, and that separation is the entire righting mechanism: tip the buoy and gravity turns it back, every time, with nothing to wear out or run flat.

Steel rather than lead, deliberately. This probe is expendable and may well be lost at sea, and lead is not something to leave in the Southern Ocean. Steel is about 30 % less dense so it takes more volume for the same mass — an accepted cost. It doubles as a real bench tool, which is why it was cheap.

It must be painted or epoxy-coated before it goes in: the chrome plating chips, and bare steel rusts in a hull that can condense.

Ballast collar + lid printed ASA, part of the hull set
4 × M5 into brass inserts
printed

A printed ring the steel puck drops into and a hollow lid screwed down over it. A loose half-kilo weight inside a buoy in a Drake Passage storm is a wrecking ball — it would destroy the battery platform above it in minutes. Four M5 screws into heat-set inserts clamp it so it cannot shift at all. The lid is hollow to save mass where mass is not wanted: high up.

Drogue a tarp holey sock at 15 m, or a bought drift sock at ~3 m
harness around the flange, pierces nothing
nothing built — SCI-04 picks

400 g of pull in water is the hull's ceiling: the waterline climbs 12.5 mm and the seam goes 10.5 mm under [C], the case the freeboard rule is sized against

An underwater sea-anchor on a line below the buoy. Without one the buoy is pushed by wind on the exposed part of the sphere and tracks the weather instead of the current — which would make the drift measurement answer the wrong question entirely.

A drogue hangs deep enough to be gripped by water rather than air, so the assembly moves with the current and the buoy is dragged along by it. Its pull is already in the hydrostatics, because a drogue under load pulls the buoy down, and the vent bore has to stay above water even then.

Two routes, unreconciled. The build guide of 2026-10-21 (docs/drogue-build-guide.html) sizes the sock to the tether, not the hull: on a Ø200 mm sphere 13 m of 2 mm line out-drags the hull nearly four to one, so the drag-area rule of R > 40 [D] wants about 2 m² of sock — an 8 × 10 ft tarp tube Ø0.71 × 2.9 m on three water-filled hoops, centred at 15 m, R ≈ 62 [C], 300–360 g in water [C] under the 400 g the hull allows, with a shock-cord snubber against snatch on a rising wave. Its harness is a snug cord ring above the flange, riding on the bolt heads, four legs to a knot under the foot: compression on the joint, no hole, its fit unproven. Beside it stands the route of 2026-10-16: a bought 42-inch drift sock hung at about 3 m, on order to be tested in a pool, because the deep sock's weight and snatch loads worry a 2 kg hull. Nothing has been built or weighed; the lead picks, and that route's tests gate it.

owned in the drawer ordered paid for, not arrived to buy not yet bought

What is still missing

The two biggest gaps are the third satellite modem and antenna (~$350 together) and 4 kg of filament for four hulls. The small electronics that a receipt check on 8 September found had never been ordered — the load switches and the thermistors — came in on 13 October, the switches placed on the carrier boards, the thermistors from DigiKey. Chargers and gauges are no longer short: a reversed pack plug killed both chargers and a gauge in late October, a second gauge failed with no cause found and a third is suspect, and seven chargers and eight gauges are now owned, three of each on the carrier boards, the dead ones labelled and kept.

No bulk capacitor appears on that list, because the design has none: the modem runs straight off the battery and buffers its own transmit burst. The charger was chosen on 8 September and re-chosen on 15 October — the bq24074, once its rival's thermistor pin turned out to have no pad — so what is open about it now is its idle current, bench gate ①, which the Klein has been able to read since 30 October; its cold gate was proven in ice on all three boards on 1–2 November and accepted as built (ADR 0018).

Part photographs are the manufacturers' own, from the product pages linked beside each part: DFRobot (FireBeetle, BMP581), SparkFun (BME280, SAM-M8Q, the Micro BMP581 on the GPS), Adafruit (MAX17048, charger), Ground Control (RockBLOCK), Maxtena (antenna), Voltaic (solar panel), DFRobot (BMP581, and a photograph of the same commodity waterproof DS18B20) and Amphenol/Digi-Key (the RF jumper). They show the catalogue part, not the individual unit in the drawer — which is a distinction this project has already paid for once, when the BME280 turned out to be a different board from the one every document named.

Live quantities and prices are in device/hardware/bom/bom-prod.md; what is physically in the drawer is device/hardware/inventory.md; nets and pins are in the carrier spec; the hull's own figures are in device/enclosure/buoy-description.md. This page is a plain-English reading of those; each figure's home is the document that owns it.

Part of SouthPing — southping.org. This page is licensed CC BY 4.0: reuse it, adapt it, publish it, with credit to SouthPing and a link back. Source code in the project is Apache-2.0. Manufacturers' datasheets and product photographs remain theirs and are not covered by this grant.