As many of you who follow our Google Hangouts may know, a bunch of us have been working on a way to determine the heading and depth (as well as some other things) of our ROV electronically. We've evaluated all sorts of components on the market and have done quite a bit of testing with how to make low cost but effective fixtures that could hold the sensors in the right way to allow them to work. Finally, it seems that we've got some hardware that will do the job!
What we've come up with is the OpenROV IMU/Depth Sensor (shown above). The sensor has two principle devises on it: a 9-axis Inertial Measurement Unit (IMU) called the MPU9150, made by Invensense, and an MS5803-14A pressure sensor, made by Measurement Specialties.
We've put both devises on one PCB, and both of them attach to a single I2C line that can be connected to auxiliary wires coming out of the endcap on an OpenROV. As simple as the board looks, it actually is capable of giving the user a pretty good amount of data.
The 9-axis IMU has a 3-axis magnetometer (so it can tell you your heading no matter how it is oriented), a 3-axis accelerometer (so you can detect linear acceleration vectors such as gravity), and a 3-axis gyrometer (so you can tell what rate your rotating at in all three axis). All of this data is made to work together inside the MPU9150, so the outputs you get are much more accurate.
The Depth Sensor detects absolute pressure, and is able to determine your depth with pretty good precision down to 14 bar of pressrue. In our experience, differences on the order of 1mBar (which equates to about 1cm of depth change) seem to be noticeable! In order to equate pressure with depth, the MS5803 also has an on-board temperature sensor (since water temperature changes the relationship between pressure and depth). This temperature data can also be read over the I2C line, so although it seems to take a bit of time to equalize, we've noticed that we can detect water temperature with about 0.1C precision.
The mechanical design of the IMU/Depth Sensor took a bit of figuring out. Normally, the pressure sensor is meant to be mounted with an o-ring around its diameter which would require precision machining on its enclosure (which means high cost and special tooling). We wanted to make a devise that uses the same materials already used to build an OpenROV, so we decided to try potting everything so that only the top diaphragm of the sensor would be exposed to water. By doing this, we would also be able waterproof the connection between the four I2C leadwires coming out from the sensor and the PCB itself. To attach the sensor, we decided the easiest thing to do would be to simply solder the sensor wires to the auxiliary wires coming from the ROV, then cover those connections with the same waterproof heat-shrink tubing used to protect the solder joints on the motors.
We used the pressure chamber we designed earlier this year with a special wire pass-through to verify if the pressure sensor worked well in its enclosure, and we were happy to find that it reported values with in a Bar or two of what our fancy hundred-dollar in-line digital pressure gauge read. We ran the pressure all the way up to about 11 bar (equivalent to a little over 100m) and everything seemed just fine! In the photo below, you'll notice that we only have the pressure chamber partially filled with water.. for all you safety-minded people- don't worry: the 11 bar pressure test was done with the chamber completely filled!
We also did a test to measure water temperature using the pressure sensor. At first, we noticed our values were several degrees off from what our kitchen thermometer was reading, then Walt did some compensation for the non-linearities in the sensor and that seemed make things work much better! (Note that the pot in the background was warm water which we also tested in)
All of the code we used for these tests was written by Walt from scratch (major kudos for that!). Brian has been working on integrating Walt's software as well as software to read the IMU into the main OpenROV code, but if you want to do some testing of your own MS5803, you can find the .ino file Walt wrote (which works with Arduino) on our GitHub site under openrov-software --> Arduino --> Test Code. Of course, tons of credit also has to be given to Colin Ho, who designed the IMU/Depth Sensor Board. You can find the schematic and other design files on Upverter. (Note, there's a small bug in the design in that the I2C address pin for the IMU -AD0/pin9 - is not currently connected to anything. We're going to pull that to ground and get some new PCBs made with that change soon).
We're still getting some stuff figured out- for instance, where is the best place to mount the sensor? What is the best way to display the data it produces? How could we design a closed-loop control system around this to make the ROV easier to fly? But our hope is that if we make the prototype of our sensor available, our community will start tinkering and give us some ideas.
We haven't put the IMU/Depth Sensor board and housing kit up on our store yet, but we're hoping to do that pretty soon. We still have to get some of the logistical issues relating to manufacturing these figured out, but our aim will be to make the system a simple kit that will cost under $100.