DIY Submersible ROV




How hard could it be? It turns out that there were several challenges to making a submersible ROV. But it was a fun project and I think it was quite successful. My goal was to have it not cost a fortune, have it easy to drive, and to have a camera to show what it sees underwater. I didn't like the idea of having a wire dangling from the driver's controls, and I have a variety of radio control transmitters already, so that's the direction I went, with the transmitter and control box separate. On the 6 channel transmitter I used, the right stick is used for forward/back and left/right. The left stick is Up/Down and turn Clockwise/CCW. This is the same setup used on quad-copters, etc.

I looked online and saw some pricey ROVs and saw a few with "vectored thrusters". This means the side thrusters are mounted at 45 degree angles and combine their forces to move the ROV in any direction. I had built a mecanum wheel rover already and I thought the math there would apply. (Ref. Driving Mecanum Wheels Omnidirectional Robots). Separate thrusters are used for diving and surfacing. And "vectored thrusters" sounds cool.

For ease of driving it, I wanted depth hold and heading hold. This way the driver doesn't have to move the left stick at all except for diving/surfacing or turning to a new heading. Turns out this was also a bit of a challenge.

This Instructable is not intended as a set of directions for doing it yourself. The intent is more to provide a resource that someone might draw from if they intend to build their own submersible ROV.

Teacher Notes

Teachers! Did you use this instructable in your classroom?
Add a Teacher Note to share how you incorporated it into your lesson.

Step 1: The Frame

This was an easy choice. Looking to see what other folks had done pushed me in the direction of 1/2 inch PVC pipe. It's cheap and easy to work with. I came up with an overall design that would accommodate the side thrusters and the up/down thrusters. Soon after assembly I sprayed it yellow. Oh yeah, now it's a submarine! I drilled holes in the tubing top and bottom to allow it to flood. For attaching stuff I tapped threads into the PVC and used 4 40 stainless screws. I used a lot of them.

Shown at a later stage are skids that are held away from the bottom by 3d printed risers. The risers were needed to make it so the battery could be removed and replaced. I 3d printed a tray to hold the battery. The battery is secured in the tray by a velcro strap. The Dry Tube is also held onto the frame with velcro straps.

Step 2: The Dry Tube

First pic is the buoyancy test. Second pic attempts to show how thruster wires are led into potted bullet connectors. Third pic is more of the same plus the additional bump for potting depth meter and its wires. Fourth pic shows pulling apart the dry tube.


The Dry Tube contains the electronics and provides most of the positive buoyancy. The ideal is a small amount of positive buoyancy, so if things go wrong the ROV will eventually float to the surface. This took a bit of trial and error. The assembly shown here during a float test took several pounds of force to get it to submerge. This led to any easy decision to mount the battery on-board (as opposed to power coming over the tether). It also led to cutting the tube down in length. It turns out a 4 inch tube provides about 1/4 pound of buoyancy per inch of length (I did the math once but this is a guess). I also ended up putting PVC "skids" on the bottom. They have screw on ends where I put in lead shot for fine tuning the buoyancy.

Water Tight Seal

Once I settled on using epoxy to seal seams and holes, and settled on using neoprene hub-less connectors, the ROV was reliably watertight. I struggled for awhile with "waterproof" ethernet connectors, but in the end I gave up on these and just drilled a small hole, led the wire in, and "potted" the hole with epoxy. After the hub-less connectors were tightened in place, trying to remove them was difficult. I discovered that a little smear of white grease made the Dry Tube pull apart and push together a lot easier.

To mount the acrylic dome I carved a hole in a 4" ABS cap leaving a ledge to receive the edge of the dome. Initially I tried hot glue, but that leaked immediately and I went to epoxy.


All the inside electronics are mounted on a 1/16 inch aluminum sheet (with standoffs). It's just under 4 inches wide and extends the length of the tube. Yeah, I know it conducts electricity, but it also conducts heat.

Wires Coming Through

The rear 4" ABS cap got a 2 inch hole drilled into it and a 2" ABS female adapter glued in. A 2" plug got a hole drilled in for the Ethernet wire to come through and be potted. A little piece of 3" ABS glued on also made a little circle area for "potting".

