SouthPing · one carrier for a real probe, from bare board to a bench-proven core

Flight Board

The checklist for building a carrier board that goes into a buoy. It starts from a bare fabbed board and ends with the board, its brain, its sensors and its satellite modem all proven on the bench. Every step says what to do, how to check it with the meter or the laptop, and in plain words what the step does and why it matters. It is board 1's build, done again with everything board 1 taught us written in.

The short form of Carrier Assembly (stages 0–5, with the drawings and the physics) and of the carrier spec's bring-up steps 6–9. Board 1's readings are quoted as the reference, tagged [M]; they come from the lab notes of 2026-10-14 to 2026-10-17, and boards 2 and 3's from those of 2026-10-18 to 2026-11-04. Expected bands are tagged [D] for a datasheet and [C] for a calculation. Ports, pins and nets are from connection-table.csv.

How to use this page

⚠ Rules for the whole build

What board 1 taught us, built into the steps below

Phase 0Before you start

  1. 0.1

    Pick the board, name it, and start its record

    Do Take a board not yet built: boards 4 and 5 are untouched since the factory check, boards 1–3 built and level since 2026-10-28 (all five passed the factory check on 2026-10-13). Write its number on the underside with a fine permanent marker, on bare board away from any pad. Fill in the board's fields in the record at the bottom of this page: the board number, the probe it is for, and today's date.

    What this does Three probes get three nearly identical boards, and nothing on a board says which one it is. Every reading taken below has to follow the right board into the lab note. Otherwise a fault found at sea cannot be traced back to how that board was built.

  2. 0.2

    Check the kit

    Do Lay out everything in the table and tick it off. Where the last column says short, sort that out before phase 7 or 8 starts.

    PartFor this boardWhat the records say (inventory.md, 2026-11-04)
    meteo-carrier rev. 4, assembled15 fabbed, counted 2026-10-13; boards 1–3 built and level since 2026-10-28; boards 4–5 untouched
    MCP1700-3302E/TO regulator (U1)110-pack, owned
    JST B5B-XH-A (J5, J6)2DigiKey bag, owned
    JST B3B-XH-A (J7, J8, J9)3DigiKey bag, owned
    Male header strip, 1×4041 pinsJP1 2, J10 5, JP2 2, the module seat 14 + 18. Owned
    Female header strip, 1×40, 8.5 mm17 + 3 lost to cutsSOCK_BARO 7, SOCK_BME 4 + 6. Owned
    Shunts, black, closed top (S9001-ND bag)2JP1, JP2. Owned, 30
    FireBeetle 2 ESP32-E13 owned, all on boards 1–3 since 2026-10-27. Short: none spare
    DFRobot BMP581 (SEN0667)13 + 3 (three more arrived 2026-10-30), one bad (it froze board 2's bus scan). Check which one this probe gets
    SparkFun Qwiic BMP581 (SEN-20171), the second barometer1Five ordered 2026-10-28, three on boards 1–3: on the GPS's second Qwiic port, so on I²C1 (IO18/19) at 0x47, powered only while the GPS rail is up; it cross-checks the Fermion (FW-29). Check the silkscreen says BMP581, not BMP384
    SparkFun BME280 (SEN-13905)1Three on boards 1–3, one bad (93–97 %RH in a ~50 % room [M]), one spare. Read its humidity before it is seated
    Adafruit MAX17048 fuel gauge18: three on boards 1–3, two new spares, two bad, one suspect. A bad one answers at 0x36 with a fixed voltage (7.2)
    SparkFun SAM-M8Q GPS1One on each of boards 1–3; no spare is recorded. Check one is in hand
    Adafruit #4210 Qwiic cable, 100 mm29 × 100 mm and 6 × 50 mm owned (PROC-25 closed 2026-10-29): enough
    Qwiic → male-header cable, 150 mm (for probing QW1 and QW2)14 owned; a bench tool, not part of the probe
    DS18B20 waterproof probe13 owned, one per probe
    10 kΩ NTC thermistor (Vishay NTCLE100E3103JB0)1DigiKey bag, about 15
    XHP-3 housings, XHP-5 housings, 22 AWG pre-crimped XH leads2 × XHP-3, 1 × XHP-5, ~6 leadsDigiKey bag. The leads are all black: mark them with tape
    RockBLOCK 960312 owned, board 1's and board 2's. Short: a third is on the order list
    MX1.25 (PicoBlade) pre-crimped kit, 10-way housing1 housing, 5 wiresOwned; it fits the modem's header
    The modem's antenna and its cable1The flight antenna on the Amphenol cable, or the bench helical
    A pack with its J5 lead, one per board1Boards 1–3 each have their own pack and gauge since 2026-10-28: one NCR18650GA, a uxcell T1.6A fuse in the + lead (rules box), the gauge between pack and J5
    Solder 63/37, iron at 320–350 °C, flush cutters, pliers, magnifier, tape, heat-shrink, female–female jumper wire—Bench

    What this does Board 1 stopped twice for a part nobody had: the regulator bag that could not be found, and the modem lead that never shipped. A missing part found now is an order. Found halfway through, it leaves a half-built board on the bench for a week.

  3. 0.3

    Set up the meter, and learn the probe points

    Do This guide is written in the Klein MM325's words, the bench meter since 2026-10-30: manual ranging, three jacks. Black lead always in COM. Red goes in VΩ for everything except the two big currents (phase 6 and the modem), which use 10A. The dial decides AC or DC (V⎓ and A⎓ are DC, V~ is AC), so there is no AC/DC button. Ohms start at 2k, which reads kΩ to three decimals (there is no 200 position), then 20k, 200k and 2M; OL means open, or over-range. device/hardware/bench-meters.md has the rest. Check these before the first reading:

    1. Dial on 2k under Ω, touch the probe tips together: it reads 0.000 or 0.001 (kΩ). That is the leads' own resistance.
    2. The 10 A fuse is good: leads in COM and VΩ, dial on 2k under Ω, and push the red probe's tip into the empty 10A jack. It reads 0.000 or 0.001 (board 1, on the EverStart: 0.00 [M]). OL means that fuse is blown, and every big current would read 0. The VΩ jack has its own 200 mA fuse, and a blown one reads 0.00 on a current range too; step 5.4 proves that one with a real 0.03 mA.
    3. Read volts on the V⎓ arcs and current under A⎓; never V~.
    A J10 GND (pin 2), its cone underneath. The black probe's home
    B J10 VBAT (pin 1): the pack's voltage
    C JP1 upper pin: the regulator's output
    D J10 3V3 (pin 3): the board's 3.3 V rail
    E JP2 upper pin: the modem's switched rail
    F J8 pin 3: the DS18B20's supply
    G J8 pin 1: the DS18B20's data line
    K the module seat's VCC, the square cone at the top of the 14-pin row

    What this does A voltage is always measured between two points. Keeping the black probe on one fixed ground point (A) means every number below can be compared with board 1's. "Cone" means the little cone of solder around a pin on the underside. That is where the joint really is.

  4. 0.4

    Check the bench pack at its plug

    Do Unplug the J5 lead from the board. Dial on 20 under V⎓. Red probe on the XHP-5 plug's position 1 contact (seen through its side window), black on position 5. This reads the J5 lead, downstream of the gauge; the pack's own plug gets the same sign check at 7.1, before it mates the gauge.

    Check 3.0–4.2 V [D], positive. Board 1 read 3.4–3.5 V [M]. A minus sign means the lead is reversed: stop.

    What this does Everything below is powered from this plug. The pack is a lithium cell that can push many amps into a mistake. The fuse in its + lead limits a short, but it did not save a gauge and two chargers from a reversed plug: this sign check is what keeps a wrong plug from becoming a burnt board.

Phase 1 · Carrier Assembly stage 0The bare board: look before you solder

The factory has already placed twenty-one tiny parts. Before you add yours, prove theirs are present, the right way round, and not shorted. No power and no soldering in this phase.

  1. 1.1

    Photograph and inspect

    Do Photograph both faces. Under the magnifier or a phone zoom: on U2 and U3 (the two six-legged chips) the chip's dot sits at the silk's small triangle. No solder joins two legs of U2, U3, QW1 or QW2, and no part stands on one end.

    What this does U2 and U3 are the power switches for the GPS and the modem. A six-legged chip fits either way round, so only its mark tells you it is right. A fault the factory made is an e-mail to the factory today. After your eighty joints, nobody can say whose fault it was.

  2. 1.2

    Four short checks

    Do Dial on 2k under Ω. This meter shows OL for open. The pads are bare, so touch them directly.

    RedBlackExpectRead
    J5 pad 1 (square, top)J5 pad 5open, or a number that climbs
    JP1 upper padA — J10 GND padopen, or climbing
    JP1 lower padAopen, or climbing
    JP2 upper padAopen, or climbing

    Check No pair holds a steady few ohms. If one does, don't solder this board: photograph it and take another.

    What this does These are the board's power rails, each measured against ground. Between a rail and ground the design has only capacitors. A capacitor takes the meter's tiny test current at first and then fills, so the reading climbs toward open. A solder bridge is a wire: a few ohms that never climb. That is a short.

Phase 2 · Carrier Assembly stage 1The power inlet: J5, U1, JP1, J10

Four parts and fifteen joints, and at the end of it the board turns the pack's 3–4.2 V into a steady 3.3 V. Every later check is measured against this rail, so it is proven first and on its own.

One joint, the right way

  • Tin the tip so it is shiny. Touch the tip to the pad and the pin together, underneath, for about a second.
  • Feed the solder into the joint, not onto the iron. Two or three millimetres of wire is a whole joint. Take the wire away, then the iron, and don't move the part for two seconds.
  • Good: a small shiny cone that climbs the pin and covers the pad. Bad: a dull ball sitting on top (reheat). A blob reaching the next pad (drag the iron out along the gap).
  • Ground pins (U1's square pad, J5 pin 5, J6 pin 2, J8 pin 2, J9 pin 3, J10 pin 2, the seats' GND pins): stay a second or two longer until the solder flows. Don't add more solder to a slow joint. Five seconds is the limit before a pad lifts.
  • Every part goes in the same way: solder one end pin, check the part sits flat and square (reheat and press if not), then solder the rest.
  1. 2.1

    Solder J5, the battery socket

    Do The 5-position XH header. Its slotted wall goes on the broken silk line; the square pad is at the top, where the silk says 1=BATT+. Tape it, flip the board, then one end pin, check, the other end, and the middle three.

    What this does J5 is where the battery comes in. Only its two outer positions carry wires; the three empty ones are a key, so the wrong plug won't fit. The slotted wall decides which way the plug goes in, and so which wire lands on which pad.

  2. 2.2

    Solder U1, the regulator

    Do The MCP1700, a black three-legged part. Its flat face goes on the straight silk line, toward the board's middle, with the GND leg in the square pad. If the legs are closer than the 2.54 mm holes, splay the two outer legs with pliers about 1 mm below the body. Leave 2–3 mm of leg above the board, solder all three, and trim them flush.

    What this does The regulator takes whatever the pack gives as it discharges and puts out 3.3 V regardless. It was chosen because it uses almost nothing itself, about 1.6 µA [D]. That matters because the probe is asleep nearly all of every hour. Turned round, it would put the battery on the wrong pins.

  3. 2.3

    Solder JP1 (2 pins) and J10 (5 pins)

    Do Snap a 2-pin and a 5-pin piece from the male strip (it snaps at the notch). Short end down through the board, plastic on the top face. Tape, solder one pin, check it is straight, then the rest.

    What this does JP1 is a removable link in the 3.3 V line. With its shunt off, the rail is cut. That is how the meter measures the board's current, and how USB and the pack are kept apart later. J10 is the service header: VBAT, GND, 3V3, and the module's boot and reset pins, reachable once the module covers the board.

  4. 2.4

    Power-off checks

    Do Look at all fifteen cones first: none touches a neighbour. Then use •)) (continuity: it beeps below 50 Ω [D] and shows the ohms) unless the row says otherwise.

    RedBlackExpectRead
    U1 left leg (square pad)Abeep
    U1 right legC — JP1 upperbeep
    U1 middle legeither end of F1beep
    J5 pin 5Abeep
    J5 pin 1B — J10 VBATdiode ▷|: 0.3–0.8 V [C], shown in mV. Board 1: 456 [M]
    each J10 pinthe pin next to itno beep, four times
    C, then JP1 lowerAΩ: open or climbing

    What this does Each beep proves a joint connects what it should. Each silence proves it doesn't touch what it shouldn't. The diode row reads Q1, the factory's reverse-battery valve: it passes current one way only, at a "toll" of about half a volt. With the probes reversed it reads open, and that is right. 0.00 would mean Q1 is bridged.

  5. 2.5

    First power, through the meter

    Do JP1 has no shunt. Red lead in VΩ, dial on 20m under A⎓ (current). Plug the J5 lead in: nothing flows yet, because JP1 is open. Now put the probes across JP1's two pins, red on the upper pin. The meter is now the only path from the regulator to the rail. Then touch U1, Q1 and F1 with a finger.

    Check 0.00–0.01 mA [C] (board 1: 0.00 [M]), and all three parts cold. A reading of about 2.7 or 3.5 means the dial is on volts. On a current range OL means over-range, not open: lift the probes and look at the dial. Anything over 0.1 mA is a fault: unplug and look for a bridge.

    What this does The meter in the line reads everything the board draws. On a bare board that should be almost nothing: the regulator's 1.6 µA. A short shows up here as a number before it shows up as smoke. That is why first power always goes through the meter.

  6. 2.6

    Volts

    Do Dial on 20 under V⎓. Black on A, red on each cone in turn.

    Red onExpectBoard 1 [M]Read
    B — J10 VBATthe pack, within 0.02 V3.49
    U1 middle legthe same3.49
    C — JP1 upper3.20–3.40 [D], typically 3.29–3.313.34
    D — J10 3V30 — the shunt is out0.00

    What this does It proves the regulator makes 3.3 V. Board 1's read 3.34, a little high. Your reading says whether that was the part or the meter, so write it down exactly.

  7. 2.7

    Fit the JP1 shunt

    Do Unplug J5. Take a shunt from its bag: a small black block about 6 mm each way, with two holes and a metal clip inside. Push it over JP1's two pins until it sits on the header's plastic. Plug J5 back in and read D.

    Check D now reads what C read.

    What this does The shunt closes the link, and the 3.3 V reaches the whole board. Board 1 lost an hour here because "fit the shunt" was read as "solder the pins".

