

Semester one was a series of sprints: validate or replace every choice made the year before, function by function. Buoyancy, movement, water throw, control. Semester two, build it.
Hull wall 1 cm → 0.3 cm and a smaller footprint to hit 70 cm. Lighter roof with a ledge to keep water out.
The V-hull with a flood chamber: air-filled upright, it floods when capsized and rolls the boat back.
7.5 kg of margin before the hull sinks. The catch was lateral: the flood chamber puts 2.31 kg on one side against 1.31 kg on the other, so components and a 1 kg ballast go to port to keep the boat level under way.


The receiver outputs a pulse between 1 and 2 ms. I wanted 8-bit resolution over that window, so 256 counts in 2 ms.
Steering band read from the counter value.
Same bands select the pilot: phone, remote, autopilot.
Above 64 on the throttle channel: speed up. Below: slow down.
Two kinds of code. A web page served by the ESP32 over its own Wi-Fi, so any phone becomes the console; and hardware logic drawn in Logisim for the FPGA, so decoding the radio pulses costs the microcontroller nothing.
// ESP32 · who drives the boat
void loop() {
if (millis() - lastPing > 1000) {
phoneAlive = server.ping(phone); // 1 Hz heartbeat
lastPing = millis();
}
mode = phoneAlive ? PHONE : REMOTE; // remote past ~100 m
fpga.select(mode); // 128–170 · 170–212 · 212–256
int throttle = fpga.count(CH_THROTTLE);
hbridge.drive(throttle > 64 ? FASTER : SLOWER);
nozzle.write(bandToAngle(fpga.count(CH_STEER)));
ui.send(speed, battery, mode); // live telemetry to the web page
}