I drilled what seemed like plenty of holes (2 for each thruster), but I wish I had done more. Each hole got a female bullet connector shoved into it (while hot from the soldering iron). The thruster wires and battery leads got the male bullet connectors soldered on.

I ended up adding a little ABS bump to give me a place for the depth gauge wire to come through and be potted. It got messier than I would have liked and I tried to organize the wires with a little holder with slots in it.

Step 3: DIY Thrusters

I got a lot of ideas from the web and decided to go with bilge pump cartridges. They're relatively cheap (about $20+) each and have about the right amount of torque and speed. I used two 500 Gallons/hour cartridges for the up/down thrusters and four 1000 GPH cartridges for the side thrusters. These were Johnson Pump Cartridges and I got them via Amazon.

I 3d printed the thruster housings using a design from Thingaverse, ROV Bilge Pump Thruster Mount. I also 3d printed the propellers, again with a design from Thingaverse, ROV Bilge Pump Thruster Propeller. They took a little adapting but worked pretty well.

Step 4: Tether

I used a 50 foot length of Cat 6 Ethernet cable. I pushed it into 50 feet of polypropylene rope. I used the end of a ball point pen taped onto the cable and took about an hour pushing it through the rope. Tedious, but it worked. The rope provides protection, strength for pulling and some positive buoyancy. The combination still sinks but not as badly as the Ethernet cable by itself.

Three of the four cable pairs are used.

  • Camera Video signal and ground ----> Arduino OSD shield in the control box
  • ArduinoMega PPM signal and ground <---- RC receiver in the control box
  • ArduinoMega Telemetry signal --> RS485 ----> matching RS485 --> Arduino Uno in the control box

Based on comments from another Instructables contributor, I realized that having the tether dragging on a lake bottom would not be good. In the swimming pool test it was not a problem. So I 3d printed a bunch of clip-on floats, using PLA and thicker walls than usual. Picture above shows the floats deployed on the tether, grouped more closely close to the ROV but averaging about 18 inches apart. Again per the other contributor's comments, I put floats into a mesh bag tied to the tether bundle to see if I had enough.

Step 5: On Board Electronics

First pic shows camera and compass. Second pic shows what happens when you keep adding stuff. Third pic shows underside-mounted motor controllers with aluminum slabs as alternative heat sinks.


  • Camera – Micro 120 Degree 600TVL FPV cam
    • Mounted on 3d printed holder that extends it out into the dome
  • Tilt Compensated Compass – CMPS12
    • Built-in Gyro and Accelerometer readings automatically integrated with Magnetometer readings to compass reading stays correct as ROV bops around
    • Compass also provides temperature reading
  • Motor Drivers – Ebay – BTS7960B x 5
    • Large Heat sinks had to be removed to save space
    • Mounted w heat transfer grease onto ¼” aluminum slabs
    • Aluminum slabs mounted directly on both sides of aluminum electronics shelf
    • Experience shows drivers operate well under capacity so heat is not a problem
  • Arduino Mega
  • RS485 Module to beef up serial telemetry signal
  • Current sensor Power module
    • Provides up to 3A of 5v power for electronics
    • Measures Amperage up to 90A going to 12v motor drivers
    • Measures battery voltage
  • Relay (5v) to operate 12v lights


  • Pressure (depth) Sensor Module – Amazon – MS5540-CM
    • Also provides water temperature reading
  • 10 Amp/Hr 12 volt AGM battery

I had concerns that a lot of electrical contacts were exposed to water. I learned that in fresh water, there is not enough conductivity to cause a problem (short circuits etc.), that the current takes the "path of least resistance" (literally). I'm not sure how all this would fare in seawater.

Wiring Outline (see SubDoc.txt)

Step 6: SubRun Software

The first video shows Depth Hold working pretty well.

The second video is a test of the Heading Hold feature.