Phase 3 · Carrier Assembly stage 2The other ports: J6, J7, J9, J8, JP2

The sockets through which the board reaches the outside: the modem, the battery thermistor, the leak pads and the water-temperature probe. Nothing gets plugged into them yet.

  1. 3.1

    Solder J6, then J7, J9 and J8, then JP2

    Do J6 is the 5-position one, square pad at the top like J5. J7 (NTC), J9 (LEAK) and J8 (DS18B20) are 3-position, square pad at the left. Every slotted wall goes on its broken silk line. JP2 is a 2-pin piece like JP1, with no shunt. Then count: three cones on every 3-pin port. Board 1's middle pins were missed the first time.

    What this does J6 carries the modem's power (the pack's voltage through switch U3), ground, two serial wires and an on/off line. J7 reads the battery's temperature through a thermistor. J9 is the two wet-pad leak sensor. J8 is the DS18B20 probe that goes out through the hull. JP2 is the modem's own removable link, like JP1.

  2. 3.2

    Power-off checks

    RedBlackModeExpectRead
    J6 pin 2 · J8 pin 2 · J9 pin 3Abeepbeep, each
    J6 pin 1JP2 lower pinbeepbeep
    J6 pin 1J6 pin 2beepno beep
    F — J8 pin 3DΩ 2k~100 Ω [D] (R6), shown as 0.100. Board 1: 99.9 [M]
    G — J8 pin 1DΩ 20k~4.8 kΩ [D] (R7 + R3). Board 1: 4.74 [M]
    J7 pin 3AΩ 20k~10 kΩ [D] (R4). Board 1: 9.9 [M]
    E — JP2 upperAΩ 2MOL, or wandering below 2 MΩ

    What this does The resistor rows read the factory's resistors through your new joints, so a right value proves both the part and the joint. 100 Ω is too much for the beeper to sound, which is why that row uses Ω. The last row wanders because a capacitor on the modem rail is slowly charging from the meter. That is fine; a short holds still.

  3. 3.3

    Power on: current, then volts

    Do JP1's shunt off, meter on 20m under A⎓ across JP1 as in 2.5, J5 plugged in. Then the shunt back on, 20 under V⎓, black on A.

    ReadingExpectRead
    Current across JP10.00–0.01 mA
    F — J8 pin 3 · G — J8 pin 13.3 V each
    E — JP2 upper · J6 pin 10 V each
    J7 pin 1 · J9 pin 10 V each

    What this does The probe's port is live (3.3 V) because the probe is always powered. The modem's rail is dead because its switch is off: a 100 kΩ resistor holds the switch's "on" pin at ground until the brain says otherwise. J7 and J9 read 0 because they are fed by a brain pin, and there is no brain yet.

