H2Woah OTV
An autonomous vehicle for ENES100's water-sampling mission. It finds itself in the arena from an overhead camera, hugs a wall past the obstacles, threads the limbo gap, then lowers an arm to measure the water's depth, check it for pollution and pump a sample.
I wire the robot and own its code. Teammates write each subsystem as its own Arduino sketch; I port them into one codebase, fix what breaks, and test it in ENES100's browser simulator before it ever touches the hardware. The same source builds for both, behind one flag.
- 40/40
- randomized simulator runs passed
- 1,620
- lines of firmware
- 7
- bench tests, one per subsystem
Select a block to see what it does and how it's wired.
The arena's overhead camera reads an ArUco marker on top of the robot and reports its position and heading over Wi-Fi. All navigation runs on that. Watches for obstacles ahead so the robot can detour around them. Every distance is the median of several pings, so one bad echo can't stop the robot. Measures down to the water from a known height. Depth is that height minus the distance to the surface. Reads the water's color through filtered channels to flag pollution. It needs six pins, the most of any subsystem. One codebase, two targets: a build flag switches the same C++ between the real robot and ENES100's browser simulator. CI compiles both on every push. Two DRV8871 H-bridges. PWM is capped at 153 of 255, because the 6 V motors run from a 9.6 V pack. Two SG90 servos move together, one degree at a time, so their current spikes don't brown out the shared 5 V rail. A MOSFET on D10 switches the pump that pulls the water sample. A 9.6 V pack feeds the motor drivers directly. The logic runs from the Arduino's regulated supply.