DIY Submersible ROV





Introduction: 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.

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.

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: Ground Controls

6 Channel RC transmitter

Control Box

The control box (old cigar box - check the 5 cent price!) is the termination point for the Ethernet cable (tether) and contains the following:

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

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 box:

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

Step 8: Future Stuff

I plan on adding a mini DVR module to the control box to sit between the OSD (On Screen Display) and the little TV to record the video. Then I can try driving the sub in a nearby lake and see what I see. So far I've only driven it where it stays in view. Driving when I can only see what it sees may be very different.

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

This is an entry in the
Make it Move Contest



  • Oil Contest

    Oil Contest
  • Woodworking Contest

    Woodworking Contest
  • Planter Challenge

    Planter Challenge

We have a be nice policy.
Please be positive and constructive.


3 Questions

Great work! Concerning the Compass: I recently received my cmps12 and I cannot get the thing to maintain its calibration between power ups. Every time I power it up it thinks it is pointing due north. By hand, I can rotate it and get it to re-calibrate. But on the robot - even if I turn the robot in circles, it keeps thinking it's start direction at power up is 0.0.

How did you get around this? Any calibration code, hints, etc would be very helpful.



I think that the need to recalibrate at power up is the nature of the beast. My mobile phone compass also requires moving it around to calibrate when the app is brought up. I read somewhere that this is normal and perhaps unavoidable. After I power up (connect the battery) I just dangle my sub and turn in 360 before putting it in the water. But I can see that for a ground based rover it would be awkward, more awkward for a big one.

For the non-automatic 9 axis compasses, I have seen code that does a calibration at the beginning. I've not been successful with that. Good luck.


Very nice job. I tried to make something like this a couple years ago without much luck. Can you provide more info on how the R/C receiver is converted to a single serial line to the ROV. A pointer to more detail will be fine.

Also a source for the dry tube dome.


For the acrylic dome, do a search in Amazon for Acrylic Dome 4". It was $12.99.

Re. the RC, the receiver I use is one that has a separate PPM output. You have to look for that when you buy a receiver. To decode the PPM signal, there's pretty good discussion in Instructables here And many other sources if you Google "decoding PPM with Arduino". The only extra trick I needed was that stray erroneous signals would come in and cause the thrusters to twitch and spasm. The prefect solution was to use a Median Filter to get rid of the extra high and extra low values. The filter takes the last 5 (in my case) readings, sorts them in value sequence, and gives you the center reading.

Hope this helps.


I assume your battery is 12V. Do you have a general idea of the run time of your ROV?

It's a 10 Amp/Hr battery. Just observing the Ammeter, it draws 2 to 4 Amps only when it's pushing hard one direction or another. So based on the assumption one is not constantly travelling, it would only be drawing an average of 1 Amp, it should last several hours, say 5, taking it to 50%. That sounds optimistic though huh? Just playing around with it in the pool etc, the battery never seems to go down much.

The voltage shown on the pics of the screen is not valid, not calibrated right.



Hi dcolemans,

I was thinking about making something like this, you said that you got the bilge pumps for cheap, can you post links as to were to buy them?

Also I voted for you!

2 replies

Good old Amazon, where two day shipping has made me an impatient person. Here's the link to the 500 GPH cartridge

If the link doesn't work, just search for Johnson Marine Pump Cartridge. BTW, the 500 GPH has the same dimensions as the 1000 GPH. I guess "cheap" is relative - compared to ready to go thrusters.



This is a very worthy Instructable mate, hope you win the contest for it.

1 reply

Right now it's limited by the 50 foot tether. I've only had it to swimming pool depth so far. I don't know how much pressure it will withstand before it leaks. I think the seal around the acrylic dome is weakest point. The potting around the holes seems secure and the rubber hub-less connectors seem secure too.