Greetings!
Here is my video of 3 thrusters controlled via Arduino and Processing application. Motors are controlled using simplle USB gamepad.
http://www.youtube.com/watch?v=t_VRHlkT ... re=mh_lolz
Thruster control
- KR2_Diving
- Posts: 391
- Joined: Aug 30th, 2012, 11:43 am
- Location: Currently: NW Suburbs of Chicago. Originally: NE Wisconsin
Re: Thruster control
Looks good!
Would be interested in seeing your code some time!
Which motors are those? (Think I have the same ones!)
Would be interested in seeing your code some time!
Which motors are those? (Think I have the same ones!)
Re: Thruster control
Here's the code, i hope i will help someone:
I appologise for croatian comments, it's raw code, but it works. This works for forward and reverse mode, you need to put relays on pins 8,9 and 10 to switch two phases of every motor. Signals are connected on pins 4,5 and 6. Processing code sends simple characters for every joystick action, and arduino decodes every character in multiple if loop (swithc case didn't work good). I use NewSoftSerial library because i will need to invert signals for rs232/rs485 convertion in future. "Pozdrav svijete!" means "Hello world!" on croatian.
Arduino Code:
//
//
#include <ServoTimer2.h> // the servo library Posebno za vertikalni thruster //%%%
#include <SoftwareServo.h>
#include <NewSoftSerial.h>
NewSoftSerial SerijskaInverted(0, 1, false); //
#define PIN4 4
#define PIN5 5
#define PIN6 6
SoftwareServo MOTOR1; // definiranje prvog motora
SoftwareServo MOTOR2; // definiranje prvog motora
ServoTimer2 MOTOR3; //MOTOR3 JE OBJEKT DRUGE KLASE
int RL1=8;
int RL2=9;
int RL3=10;
int AX=0;
int BX=0;
int XX=30; // vrijednost brzine vrtnje za motor1
int YY=20;
int ZZ=19;
int x=800; //vrijednost za vertikalni thrusrter //%%%
int y=800;
char incomingByte = 0; //dolazni podatak sa serijske veze
char myChar[2]={'0','0'};
int myInts[3]={800,800,800};
int myInts2[3]={800,800,800};
void setup()
{
SerijskaInverted.begin(9600); //otvaranje serijska veze
delay (1000);
SerijskaInverted.println(" Pozdrav svijete!");
delay (1000);
MOTOR1.attach(PIN4); // spaja prvi motor na 4. pin
MOTOR2.attach(PIN5); // spaja drugi motor na 5. pin
MOTOR3.attach(PIN6); //vertikalni thruster //%%%
MOTOR1.write(YY);
SoftwareServo::refresh();
MOTOR2.write(ZZ);
SoftwareServo::refresh();
MOTOR3.write(x);
}
void loop()
{
MOTOR1.write(YY);
SoftwareServo::refresh();
delay(20);
MOTOR2.write(ZZ);
delay(20);
SoftwareServo::refresh();
MOTOR3.write(x);
delay(20);
if (SerijskaInverted.available() > 0)
{
for(int i=0;i<2;i++){
// read the incoming byte:
incomingByte = SerijskaInverted.read();
myChar=incomingByte;
//myInts=(((int)myChar*10)+500);
delay(10);
//SerijskaInverted.println((int)myChar);
}
SerijskaInverted.flush();
}
if(myChar[0]=='F')
{
digitalWrite(RL1, HIGH);
digitalWrite(RL2, HIGH);
delay(10);
YY=50;
ZZ=50;
MOTOR1.write(YY);
delay(10);
MOTOR2.write(ZZ);
delay(10);
SoftwareServo::refresh();
delay(10);
myChar[0]= 'Q';
}
else if(myChar[0]=='B')
{
digitalWrite(RL1, LOW);
digitalWrite(RL2, LOW);
delay(10);
YY=50;
ZZ=50;
MOTOR1.write(YY);
delay(10);
MOTOR2.write(ZZ);
delay(10);
SoftwareServo::refresh();
delay(10);
myChar[0]= 'Q';
delay(10);
}
else if(myChar[0]=='L')
{
digitalWrite(RL1, HIGH);
delay(15);
YY=50;
ZZ=19;
MOTOR1.write(YY);
MOTOR2.write(ZZ);
delay(10);
SoftwareServo::refresh();
delay(10);
myChar[0]= 'Q';
delay(10);
}
else if(myChar[0]=='R')
{
digitalWrite(RL2, HIGH);
delay(10);
YY=20;
ZZ=50;
delay(10);
MOTOR1.write(YY);
delay(10);
MOTOR2.write(ZZ);
SoftwareServo::refresh();
delay(10);
myChar[0]= 'Q';
delay(10);
}
else if(myChar[0]=='U')
{
myInts[0]=myInts[0]+5;
myInts[1]=myInts[1]-5;
delay(10);
x=myInts[0];
y=myInts[1];
delay(10);
if (myInts[0]<800)
{ digitalWrite(RL3,HIGH);
myInts2[0]=800+(800-myInts[0]);
delay(10);
x=myInts2[0];
}
if (myInts[0]>800)
{digitalWrite(RL3,LOW);
}
if (myInts[1]<800)
{;
myInts2[1]=800+(800-myInts[1]);
delay(10);
y=myInts2[1];
}
if (myInts[0]>800)
{
}
myChar[0]= 'Q';
}
else if(myChar[0]=='D')
{
myInts[0]=myInts[0]-5;
myInts[1]=myInts[1]+5;
delay(10);
x=myInts[0];
y=myInts[1];
delay(5);
if (myInts[0]<800)
{digitalWrite(RL3,HIGH);
myInts2[0]=800+(800-myInts[0]);
delay(10);
x=myInts2[0];
}
if (myInts[1]<800)
{
myInts2[1]=800+(800-myInts[1]);
y=myInts2[1];
}
myChar[0]= 'Q';
}
else if(myChar[0]=='Q') //motor u početnu poziciju
{
YY=20;
ZZ=20;
MOTOR1.write(YY);
delay(10);
MOTOR2.write(ZZ);
delay(10);
SoftwareServo::refresh();
delay(15);
myChar[0]= 'Q';
delay(20);
}
} ;
Processing code:
import procontroll.*;
import java.io.*;
import interfascia.*;
import java.awt.*;
import processing.serial.*;
////--- DODAVANJE GUMBA I JOYSTICKA OD GAMEPADA
ControllIO controll;
ControllDevice device;
ControllSlider sliderX,sliderY,sliderZ;
ControllButton button1,button2,button3,button4,button5,button6,button7,button8,button9,button10,button11,button12;
//INTERFASCIA
IFTextField t,o,p;
IFLabel s;
GUIController MOJGUI; //otvaranje objekta kontroliranja GUI-ja
////// serijski port
Serial myPort; //kreiranje instance serijskog porta
////////////////
int a=1;
void setup(){
size(400,400);
println(Serial.list());
float X=0;
float Y=0;
float Z=0;
controll = ControllIO.getInstance(this);
MOJGUI = new GUIController(this);
myPort = new Serial(this, Serial.list()[0], 9600); // otvara se port, prvi i jedini s liste serijskoh portova
t = new IFTextField("",125, 30, 150);
o = new IFTextField("",125, 60, 150);
p = new IFTextField("",125, 90, 150);
MOJGUI.add(t);
MOJGUI.add(o);
MOJGUI.add(p);
device = controll.getDevice(2);
device.setTolerance(0.05f);
button1 =device.getButton(1); button7 =device.getButton(7);
button2 =device.getButton(2); button8 =device.getButton(8);
button3 =device.getButton(3); button9 =device.getButton(9);
button4 =device.getButton(4); button10 =device.getButton(10);
button5 =device.getButton(5); button11 =device.getButton(11);
button6 =device.getButton(6); button12 =device.getButton(12);
sliderX =device.getSlider(0);
sliderY=device.getSlider(1);
sliderZ=device.getSlider(3);
sliderX.setMultiplier(a);
sliderY.setMultiplier(a);
sliderZ.setMultiplier(a);
fill(0);
rectMode(CENTER);
}
void draw(){;
background(255);
if(button1.pressed()) {
println("1");
delay(25);
myPort.write("AA");
println("AA");
background(100,100,123);
}
else if(button2.pressed()) {
println("2");
delay(25);
background(10,123,35);
}
else if(button3.pressed()) {
println("3");
delay(25);
background(55);
}
else if(button4.pressed()) {
println("4");
delay(25);
background(190);
}
else if(button5.pressed()) {
println("5");
delay(25);
}
else if(button6.pressed()) {
println("6");
delay(25);
}
else if(button7.pressed()) {
println("7");
delay(25);
}
else if(button8.pressed()) {
println("8");
delay(25);
}
else if(button9.pressed()) {
println("9");
delay(25);
}
else if(button10.pressed()) {
println("10");
delay(25);
}
else if(button11.pressed()) {
myPort.write('Q');
delay(15);
}
else if(button12.pressed()) {
println("12");
delay(25);
}
else {
}
//}
int X=int(sliderX.getValue());
int Y=int(sliderY.getValue());
int Z=int(sliderZ.getValue());
if(X >0.8)
{
myPort.write('B');
delay(50);
};
if(X < -0.8)
{
myPort.write('F');
delay(50);
};
if(Y >0.8)
{
myPort.write('R');
delay(50);
};
if(Y < -0.8)
{
myPort.write('L');
delay(50);
};
if(Z >0.8)
{
myPort.write('D');
delay(50);
};
if(Z < -0.8)
{
myPort.write('U');
delay(50);
};
//int Z=int(sliderZ.getValue());
// while (myPort.available() > 0)
// {
// int inByte = myPort.read();
// p.setValue(String.valueOf(inByte)); ///
// }
// t.setValue(String.valueOf(X)); ///
//o.setValue(String.valueOf(Y)); ///
// p.setValue(String.valueOf(Z)); ///
}
I appologise for croatian comments, it's raw code, but it works. This works for forward and reverse mode, you need to put relays on pins 8,9 and 10 to switch two phases of every motor. Signals are connected on pins 4,5 and 6. Processing code sends simple characters for every joystick action, and arduino decodes every character in multiple if loop (swithc case didn't work good). I use NewSoftSerial library because i will need to invert signals for rs232/rs485 convertion in future. "Pozdrav svijete!" means "Hello world!" on croatian.
Arduino Code:
//
//
#include <ServoTimer2.h> // the servo library Posebno za vertikalni thruster //%%%
#include <SoftwareServo.h>
#include <NewSoftSerial.h>
NewSoftSerial SerijskaInverted(0, 1, false); //
#define PIN4 4
#define PIN5 5
#define PIN6 6
SoftwareServo MOTOR1; // definiranje prvog motora
SoftwareServo MOTOR2; // definiranje prvog motora
ServoTimer2 MOTOR3; //MOTOR3 JE OBJEKT DRUGE KLASE
int RL1=8;
int RL2=9;
int RL3=10;
int AX=0;
int BX=0;
int XX=30; // vrijednost brzine vrtnje za motor1
int YY=20;
int ZZ=19;
int x=800; //vrijednost za vertikalni thrusrter //%%%
int y=800;
char incomingByte = 0; //dolazni podatak sa serijske veze
char myChar[2]={'0','0'};
int myInts[3]={800,800,800};
int myInts2[3]={800,800,800};
void setup()
{
SerijskaInverted.begin(9600); //otvaranje serijska veze
delay (1000);
SerijskaInverted.println(" Pozdrav svijete!");
delay (1000);
MOTOR1.attach(PIN4); // spaja prvi motor na 4. pin
MOTOR2.attach(PIN5); // spaja drugi motor na 5. pin
MOTOR3.attach(PIN6); //vertikalni thruster //%%%
MOTOR1.write(YY);
SoftwareServo::refresh();
MOTOR2.write(ZZ);
SoftwareServo::refresh();
MOTOR3.write(x);
}
void loop()
{
MOTOR1.write(YY);
SoftwareServo::refresh();
delay(20);
MOTOR2.write(ZZ);
delay(20);
SoftwareServo::refresh();
MOTOR3.write(x);
delay(20);
if (SerijskaInverted.available() > 0)
{
for(int i=0;i<2;i++){
// read the incoming byte:
incomingByte = SerijskaInverted.read();
myChar=incomingByte;
//myInts=(((int)myChar*10)+500);
delay(10);
//SerijskaInverted.println((int)myChar);
}
SerijskaInverted.flush();
}
if(myChar[0]=='F')
{
digitalWrite(RL1, HIGH);
digitalWrite(RL2, HIGH);
delay(10);
YY=50;
ZZ=50;
MOTOR1.write(YY);
delay(10);
MOTOR2.write(ZZ);
delay(10);
SoftwareServo::refresh();
delay(10);
myChar[0]= 'Q';
}
else if(myChar[0]=='B')
{
digitalWrite(RL1, LOW);
digitalWrite(RL2, LOW);
delay(10);
YY=50;
ZZ=50;
MOTOR1.write(YY);
delay(10);
MOTOR2.write(ZZ);
delay(10);
SoftwareServo::refresh();
delay(10);
myChar[0]= 'Q';
delay(10);
}
else if(myChar[0]=='L')
{
digitalWrite(RL1, HIGH);
delay(15);
YY=50;
ZZ=19;
MOTOR1.write(YY);
MOTOR2.write(ZZ);
delay(10);
SoftwareServo::refresh();
delay(10);
myChar[0]= 'Q';
delay(10);
}
else if(myChar[0]=='R')
{
digitalWrite(RL2, HIGH);
delay(10);
YY=20;
ZZ=50;
delay(10);
MOTOR1.write(YY);
delay(10);
MOTOR2.write(ZZ);
SoftwareServo::refresh();
delay(10);
myChar[0]= 'Q';
delay(10);
}
else if(myChar[0]=='U')
{
myInts[0]=myInts[0]+5;
myInts[1]=myInts[1]-5;
delay(10);
x=myInts[0];
y=myInts[1];
delay(10);
if (myInts[0]<800)
{ digitalWrite(RL3,HIGH);
myInts2[0]=800+(800-myInts[0]);
delay(10);
x=myInts2[0];
}
if (myInts[0]>800)
{digitalWrite(RL3,LOW);
}
if (myInts[1]<800)
{;
myInts2[1]=800+(800-myInts[1]);
delay(10);
y=myInts2[1];
}
if (myInts[0]>800)
{
}
myChar[0]= 'Q';
}
else if(myChar[0]=='D')
{
myInts[0]=myInts[0]-5;
myInts[1]=myInts[1]+5;
delay(10);
x=myInts[0];
y=myInts[1];
delay(5);
if (myInts[0]<800)
{digitalWrite(RL3,HIGH);
myInts2[0]=800+(800-myInts[0]);
delay(10);
x=myInts2[0];
}
if (myInts[1]<800)
{
myInts2[1]=800+(800-myInts[1]);
y=myInts2[1];
}
myChar[0]= 'Q';
}
else if(myChar[0]=='Q') //motor u početnu poziciju
{
YY=20;
ZZ=20;
MOTOR1.write(YY);
delay(10);
MOTOR2.write(ZZ);
delay(10);
SoftwareServo::refresh();
delay(15);
myChar[0]= 'Q';
delay(20);
}
} ;
Processing code:
import procontroll.*;
import java.io.*;
import interfascia.*;
import java.awt.*;
import processing.serial.*;
////--- DODAVANJE GUMBA I JOYSTICKA OD GAMEPADA
ControllIO controll;
ControllDevice device;
ControllSlider sliderX,sliderY,sliderZ;
ControllButton button1,button2,button3,button4,button5,button6,button7,button8,button9,button10,button11,button12;
//INTERFASCIA
IFTextField t,o,p;
IFLabel s;
GUIController MOJGUI; //otvaranje objekta kontroliranja GUI-ja
////// serijski port
Serial myPort; //kreiranje instance serijskog porta
////////////////
int a=1;
void setup(){
size(400,400);
println(Serial.list());
float X=0;
float Y=0;
float Z=0;
controll = ControllIO.getInstance(this);
MOJGUI = new GUIController(this);
myPort = new Serial(this, Serial.list()[0], 9600); // otvara se port, prvi i jedini s liste serijskoh portova
t = new IFTextField("",125, 30, 150);
o = new IFTextField("",125, 60, 150);
p = new IFTextField("",125, 90, 150);
MOJGUI.add(t);
MOJGUI.add(o);
MOJGUI.add(p);
device = controll.getDevice(2);
device.setTolerance(0.05f);
button1 =device.getButton(1); button7 =device.getButton(7);
button2 =device.getButton(2); button8 =device.getButton(8);
button3 =device.getButton(3); button9 =device.getButton(9);
button4 =device.getButton(4); button10 =device.getButton(10);
button5 =device.getButton(5); button11 =device.getButton(11);
button6 =device.getButton(6); button12 =device.getButton(12);
sliderX =device.getSlider(0);
sliderY=device.getSlider(1);
sliderZ=device.getSlider(3);
sliderX.setMultiplier(a);
sliderY.setMultiplier(a);
sliderZ.setMultiplier(a);
fill(0);
rectMode(CENTER);
}
void draw(){;
background(255);
if(button1.pressed()) {
println("1");
delay(25);
myPort.write("AA");
println("AA");
background(100,100,123);
}
else if(button2.pressed()) {
println("2");
delay(25);
background(10,123,35);
}
else if(button3.pressed()) {
println("3");
delay(25);
background(55);
}
else if(button4.pressed()) {
println("4");
delay(25);
background(190);
}
else if(button5.pressed()) {
println("5");
delay(25);
}
else if(button6.pressed()) {
println("6");
delay(25);
}
else if(button7.pressed()) {
println("7");
delay(25);
}
else if(button8.pressed()) {
println("8");
delay(25);
}
else if(button9.pressed()) {
println("9");
delay(25);
}
else if(button10.pressed()) {
println("10");
delay(25);
}
else if(button11.pressed()) {
myPort.write('Q');
delay(15);
}
else if(button12.pressed()) {
println("12");
delay(25);
}
else {
}
//}
int X=int(sliderX.getValue());
int Y=int(sliderY.getValue());
int Z=int(sliderZ.getValue());
if(X >0.8)
{
myPort.write('B');
delay(50);
};
if(X < -0.8)
{
myPort.write('F');
delay(50);
};
if(Y >0.8)
{
myPort.write('R');
delay(50);
};
if(Y < -0.8)
{
myPort.write('L');
delay(50);
};
if(Z >0.8)
{
myPort.write('D');
delay(50);
};
if(Z < -0.8)
{
myPort.write('U');
delay(50);
};
//int Z=int(sliderZ.getValue());
// while (myPort.available() > 0)
// {
// int inByte = myPort.read();
// p.setValue(String.valueOf(inByte)); ///
// }
// t.setValue(String.valueOf(X)); ///
//o.setValue(String.valueOf(Y)); ///
// p.setValue(String.valueOf(Z)); ///
}
Re: Thruster control
Oh, and the motor is:
http://www.rctimer.com/index.php?gOo=go ... oodsid=130
http://www.rctimer.com/index.php?gOo=go ... oodsid=130