base ultimate + line following HYBRID
Dependencies: ESC Motor PS_PAD hadah mbed Ping
Fork of Ultimate_Hybrid by
Diff: main.cpp
- Revision:
- 0:edddd373a163
- Child:
- 1:fc1535231c0d
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue Apr 19 02:47:31 2016 +0000 @@ -0,0 +1,342 @@ +/*********************************************************************************************/ +/** FILE HEADER **/ +/*********************************************************************************************/ +#include "mbed.h" +#include "Motor.h" +#include "PS_PAD.h" +#include "PID.h" +#include "esc.h" +#include "Servo.h" + +/*********************************************************************************************/ +/** DEKLARASI INPUT OUTPUT **/ +/*********************************************************************************************/ +//serial +Serial pc(USBTX,USBRX); //debug +Serial com(PA_0,PA_1); //sensor + +//joystick PS2 +PS_PAD ps2(PB_15,PB_14,PB_13, PC_4); //(mosi, miso, sck, ss) + +//motor (PWM, forward, reverse) +Motor motor1(PA_8, PB_0, PC_15); +Motor motor2(PA_11, PA_6, PA_5); +//Motor motor3(PB_6, PA_7, PB_12); +Motor motor3(PA_9, PC_2, PC_3); +Motor motor4(PB_7, PA_14, PA_15); +Motor motorC1(PB_9, PA_12, PC_5); +Motor motorC2(PB_8, PB_1, PA_13); +Motor motorS(PA_10, PB_5, PB_4); + +//pnuematik +DigitalOut pnuematik1(PC_11); +DigitalOut pnuematik2(PC_10); +DigitalOut pnuematik3(PD_2); +DigitalOut pnuematik4(PC_12); + +//Limit Switch +DigitalIn limit1(PC_13 ,PullUp); +DigitalIn limit2(PC_14 ,PullUp); +DigitalIn limit3(PC_1 ,PullUp); +DigitalIn limit4(PC_0 ,PullUp); + +//PID line follower(P, I, D, Time Sampling) +PID PID(0.992,0.000,0.81,0.001); + +//servo(PWM) +Servo servoEDF(PC_8); + +//EDF(PWM, timer) +ESC edf(PC_6,20); + +//Timer Pnuematik +Timer timer; + +/*********************************************************************************************/ +/** DEKLARASI VARIABEL, PROSEDUR, DAN FUNGSI **/ +/*********************************************************************************************/ +float gMax_speed = 1; +float v0 = 0.6; +float ax = 0.0007; + +// inisialisasi pwm awal servo +double pwm = 0.00; + +// inisialisasi sudut awal +double sudut = -85; + +// variabel kondisi pnuematik +int g = 1; + +/////// +void aktuator(); +void edf_servo(); +/*********************************************************************************************/ +/*********************************************************************************************/ +/** PROGRAM UTAMA **/ +/*********************************************************************************************/ +/*********************************************************************************************/ +int main() { + //inisiasi serial + pc.baud(115200); + com.baud(115200); + + //inisiasi joystick + ps2.init(); + + //set inisiasi servo pada posisi 0 + servoEDF.position(sudut); + + //set edf pada posisi bukan kalibrasi, yaitu set edf 0 + edf.setThrottle(0); + edf.pulse(); + + //inisiasi pnuematik + pnuematik1 = 1; + pnuematik2 = 1; + pnuematik3 = 1; + pnuematik4 = 1; + + //inisiasi PID sensor + PID.setInputLimits(-15,15); + PID.setOutputLimits(-1.0,1.0); + PID.setMode(1.0); + PID.setBias(0.0); + PID.reset(); + + //inisisasi TIMER + timer.start(); + + //kondisi robot + bool manual=true; + + + while(manual){ + + ps2.poll(); + + aktuator(); + edf_servo(); + + if(limit3==0) manual = false; + + } + + motor1.brake(1); + motor2.brake(1); + motor3.brake(1); + motor4.brake(1); + + pnuematik1=0; + wait_ms(1500); + + while(limit4!=0){ + motorC1.speed(1); + motorC2.speed(-1); + } + + motorC1.brake(1); + motorC2.brake(1); + + pnuematik3 = 0; + wait_ms(1500); + pnuematik2 = 1; + wait_ms(500); + pnuematik3 = 1; + + + + return 0; +} + +/*********************************************************************************************/ +/** ALGORITMA PROSEDUR DAN FUNGSI **/ +/*********************************************************************************************/ +void aktuator(){ + float speed = v0; + float tuning = 0.01; + if((ps2.read(PS_PAD::PAD_L1)==1) && (ps2.read(PS_PAD::PAD_R1)==0)){ + //pivot kiri + motor2.speed(speed*0.7); + motor4.speed(-speed*0.7); + motor1.speed(speed*0.7-tuning); + motor3.speed(-(speed*0.7-tuning)); + pc.printf("pivot kiri \n"); + + v0 += ax; + } + else if((ps2.read(PS_PAD::PAD_R1)==1) && (ps2.read(PS_PAD::PAD_L1)==0)){ + //pivot kanan + motor2.speed(-speed*0.7); + motor4.speed(speed*0.7); + motor1.speed(-(speed*0.7-tuning)); + motor3.speed(speed*0.7-tuning); + pc.printf("pivot kanan \n"); + + v0 += ax; + } + else if((ps2.read(PS_PAD::PAD_RIGHT)==1) && (ps2.read(PS_PAD::PAD_TOP)==1)){ + //serong atas kanan + motor2.speed(speed); + motor4.brake(1); + motor1.brake(1); + motor3.speed(speed-tuning); + pc.printf("serong atas kanan \n"); + + v0 += ax; + } + else if((ps2.read(PS_PAD::PAD_TOP)==1) && (ps2.read(PS_PAD::PAD_LEFT)==1)){ + //serong atas kiri + motor2.brake(1); + motor4.speed(-speed); + motor1.speed(-(speed-tuning)); + motor3.brake(1); + pc.printf("serong atas kiri \n"); + + v0 += ax; + } + else if((ps2.read(PS_PAD::PAD_LEFT)==1) && (ps2.read(PS_PAD::PAD_BOTTOM)==1)){ + //serong bawah kiri + motor2.speed(-speed); + motor4.brake(1); + motor1.brake(1); + motor3.speed(-(speed-tuning)); + pc.printf("serong bawah kiri \n"); + + v0 += ax; + } + else if((ps2.read(PS_PAD::PAD_BOTTOM)==1) && (ps2.read(PS_PAD::PAD_RIGHT)==1)){ + //serong bawah kanan + motor2.brake(1); + motor4.speed(speed); + motor1.speed(speed-tuning); + motor3.brake(1); + pc.printf("serong bawah kanan \n"); + + v0 += ax; + } + else if((ps2.read(PS_PAD::PAD_TOP)==1) && (ps2.read(PS_PAD::PAD_BOTTOM)==0)){ + //maju + motor1.speed(-(speed-tuning)); + motor3.speed(speed-tuning); + motor2.speed(speed); + motor4.speed(-speed); + pc.printf("maju \n"); + + v0 += ax; + } + else if((ps2.read(PS_PAD::PAD_BOTTOM)==1) && (ps2.read(PS_PAD::PAD_TOP)==0)){ + //mundur + motor1.speed(speed-tuning); + motor3.speed(-(speed-tuning)); + motor2.speed(-speed); + motor4.speed(speed); + pc.printf("mundur \n"); + + v0 += ax; + } + else if((ps2.read(PS_PAD::PAD_RIGHT)==1) && (ps2.read(PS_PAD::PAD_LEFT)==0)){ + //kanan + motor2.speed(speed); + motor4.speed(speed); + motor1.speed(speed); + motor3.speed(speed); + pc.printf("kanan \n"); + + v0 += ax; + } + else if((ps2.read(PS_PAD::PAD_RIGHT)==0) && (ps2.read(PS_PAD::PAD_LEFT)==1)){ + //kiri + motor2.speed(-speed); + motor4.speed(-speed); + motor1.speed(-speed); + motor3.speed(-speed); + pc.printf("kiri \n"); + + v0 += ax; + } + else{ + motor1.brake(1); + motor3.brake(1); + motor2.brake(1); + motor4.brake(1); + pc.printf("diam \n"); + + v0 = 0.6; + } + + if((ps2.read(PS_PAD::PAD_CIRCLE)==0) && (ps2.read(PS_PAD::PAD_TRIANGLE)==1)){ + //POWER WINDOW ATAS + motorS.speed(1); + pc.printf("up \n"); + } + else if((ps2.read(PS_PAD::PAD_CIRCLE)==1) && (ps2.read(PS_PAD::PAD_TRIANGLE)==0)){ + //POWER WINDOW BAWAH + motorS.speed(-1); + pc.printf("down \n"); + } + else{ + motorS.brake(1); + pc.printf("diam \n"); + + } + + if ((ps2.read(PS_PAD::PAD_SELECT)==1)) + { + //mekanisme ambil gripper + pc.printf("mekanisme gripper"); + if (g==1){ + pc.printf("ambil 1"); + pnuematik2 = 0; + g=2; + wait_ms(400); + } + else + { + pnuematik2 = 1; + wait_ms(400); + g=1; + } + } +} + +void edf_servo(){ + if(ps2.read(PS_PAD::PAD_X)==1){ + //PWM ++ + pwm += 0.002; + if( pwm > 0.7) pwm = 0.7; + pc.printf("gaspol \n"); + } + else if(ps2.read(PS_PAD::PAD_SQUARE)==1){ + //PWM-- + pwm -= 0.002; + + if(pwm < 0) pwm = 0.0; + pc.printf("rem ndeng \n"); + } + + if(ps2.read(PS_PAD::PAD_R2)==1){ + //SERVO -- + sudut += 0.5; + + if(sudut > 90) sudut = 90; + pc.printf("servo max \n"); + } + else if(ps2.read(PS_PAD::PAD_L2)==1){ + //SERVO ++ + sudut -= 0.5; + + if(sudut < -90) sudut = -90; + pc.printf("servo min \n"); + } + + if(ps2.read(PS_PAD::PAD_START)==1){ + + sudut = 0; + pwm = 0.25; + } + + servoEDF.position((float)sudut); + edf.setThrottle((float)pwm); + edf.pulse(); +} \ No newline at end of file