![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
Kode Taker 2018
Dependencies: mbed PS_PAD encoderKRAI Motor_1 millis
main.cpp@0:8c6f29487664, 2018-07-03 (annotated)
- Committer:
- gatulz
- Date:
- Tue Jul 03 05:45:18 2018 +0000
- Revision:
- 0:8c6f29487664
- Child:
- 1:1dc7c9cb4f8c
TAKER DENGAN JOYSTICK KABEL
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
gatulz | 0:8c6f29487664 | 1 | |
gatulz | 0:8c6f29487664 | 2 | //////////////////////////////////////////////////////////////////////////////// |
gatulz | 0:8c6f29487664 | 3 | // Robo Taker (Semi-Otomatis) 2018 // |
gatulz | 0:8c6f29487664 | 4 | // -------------------------------------------------------------------------- // |
gatulz | 0:8c6f29487664 | 5 | // Gerakan Robot: // |
gatulz | 0:8c6f29487664 | 6 | // - Arah -> Gerak // |
gatulz | 0:8c6f29487664 | 7 | // - Silang -> Buka atau Tutup Gripper A // |
gatulz | 0:8c6f29487664 | 8 | // - Lingkaran -> Buka atau Tutup Gripper B // |
gatulz | 0:8c6f29487664 | 9 | // - Kotak -> Extend atau Shrink Slider A // |
gatulz | 0:8c6f29487664 | 10 | // - Segitigas -> Extend atau Shrink Slider B // |
gatulz | 0:8c6f29487664 | 11 | // - Start -> Ubah Mode // |
gatulz | 0:8c6f29487664 | 12 | //////////////////////////////////////////////////////////////////////////////// |
gatulz | 0:8c6f29487664 | 13 | #include "mbed.h" |
gatulz | 0:8c6f29487664 | 14 | #include "Motor.h" |
gatulz | 0:8c6f29487664 | 15 | #include "encoderKRAI.h" |
gatulz | 0:8c6f29487664 | 16 | #include "JoystickPS3.h" |
gatulz | 0:8c6f29487664 | 17 | #include "PS_PAD.h" |
gatulz | 0:8c6f29487664 | 18 | #include "pinList.h" |
gatulz | 0:8c6f29487664 | 19 | #include "millis.h" |
gatulz | 0:8c6f29487664 | 20 | |
gatulz | 0:8c6f29487664 | 21 | //////////////////////////////////////////////////////////////////////////////// |
gatulz | 0:8c6f29487664 | 22 | // Konstanta Program // |
gatulz | 0:8c6f29487664 | 23 | //////////////////////////////////////////////////////////////////////////////// |
gatulz | 0:8c6f29487664 | 24 | #define PI 3.141592653593 |
gatulz | 0:8c6f29487664 | 25 | #define RAD_TO_DEG 57.2957795131 |
gatulz | 0:8c6f29487664 | 26 | #define MAX_W_SPEED 15000 //max angular speed of robot |
gatulz | 0:8c6f29487664 | 27 | #define TOLERANCET 0.8 //theta tolerance |
gatulz | 0:8c6f29487664 | 28 | #define PULSE_TO_JARAK 0.7416027 //0.7656027 //0.581776 //kll roda / pulses |
gatulz | 0:8c6f29487664 | 29 | #define L 298.0 //roda to center of robot |
gatulz | 0:8c6f29487664 | 30 | #define TS 2.0 //time sampling |
gatulz | 0:8c6f29487664 | 31 | #define LIMITPWM 0.4 //limit pwm motor |
gatulz | 0:8c6f29487664 | 32 | |
gatulz | 0:8c6f29487664 | 33 | //Konstanta PID Theta |
gatulz | 0:8c6f29487664 | 34 | #define KP_W 1.8 |
gatulz | 0:8c6f29487664 | 35 | #define KI_W 0 |
gatulz | 0:8c6f29487664 | 36 | #define KD_W 140 |
gatulz | 0:8c6f29487664 | 37 | |
gatulz | 0:8c6f29487664 | 38 | #define MOTOR_LIMIT_MAX 1 |
gatulz | 0:8c6f29487664 | 39 | #define MOTOR_LIMIT_MIN -1 |
gatulz | 0:8c6f29487664 | 40 | |
gatulz | 0:8c6f29487664 | 41 | // Set 1 untuk aktifkan fitur pc.print |
gatulz | 0:8c6f29487664 | 42 | #define DEBUG 1 |
gatulz | 0:8c6f29487664 | 43 | |
gatulz | 0:8c6f29487664 | 44 | //////////////////////////////////////////////////////////////////////////////// |
gatulz | 0:8c6f29487664 | 45 | // Object Program // |
gatulz | 0:8c6f29487664 | 46 | //////////////////////////////////////////////////////////////////////////////// |
gatulz | 0:8c6f29487664 | 47 | // Serial |
gatulz | 0:8c6f29487664 | 48 | Serial pc(USBTX, USBRX, 115200); |
gatulz | 0:8c6f29487664 | 49 | joysticknucleo stick(PIN_TX, PIN_RX); |
gatulz | 0:8c6f29487664 | 50 | |
gatulz | 0:8c6f29487664 | 51 | //joystick PS2 |
gatulz | 0:8c6f29487664 | 52 | PS_PAD ps2(PB_15,PB_14, PB_10, PB_12); //(mosi, miso, sck, ss) |
gatulz | 0:8c6f29487664 | 53 | //PS_PAD ps2(PB_15,PB_14,PB_13, PC_4); //PB_13 udah dipake pin forward motor-_- |
gatulz | 0:8c6f29487664 | 54 | |
gatulz | 0:8c6f29487664 | 55 | // Pneumatik |
gatulz | 0:8c6f29487664 | 56 | DigitalOut pneumatik[5]{PIN_PNEUMATIK_1, PIN_PNEUMATIK_2, PIN_PNEUMATIK_5, PIN_PNEUMATIK_6, PIN_PNEUMATIK_9}; |
gatulz | 0:8c6f29487664 | 57 | |
gatulz | 0:8c6f29487664 | 58 | // Encoder |
gatulz | 0:8c6f29487664 | 59 | encoderKRAI encoder_A(PIN_A_CHANNEL_A, PIN_A_CHANNEL_B, 540, encoderKRAI::X4_ENCODING); |
gatulz | 0:8c6f29487664 | 60 | encoderKRAI encoder_B(PIN_B_CHANNEL_A, PIN_B_CHANNEL_B, 540, encoderKRAI::X4_ENCODING); |
gatulz | 0:8c6f29487664 | 61 | encoderKRAI encoder_C(PIN_C_CHANNEL_A, PIN_C_CHANNEL_B, 540, encoderKRAI::X4_ENCODING); |
gatulz | 0:8c6f29487664 | 62 | |
gatulz | 0:8c6f29487664 | 63 | // Motor |
gatulz | 0:8c6f29487664 | 64 | Motor motor1(PIN_PWM_A, PIN_FWD_A, PIN_REV_A); |
gatulz | 0:8c6f29487664 | 65 | Motor motor2(PIN_PWM_B, PIN_FWD_B, PIN_REV_B); |
gatulz | 0:8c6f29487664 | 66 | Motor motor3(PIN_PWM_C, PIN_FWD_C, PIN_REV_C); |
gatulz | 0:8c6f29487664 | 67 | |
gatulz | 0:8c6f29487664 | 68 | //////////////////////////////////////////////////////////////////////////////// |
gatulz | 0:8c6f29487664 | 69 | // Deklarasi Prosedure dan Fungsi // |
gatulz | 0:8c6f29487664 | 70 | //////////////////////////////////////////////////////////////////////////////// |
gatulz | 0:8c6f29487664 | 71 | void gerakMotor(); |
gatulz | 0:8c6f29487664 | 72 | void hitungPID(double theta_s); |
gatulz | 0:8c6f29487664 | 73 | void hitungParameter(); |
gatulz | 0:8c6f29487664 | 74 | void printPulse(); |
gatulz | 0:8c6f29487664 | 75 | void case_gerak(); |
gatulz | 0:8c6f29487664 | 76 | void motor_Stop(); |
gatulz | 0:8c6f29487664 | 77 | void motor_ForceStop(); |
gatulz | 0:8c6f29487664 | 78 | void gerak_Pneumatic(); |
gatulz | 0:8c6f29487664 | 79 | void case_pneumatic(); |
gatulz | 0:8c6f29487664 | 80 | |
gatulz | 0:8c6f29487664 | 81 | //////////////////////////////////////////////////////////////////////////////// |
gatulz | 0:8c6f29487664 | 82 | // Variable-variable // |
gatulz | 0:8c6f29487664 | 83 | //////////////////////////////////////////////////////////////////////////////// |
gatulz | 0:8c6f29487664 | 84 | int joystick; |
gatulz | 0:8c6f29487664 | 85 | int pn = 0; |
gatulz | 0:8c6f29487664 | 86 | int pn2 = 0; |
gatulz | 0:8c6f29487664 | 87 | int pn3 = 0; |
gatulz | 0:8c6f29487664 | 88 | int pn_state = 0; |
gatulz | 0:8c6f29487664 | 89 | double pulse_A=0, pulse_B=0, pulse_C=0; |
gatulz | 0:8c6f29487664 | 90 | double Vr = 0, Vr_max = 0; |
gatulz | 0:8c6f29487664 | 91 | double Vw = 0; |
gatulz | 0:8c6f29487664 | 92 | double a = 0; |
gatulz | 0:8c6f29487664 | 93 | double w = 0; |
gatulz | 0:8c6f29487664 | 94 | double x =0, x_s=0, y=0, y_s=0, x_prev=0, y_prev=0; |
gatulz | 0:8c6f29487664 | 95 | double theta=0, theta_s=0; |
gatulz | 0:8c6f29487664 | 96 | double theta_error = 0, theta_prev=0, theta_error_prev=0, sum_theta_error=0; |
gatulz | 0:8c6f29487664 | 97 | unsigned long last_mt_print,last_mt_print2, last_mt_pid, last_mt_rotasi; |
gatulz | 0:8c6f29487664 | 98 | unsigned long last_mt_aksel, last_mt_desel,last1; |
gatulz | 0:8c6f29487664 | 99 | bool modeauto = 1; |
gatulz | 0:8c6f29487664 | 100 | bool print_pulse = 0; |
gatulz | 0:8c6f29487664 | 101 | int brake_state=0; |
gatulz | 0:8c6f29487664 | 102 | double Vmax = 0.4; |
gatulz | 0:8c6f29487664 | 103 | double Vw_max = 0.3; |
gatulz | 0:8c6f29487664 | 104 | int force=0; |
gatulz | 0:8c6f29487664 | 105 | int count = 0; |
gatulz | 0:8c6f29487664 | 106 | int countX = 0; |
gatulz | 0:8c6f29487664 | 107 | int countKotak = 0; |
gatulz | 0:8c6f29487664 | 108 | int countSegitiga = 0; |
gatulz | 0:8c6f29487664 | 109 | int countCircle = 0; |
gatulz | 0:8c6f29487664 | 110 | int dudu; |
gatulz | 0:8c6f29487664 | 111 | |
gatulz | 0:8c6f29487664 | 112 | //////////////////////////////////////////////////////////////////////////////// |
gatulz | 0:8c6f29487664 | 113 | // Main Program // |
gatulz | 0:8c6f29487664 | 114 | //////////////////////////////////////////////////////////////////////////////// |
gatulz | 0:8c6f29487664 | 115 | int main(){ |
gatulz | 0:8c6f29487664 | 116 | encoder_A.reset(); |
gatulz | 0:8c6f29487664 | 117 | encoder_B.reset(); |
gatulz | 0:8c6f29487664 | 118 | encoder_C.reset(); |
gatulz | 0:8c6f29487664 | 119 | |
gatulz | 0:8c6f29487664 | 120 | pneumatik[0]=0; //gripA |
gatulz | 0:8c6f29487664 | 121 | pneumatik[1]=0; //gripB |
gatulz | 0:8c6f29487664 | 122 | pneumatik[2]=1; //sliderA |
gatulz | 0:8c6f29487664 | 123 | pneumatik[3]=1; //sliderB |
gatulz | 0:8c6f29487664 | 124 | |
gatulz | 0:8c6f29487664 | 125 | startMillis(); |
gatulz | 0:8c6f29487664 | 126 | //stick.setup(); |
gatulz | 0:8c6f29487664 | 127 | //stick.idle(); |
gatulz | 0:8c6f29487664 | 128 | |
gatulz | 0:8c6f29487664 | 129 | ps2.init(); |
gatulz | 0:8c6f29487664 | 130 | |
gatulz | 0:8c6f29487664 | 131 | |
gatulz | 0:8c6f29487664 | 132 | while(1){ |
gatulz | 0:8c6f29487664 | 133 | ps2.poll(); |
gatulz | 0:8c6f29487664 | 134 | if (millis() - last_mt_pid > TS){ |
gatulz | 0:8c6f29487664 | 135 | last_mt_pid = millis(); |
gatulz | 0:8c6f29487664 | 136 | hitungParameter(); |
gatulz | 0:8c6f29487664 | 137 | if (!(fabs(theta_s - (theta*RAD_TO_DEG))<TOLERANCET) ){ |
gatulz | 0:8c6f29487664 | 138 | hitungPID(theta_s); |
gatulz | 0:8c6f29487664 | 139 | } |
gatulz | 0:8c6f29487664 | 140 | //if (fabs(theta_s - (theta*RAD_TO_DEG))<TOLERANCET ){ |
gatulz | 0:8c6f29487664 | 141 | // Vw = 0; |
gatulz | 0:8c6f29487664 | 142 | // } |
gatulz | 0:8c6f29487664 | 143 | if (DEBUG==1) |
gatulz | 0:8c6f29487664 | 144 | printPulse(); |
gatulz | 0:8c6f29487664 | 145 | } |
gatulz | 0:8c6f29487664 | 146 | //gerakMotor(); |
gatulz | 0:8c6f29487664 | 147 | |
gatulz | 0:8c6f29487664 | 148 | //if (millis() - last_mt_print2 > TS){ |
gatulz | 0:8c6f29487664 | 149 | // hitungParameter(); |
gatulz | 0:8c6f29487664 | 150 | // // printPulse(); |
gatulz | 0:8c6f29487664 | 151 | // pc.printf("%.2f\t%.2f\t%.2f\t%d\n",theta*RAD_TO_DEG, theta_s, a,modeauto); |
gatulz | 0:8c6f29487664 | 152 | // last_mt_print2 = millis(); |
gatulz | 0:8c6f29487664 | 153 | // } |
gatulz | 0:8c6f29487664 | 154 | //if(stick.readable() ) { |
gatulz | 0:8c6f29487664 | 155 | // Panggil fungsi pembacaan joystik |
gatulz | 0:8c6f29487664 | 156 | //stick.baca_data(); |
gatulz | 0:8c6f29487664 | 157 | // Panggil fungsi pengolahan data joystik |
gatulz | 0:8c6f29487664 | 158 | //stick.olah_data(); |
gatulz | 0:8c6f29487664 | 159 | // Ambil data joystick |
gatulz | 0:8c6f29487664 | 160 | case_gerak(); |
gatulz | 0:8c6f29487664 | 161 | case_pneumatic(); |
gatulz | 0:8c6f29487664 | 162 | |
gatulz | 0:8c6f29487664 | 163 | // Pengatur Gerak Motor |
gatulz | 0:8c6f29487664 | 164 | gerakMotor(); |
gatulz | 0:8c6f29487664 | 165 | |
gatulz | 0:8c6f29487664 | 166 | // Program PID |
gatulz | 0:8c6f29487664 | 167 | if (fabs(theta_s - (theta*RAD_TO_DEG))<TOLERANCET ){ |
gatulz | 0:8c6f29487664 | 168 | Vw = 0; |
gatulz | 0:8c6f29487664 | 169 | } |
gatulz | 0:8c6f29487664 | 170 | |
gatulz | 0:8c6f29487664 | 171 | // Fungsi Serial Print |
gatulz | 0:8c6f29487664 | 172 | if (millis() - last_mt_print > TS*10){ |
gatulz | 0:8c6f29487664 | 173 | if (print_pulse && DEBUG) |
gatulz | 0:8c6f29487664 | 174 | printPulse(); |
gatulz | 0:8c6f29487664 | 175 | last_mt_print = millis(); |
gatulz | 0:8c6f29487664 | 176 | } |
gatulz | 0:8c6f29487664 | 177 | //} |
gatulz | 0:8c6f29487664 | 178 | } |
gatulz | 0:8c6f29487664 | 179 | } |
gatulz | 0:8c6f29487664 | 180 | |
gatulz | 0:8c6f29487664 | 181 | |
gatulz | 0:8c6f29487664 | 182 | //////////////////////////////////////////////////////////////////////////////// |
gatulz | 0:8c6f29487664 | 183 | // Prosedure dan Fungsi // |
gatulz | 0:8c6f29487664 | 184 | //////////////////////////////////////////////////////////////////////////////// |
gatulz | 0:8c6f29487664 | 185 | void hitungParameter(){ |
gatulz | 0:8c6f29487664 | 186 | pulse_A = encoder_A.getPulses()*PULSE_TO_JARAK; |
gatulz | 0:8c6f29487664 | 187 | pulse_B = encoder_B.getPulses()*PULSE_TO_JARAK; |
gatulz | 0:8c6f29487664 | 188 | pulse_C = encoder_C.getPulses()*PULSE_TO_JARAK; |
gatulz | 0:8c6f29487664 | 189 | |
gatulz | 0:8c6f29487664 | 190 | //Compute value |
gatulz | 0:8c6f29487664 | 191 | x = x_prev + (2*pulse_A - pulse_C - pulse_B)/3*cos(theta_prev) - (-pulse_C+pulse_B)*0.5773*sin(theta_prev); |
gatulz | 0:8c6f29487664 | 192 | y = y_prev + (2*pulse_A - pulse_C - pulse_B)/3*sin(theta_prev) + (-pulse_C+pulse_B)*0.5773*cos(theta_prev); |
gatulz | 0:8c6f29487664 | 193 | theta = theta_prev + (pulse_A + pulse_C + pulse_B)/(3.0*L); |
gatulz | 0:8c6f29487664 | 194 | //theta2 = theta_prev2 + (pulse_A + pulse_C + pulse_B)/(3.0*L); |
gatulz | 0:8c6f29487664 | 195 | |
gatulz | 0:8c6f29487664 | 196 | //Update value |
gatulz | 0:8c6f29487664 | 197 | x_prev = x; |
gatulz | 0:8c6f29487664 | 198 | y_prev = y; |
gatulz | 0:8c6f29487664 | 199 | theta_prev = theta; |
gatulz | 0:8c6f29487664 | 200 | //theta_prev2 = theta2; |
gatulz | 0:8c6f29487664 | 201 | |
gatulz | 0:8c6f29487664 | 202 | encoder_A.reset(); |
gatulz | 0:8c6f29487664 | 203 | encoder_B.reset(); |
gatulz | 0:8c6f29487664 | 204 | encoder_C.reset(); |
gatulz | 0:8c6f29487664 | 205 | } |
gatulz | 0:8c6f29487664 | 206 | |
gatulz | 0:8c6f29487664 | 207 | void hitungPID(double theta_s){ |
gatulz | 0:8c6f29487664 | 208 | //menghitung error jarak x,y terhaadap xs,ys |
gatulz | 0:8c6f29487664 | 209 | theta_error = theta_s - (theta*RAD_TO_DEG); |
gatulz | 0:8c6f29487664 | 210 | |
gatulz | 0:8c6f29487664 | 211 | sum_theta_error += theta_error; |
gatulz | 0:8c6f29487664 | 212 | |
gatulz | 0:8c6f29487664 | 213 | //kalkulasi PID Theta |
gatulz | 0:8c6f29487664 | 214 | w = KP_W*theta_error + KI_W*TS*sum_theta_error + KD_W*(theta_error - theta_error_prev)/TS; |
gatulz | 0:8c6f29487664 | 215 | Vw += (w*L/MAX_W_SPEED)*LIMITPWM; |
gatulz | 0:8c6f29487664 | 216 | |
gatulz | 0:8c6f29487664 | 217 | //update |
gatulz | 0:8c6f29487664 | 218 | theta_error_prev = theta_error; |
gatulz | 0:8c6f29487664 | 219 | |
gatulz | 0:8c6f29487664 | 220 | //Limit vw |
gatulz | 0:8c6f29487664 | 221 | if (Vw > Vw_max){ |
gatulz | 0:8c6f29487664 | 222 | Vw = Vw_max; |
gatulz | 0:8c6f29487664 | 223 | } |
gatulz | 0:8c6f29487664 | 224 | else if ( Vw < -1*Vw_max){ |
gatulz | 0:8c6f29487664 | 225 | Vw = -1*Vw_max; |
gatulz | 0:8c6f29487664 | 226 | } |
gatulz | 0:8c6f29487664 | 227 | } |
gatulz | 0:8c6f29487664 | 228 | |
gatulz | 0:8c6f29487664 | 229 | void gerakMotor(){ |
gatulz | 0:8c6f29487664 | 230 | // Berhent jika tidak maju, mundur, kiri, kanan, atau pivot |
gatulz | 0:8c6f29487664 | 231 | if (brake_state == 1){ |
gatulz | 0:8c6f29487664 | 232 | motor_ForceStop(); |
gatulz | 0:8c6f29487664 | 233 | //motor_Stop(); |
gatulz | 0:8c6f29487664 | 234 | } else { |
gatulz | 0:8c6f29487664 | 235 | if (count>50){ |
gatulz | 0:8c6f29487664 | 236 | if ((millis() - last_mt_aksel > 60) && Vr < Vr_max){ |
gatulz | 0:8c6f29487664 | 237 | if (Vr < 0.35){ |
gatulz | 0:8c6f29487664 | 238 | Vr = 0.35; |
gatulz | 0:8c6f29487664 | 239 | } |
gatulz | 0:8c6f29487664 | 240 | else if ( (Vr >= 0.35)&& (Vr<=0.45)){ |
gatulz | 0:8c6f29487664 | 241 | Vr+= 0.025; |
gatulz | 0:8c6f29487664 | 242 | } else if ((Vr>0.45) && (Vr<0.7) ){ |
gatulz | 0:8c6f29487664 | 243 | Vr+=0.1; |
gatulz | 0:8c6f29487664 | 244 | } else if ((Vr>=0.7) && (Vr<1.00)) { |
gatulz | 0:8c6f29487664 | 245 | Vr+=0.15; |
gatulz | 0:8c6f29487664 | 246 | } else |
gatulz | 0:8c6f29487664 | 247 | Vr = 1.00; |
gatulz | 0:8c6f29487664 | 248 | last_mt_aksel = millis(); |
gatulz | 0:8c6f29487664 | 249 | } |
gatulz | 0:8c6f29487664 | 250 | } else { |
gatulz | 0:8c6f29487664 | 251 | Vr=0.4; |
gatulz | 0:8c6f29487664 | 252 | } |
gatulz | 0:8c6f29487664 | 253 | |
gatulz | 0:8c6f29487664 | 254 | // Limit |
gatulz | 0:8c6f29487664 | 255 | if (Vr > Vr_max && Vr_max >= 0.000){ |
gatulz | 0:8c6f29487664 | 256 | Vr = Vr_max; |
gatulz | 0:8c6f29487664 | 257 | } |
gatulz | 0:8c6f29487664 | 258 | |
gatulz | 0:8c6f29487664 | 259 | // Control Motor |
gatulz | 0:8c6f29487664 | 260 | motor1.speed((Vr*cos(a) - Vw)); |
gatulz | 0:8c6f29487664 | 261 | motor2.speed((Vr*(-0.5*cos(a) - 0.866*sin(a)) - Vw)); |
gatulz | 0:8c6f29487664 | 262 | motor3.speed((Vr*(-0.5*cos(a) + 0.866*sin(a)) - Vw)); |
gatulz | 0:8c6f29487664 | 263 | print_pulse = 1; |
gatulz | 0:8c6f29487664 | 264 | } |
gatulz | 0:8c6f29487664 | 265 | |
gatulz | 0:8c6f29487664 | 266 | } |
gatulz | 0:8c6f29487664 | 267 | |
gatulz | 0:8c6f29487664 | 268 | void printPulse(){ |
gatulz | 0:8c6f29487664 | 269 | pc.printf("Up=%d \t Down=%d \t Left=%d \t Right=%d \t\n", (ps2.read(PS_PAD::PAD_TOP)), (ps2.read(PS_PAD::PAD_BOTTOM)), (ps2.read(PS_PAD::PAD_LEFT)), (ps2.read(PS_PAD::PAD_RIGHT))); |
gatulz | 0:8c6f29487664 | 270 | //pc.printf("%d \n", pn); |
gatulz | 0:8c6f29487664 | 271 | //pc.printf("%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n", pulse_A, pulse_B, pulse_C, x, y); |
gatulz | 0:8c6f29487664 | 272 | //pc.printf("%.2f\t%.2f\t%.2f\t%.2f\t%d\n",theta*RAD_TO_DEG, x, y, Vmax, modeauto); |
gatulz | 0:8c6f29487664 | 273 | } |
gatulz | 0:8c6f29487664 | 274 | |
gatulz | 0:8c6f29487664 | 275 | void motor_Stop(){ |
gatulz | 0:8c6f29487664 | 276 | motor1.speed(0); |
gatulz | 0:8c6f29487664 | 277 | motor2.speed(0); |
gatulz | 0:8c6f29487664 | 278 | motor2.speed(0); |
gatulz | 0:8c6f29487664 | 279 | } |
gatulz | 0:8c6f29487664 | 280 | |
gatulz | 0:8c6f29487664 | 281 | void motor_ForceStop(){ |
gatulz | 0:8c6f29487664 | 282 | motor1.brake(BRAKE_HIGH); |
gatulz | 0:8c6f29487664 | 283 | motor2.brake(BRAKE_HIGH); |
gatulz | 0:8c6f29487664 | 284 | motor3.brake(BRAKE_HIGH); |
gatulz | 0:8c6f29487664 | 285 | } |
gatulz | 0:8c6f29487664 | 286 | |
gatulz | 0:8c6f29487664 | 287 | void gerak_Pneumatic(){ |
gatulz | 0:8c6f29487664 | 288 | if (pn_state==0){ |
gatulz | 0:8c6f29487664 | 289 | pneumatik[0] = 1; |
gatulz | 0:8c6f29487664 | 290 | pneumatik[1] = 1; |
gatulz | 0:8c6f29487664 | 291 | pneumatik[2] = 1; |
gatulz | 0:8c6f29487664 | 292 | pneumatik[3] = 1; |
gatulz | 0:8c6f29487664 | 293 | } else if (pn_state==1){ |
gatulz | 0:8c6f29487664 | 294 | pneumatik[0] = 1; |
gatulz | 0:8c6f29487664 | 295 | pneumatik[1] = 1; |
gatulz | 0:8c6f29487664 | 296 | pneumatik[2] = 0; |
gatulz | 0:8c6f29487664 | 297 | pneumatik[3] = 1; |
gatulz | 0:8c6f29487664 | 298 | } else if (pn_state==2){ |
gatulz | 0:8c6f29487664 | 299 | pneumatik[0] = 0; |
gatulz | 0:8c6f29487664 | 300 | pneumatik[1] = 1; |
gatulz | 0:8c6f29487664 | 301 | wait_ms(100); |
gatulz | 0:8c6f29487664 | 302 | pneumatik[2] = 1; |
gatulz | 0:8c6f29487664 | 303 | pneumatik[3] = 1; |
gatulz | 0:8c6f29487664 | 304 | } else if (pn_state==3){ |
gatulz | 0:8c6f29487664 | 305 | pneumatik[0] = 0; |
gatulz | 0:8c6f29487664 | 306 | pneumatik[1] = 1; |
gatulz | 0:8c6f29487664 | 307 | pneumatik[2] = 1; |
gatulz | 0:8c6f29487664 | 308 | pneumatik[3] = 0; |
gatulz | 0:8c6f29487664 | 309 | } else if (pn_state==4){ |
gatulz | 0:8c6f29487664 | 310 | pneumatik[0] = 0; |
gatulz | 0:8c6f29487664 | 311 | pneumatik[1] = 0; |
gatulz | 0:8c6f29487664 | 312 | wait_ms(100); |
gatulz | 0:8c6f29487664 | 313 | pneumatik[2] = 1; |
gatulz | 0:8c6f29487664 | 314 | pneumatik[3] = 1; |
gatulz | 0:8c6f29487664 | 315 | } |
gatulz | 0:8c6f29487664 | 316 | } |
gatulz | 0:8c6f29487664 | 317 | void case_gerak(){ |
gatulz | 0:8c6f29487664 | 318 | if(ps2.read(PS_PAD::PAD_SELECT)==1){ |
gatulz | 0:8c6f29487664 | 319 | pneumatik[0]=1; //gripA |
gatulz | 0:8c6f29487664 | 320 | pneumatik[1]=1; //gripB |
gatulz | 0:8c6f29487664 | 321 | pneumatik[2]=1; //sliderA |
gatulz | 0:8c6f29487664 | 322 | pneumatik[3]=1; //sliderB |
gatulz | 0:8c6f29487664 | 323 | pn=0; |
gatulz | 0:8c6f29487664 | 324 | pn2=0; |
gatulz | 0:8c6f29487664 | 325 | modeauto = 0; |
gatulz | 0:8c6f29487664 | 326 | theta = 0.0; |
gatulz | 0:8c6f29487664 | 327 | theta_prev = 0.0; |
gatulz | 0:8c6f29487664 | 328 | theta_s = 0; |
gatulz | 0:8c6f29487664 | 329 | theta_error_prev = 0; |
gatulz | 0:8c6f29487664 | 330 | sum_theta_error = 0; |
gatulz | 0:8c6f29487664 | 331 | theta_error = 0; |
gatulz | 0:8c6f29487664 | 332 | } |
gatulz | 0:8c6f29487664 | 333 | |
gatulz | 0:8c6f29487664 | 334 | // Rotasi |
gatulz | 0:8c6f29487664 | 335 | if ((ps2.read(PS_PAD::PAD_R1)==1) && (ps2.read(PS_PAD::PAD_L1)==0)){ // Pivot Kanan |
gatulz | 0:8c6f29487664 | 336 | //theta = 0.0; |
gatulz | 0:8c6f29487664 | 337 | //theta_prev = 0.0; |
gatulz | 0:8c6f29487664 | 338 | theta_s = theta*RAD_TO_DEG; |
gatulz | 0:8c6f29487664 | 339 | theta_error_prev = 0; |
gatulz | 0:8c6f29487664 | 340 | sum_theta_error = 0; |
gatulz | 0:8c6f29487664 | 341 | theta_error = 0; |
gatulz | 0:8c6f29487664 | 342 | if (Vr_max==0) |
gatulz | 0:8c6f29487664 | 343 | Vw = 0.2; |
gatulz | 0:8c6f29487664 | 344 | else |
gatulz | 0:8c6f29487664 | 345 | Vw = 0.2; |
gatulz | 0:8c6f29487664 | 346 | } |
gatulz | 0:8c6f29487664 | 347 | else if ((ps2.read(PS_PAD::PAD_L1)==1) && (ps2.read(PS_PAD::PAD_R1)==0)){ // Pivot Kiri |
gatulz | 0:8c6f29487664 | 348 | //theta = 0.0; |
gatulz | 0:8c6f29487664 | 349 | //theta_prev = 0.0; |
gatulz | 0:8c6f29487664 | 350 | theta_s = theta*RAD_TO_DEG; |
gatulz | 0:8c6f29487664 | 351 | theta_error_prev = 0; |
gatulz | 0:8c6f29487664 | 352 | sum_theta_error = 0; |
gatulz | 0:8c6f29487664 | 353 | theta_error = 0; |
gatulz | 0:8c6f29487664 | 354 | if (Vr_max==0) |
gatulz | 0:8c6f29487664 | 355 | Vw = -0.2; |
gatulz | 0:8c6f29487664 | 356 | else |
gatulz | 0:8c6f29487664 | 357 | Vw = -0.2; |
gatulz | 0:8c6f29487664 | 358 | } |
gatulz | 0:8c6f29487664 | 359 | |
gatulz | 0:8c6f29487664 | 360 | if (ps2.read(PS_PAD::PAD_R2)==1){ |
gatulz | 0:8c6f29487664 | 361 | // Mode Sprint |
gatulz | 0:8c6f29487664 | 362 | Vmax=1.0; |
gatulz | 0:8c6f29487664 | 363 | } else { |
gatulz | 0:8c6f29487664 | 364 | Vmax=0.8; |
gatulz | 0:8c6f29487664 | 365 | } |
gatulz | 0:8c6f29487664 | 366 | |
gatulz | 0:8c6f29487664 | 367 | if ( (ps2.read(PS_PAD::PAD_TOP)==0)&&(ps2.read(PS_PAD::PAD_BOTTOM)==0)&&(ps2.read(PS_PAD::PAD_RIGHT)==0)&&(ps2.read(PS_PAD::PAD_LEFT)==0)&&(ps2.read(PS_PAD::PAD_L1)==0)&&(ps2.read(PS_PAD::PAD_R1)==0) && (ps2.read(PS_PAD::PAD_R2)==0)){ |
gatulz | 0:8c6f29487664 | 368 | count=0; |
gatulz | 0:8c6f29487664 | 369 | brake_state=1; |
gatulz | 0:8c6f29487664 | 370 | }else{ |
gatulz | 0:8c6f29487664 | 371 | if (count<200) |
gatulz | 0:8c6f29487664 | 372 | count++; |
gatulz | 0:8c6f29487664 | 373 | else |
gatulz | 0:8c6f29487664 | 374 | count=500; |
gatulz | 0:8c6f29487664 | 375 | brake_state=0; |
gatulz | 0:8c6f29487664 | 376 | } |
gatulz | 0:8c6f29487664 | 377 | // Linier |
gatulz | 0:8c6f29487664 | 378 | if ((ps2.read(PS_PAD::PAD_TOP)==1) && (ps2.read(PS_PAD::PAD_BOTTOM)==0)){ |
gatulz | 0:8c6f29487664 | 379 | a = (-90/RAD_TO_DEG); // Maju |
gatulz | 0:8c6f29487664 | 380 | Vr_max = Vmax; |
gatulz | 0:8c6f29487664 | 381 | } |
gatulz | 0:8c6f29487664 | 382 | else if ((ps2.read(PS_PAD::PAD_BOTTOM)==1) && (ps2.read(PS_PAD::PAD_TOP)==0)){ |
gatulz | 0:8c6f29487664 | 383 | a = (90/RAD_TO_DEG); // Mundur |
gatulz | 0:8c6f29487664 | 384 | Vr_max = Vmax; |
gatulz | 0:8c6f29487664 | 385 | } |
gatulz | 0:8c6f29487664 | 386 | else if ((ps2.read(PS_PAD::PAD_RIGHT)==1) && (ps2.read(PS_PAD::PAD_TOP)==1)){ |
gatulz | 0:8c6f29487664 | 387 | a = (-45/RAD_TO_DEG); // Serong Atas Kanan |
gatulz | 0:8c6f29487664 | 388 | Vr_max = Vmax; |
gatulz | 0:8c6f29487664 | 389 | } |
gatulz | 0:8c6f29487664 | 390 | else if ((ps2.read(PS_PAD::PAD_BOTTOM)==1) && (ps2.read(PS_PAD::PAD_RIGHT)==1)){ |
gatulz | 0:8c6f29487664 | 391 | a = (45/RAD_TO_DEG); // Serong Bawah Kanan |
gatulz | 0:8c6f29487664 | 392 | Vr_max = Vmax; |
gatulz | 0:8c6f29487664 | 393 | } |
gatulz | 0:8c6f29487664 | 394 | else if ((ps2.read(PS_PAD::PAD_TOP)==1) && (ps2.read(PS_PAD::PAD_LEFT)==1)){ |
gatulz | 0:8c6f29487664 | 395 | a = (-135/RAD_TO_DEG); // Serong Atas Kiri |
gatulz | 0:8c6f29487664 | 396 | Vr_max = Vmax; |
gatulz | 0:8c6f29487664 | 397 | } |
gatulz | 0:8c6f29487664 | 398 | else if ((ps2.read(PS_PAD::PAD_LEFT)==1) && (ps2.read(PS_PAD::PAD_BOTTOM)==1)){ |
gatulz | 0:8c6f29487664 | 399 | a = (135/RAD_TO_DEG); // Serong Bawah Kiri |
gatulz | 0:8c6f29487664 | 400 | Vr_max = Vmax; |
gatulz | 0:8c6f29487664 | 401 | } |
gatulz | 0:8c6f29487664 | 402 | else if ((ps2.read(PS_PAD::PAD_RIGHT)==1) && (ps2.read(PS_PAD::PAD_LEFT)==0)){ |
gatulz | 0:8c6f29487664 | 403 | a = (0/RAD_TO_DEG); // Kanan |
gatulz | 0:8c6f29487664 | 404 | Vr_max = Vmax; |
gatulz | 0:8c6f29487664 | 405 | } |
gatulz | 0:8c6f29487664 | 406 | else if ((ps2.read(PS_PAD::PAD_RIGHT)==0) && (ps2.read(PS_PAD::PAD_LEFT)==1)){ |
gatulz | 0:8c6f29487664 | 407 | a = (180/RAD_TO_DEG); // Kiri |
gatulz | 0:8c6f29487664 | 408 | Vr_max = Vmax; |
gatulz | 0:8c6f29487664 | 409 | } |
gatulz | 0:8c6f29487664 | 410 | else { |
gatulz | 0:8c6f29487664 | 411 | Vr_max = 0; |
gatulz | 0:8c6f29487664 | 412 | } |
gatulz | 0:8c6f29487664 | 413 | |
gatulz | 0:8c6f29487664 | 414 | |
gatulz | 0:8c6f29487664 | 415 | } |
gatulz | 0:8c6f29487664 | 416 | void case_pneumatic(){ |
gatulz | 0:8c6f29487664 | 417 | // Control Pneumatic |
gatulz | 0:8c6f29487664 | 418 | |
gatulz | 0:8c6f29487664 | 419 | if((ps2.read(PS_PAD::PAD_X)==0) && (ps2.read(PS_PAD::PAD_SQUARE)==0) && (ps2.read(PS_PAD::PAD_CIRCLE)==0) && (ps2.read(PS_PAD::PAD_TRIANGLE)==0)) { |
gatulz | 0:8c6f29487664 | 420 | countX=0; |
gatulz | 0:8c6f29487664 | 421 | countKotak=0; |
gatulz | 0:8c6f29487664 | 422 | countSegitiga=0; |
gatulz | 0:8c6f29487664 | 423 | countCircle=0; |
gatulz | 0:8c6f29487664 | 424 | } else if ((ps2.read(PS_PAD::PAD_X)==1)) { |
gatulz | 0:8c6f29487664 | 425 | //SILANG : sekuensial tiap tangan gripper |
gatulz | 0:8c6f29487664 | 426 | countX++; |
gatulz | 0:8c6f29487664 | 427 | } |
gatulz | 0:8c6f29487664 | 428 | |
gatulz | 0:8c6f29487664 | 429 | if (countX>5 && countX<=300) { |
gatulz | 0:8c6f29487664 | 430 | pn2=0; |
gatulz | 0:8c6f29487664 | 431 | countX=325; |
gatulz | 0:8c6f29487664 | 432 | if (pn<5 && pn>=0) |
gatulz | 0:8c6f29487664 | 433 | pn++; |
gatulz | 0:8c6f29487664 | 434 | else |
gatulz | 0:8c6f29487664 | 435 | pn=0; |
gatulz | 0:8c6f29487664 | 436 | |
gatulz | 0:8c6f29487664 | 437 | if(pn==0 || pn==22){ |
gatulz | 0:8c6f29487664 | 438 | pneumatik[0]=1;//gripA |
gatulz | 0:8c6f29487664 | 439 | pneumatik[1]=1;//gripB |
gatulz | 0:8c6f29487664 | 440 | pneumatik[2]=1;//sliderA |
gatulz | 0:8c6f29487664 | 441 | pneumatik[3]=1;//sliderB |
gatulz | 0:8c6f29487664 | 442 | } else if (pn==1){ |
gatulz | 0:8c6f29487664 | 443 | pneumatik[2] = 0; |
gatulz | 0:8c6f29487664 | 444 | } else if (pn==2){ |
gatulz | 0:8c6f29487664 | 445 | pneumatik[0] = 0; |
gatulz | 0:8c6f29487664 | 446 | wait_ms(70); |
gatulz | 0:8c6f29487664 | 447 | pneumatik[2] = 1; |
gatulz | 0:8c6f29487664 | 448 | } else if (pn==3){ |
gatulz | 0:8c6f29487664 | 449 | pneumatik[0]=1; |
gatulz | 0:8c6f29487664 | 450 | pneumatik[2]=1; |
gatulz | 0:8c6f29487664 | 451 | } else if(pn==4){ |
gatulz | 0:8c6f29487664 | 452 | pneumatik[3]=0; |
gatulz | 0:8c6f29487664 | 453 | } else if (pn==5){ |
gatulz | 0:8c6f29487664 | 454 | pneumatik[1] = 0; |
gatulz | 0:8c6f29487664 | 455 | wait_ms(20); |
gatulz | 0:8c6f29487664 | 456 | pneumatik[3] = 1; |
gatulz | 0:8c6f29487664 | 457 | } |
gatulz | 0:8c6f29487664 | 458 | |
gatulz | 0:8c6f29487664 | 459 | } |
gatulz | 0:8c6f29487664 | 460 | |
gatulz | 0:8c6f29487664 | 461 | if (ps2.read(PS_PAD::PAD_SQUARE)==1){ |
gatulz | 0:8c6f29487664 | 462 | //KOTAK : maju 2 glider , 2 kali kotak 1 kali lingkaran |
gatulz | 0:8c6f29487664 | 463 | countKotak++; |
gatulz | 0:8c6f29487664 | 464 | } |
gatulz | 0:8c6f29487664 | 465 | |
gatulz | 0:8c6f29487664 | 466 | if (countKotak>5 && countKotak<300){ |
gatulz | 0:8c6f29487664 | 467 | pn=0; |
gatulz | 0:8c6f29487664 | 468 | countKotak=325; |
gatulz | 0:8c6f29487664 | 469 | if (pn2<5 && pn2>=0) |
gatulz | 0:8c6f29487664 | 470 | pn2++; |
gatulz | 0:8c6f29487664 | 471 | else |
gatulz | 0:8c6f29487664 | 472 | pn2=0; |
gatulz | 0:8c6f29487664 | 473 | |
gatulz | 0:8c6f29487664 | 474 | if(pn2==0){ |
gatulz | 0:8c6f29487664 | 475 | pneumatik[0]=1; |
gatulz | 0:8c6f29487664 | 476 | pneumatik[1]=1; |
gatulz | 0:8c6f29487664 | 477 | pneumatik[2]=1; |
gatulz | 0:8c6f29487664 | 478 | pneumatik[3]=1; |
gatulz | 0:8c6f29487664 | 479 | } else if(pn2==1){ |
gatulz | 0:8c6f29487664 | 480 | pneumatik[2]=0; |
gatulz | 0:8c6f29487664 | 481 | pneumatik[3]=0; |
gatulz | 0:8c6f29487664 | 482 | } else if(pn2==2){ |
gatulz | 0:8c6f29487664 | 483 | pneumatik[0]=0; |
gatulz | 0:8c6f29487664 | 484 | pneumatik[1]=0; |
gatulz | 0:8c6f29487664 | 485 | wait_ms(50); |
gatulz | 0:8c6f29487664 | 486 | pneumatik[0]=0; |
gatulz | 0:8c6f29487664 | 487 | pneumatik[1]=0; |
gatulz | 0:8c6f29487664 | 488 | pneumatik[2]=1; |
gatulz | 0:8c6f29487664 | 489 | pneumatik[3]=1; |
gatulz | 0:8c6f29487664 | 490 | } else if (pn2==3){ |
gatulz | 0:8c6f29487664 | 491 | pneumatik[0]=0; |
gatulz | 0:8c6f29487664 | 492 | pneumatik[1]=0; |
gatulz | 0:8c6f29487664 | 493 | } |
gatulz | 0:8c6f29487664 | 494 | |
gatulz | 0:8c6f29487664 | 495 | } |
gatulz | 0:8c6f29487664 | 496 | |
gatulz | 0:8c6f29487664 | 497 | if (ps2.read(PS_PAD::PAD_TRIANGLE)==1 && countSegitiga<400) |
gatulz | 0:8c6f29487664 | 498 | countSegitiga++; |
gatulz | 0:8c6f29487664 | 499 | if (countSegitiga>=7 && countSegitiga<300){ |
gatulz | 0:8c6f29487664 | 500 | //SEGITIGA : buka tutup kedua gripper |
gatulz | 0:8c6f29487664 | 501 | countSegitiga=500; |
gatulz | 0:8c6f29487664 | 502 | pneumatik[0]=!pneumatik[0]; |
gatulz | 0:8c6f29487664 | 503 | pneumatik[1]=!pneumatik[1]; |
gatulz | 0:8c6f29487664 | 504 | pneumatik[2]=1; |
gatulz | 0:8c6f29487664 | 505 | pneumatik[3]=1; |
gatulz | 0:8c6f29487664 | 506 | pn=0; |
gatulz | 0:8c6f29487664 | 507 | pn2=0; |
gatulz | 0:8c6f29487664 | 508 | } |
gatulz | 0:8c6f29487664 | 509 | |
gatulz | 0:8c6f29487664 | 510 | |
gatulz | 0:8c6f29487664 | 511 | if (ps2.read(PS_PAD::PAD_CIRCLE)==1 && countCircle<400) |
gatulz | 0:8c6f29487664 | 512 | countCircle++; |
gatulz | 0:8c6f29487664 | 513 | if (countCircle>=5 && countCircle<200){ |
gatulz | 0:8c6f29487664 | 514 | //LINGKARAN : glider AB mundur, gripper AB buka, (kombinasikan dg kotak utk passing golde sc) |
gatulz | 0:8c6f29487664 | 515 | countCircle=500; |
gatulz | 0:8c6f29487664 | 516 | pneumatik[0]=0; //gripA |
gatulz | 0:8c6f29487664 | 517 | pneumatik[1]=0; //gripB |
gatulz | 0:8c6f29487664 | 518 | pneumatik[2]=1; //sliderA |
gatulz | 0:8c6f29487664 | 519 | pneumatik[3]=1; //sliderB |
gatulz | 0:8c6f29487664 | 520 | pn=0; |
gatulz | 0:8c6f29487664 | 521 | pn2=0; |
gatulz | 0:8c6f29487664 | 522 | } |
gatulz | 0:8c6f29487664 | 523 | |
gatulz | 0:8c6f29487664 | 524 | } |