ROV Senior Project

electronics

#1

Hello,

My name is Victor Carson I am a senior in high school and I am in the development stage of an engineering based senior project. For this project, I will be building and programming a ROV. I have had no experience with ROV engineering and I am looking for someone with experience to guide me.

Right now, I am looking for parts for my ROV. I am considering using the OpenROV motors set, and Li-FePO4 batteries. However, I did not see any ESC listed in the store. I did notice that the OpenROV Controller Board v2.8 did feature already integrated ESC, however, I am looking for individual ESC. Can anyone refer me to an ESC that would work with these motors?


#2

@carsonVB,

You will need an ESC that can provide both forward and reverse motion like this BR ESC. The BR ESC is probably a little overkill for the OROV DT-700 motors, but you may want to use bigger thrusters in the future and these BR ESCs can easily handle bigger thrusters.

You might want to take a look at my Blue Robotics/OROV2.8 Hybrid ROV to get some construction ideas for your project.

Regards,
TCIII AVD


#3

Thanks @TCIII,

I have another question, I don’t know if you can answer this, but but maybe you can refer me to someone who can. I will be using an arduino to control the ESCs, and I want the arduino to interface with my topside computer so I can operate it with a remote. How do I go about connecting the arduino to the topside computer so I can control my ROV?


#4

@carsonVB,

You can use a bi-directional IC like the RS 485/488 to communicate between your ROV and your topside computer.

I assume that you plan to use an Arduino more powerful than an Arduino 328 for your ROV?

You might want to check out this ROV project that uses an Arduino Pro-Mini for thruster and accessory control.

Regards,
TCIII AVD


#5

Hey @carsonVB - in the VEERRRYYY early days of OpenROV… actually, before it was even called OpenROV and I was just screwing around with stuff to procrastinate from school… I wrote some code to control my prototype ROV which had an Arduino 328 on board. The code controlled three thrusters, lights, and a camera servo. On my computer, I used a program called Processing (which is what the Arduino IDE is based off of) and that passed serial data to the Arduino on the ROV through a USB cable. I am by no means a software developer, so I’m sure my code could have been much better, but I chose to use switch-case statements to let keyboard commands on my computer to effect outputs on the Arduino.

I recorded a video back then of how it all worked, which I’ve linked to here.

I managed to dig up my old code from back then, and I’ve pasted that below in case it’s helpful. Anyone who actually knows what they’re doing in terms of software will probably cringe…

(note that these thursters were controlled with a set of H-bridges I put together, so the output from the Arduino is PWM and direction, rather than servo output like you’d use for an ESC)

Best of luck with your project!

Arduino*******

#include <Servo.h>

// Arduino pins that each variable will control
const int V = 8;
const int P = 12;
const int S = 13;
const int v = 3;
const int p = 5;
const int s = 6;
const byte l = 11;

Servo tilt;
int pos = 80;

void setup(){

// initialize the serial communication:
Serial.begin(9600);

// initialize the pins as an outputs:
pinMode(V, OUTPUT);
pinMode(P, OUTPUT);
pinMode(S, OUTPUT);
pinMode(v, OUTPUT);
pinMode(p, OUTPUT);
pinMode(s, OUTPUT);
pinMode(l, OUTPUT);

// attach the servo on pin 14 (analog 0) to the servo object, “tilt”
tilt.attach(14);
}

byte input;
byte x = 250;
byte i = 128;

void loop(){
if (Serial.available()){
input = Serial.read();

//Turn motors on/off at speed “x” (lower case) and direction (upper case) based on
//input of F (Forward), A (Aft), P (Port), S (Starbord), V (Vertical)
switch (input){
case ‘F’:
digitalWrite(P, HIGH);
digitalWrite(S, HIGH);
analogWrite(p, x);
analogWrite(s, x);
break;
case ‘A’:
digitalWrite(P, LOW);
digitalWrite(S, LOW);
analogWrite(p, x);
analogWrite(s, x);
break;
case ‘P’:
digitalWrite(P, LOW);
digitalWrite(S, HIGH);
analogWrite(p, x);
analogWrite(s, x);
break;
case ‘S’:
digitalWrite(P, HIGH);
digitalWrite(S, LOW);
analogWrite(p, x);
analogWrite(s, x);
break;
case ‘U’:
digitalWrite(V, HIGH);
analogWrite(v, x);
break;
case ‘D’:
digitalWrite(V, LOW);
analogWrite(v, x);
break;
case ‘h’:
i++;
analogWrite(l, i);
break;
case ‘l’:
i–;
analogWrite(l, i);
break;
case ‘1’:
x = 50;
break;
case ‘2’:
x = 150;
break;
case ‘3’:
x = 250;
break;
case ‘q’:
pos = 30;
break;
case ‘a’:
pos = 80;
break;
case ‘z’:
pos = 150;
break;
default:
analogWrite(s, 0);
analogWrite(v, 0);
analogWrite(p, 0);
//pos = 80;
}

// set servo position according to value of pos
tilt.write(pos);
//tilt.detach();
}

}

Processing*************

import processing.serial.*;
Serial port;

void setup(){
println(Serial.list());
port = new Serial(this, Serial.list()[0], 9600);
}

void draw() {
if (keyPressed){
switch (key){
case ‘q’: port.write(‘q’);break;
case ‘a’: port.write(‘a’);break;
case ‘z’: port.write(‘z’);break;
case ‘h’: port.write(‘h’);break;
case ‘l’: port.write(‘l’);break;
case ‘1’: port.write(‘1’);break;
case ‘2’: port.write(‘2’);break;
case ‘3’: port.write(‘3’);break;
}
if (key == CODED){
switch (keyCode){
case UP: port.write(‘F’);break;
case DOWN: port.write(‘A’);break;
case LEFT: port.write(‘P’);break;
case RIGHT: port.write(‘S’);break;
case SHIFT: port.write(‘U’);break;
case CONTROL: port.write(‘D’);break;
default: port.write(‘0’);break;
}
}
}
else port.write(‘0’);
}


#6

Thanks @TCIII, @Eric_Stackpole