The Arduino Mega runs a sketch that performs the following logic:

  1. Gets PPM RC signal over tether
    1. Pin Change Interrupt on data calculates individual channel PWM values and keeps them updated
    2. Uses Median filter to avoid noise values
    3. PWM Values assigned to Left/Right, Fwd/Back, Up/Down, CW/CCW and other ctls.
  2. Gets water depth
  3. Logic to allow CW or CCW twist to finish
  4. Looks at driver controls
    1. Uses Fwd/Back and Left/Right to calc strength and angle (vector) for driving side thrusters.
    2. Checks for Arm/Disarm
    3. Uses CW/CCW to calc twist component or
    4. Reads compass to see if heading error and calculates corrective twist component
    5. Uses strength, angle and twist factors to calc power and direction for each of four thrusters
    6. Uses Up/Down to run Up/Down thrusters (two thrusters on one controller) or
    7. Reads depth meter to see if depth error and runs Up/Down thrusters to correct
  5. Reads power data
  6. Reads temperature data from depth meter (water temp) and compass (internal temp)
  7. Periodically sends telemetry data up Serial1
    1. Depth, Heading, Water Temp, Dry Tube Temp, Battery Voltage, Amps, Arm Status, Lights status, Heartbeat
  8. Looks at Light Control PWM signal and turns light On/Off via relay.

Vectored Thrusters

The magic for controlling the side thrusters is in steps 4.1, 4.3 and 4.5 above. To pursue this, look in the code at the Arduino tab titled runThrusters functions getTransVectors() and runVectThrusters(). Clever math was copied from various sources, primarily those dealing with mecanum wheel rovers.

Step 7: Floating Control Station (updated)

6 Channel RC transmitter

Control Box

The original control box (old cigar box) that held electronics not on the sub has been replaced by a floating control station.

Floating Control Station

I began to be concerned that my fifty foot tether was not long enough to get anywhere. If I'm standing on a dock, then much of the tether will be taken just getting out into the lake and there won't be any left for diving. Since I had a radio link to the control box already, I got the notion of a floating waterproof control box.

So I did away with the old cigar box and put the control box electronics onto a narrow piece of plywood. The plywood slips into the 3 inch mouth of a plastic three gallon jug. The TV screen from the control box had to be replaced with a video transmitter. And the RC transmitter (the only part still on shore) now has a tablet with video receiver mounted on top. The tablet can optionally record the video it displays.

The lid of the jug has the power switch and voltmeter, tether attachment, RC whisker antennas, and rubber ducky video transmitter antenna on it. When the ROV pulls out into the lake I didn't want it to tip the control jug too far so I installed a ring near the bottom where the tether is led and where a retrieval line will be attached. I also put about 2 inches of concrete at the bottom of the jug as ballast so it floats upright.

The floating control station contains to following electronics:

  • RC Receiver – with PPM Output
  • Arduino Uno
  • OSD Shield - Amazon
  • RS485 Module to beef up serial telemetry signal
  • Video Transmitter
  • Volt meter to monitor 3s Lipo Battery health
  • 2200 mah 3s Lipo Battery

On Screen Display (OSD)

In the quad-copter world, telemetry data is added to the FPV (First Person Video) display at the drone end. I didn't want to put any more stuff into the already crowded and messy Dry Tube. So I opted to send the telemetry up to the base station separately from the video and put the info on the screen there. An OSD Shield from Amazon was perfect for this. It has a video in, video out, and an Arduino library (MAX7456.h) that hides any mess.

SubBase Software

The following logic is run in a sketch on an Arduino Uno in the control station:

  1. Reads pre-formatted serial telemetry message
  2. Writes message to On Screen Display shield

Step 8: Future Stuff

I did add a mini DVR module to the control box to sit between the OSD (On Screen Display) and the little TV to record the video. But with the change to the Floating Control Station I now rely on the tablet app to record video.

I may, if I get real ambitious, try to add a grabber arm. There are unused radio control channels and an unused cable pair in the tether just looking for work.

Make it Move Contest

Second Prize in the
Make it Move Contest



  • Indoor Lighting Contest

    Indoor Lighting Contest
  • Make It Fly Challenge

    Make It Fly Challenge
  • Growing Beyond Earth Maker Contest

    Growing Beyond Earth Maker Contest

