Introduction
Build a tethered underwater remotely operated vehicle (ROV) for underwater inspection and exploration. This comprehensive guide covers everything from design through implementation, testing, and deployment.
Build a tethered underwater remotely operated vehicle (ROV) for underwater inspection and exploration.
Build a tethered underwater remotely operated vehicle (ROV) for underwater inspection and exploration. This comprehensive guide covers everything from design through implementation, testing, and deployment.
Calculate maximum operating depth: for 20m depth, pressure = 3 bar (absolute). Housing must withstand 3× operating pressure (safety factor 3) = 9 bar. Acrylic tube (200mm OD, 10mm wall) rated for 10 bar — adequate. End caps sealed with double O-rings (Parker 2-206 NBR O-rings). O-ring groove design: groove depth = 90% of O-ring cross-section diameter. Apply thin silicone grease (not petroleum lubricant — degrades O-rings). Pressure test to 6 bar in a bucket before water deployment.
10 components required for this project.
| # | Component | Purpose | Qty |
|---|---|---|---|
| 1 | Bilge Pump Motors (12V, modified as thruster) | Propulsion (3-axis: surge, sway, heave) | x4 |
| 2 | Acrylic/PVC Pressure Housing | Electronics waterproof enclosure | x1 |
| 3 | Arduino Mega + Raspberry Pi Zero | Motor control and video streaming | x1 |
| 4 | USB Camera (wide angle, waterproofed) | Forward and downward views | x2 |
| 5 | Depth Sensor (MS5837-30BA) | Pressure/depth measurement | x1 |
| 6 | IMU (BNO055, waterproofed) | Attitude reference | x1 |
| 7 | LED Lights (12V, waterproof) | Underwater illumination | x4 |
| 8 | Tether Cable (30m, neutrally buoyant) | Power and data umbilical | x1 |
| 9 | Buoyancy Foam Blocks | Achieving neutral buoyancy | x1 |
| 10 | 3D-Printed ABS Frame | ROV structure | x1 |
Follow these 3 steps carefully.
Calculate maximum operating depth: for 20m depth, pressure = 3 bar (absolute). Housing must withstand 3× operating pressure (safety factor 3) = 9 bar. Acrylic tube (200mm OD, 10mm wall) rated for 10 bar — adequate. End caps sealed with double O-rings (Parker 2-206 NBR O-rings). O-ring groove design: groove depth = 90% of O-ring cross-section diameter. Apply thin silicone grease (not petroleum lubricant — degrades O-rings). Pressure test to 6 bar in a bucket before water deployment.
4-thruster configuration: 2 horizontal thrusters (left/right for heading and surge), 2 vertical thrusters (fore/aft for pitch-free depth control). Thruster allocation matrix maps joystick commands to individual thruster PWM: Surge=(T1+T2)/2, Turn=(T1-T2)/2, Heave=(T3+T4)/2, Pitch=(T3-T4)/2. ESC control: 50Hz PWM, 1000µs=full reverse, 1500µs=stop, 2000µs=full forward. Use Blue Robotics T100/T200 thrusters or modified bilge pumps with marine-grade propellers.
ROV must be neutrally buoyant: weight equals displaced water weight. Measure ROV weight in air, calculate water displacement volume needed: V_buoyancy = ROV_mass / water_density. Current displacement volume from frame: calculate from dimensions. Difference: add closed-cell foam (density 40kg/m³) in calculated volume. Trim for level attitude: adjust foam placement fore/aft and port/starboard to align center of buoyancy with center of gravity.
Core code for rov_controller.ino:
#include <Servo.h>
Servo t1, t2, t3, t4; // Thrusters
void setup() {
t1.attach(3); t2.attach(5); t3.attach(6); t4.attach(9);
// ESC arming sequence
t1.writeMicroseconds(1500); t2.writeMicroseconds(1500);
t3.writeMicroseconds(1500); t4.writeMicroseconds(1500);
delay(3000); // ESC initialization
Serial.begin(115200);
}
void setThrusters(int surge, int turn, int heave, int pitch) {
// Thruster allocation
int T1 = constrain(1500 + surge + turn, 1100, 1900);
int T2 = constrain(1500 + surge - turn, 1100, 1900);
int T3 = constrain(1500 + heave + pitch, 1100, 1900);
int T4 = constrain(1500 + heave - pitch, 1100, 1900);
t1.writeMicroseconds(T1); t2.writeMicroseconds(T2);
t3.writeMicroseconds(T3); t4.writeMicroseconds(T4);
}
void loop() {
if(Serial.available() >= 4) {
int s = Serial.read() - 128; // -128 to +127
int t = Serial.read() - 128;
int h = Serial.read() - 128;
int p = Serial.read() - 128;
setThrusters(s*3, t*3, h*3, p*3);
}
}
Test Underwater ROV by verifying each subsystem individually before full integration.
Verify power voltages, check ground connections, use serial monitor for debug.
An interactive simulator will be available here — simulate circuits and run code in-browser without hardware.