Phase 4 · Carrier Assembly stage 3The sensor seats: SOCK_BARO and SOCK_BME

Two female sockets so the barometer and the weather sensor plug in by hand. Each sensor board is used as the jig that holds its socket square while it is soldered.

  1. 4.1

    Cut the sockets, and give the BMP581 its header

    Do

    1. From the female strip cut a 7-way, a 4-way and a 6-way. Cut through the next cavity along, which loses one position each time.
    2. The BMP581 ships with a 10-pin header: snap off 7. Push the pins through the sensor board from the back (the face with the pin names INT … 3V3), long pins down, sensor face up. Stand the long pins in the 7-way socket so the header sits square, and solder the seven on the sensor's top face.
    3. Dial on 2M under Ω: the breakout's 3V3 pin to its GND pin reads open or climbing, and each pin to its neighbour reads open.

    What this does The BMP581 is the mission's barometer, the measurement the science rests on. The board has seven pins but only the last four are used. The socket is seven wide anyway, so the sensor can't be plugged in one position off: one off would put GND on 3.3 V.

  2. 4.2

    Solder both seats, with the sensors as jigs

    Do SOCK_BARO: the 7-way into its holes and the BMP581 plugged into it, its INT end at the silk's INT<. Solder one end pin underneath, check it is upright, then the rest. SOCK_BME: the 4-way in the left column (GND at the top), the 6-way in the right, and the BME280 plugged across both so the columns end up parallel. One pin each, check, then all ten. Then pull both sensors straight up.

    What this does A female socket soldered on its own leans. Plugged into its sensor, it is held exactly where the sensor needs it. The BME280's 6-pin row carries no signals; it only holds the board steady.

  3. 4.3

    Checks

    Do Count socket positions from the square pad. For the Qwiic rows, plug the Qwiic-to-male-header cable into QW1.

    RedBlackExpectRead
    BARO 6 · BME 4-way topAbeep, each
    BARO 7 · BME 4-way 2ndDbeep, each
    BARO 4 · BARO 5BME 3rd · BME 4thbeep, each (SDA, SCL)
    Qwiic black · red · blue · yellowA · D · BME 3rd · BME 4thbeep, each
    each socket positionthe next oneno beep, all
    Power on, JP1 shunt in, 20 under V⎓, red on the cones underneath. BARO 7, BME 2nd, Qwiic red in QW1: 3.3 V each. Qwiic red in QW2: 0 V

    What this does Both sensors and the fuel gauge's port (QW1) share one two-wire data bus, I²C. Each device answers only to its own address, so they don't get in each other's way. QW2 reads 0 because the GPS, and the second barometer on its Qwiic port, have their own bus behind their own switch, so the brain can turn them completely off.

