Thruster control

Anything to do with Propulsion.
Post Reply
gumma
Posts: 49
Joined: Jun 1st, 2011, 4:05 am

Thruster control

Post by gumma »

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
User avatar
KR2_Diving
Posts: 391
Joined: Aug 30th, 2012, 11:43 am
Location: Currently: NW Suburbs of Chicago. Originally: NE Wisconsin

Re: Thruster control

Post by KR2_Diving »

Looks good!
Would be interested in seeing your code some time!

Which motors are those? (Think I have the same ones!)
gumma
Posts: 49
Joined: Jun 1st, 2011, 4:05 am

Re: Thruster control

Post by gumma »

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)); ///
}
gumma
Posts: 49
Joined: Jun 1st, 2011, 4:05 am

Re: Thruster control

Post by gumma »

Post Reply