47 Discussions


12 hours ago on Introduction

Hello. I dig the build very much. I was wondering since I dont have the time to build this dur to my demanding work schedule, perhaps I could either buy the ROV from you or you could build one for me, or direct me to a link where ai could purchase one like this.


12 hours ago on Introduction

Hello. Love your build, unfortunately I do not have the space to start on this project and would like to know if you can direct me to a link to buy one like this, or buy this particular ROV off of your hands.


2 months ago

Bom dia!
Sou um pouco leigo no assunto, gostaria de saber como faço para substituir o controle Joystick para um controle joystick de PS1 ou PS2

2 replies

Reply 2 months ago

sobre a mesma questão dos Joysticks do ps1, poderia me ajudar como eu poderia fazer as alterações no projeto.


4 months ago

Great project. You have a link to the library OSD and font? I am new to Arduino, how difficult is it to change the sketch to brushless motors?

3 replies

Reply 4 months ago

Sorry for the question amateur. In which sketch should be changed under the ESC. You have no opportunity to help with this. Thank.


Reply 4 months ago

If you plan on using brushless motors, you need to change motor variables and setup in the subrun tab, and you need to change how the motors are driven in the runThrusters tab. You will need to study how my motors are run. Then you need to do research to see how to control your motors. Sorry I can't be more help.


Reply 4 months ago

For the OSD shield, look in Amazon for "OSD Shield for Arduino". It uses the MAX7456.h library. I used the default font, but I think there are ways to modify that.
As for the motors, brushless would typically be easier, with only a PWM value to control each brushless ESC. They are usually made to be RC controlled, so the Arduino just has to give it a pulsewidth of something like 1500 for stop, less for reverse, and more for forward. The range is usually within 1000 to 2000 microseconds. For example motor.writeMicroseconds(1800); for forward. This has to be on an Arduino pin that does PWM. Brushless ESCs often have jumpers and sometimes programming that controls how reverse and braking work. Sometimes they insist that the motor be stopped before they will recognize a reverse signal. Good luck.


Question 5 months ago on Introduction

Does the robot just stay afloat from motors or just that its light enough?

1 answer

Reply 5 months ago

The ROV has a slight positive bouyancy, so it floats on its own. But when you work the controls to Dive, then let go, the up/down motors come on as needed to keep it at a constant depth.


Question 5 months ago on Step 3

For the motors, did you have to 3d print them in seperate parts to put them together or did you just print the entire thing at once?

1 answer

Reply 5 months ago

The thruster mount prints as one piece and the bilge pump cartridge fits in it. The propellers print in multiple pieces.


Question 5 months ago on Introduction

Hello again. So my build is coming along nicely. But I have hit a road block and thought maybe you would know a solution. Its about using PPM from the RC receiver. As I understand it, PPM is limited to 8 channels. But I find myself wanting more. I have built a ROV using 8 thrusts. 4 vectored for F/B and turning. And 4 vertical that will provide U/D and also pan and tilt. Pan and tilt thrusters would accomplish the same as having servos on the camera to look around. Either way I need some form of pan and tilt taking two channels. I see in your code that you run both your vertical thrusters together. Where each of my 4 would need separate PWM. I am very new to the Arduino and only assume that it has enough PWM outs to run all 8 motors. I expect that I can copy parts of your code to read the pan and tilt channels from my RC. So my main problem is again 8ch of PPM. By my count its like this. 1 up/down, 2 forward/back, 3 turn left/right, 4 move left/right, 5 pan, 6 tilt. I also need one for lights, so 7, and I would like to add an arm that I expect would need at least one to close the clamps. So im at my 8. But that doesnt leave any room to expand. Suppose I want to have movement on my arm, or add a second set of lights on a separate channel so I can use them only when needed. The point is, is there a way to use SBUS instead of PPM from the RC receiver? Then I could get all 16 ch available.

5 answers

Reply 5 months ago