From here on the BMP581 covers J10. Its board sits about 2.5 mm [C] above J10's pin tips. Whenever a step needs J10's pins or the module's reset, pull the barometer off first; it is one tug.

Phase 5 · Carrier Assembly stage 4The module seat, and the switch test

Thirty-two pins that must land exactly where the FireBeetle's sockets are, so the FireBeetle itself is the jig. Unpowered. Then a jumper wire plays the brain's part and switches both power switches.

  1. 5.1

    Solder the seat with the module as the jig

    Do

    1. Snap a 14-pin and an 18-pin piece from the male strip. Drop them, short end down, into the seat's rows: the 14 on the left under VCC…17, the 18 on the right under RST…RX. Don't solder yet.
    2. Plug this probe's FireBeetle onto the long pins upside down, so you see its back. Its USB-C is over the silk's USB box, and its four mounting holes line up with the seat's four small corner holes. If they don't line up, it is turned round.
    3. Flip the pair. Solder one pin at each end of each row, flip back, and check the module lies flat. Then solder the other twenty-eight.
    4. Pull the module off straight up, rocking it end to end, not side to side.
    5. Look at all 32 cones under the magnifier and tick it. Board 1's record is missing this look.

    What this does The FireBeetle is the brain. Its sockets are on the same face as its radio can, so it sits on the carrier face-down. Pins soldered while it holds them can't end up at the wrong spacing.

  2. 5.2

    The bridge walk, then the nets

    Do Power off. Walk both rows pin to neighbour: 13 pairs on the left, 17 on the right. Every pair is silent: no two neighbours share a net, so any beep is a bridge. Then:

    Seat pinToExpectRead
    bridge walk, 30 pairs—silent, all
    3V3 (left 2nd, right 2nd)Dbeep
    GND (left 3rd, right 4th)Abeep
    21 · 22 (right row)BME 3rd · BME 4thbeep
    18 · 19Qwiic cable in QW2: blue · yellowbeep
    14 · 16 · 17J6 pin 5 · pin 4 · pin 3beep
    13 · 39J7 pin 1 · pin 3beep
    35J9 pin 1beep
    4G — J8 pin 1Ω: ~100 Ω [D] (R7). Board 1: 99 [M]
    0 · RSTJ10 pin 4 · pin 5beep
    VCC (left top, square)A, B, Dno beep: JP3 is open

    What this does Each seat pin is followed to the far end of its copper, so every wire the brain will use has been seen whole. If "4 to G" reads open, press harder into J8's cone before reheating anything. On board 1 that open was the probe sitting on flux.

  3. 5.3

    Power on, no module

    Do Both sensors off their seats. JP1's shunt off, meter on 20m under A⎓ across JP1, J5 in. Then the shunt on, 20 under V⎓, black on A.

    ReadingExpectRead
    Current across JP10.00–0.01 mA. Board 1 skipped this one
    Both seat 3V3 pins3.3 V
    Seat VCC0 V
    Seat 25 · seat 260 V each

    What this does Pins 25 and 26 are the brain's "turn the GPS on" and "turn the modem on" wires. With nothing driving them, a 100 kΩ resistor each holds them at 0, so both switches default to off. That is what keeps a rebooting or sleeping brain from waking the modem by accident.

  4. 5.4

    The switch test, with a jumper as the brain

    Do JP1 shunt in, J5 in. One female–female jumper: one end on the seat's own 3V3 pin (left row, second from top; not J10's), the other end on the pin named below. Read, then pull the jumper and watch the rail fall.

    Jumper toRed onExpectBoard 1 [M]Read
    seat 25Qwiic cable red, in QW23.3 V, then 0 within a second3.34 → 0.01
    seat 26E — JP2 upper (no shunt)the pack's voltage, then 03.49 → 0
    seat 26, JP2 shunt fittedJ6 pin 1the pack's voltage, then 03.49 → 0.01

    Prove the meter's mA fuse: JP1's shunt off, the meter on 20m under A⎓ across JP1, the jumper on seat 25. It should read about 0.03 mA [C], the 3.3 V across U2's 100 kΩ pull-down. Every earlier "0.00 mA" pass is only worth something if this one moves.

    Afterwards: JP1's shunt back on, JP2's shunt back in its bag, and unplug J5.

    What this does This is the whole power plan in one test. The GPS and the modem must draw nothing while they aren't needed (the modem is wanted for eight windows a day on SEA, one on LAND; the GPS for a fix on every hourly wake on SEA, one a day on LAND), and a switch in their supply is the only way to get there. The modem rail shows the pack's voltage, not 3.3, because the modem is fed straight from the battery. Its half-amp bursts would overwhelm the small regulator. The seat's own 3V3 pin is used because its neighbours are harmless if the jumper slips. J10 has the battery right next to ground.

