sphere200g_p123 · SEA — the Drake Passage drifter
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.
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 book | LAND-1 / LAND-2 | |
|---|---|---|
| Keel | 530 g steel ballast in a printed collar under a bolted lid | omitted — the station is bolted to a bracket instead |
| Drogue | sea anchor on a line below the hull | none |
| Internal screws | 15 | 11 — the ballast lid's four are not needed |
| Transmit | 8× a day, every 3 h from 00 UTC — decided 2026-11-04 | the same, every 3 h from 00 UTC — SEA's schedule since 2026-11-05 |
| GPS fix | on 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 row | the same — every hourly wake |
| Message | schema 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 probe | same part, same pocket — reads water along the track | same part, same pocket — reads ground or snow |
| BME280 humidity | sealed inside: a condensation canary | real 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.
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.
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.
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.
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
| Part | Power | Data | Pins on the MCU |
|---|---|---|---|
| Solar panels ×3 | source — 6 V, 110 mA each | — | — |
| Charger | panels in, pack and VBAT out | — | off-board: BATT+ and GND to J5, nothing else |
| FireBeetle ESP32 | 3V3, always on | it is the bus master | every pin below is its own |
| BME280 | 3V3 — 4-pin header, not Qwiic | I²C0, 0x77 | IO21 SDA0 / IO22 SCL0 |
| BMP581 (Fermion) | 3V3 via SOCK_BARO | I²C0, 0x47 | IO21 / IO22, the same pair |
| MAX17048 | 3V3 via Qwiic QW1, for its LED and pull-ups; the chip runs from the pack on its own JST-PH | I²C0, 0x36 | IO21 / IO22 — it is powered by the pack it watches, and silent without one |
| SAM-M8Q GPS | 3V3_GPS — switched by U2 | I²C1, its own bus | IO25 gates U2; IO18 SDA1 / IO19 SCL1 |
| BMP581 #2 (SparkFun) | 3V3_GPS — with the GPS, through its spare Qwiic port | I²C1, 0x47 | IO18 / IO19, the GPS's pair |
| RockBLOCK 9603 | VBAT_RB_SW — switched by U3, tapped before F1 | UART, plus its own sleep pin | IO26 gates U3; IO16 RB_TX / IO17 RB_RX; IO14 RB_ONOFF |
| DS18B20 probe | 3V3 via J8, 4.7 kΩ pull-up, 100 Ω in supply and data | 1-Wire — data and clock share one line | IO4 OW_DATA |
| NTC — carrier leg | none at rest: excited only for the read | analogue divider | IO13 SENSE_EXC → J7 → IO39 NTC_SENSE |
| NTC — charger leg | the charger's own THERM pad | none — it gates in hardware | not on the carrier at all |
| Leak pads | none at rest: same IO13 excitation | analogue, 100 kΩ + 100 nF | IO13 → 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.
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).
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.
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
| Pin | Net | What it does |
|---|---|---|
| IO16 / IO17 | RB_TX / RB_RX | Serial link to the satellite modem |
| IO18 / IO19 | SDA1 / SCL1 | GPS bus (I²C1) — its own, see the backfeed note; the second BMP581 rides it |
| IO21 / IO22 | SDA0 / SCL0 | Sensor bus (I²C0) — BME280, MAX17048, BMP581 |
| IO25 | GPS_EN | Turns the GPS rail on via the load switch |
| IO26 | RB_EN | Turns the modem's battery rail on, through the second load switch |
| IO14 | RB_ONOFF | The modem's own sleep input — wired as the alternative to cutting its rail |
| IO4 | OW_DATA | 1-Wire to the sea-temperature probe, 4.7 kΩ pull-up |
| IO13 | SENSE_EXC | Excites the NTC and leak dividers — high only during a read |
| IO39 | NTC_SENSE | Battery temperature (ADC1, input-only) |
| IO35 | LEAK_SENSE | Leak pads (ADC1, input-only) |
| spare | IO23, IO36 | Unallocated. IO34 is free too, but the FireBeetle loads it with its own battery divider |
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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).
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.
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.
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.
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.
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).
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.
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.
~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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.