Glad you're making progress. I'd love to see pictures!
Re. the limitation of 8 channels - the best way in my opinion is to assign one of the non-joystick channels to be a "mode switch". In one mode it would mean the joysticks control navigating the ROV. In another position it would mean joysticks do camera control, arm control, or whatever. You wouldn't be able to navigate while doing this stuff, but I suspect you wouldn't want to or need to. By the way, unless you have separate camera panning, turning left/right does the same thing doesn't it?


Reply 5 months ago

Hello again. Well my ROV is progressing well. I had a slight problem with the frame and had to raise it to get the tube to fit above the thrusters. But ill end up using those T's for lights or something. As for wiring, well all the sensors and such connected to the MEGA board are working properly. But I cant seem to get the data from the MEGA to the UNO. I tested the UNO with the OSD and the test sketches work, so I know its working. But I cant get it to display any data from the MEGA. Can you please share more info for the wiring to the rs485 and how they connect to the MEGA and UNO. I have mine as follows, but it does not work. I have tried several combos of this and still nothing.
MEGA pin 19 RX1 to RO on rs485
MEGA pin 18 TX1 to DI on rs485, i have swapped these but not working
DE and RE on rs485 to +5v, maybe this is the problem?
RS485 VCC to +5 and GND to GND on both
rs485 A to A on second rs485 and B to B, swapped this but no
on second rs485 DE and RE to +5v, again, dont know where to connect these, some web diagrams show connected to +5v
on second rs485 DI and RO I have tried on pins 0RX and 1TX on UNO, also pins 5 and 6 on uno, swapping them has no effect.
I have even tried removing the rs485 and just connecting pins 18 and 19 on MEGA to both 0 and 1, and, 5 and 6 on UNO. Doing this, i dont remember witch one worked but, I can see data using the serial monitor via the Arduino IDE with a usb connection. But even though i see the data in serial monitor, nothing on OSD. Again, I have run test sketchs on OSD and they do work, such as Hello World and Display Font.
Again, thanks for all you have done with sharing your design.


Reply 5 months ago

Wow! Coming along nicely. The rs485s are a pain. I had occasion to revisit them yesterday and found a pretty good diagram reminding me of how I did it. My telemetry wasn't working so I suspected the rs485s. In the end it was a bad connection and I had to use my spare tether cable pair.

I added a wiring diagram to the Instructable (See Electronics step SubDoc.txt). You know of course that pins 5 & 6 on the Uno are serial via Software Serial. And on the rs485s, you have to put 5v+ on the enable pins to send, and Ground on the enable pins to receive. You say you do see telemetry data on the serial monitor--- you mean on the Uno? If so, that would mean the RS485 is working and the problem is to do with the Uno sending text to the OSD. Are you using a MAX7456 OSD?

Misc nosy questions: How long a tether are you going for? Where are you going to put your battery? How are you going to seal the end of your acrylic dry tube?


Reply 5 months ago

Thanks for the reply. So while trying to figure out the rs485 i decided to bypass them, while on my desk, and just use direct serial. But I still could not get it working. Then a strange thing happened. I bumped something and lost video, but could see the OSD all of a sudden. I was blown away. So looking into it I found its actually my camera!! I posted a video below. So I will now try the rs485 chips and make sure they are working based on the diagram you shared.
To answer your questions, I plan to use a 100 ft tether. The battery will go between some skids, like a helicopter, that are not pictured. While we talked about using a polycarbonate tube that I had. Turns out that that tube was not very round and smooth. Im using the Blue Robotics flanges, end caps, and dome. When I discovered my tube would not work, I got a Blue Robotics tube also.
I made a video here:


Reply 5 months ago

Glad you got it figured out. Doesn't sound like any great advantage using the stereo camera anyway since you'd only be using one side.
100 foot tether huh. Ar you going to poke a cat5/6 cable through the polypropylene rope as I did. It was pretty comical, having the tether draped though the garage, out the driveway, and partly into the street, all the time poking with the ball point pen "fid" and massaging the bunched up rope down the line. Your Blue Robotics stuff sounds great. Maybe you can buy a tether ready to go.


5 months ago

I want to use Wi-Fi module to transmit my video feed how can I use that