The carrier is finished. Everything from here is something plugged into it, and the checks move from the meter to the laptop.

Phase 6 · Carrier Assembly stage 5The brain's first boot, from the pack

  1. 6.1

    Flash the module, off the carrier

    Do The module on its own, on USB-C to the laptop. From the repository's device/firmware/ folder: pio run -e bench -t upload --upload-port PORT. PORT is /dev/cu.wchusbserial… on a Mac or COM… on Windows. Then watch the serial monitor at 115200.

    Check A line a first line beginning boot bench profile, hour 180 s as the board resets, then the sensor lines and a closing wake done in … line once the wake ends.
    • No port appears? The module's USB chip is a CH340 (USB ID 1A86:7522). A Mac needs WCH's own driver, from their GitHub release, approved under Login Items & Extensions. Windows needs WCH's CH341SER. A charge-only USB cable shows no port either.
    • The port name changes when the cable moves to another USB socket. List the ports again before each upload.
    • Don't cut the module's Low Power Pad. The boards fly stock: the cut was declined on 2026-11-03, the pack carrying a dark winter without it (the power budget, §1).

    What this does It puts the project's bench program on the brain. That program never turns on WiFi or Bluetooth. A module fresh from the box may run a demo that scans WiFi, and those radio bursts are more than the carrier's small regulator can feed. So a module is never seated unflashed.

  2. 6.2

    Seat it and power it through the 10 A range

    Do USB out. JP1 shunt out, JP2 shunt out, sensors off. Seat the module, USB end at the USB box. Move the red lead to the 10A jack, dial on 10 under A⎓. Plug J5 in. Nothing happens until the probes land across JP1 (red upper); the module boots the moment they do.

    Check 0.02–0.15 A [C], steady. Board 1: 0.03 A [M]. A steady 0 is a module not booting; half an amp is a fault, so unplug.

    What this does The brain runs on the carrier for the first time, from the battery. The 10 A jack is used because the milliamp range has enough internal resistance to starve the brain of voltage and fake a fault.

  3. 6.3

    Volts under load, and the back-feed reading

    Do Red lead back to VΩ, dial 20 under V⎓. Shunt back on JP1. Black on A. After a minute, touch U1.

    Red onExpectBoard 1 [M]Read
    D — 3V33.2–3.37 V [D], steady3.33
    B — VBATthe pack, minus a few tens of mV3.48
    K — seat VCC, square cone underneathrecord it3.03
    U1, by fingerbarely warm at mostnot warm

    Then unplug J5.

    What this does A steady D means the regulator keeps up with a real computer. K records whether 3.3 V leaks backwards through the module's own regulator onto its USB side, as it did on board 1. That is not a fault. K follows the module, not the board: three modules read 3.29, 3.14 and 3.24 → 3.02 V [M], the last drifting within one session (board 1's 3.03 was the module now on board 3), so another board's number adds little. FW-19 (blocked) waits on the VCC side measured on the microamp meter, on each module.

Phase 7 · carrier spec steps 6–8The sensors

The split supply: USB and the pack together, safely

From here on you watch the brain's output on the laptop, so USB stays in. The set-up, every time, in this order:

  • JP1 shunt out. Always, while USB is in.
  • USB into the module first, then the pack's J5 lead.
  • Then USB feeds the 3.3 V rail through the module, and the pack feeds only the modem's switch and the regulator, which dead-ends at JP1. The two 3.3 V sources can't meet, because JP1 and JP3 are both open.
  1. 7.1

    Flash the sensor bench build and connect the gauge

    Do With the module seated and on USB: pio run -e esp32dev_bringup -t upload --upload-port PORT. Seat the BMP581 and the BME280. A Qwiic cable from QW1 to the fuel gauge. Meter the pack's plug for sign first (the rules box), then push it into the gauge's left JST-PH port; the J5 lead goes into its right port. Open the serial monitor at 115200; it prints a report every 3 s.

    What this does This bench program scans both data buses, reads each part's identity register, searches for the DS18B20, and reads the thermistor and leak lines. It is a test tool, not the flight program. The gauge sits in the battery's path and measures the pack, so it only answers when the pack is plugged into it.

  2. 7.2

    The sensor bus: three devices answer

    AddressExpectBoard 1 [M]Read
    0x36MAX17048, VERSION 0x0012, VCELL ≈ the pack3.479 V
    0x47BMP581, chip ID 0x500x50
    0x77BME280, chip ID 0x600x60

    Check All three, with the right IDs, on every pass, and the values read, not only the IDs: an ID-only check catches none of what boards 1–3 showed. Two MAX17048s answered at 0x36 with the right ID and a fixed voltage that did not match the cell [M], a BMP581 froze the scan, and BME280s read 93–97 %RH in a ~50 % room [M]. Read VCELL against the meter on the pack, then watch the gauge move: a live one falls 0.1–0.19 V [M] within a second of the modem rail coming on (8.3); a reading that does not move is no reading (FW-26). No 0x36? Is the pack in the gauge's left port, and the Qwiic cable in both ends?

    What this does An address that answers proves the wiring. The right ID behind it proves it is the right part, not something else that happens to share the address.

  3. 7.3

    The GPS on QW2, switched on and off

    Do A second Qwiic cable from QW2 to the SAM-M8Q. Type g and Enter. Then g again.

    Check
    • On: 0x42 u-blox DDC (SAM-M8Q) on every pass, and the GPS board's red Power LED lit. With the second BMP581 on the GPS's Qwiic port, 0x47 (ID 0x50) appears too, powered only while the rail is up.
    • Off: the LED goes dark and the second bus's scan stops. The rail then floats at a few tenths of a volt on the meter; that is a tiny leak, not a fault.

    What this does The GPS draws tens of milliamps [D] whenever it has power, so it gets its own switch and its own bus. The brain powers it for a time fix and a position, on every hourly wake (about 18 minutes of rail a day [C]), and it draws nothing the rest of the time.

  4. 7.4

    The DS18B20: ring the probe, plug it, read its ID

    Do

    1. Find its ground wire with the meter. Dial on ▷| (diode). The red probe on one wire, the black on each of the other two in turn. The ground wire is the one that reads about 0.6 V [M] to both others, and open with the probes reversed. On board 1's probe that was black. The meter decides the ground; of the other two, take red as 3.3 V and yellow as data by the usual convention. A swap of those two does no harm, and the search in the check below proves it either way: no answer, swap them.
    2. A temporary lead: an XHP-3 housing with three XH leads, data on position 1, ground on 2, 3.3 V on 3. Twist the probe's wires onto the leads and tape them; don't solder. The bare ends must stay free to go through the hull's gland later.
    3. Plug into J8 (the one marked DS18B20), not J9.
    Check ROM 28 … CRC ok, DS18B20 and a room temperature. Board 1's read 26.9 °C [M]. Write the ROM ID here and on a tape label on the probe's cable.

    What this does This is the water (or ground) temperature sensor that goes out through the hull. It talks over one wire, and every chip has a factory serial number, the ROM ID. The label is how three probes' sensors are told apart for good. Plugged into the leak port by mistake it does no harm, but it doesn't answer.

  5. 7.5

    The battery thermistor on J7

    Do One 10 kΩ thermistor from the bag on an XHP-3: its two legs on positions 1 and 3, the middle empty. Plug into J7. Read the NTC line, then hold the bead between two fingers for half a minute.

    Check About 1.7 V [M] at room temperature (board 1: 1716–1726 mV at ~27 °C), rising as your fingers warm it.

    What this does A thermistor is a resistor that changes with temperature. With the board's 10 kΩ it forms a divider: the voltage in the middle tells the temperature. In the probe it is taped to the battery pack, so the message reports how cold the cells are. The brain powers it only during a reading, because left on, its ~165 µA [C] would add a quarter to the sleeping probe's ~648 µA [C].

  6. 7.6

    The leak pads on J9

    Do Nothing plugged in, then a short bare wire held across J9's pins 1 and 3.

    Check Dry: about 3.1 V [M]. Wire across: about 0.14 V [M] (board 1: 3.11 and 0.142).

    What this does Two bare pads low in the hull. Dry, the line sits near 3.3 V; seawater across the pads pulls it down, and the probe reports that it is taking water. A fingertip barely moves it, which is why the test uses a wire.

Phase 8 · carrier spec step 9The modem

The RockBLOCK 9603 is the probe's only link home: short messages through the Iridium satellites. Write its serial number (not its IMEI) in the record.

  1. 8.1

    Build this modem's lead

    Do The modem's 10-pin header has no pin-1 mark. Pin 1 is the end away from the plated mounting hole, toward the large supercapacitor and the C5 marking. Push five pre-crimped MX1.25 wires into a 10-way housing, and splice each to an XH lead in an XHP-5. Stagger the joints and heat-shrink each one. Tape-mark each XH lead with its wire's colour, so one colour runs end to end.

    Modem pinIts labelWireXHP-5 positionWhat it carries
    85v Inred1the pack, through U3 and JP2
    10GNDblack2ground
    6TXD (an input to the modem)yellow3the brain's transmit, IO17
    1RXD (an output from the modem)green4the brain's receive, IO16
    7OnOffwhite5sleep / wake, IO14
    Check
    • By eye, with the housing on the modem, from the capacitor end: green, four empty, yellow, white, red, empty, black.
    • Beeper, nothing powered: XHP-5 positions 1–5 to modem pins 8, 10, 6, 1, 7 give five beeps. Position 1 to 2, 3, 4, 5 and position 2 to 3, 4, 5 are silent.

    What this does No lead shipped with the modems, so each probe gets one from the kit. Only five of the ten pins are used, so no loose wires sit in the hull. Two wires are power, two are a serial link (the brain types text commands and the modem types answers), and one tells the modem to sleep. The modem names its serial pins from the other side's point of view, which is why "TXD" is its input.

  2. 8.2

    Flash the modem bench build and dry-run it with no modem

    Do pio run -e esp32dev_rockblock -t upload --upload-port PORT. Split supply as in phase 7, JP2 shunt out, nothing on J6. Type !on, read E (JP2 upper), then !off and read E again.

    Check E reads the pack after !on (board 1: 3.47 V [M]) and 0 after !off. AT goes unanswered, since there is no modem.

    What this does This program passes typed lines through to the modem and switches its power on command. It also guards the credits: it refuses any send command until !arm. Proving the switch with no modem attached means the modem's first power comes from a path you have already seen work.

  3. 8.3

    Antenna on, then the cold start through the meter

    Do The modem should have been unpowered for at least an hour. Screw the antenna onto its SMA first. Plug the lead into J6 and the modem. JP2 shunt out. Red lead in 10A, dial on 10 under A⎓, probes across JP2 (red on upper). Start a phone video of the display, then type !on.

    Check The seconds to the first OK (the program prints them) and the highest current in the first seconds. The cold start is measured [M]: first OK at 12.0 s (2026-10-25); 7.0 s with 0.45 A for ~13 s, then 0.13 A for ~10 s (2026-10-28); 9.0 s on both modems outdoors (2026-11-03). Expect 7–12 s and a peak near 0.45 A. Board 1's own first run, 1–2 s and 0.19 A [M], had the supercapacitors part-charged. FW-02 owes only the pack's low end. A flat 0.00 and no OK: check the red lead is in 10A and both probes are on their pins. Type !v before !on and again while the modem charges: a live gauge falls 0.1–0.19 V [M]; one that does not move is not reading (FW-26).

    What this does The modem stores energy in supercapacitors before it can transmit. From empty, they gulp current for several seconds. This tells us how long the brain must wait after switching the modem on, and how hard the battery is pulled while it does. An antenna goes on first because a radio transmitting into an open connector can damage itself.

  4. 8.4

    Identify the modem, and find the sky

    Do !off, JP2 shunt in, red lead back to VΩ. Take the bench outdoors with a clear view of the sky, and re-seat every plug after the move. !on, then ATI4, then !csq 10.

    Check ATI4 answers "IRIDIUM 9600 Family". Signal 0–5. Board 1 read 0 indoors and 0–4 outdoors [M].

    What this does It proves the brain and the modem understand each other, and that the antenna sees satellites. Indoors, expect 0: the satellites need open sky.

  5. 8.5

    The whole chain, short of sending

    Do !scan, !read, !gps 120, !msg. None of these spends credit.

    Check !scan finds 0x36, 0x47 and 0x77 on the first bus; it raises the GPS rail for the second, which finds 0x42 and, with the second BMP581, 0x47 again on I²C1; and the DS18B20 on 1-Wire. !read gives plausible weather (humidity near the room's, not 93–97 %) and the pack's voltage within about 0.02 V of the meter. !gps reaches a fix with date and time (board 1: 26 s [M], probably warm). !msg prints a 24-byte schema-1 message in hex.

    What this does It runs everything a probe does in an hour except the radio send: read every sensor, get the time and position, and pack it all into the compact message the backend decodes. !msg uses the flight encoder, the same code the real firmware will use, but it packs schema 1, 24 B. Every probe flies schema 3 (50 B, one credit a send), whose encoder is in the flight build.

  6. 8.6

    The send: stop, and only on a decision

    Don't type !arm unless the project lead has decided to send. The same goes for any +SBDIX, +SBDIXA, +SBDREG or +SBDAREG line, which the bench build refuses without it. A send spends credit, and for a modem other than board 1's or board 2's it needs three things done first:

    • the modem's line rental is active in Ground Control's portal (a monthly charge);
    • it is in the delivery group that forwards to the backend;
    • its IMEI is on the backend's allow-list. Since 2026-11-03 that list holds two modems, board 1's and board 2's (BE-02). A deploy from the Windows .env, which lists one IMEI, would drop one: add the second first (BE-09).

    Do When decided: outdoors, JP2 shunt in, !load, !arm, AT+SBDIX. The first number in the reply, MO status, must be 0, 1 or 2. 32 (no network) and 18 (link dropped) cost nothing: wait and try again.

    What this does It sends the packed message through the satellites to the backend's table. Board 1's first message after its line was activated never arrived; twenty minutes later the next one did. Why was never confirmed with Ground Control. If a first send vanishes, a second one is a new send: it needs the same decision.

  7. 8.7

    Power down in order

    Do !off. Unplug J5, then USB. Antenna off last. JP1 shunt back on. Bag the board with its label, its sensors and its leads together.

    What this does The modem's rail is switched off before anything is pulled. The board, its sensors and its leads stay together because each reading in the record belongs to that set.

Phase 9Hand-over, and what waits

The board is now a bench-proven probe core: every joint, every port, the brain, every sensor and the modem have been seen working. It is not yet flight-ready. The items below are decisions or work still open in the project's backlog. None of them is done on this page, and none should be done on a whim.

FW-30
The sleeping floor, as built. Both status LEDs stay in (decided 2026-11-03): the FireBeetle's WS2812 through the uncut Low Power Pad ~500 µA [D] and the gauge's green LED ~100 µA [C], so the probe sleeps at ~648 µA [C] (the model: ~617 µA at JP1). Board 1 read 0.73 mA at JP1 on 2026-11-03 [M], 1.0–1.3 mA until the BME280 went into forced mode. Boards 2 and 3 and the VCC side are still owed: the Klein across JP1 on 20m under A⎓ once this board sleeps. A reading far above ~617 µA reopens the cut.
FW-19
JP3. Stays open, and the row is blocked. K follows the module (3.29, 3.14, 3.24 → 3.02 V on three modules [M]), so the K reading in 6.3 decides nothing alone; what is owed is each module's VCC side on the microamp meter.
not tracked
The shunts for flight. JP1 and JP2 are push-on shunts. Whether they are soldered, glued or replaced by a wire link before the hull closes is not decided. A shunt shaken loose at sea is a silent dead station.
FW-11 · FW-03 · FW-14 · FW-20 · FW-23 · FW-26
The flight firmware. It is built: the flight build, with the modem driver, the GPS driver, the sleep that parks every pin, schema 3 at 50 B (one credit a send) for every probe, and a gauge that is reported and ignored when it does not move. What is open is the bench proving each of them, the battery level below which the probe won't transmit (FW-20), and the GPS database restored between fixes (FW-23). Until a board is proven it carries the bench sketches. The schema-2 encoder (FW-06) is not flown this season.
FW-10 · FW-07
How the modem sleeps. Its rail cut or its On/Off line, decided by whether its supercapacitors survive hours unpowered, which needs the INA219 measurements.
FW-15
The solar charger. In the probe, J5 is fed through the charger board, not straight from the gauge as on this bench. It has been on J5 on boards 1–3 since 2026-10-29 and solar steps 1–9 are done (2026-11-03); only step 10, the modem transmitting while the panels charge, waits on sun. The gauge sits on the charger's side of the pack fuse, so a resistive fuse makes it read the charger (4.23 V over a 3.54 V cell [M]).
PROC-26 · HULL-34
The modem in the hull. How its friction-fit plug is held (PROC-26), and where the modem sits: under the solar deck in the crown since 2026-10-20, beside the combiner, in a 45 × 45 mm bay with no clearance yet (HULL-34). No document records the platform-to-deck distance its J6 lead must span, so the lead's length is open.

Close the build

  • Copy the record into a lab note, one per board, as boards 1–3 had; FW-24 is the backlog row that tracks this checklist, so its line is edited in the same commit.
  • Update device/hardware/inventory.md: which board, module, sensors and modem are now a set, and for which probe.
  • If 8.3 ran, its numbers go to FW-02's backlog row in the same commit; that row owes only the pack's low end.

The recordThis board, in one block of text

The boxes above are saved in this browser only. Fill in the set below, then Copy the record and paste it into the lab note. Clear wipes it, ready for the next board.

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.