base versi 1 motherboard prototype
Dependencies: Motor NewTextLCD PID mbed
main.cpp@2:23fe981b6ef7, 2015-12-19 (annotated)
- Committer:
- rizqicahyo
- Date:
- Sat Dec 19 00:03:45 2015 +0000
- Revision:
- 2:23fe981b6ef7
- Parent:
- 1:33203568631b
debug manual driving
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
rizqicahyo | 1:33203568631b | 1 | /*********************************************************************************************/ |
rizqicahyo | 1:33203568631b | 2 | /** GARUDAGO-ITB (KRAI2016) **/ |
rizqicahyo | 1:33203568631b | 3 | /** #ROADTOBANGKOK! **/ |
rizqicahyo | 1:33203568631b | 4 | /** **/ |
rizqicahyo | 1:33203568631b | 5 | /** MAIN PROGRAM ROBOT HYBRID SEMI OTOMATIS **/ |
rizqicahyo | 1:33203568631b | 6 | /** **/ |
rizqicahyo | 1:33203568631b | 7 | /** **/ |
rizqicahyo | 1:33203568631b | 8 | /** Created by : **/ |
rizqicahyo | 1:33203568631b | 9 | /** Rizqi Cahyo Yuwono **/ |
rizqicahyo | 1:33203568631b | 10 | /** EL'14 - 13214090 **/ |
rizqicahyo | 1:33203568631b | 11 | /** **/ |
rizqicahyo | 1:33203568631b | 12 | /** Last Update : 19 Desember 2015, 06.10 WIB **/ |
rizqicahyo | 1:33203568631b | 13 | /*********************************************************************************************/ |
rizqicahyo | 1:33203568631b | 14 | |
rizqicahyo | 1:33203568631b | 15 | /*********************************************************************************************/ |
rizqicahyo | 1:33203568631b | 16 | /** FILE HEADER **/ |
rizqicahyo | 1:33203568631b | 17 | /*********************************************************************************************/ |
rizqicahyo | 0:4a1823da357f | 18 | #include "mbed.h" |
rizqicahyo | 0:4a1823da357f | 19 | #include "Motor.h" |
rizqicahyo | 0:4a1823da357f | 20 | #include "NewTextLCD.h" |
rizqicahyo | 0:4a1823da357f | 21 | #include "PS3_USB.h" |
rizqicahyo | 0:4a1823da357f | 22 | #include "PID.h" |
rizqicahyo | 0:4a1823da357f | 23 | |
rizqicahyo | 0:4a1823da357f | 24 | |
rizqicahyo | 1:33203568631b | 25 | /*********************************************************************************************/ |
rizqicahyo | 1:33203568631b | 26 | /** DEKLARASI INPUT OUTPUT **/ |
rizqicahyo | 1:33203568631b | 27 | /*********************************************************************************************/ |
rizqicahyo | 0:4a1823da357f | 28 | // serial pc |
rizqicahyo | 0:4a1823da357f | 29 | Serial pc(USBTX,USBRX); |
rizqicahyo | 0:4a1823da357f | 30 | |
rizqicahyo | 0:4a1823da357f | 31 | // LCD 20x4 |
rizqicahyo | 0:4a1823da357f | 32 | TextLCD lcd(PB_13, PB_14, PB_15, PB_1, PB_2, PB_5, TextLCD::LCD20x4); //rs,e,d4-d7 |
rizqicahyo | 0:4a1823da357f | 33 | |
rizqicahyo | 0:4a1823da357f | 34 | // joystick PS3 |
rizqicahyo | 1:33203568631b | 35 | PS3_USB PS3 (PA_11,PA_12); //(rx,tx) |
rizqicahyo | 0:4a1823da357f | 36 | |
rizqicahyo | 1:33203568631b | 37 | // PID sensor garis |
rizqicahyo | 1:33203568631b | 38 | PID PID(0.532,0.000,0.41,0.001); //(P,I,D, time sampling) |
rizqicahyo | 0:4a1823da357f | 39 | |
rizqicahyo | 0:4a1823da357f | 40 | // Motor |
rizqicahyo | 1:33203568631b | 41 | Motor motor_kiri (PA_15, PA_14, PA_13); //motor1 (pwm, fwd, rev) |
rizqicahyo | 1:33203568631b | 42 | Motor motor_kanan (PA_1, PC_14 ,PC_15); //motor2 (pwm, fwd, rev) |
rizqicahyo | 0:4a1823da357f | 43 | |
rizqicahyo | 1:33203568631b | 44 | // Selektor dan Sensor |
rizqicahyo | 1:33203568631b | 45 | BusOut selektor(PB_0,PA_9,PC_2); //(selektor A, selektor B, selektor C) |
rizqicahyo | 1:33203568631b | 46 | AnalogIn sensorR (PC_0); //ADC1 |
rizqicahyo | 1:33203568631b | 47 | AnalogIn sensorL(PC_3); //ADC2 |
rizqicahyo | 0:4a1823da357f | 48 | |
rizqicahyo | 1:33203568631b | 49 | // Multitasker |
rizqicahyo | 1:33203568631b | 50 | Ticker timer; |
rizqicahyo | 0:4a1823da357f | 51 | |
rizqicahyo | 0:4a1823da357f | 52 | |
rizqicahyo | 1:33203568631b | 53 | /*********************************************************************************************/ |
rizqicahyo | 1:33203568631b | 54 | /** DEKLARASI VARIABEL GLOBAL **/ |
rizqicahyo | 1:33203568631b | 55 | /*********************************************************************************************/ |
rizqicahyo | 1:33203568631b | 56 | float gLimit=0.4; //nilai batas sensor agar dapat membedakan warna putih dengan background |
rizqicahyo | 1:33203568631b | 57 | float gMax_speed=0.5; //nilai maksimum kecepatan motor |
rizqicahyo | 1:33203568631b | 58 | float gMin_speed=-0.05; //nilai minimum kecepatan motor |
rizqicahyo | 1:33203568631b | 59 | |
rizqicahyo | 1:33203568631b | 60 | unsigned char gMode=0; //variabel mode driving (manual = 0 otomatis = 1) |
rizqicahyo | 1:33203568631b | 61 | unsigned char gCase=0; //variabel keadaan proses |
rizqicahyo | 0:4a1823da357f | 62 | |
rizqicahyo | 1:33203568631b | 63 | unsigned char logic_sensor[16]; //variabel logic dari sensor garis |
rizqicahyo | 1:33203568631b | 64 | unsigned char over=0; |
rizqicahyo | 1:33203568631b | 65 | |
rizqicahyo | 1:33203568631b | 66 | unsigned char i; // variabel iterasi |
rizqicahyo | 1:33203568631b | 67 | |
rizqicahyo | 1:33203568631b | 68 | |
rizqicahyo | 1:33203568631b | 69 | |
rizqicahyo | 1:33203568631b | 70 | /*********************************************************************************************/ |
rizqicahyo | 1:33203568631b | 71 | /** DEKLARASI PROSEDUR DAN FUNGSI **/ |
rizqicahyo | 1:33203568631b | 72 | /*********************************************************************************************/ |
rizqicahyo | 1:33203568631b | 73 | float adcSensor(int i) //pembacaan nilai ADC dari sensor garis |
rizqicahyo | 0:4a1823da357f | 74 | { |
rizqicahyo | 1:33203568631b | 75 | if (i < 8) |
rizqicahyo | 0:4a1823da357f | 76 | { |
rizqicahyo | 1:33203568631b | 77 | selektor = 7-i; |
rizqicahyo | 1:33203568631b | 78 | return sensorL.read(); |
rizqicahyo | 0:4a1823da357f | 79 | } |
rizqicahyo | 1:33203568631b | 80 | else |
rizqicahyo | 0:4a1823da357f | 81 | { |
rizqicahyo | 1:33203568631b | 82 | selektor = 15-i; |
rizqicahyo | 1:33203568631b | 83 | return sensorR.read(); |
rizqicahyo | 0:4a1823da357f | 84 | } |
rizqicahyo | 0:4a1823da357f | 85 | } |
rizqicahyo | 0:4a1823da357f | 86 | |
rizqicahyo | 1:33203568631b | 87 | void PIDrunning() //menjalankan perintah untuk line follower |
rizqicahyo | 1:33203568631b | 88 | { |
rizqicahyo | 1:33203568631b | 89 | |
rizqicahyo | 1:33203568631b | 90 | int pv; |
rizqicahyo | 1:33203568631b | 91 | float speedR,speedL; |
rizqicahyo | 0:4a1823da357f | 92 | |
rizqicahyo | 1:33203568631b | 93 | //menentukan logic sensor |
rizqicahyo | 1:33203568631b | 94 | for(i=1;i<16;i++){ |
rizqicahyo | 1:33203568631b | 95 | if(adcSensor(i) <= gLimit) |
rizqicahyo | 1:33203568631b | 96 | logic_sensor[i]=1; |
rizqicahyo | 1:33203568631b | 97 | else |
rizqicahyo | 1:33203568631b | 98 | logic_sensor[i]=0; |
rizqicahyo | 1:33203568631b | 99 | } |
rizqicahyo | 0:4a1823da357f | 100 | |
rizqicahyo | 1:33203568631b | 101 | //////////////////logic dari PV (present Value)///////////////////////// |
rizqicahyo | 0:4a1823da357f | 102 | if(logic_sensor[0]==1){ |
rizqicahyo | 0:4a1823da357f | 103 | pv = -15; |
rizqicahyo | 1:33203568631b | 104 | over=1; |
rizqicahyo | 0:4a1823da357f | 105 | } |
rizqicahyo | 0:4a1823da357f | 106 | else if(logic_sensor[15]==1){ |
rizqicahyo | 0:4a1823da357f | 107 | pv = 15; |
rizqicahyo | 1:33203568631b | 108 | over=2; |
rizqicahyo | 0:4a1823da357f | 109 | } |
rizqicahyo | 0:4a1823da357f | 110 | else if(logic_sensor[1]==1 && logic_sensor[0]==1){ |
rizqicahyo | 0:4a1823da357f | 111 | pv = -14; |
rizqicahyo | 0:4a1823da357f | 112 | } |
rizqicahyo | 0:4a1823da357f | 113 | else if(logic_sensor[14]==1 && logic_sensor[15]==1){ |
rizqicahyo | 0:4a1823da357f | 114 | pv = 14; |
rizqicahyo | 0:4a1823da357f | 115 | } |
rizqicahyo | 0:4a1823da357f | 116 | else if(logic_sensor[1]==1 ){ |
rizqicahyo | 0:4a1823da357f | 117 | pv = -13; |
rizqicahyo | 0:4a1823da357f | 118 | } |
rizqicahyo | 0:4a1823da357f | 119 | else if(logic_sensor[14]==1 ){ |
rizqicahyo | 0:4a1823da357f | 120 | pv = 13; |
rizqicahyo | 0:4a1823da357f | 121 | } |
rizqicahyo | 0:4a1823da357f | 122 | else if(logic_sensor[2]==1 && logic_sensor[1]==1){ |
rizqicahyo | 0:4a1823da357f | 123 | pv = -12; |
rizqicahyo | 0:4a1823da357f | 124 | } |
rizqicahyo | 0:4a1823da357f | 125 | else if(logic_sensor[13]==1 && logic_sensor[14]==1){ |
rizqicahyo | 0:4a1823da357f | 126 | pv = 12; |
rizqicahyo | 0:4a1823da357f | 127 | } |
rizqicahyo | 0:4a1823da357f | 128 | else if(logic_sensor[2]==1 ){ |
rizqicahyo | 0:4a1823da357f | 129 | pv = -11; |
rizqicahyo | 0:4a1823da357f | 130 | } |
rizqicahyo | 0:4a1823da357f | 131 | else if(logic_sensor[13]==1 ){ |
rizqicahyo | 0:4a1823da357f | 132 | pv = 11; |
rizqicahyo | 0:4a1823da357f | 133 | } |
rizqicahyo | 0:4a1823da357f | 134 | else if(logic_sensor[3]==1 && logic_sensor[2]==1){ |
rizqicahyo | 0:4a1823da357f | 135 | pv = -10; |
rizqicahyo | 0:4a1823da357f | 136 | } |
rizqicahyo | 0:4a1823da357f | 137 | else if(logic_sensor[12]==1 && logic_sensor[13]==1){ |
rizqicahyo | 0:4a1823da357f | 138 | pv = 10; |
rizqicahyo | 0:4a1823da357f | 139 | } |
rizqicahyo | 0:4a1823da357f | 140 | else if(logic_sensor[3]==1 ){ |
rizqicahyo | 0:4a1823da357f | 141 | pv = -9; |
rizqicahyo | 0:4a1823da357f | 142 | } |
rizqicahyo | 0:4a1823da357f | 143 | else if(logic_sensor[12]==1 ){ |
rizqicahyo | 0:4a1823da357f | 144 | pv = 9; |
rizqicahyo | 0:4a1823da357f | 145 | } |
rizqicahyo | 0:4a1823da357f | 146 | else if(logic_sensor[4]==1 && logic_sensor[3]==1){ |
rizqicahyo | 0:4a1823da357f | 147 | pv = -8; |
rizqicahyo | 0:4a1823da357f | 148 | } |
rizqicahyo | 0:4a1823da357f | 149 | else if(logic_sensor[11]==1 && logic_sensor[12]==1){ |
rizqicahyo | 0:4a1823da357f | 150 | pv = 8; |
rizqicahyo | 0:4a1823da357f | 151 | } |
rizqicahyo | 0:4a1823da357f | 152 | else if(logic_sensor[4]==1 ){ |
rizqicahyo | 0:4a1823da357f | 153 | pv = -7; |
rizqicahyo | 0:4a1823da357f | 154 | } |
rizqicahyo | 0:4a1823da357f | 155 | else if(logic_sensor[11]==1 ){ |
rizqicahyo | 0:4a1823da357f | 156 | pv = 7; |
rizqicahyo | 0:4a1823da357f | 157 | } |
rizqicahyo | 0:4a1823da357f | 158 | else if(logic_sensor[5]==1 && logic_sensor[4]==1){ |
rizqicahyo | 0:4a1823da357f | 159 | pv = -6; |
rizqicahyo | 0:4a1823da357f | 160 | } |
rizqicahyo | 0:4a1823da357f | 161 | else if(logic_sensor[10]==1 && logic_sensor[11]==1){ |
rizqicahyo | 0:4a1823da357f | 162 | pv = 6; |
rizqicahyo | 0:4a1823da357f | 163 | } |
rizqicahyo | 0:4a1823da357f | 164 | else if(logic_sensor[5]==1 ){ |
rizqicahyo | 0:4a1823da357f | 165 | pv = -5; |
rizqicahyo | 0:4a1823da357f | 166 | } |
rizqicahyo | 0:4a1823da357f | 167 | else if(logic_sensor[10]==1 ){ |
rizqicahyo | 0:4a1823da357f | 168 | pv = 5; |
rizqicahyo | 0:4a1823da357f | 169 | } |
rizqicahyo | 0:4a1823da357f | 170 | else if(logic_sensor[6]==1 && logic_sensor[5]==1){ |
rizqicahyo | 0:4a1823da357f | 171 | pv = -4; |
rizqicahyo | 0:4a1823da357f | 172 | } |
rizqicahyo | 0:4a1823da357f | 173 | else if(logic_sensor[9]==1 && logic_sensor[10]==1){ |
rizqicahyo | 0:4a1823da357f | 174 | pv = 4; |
rizqicahyo | 0:4a1823da357f | 175 | } |
rizqicahyo | 0:4a1823da357f | 176 | else if(logic_sensor[6]==1 ){ |
rizqicahyo | 0:4a1823da357f | 177 | pv = -3; |
rizqicahyo | 0:4a1823da357f | 178 | } |
rizqicahyo | 0:4a1823da357f | 179 | else if(logic_sensor[9]==1 ){ |
rizqicahyo | 0:4a1823da357f | 180 | pv = 3; |
rizqicahyo | 0:4a1823da357f | 181 | } |
rizqicahyo | 0:4a1823da357f | 182 | else if(logic_sensor[7]==1 && logic_sensor[6]==1){ |
rizqicahyo | 0:4a1823da357f | 183 | pv = -2; |
rizqicahyo | 0:4a1823da357f | 184 | } |
rizqicahyo | 0:4a1823da357f | 185 | else if(logic_sensor[8]==1 && logic_sensor[9]==1){ |
rizqicahyo | 0:4a1823da357f | 186 | pv = 2; |
rizqicahyo | 0:4a1823da357f | 187 | } |
rizqicahyo | 0:4a1823da357f | 188 | else if (logic_sensor[7]==1 && logic_sensor[8]==1){ |
rizqicahyo | 0:4a1823da357f | 189 | pv = 0; |
rizqicahyo | 0:4a1823da357f | 190 | } |
rizqicahyo | 0:4a1823da357f | 191 | else if(logic_sensor[7]==1 ){ |
rizqicahyo | 0:4a1823da357f | 192 | pv = -1; |
rizqicahyo | 0:4a1823da357f | 193 | } |
rizqicahyo | 0:4a1823da357f | 194 | else if(logic_sensor[8]==1 ){ |
rizqicahyo | 0:4a1823da357f | 195 | pv = 1; |
rizqicahyo | 1:33203568631b | 196 | } |
rizqicahyo | 1:33203568631b | 197 | ///////////////// robot bergerak keluar dari sensor///////////////////// |
rizqicahyo | 1:33203568631b | 198 | if(over=1){ |
rizqicahyo | 0:4a1823da357f | 199 | /*if(speed_ka > 0){ |
rizqicahyo | 0:4a1823da357f | 200 | wait_ms(10); |
rizqicahyo | 0:4a1823da357f | 201 | motor_kanan.speed(-speed_ka); |
rizqicahyo | 0:4a1823da357f | 202 | wait_ms(10); |
rizqicahyo | 0:4a1823da357f | 203 | } |
rizqicahyo | 0:4a1823da357f | 204 | else{ |
rizqicahyo | 0:4a1823da357f | 205 | motor_kanan.speed(speed_ka); |
rizqicahyo | 0:4a1823da357f | 206 | } |
rizqicahyo | 0:4a1823da357f | 207 | wait_ms(10);*/ |
rizqicahyo | 0:4a1823da357f | 208 | |
rizqicahyo | 1:33203568631b | 209 | motor_kiri.brake(1); |
rizqicahyo | 1:33203568631b | 210 | //wait_ms(100); |
rizqicahyo | 0:4a1823da357f | 211 | |
rizqicahyo | 0:4a1823da357f | 212 | } |
rizqicahyo | 1:33203568631b | 213 | else if(over==2){ |
rizqicahyo | 0:4a1823da357f | 214 | /*if(speed_ki > 0){ |
rizqicahyo | 0:4a1823da357f | 215 | wait_ms(10); |
rizqicahyo | 0:4a1823da357f | 216 | motor_kiri.speed(-speed_ki); |
rizqicahyo | 0:4a1823da357f | 217 | wait_ms(10); |
rizqicahyo | 0:4a1823da357f | 218 | } |
rizqicahyo | 0:4a1823da357f | 219 | else{ |
rizqicahyo | 0:4a1823da357f | 220 | wait_ms(10); |
rizqicahyo | 0:4a1823da357f | 221 | motor_kiri.speed(speed_ki); |
rizqicahyo | 0:4a1823da357f | 222 | wait_ms(10); |
rizqicahyo | 0:4a1823da357f | 223 | } |
rizqicahyo | 0:4a1823da357f | 224 | wait_ms(10);*/ |
rizqicahyo | 1:33203568631b | 225 | motor_kanan.brake(1); |
rizqicahyo | 1:33203568631b | 226 | //wait_ms(100); |
rizqicahyo | 0:4a1823da357f | 227 | } |
rizqicahyo | 0:4a1823da357f | 228 | |
rizqicahyo | 0:4a1823da357f | 229 | PID.setProcessValue(pv); |
rizqicahyo | 0:4a1823da357f | 230 | PID.setSetPoint(0); |
rizqicahyo | 0:4a1823da357f | 231 | |
rizqicahyo | 0:4a1823da357f | 232 | // memulai perhitungan PID |
rizqicahyo | 0:4a1823da357f | 233 | |
rizqicahyo | 1:33203568631b | 234 | speedR = gMax_speed + PID.compute(); |
rizqicahyo | 1:33203568631b | 235 | if(speedR > gMax_speed){ |
rizqicahyo | 1:33203568631b | 236 | speedR = gMax_speed; |
rizqicahyo | 0:4a1823da357f | 237 | } |
rizqicahyo | 1:33203568631b | 238 | else if(speedR < gMin_speed) |
rizqicahyo | 1:33203568631b | 239 | speedR = gMin_speed; |
rizqicahyo | 1:33203568631b | 240 | motor_kanan.speed(speedR); |
rizqicahyo | 0:4a1823da357f | 241 | |
rizqicahyo | 1:33203568631b | 242 | speedL = gMax_speed - PID.compute(); |
rizqicahyo | 1:33203568631b | 243 | if(speedL > gMax_speed) |
rizqicahyo | 1:33203568631b | 244 | speedL = gMax_speed; |
rizqicahyo | 1:33203568631b | 245 | else if(speedL < gMin_speed) |
rizqicahyo | 1:33203568631b | 246 | speedL = gMin_speed; |
rizqicahyo | 1:33203568631b | 247 | motor_kiri.speed(speedL); |
rizqicahyo | 1:33203568631b | 248 | |
rizqicahyo | 1:33203568631b | 249 | over=0; |
rizqicahyo | 0:4a1823da357f | 250 | } |
rizqicahyo | 0:4a1823da357f | 251 | |
rizqicahyo | 1:33203568631b | 252 | void showLCD() //menampilkan user interface pada LCD |
rizqicahyo | 1:33203568631b | 253 | { |
rizqicahyo | 1:33203568631b | 254 | lcd.cls(); |
rizqicahyo | 1:33203568631b | 255 | lcd.locate(5,0); |
rizqicahyo | 1:33203568631b | 256 | lcd.printf("GarudaGo !!"); |
rizqicahyo | 1:33203568631b | 257 | |
rizqicahyo | 1:33203568631b | 258 | switch(gCase) |
rizqicahyo | 0:4a1823da357f | 259 | { |
rizqicahyo | 1:33203568631b | 260 | case 0 : |
rizqicahyo | 1:33203568631b | 261 | { |
rizqicahyo | 1:33203568631b | 262 | lcd.locate(1,1); |
rizqicahyo | 1:33203568631b | 263 | lcd.printf("Kalibrasi = %.4f",gLimit); |
rizqicahyo | 1:33203568631b | 264 | break; |
rizqicahyo | 1:33203568631b | 265 | } |
rizqicahyo | 1:33203568631b | 266 | case 1 : |
rizqicahyo | 1:33203568631b | 267 | { |
rizqicahyo | 1:33203568631b | 268 | if (gMode == 1) |
rizqicahyo | 1:33203568631b | 269 | { |
rizqicahyo | 1:33203568631b | 270 | lcd.locate(3,1); |
rizqicahyo | 1:33203568631b | 271 | lcd.printf("Mode = Otomatis"); |
rizqicahyo | 1:33203568631b | 272 | } |
rizqicahyo | 1:33203568631b | 273 | else if (gMode==0) |
rizqicahyo | 1:33203568631b | 274 | { |
rizqicahyo | 1:33203568631b | 275 | lcd.locate(3,1); |
rizqicahyo | 1:33203568631b | 276 | lcd.printf("Mode = Manual"); |
rizqicahyo | 1:33203568631b | 277 | } |
rizqicahyo | 1:33203568631b | 278 | break; |
rizqicahyo | 1:33203568631b | 279 | } |
rizqicahyo | 1:33203568631b | 280 | } |
rizqicahyo | 1:33203568631b | 281 | |
rizqicahyo | 1:33203568631b | 282 | for(i=0;i<16;i++){ |
rizqicahyo | 1:33203568631b | 283 | if(adcSensor(i) <= gLimit) |
rizqicahyo | 1:33203568631b | 284 | logic_sensor[i]=1; |
rizqicahyo | 1:33203568631b | 285 | else |
rizqicahyo | 1:33203568631b | 286 | logic_sensor[i]=0; |
rizqicahyo | 0:4a1823da357f | 287 | lcd.locate(i+2,3); |
rizqicahyo | 0:4a1823da357f | 288 | lcd.printf("%d",logic_sensor[i]); |
rizqicahyo | 0:4a1823da357f | 289 | } |
rizqicahyo | 0:4a1823da357f | 290 | } |
rizqicahyo | 0:4a1823da357f | 291 | |
rizqicahyo | 1:33203568631b | 292 | void running() //prosedur utama untuk kendali robot |
rizqicahyo | 0:4a1823da357f | 293 | { |
rizqicahyo | 2:23fe981b6ef7 | 294 | float speed=gMax_speed; |
rizqicahyo | 2:23fe981b6ef7 | 295 | float k=1; |
rizqicahyo | 1:33203568631b | 296 | |
rizqicahyo | 1:33203568631b | 297 | switch(gCase) |
rizqicahyo | 0:4a1823da357f | 298 | { |
rizqicahyo | 1:33203568631b | 299 | case 0 : |
rizqicahyo | 0:4a1823da357f | 300 | { |
rizqicahyo | 1:33203568631b | 301 | motor_kiri.brake(0); |
rizqicahyo | 1:33203568631b | 302 | motor_kanan.brake(0); |
rizqicahyo | 1:33203568631b | 303 | |
rizqicahyo | 1:33203568631b | 304 | if(PS3.L2 == 0 && PS3.R2==255 && !PS3.R1 && !PS3.L1) |
rizqicahyo | 1:33203568631b | 305 | gLimit += 0.00001; |
rizqicahyo | 1:33203568631b | 306 | else if (PS3.L2 == 255 && PS3.R2==0 && !PS3.R1 && !PS3.L1) |
rizqicahyo | 1:33203568631b | 307 | gLimit -= 0.00001; |
rizqicahyo | 1:33203568631b | 308 | else if(PS3.L2 == 0 && PS3.R2==0 && PS3.R1 && !PS3.L1) |
rizqicahyo | 1:33203568631b | 309 | gLimit += 0.0005; |
rizqicahyo | 1:33203568631b | 310 | if(PS3.L2 == 0 && PS3.R2==0 && !PS3.R1 && PS3.L1) |
rizqicahyo | 1:33203568631b | 311 | gLimit -= 0.0005; |
rizqicahyo | 1:33203568631b | 312 | |
rizqicahyo | 1:33203568631b | 313 | if (gLimit > 1.0) |
rizqicahyo | 1:33203568631b | 314 | gLimit = 1.0; |
rizqicahyo | 1:33203568631b | 315 | else if(gLimit < 0) |
rizqicahyo | 1:33203568631b | 316 | gLimit = 0.0; |
rizqicahyo | 1:33203568631b | 317 | |
rizqicahyo | 1:33203568631b | 318 | if(PS3.START && PS3.L2 == 0 && PS3.R2 == 0 && !PS3.R1 && !PS3.L1) |
rizqicahyo | 1:33203568631b | 319 | gCase++; |
rizqicahyo | 1:33203568631b | 320 | |
rizqicahyo | 1:33203568631b | 321 | break; |
rizqicahyo | 0:4a1823da357f | 322 | } |
rizqicahyo | 1:33203568631b | 323 | case 1 : |
rizqicahyo | 1:33203568631b | 324 | { |
rizqicahyo | 1:33203568631b | 325 | if (gMode == 1) |
rizqicahyo | 1:33203568631b | 326 | { |
rizqicahyo | 1:33203568631b | 327 | if (PS3.silang) |
rizqicahyo | 1:33203568631b | 328 | { |
rizqicahyo | 1:33203568631b | 329 | PIDrunning(); |
rizqicahyo | 1:33203568631b | 330 | pc.printf("PID \t %f \t ",PID.compute()); |
rizqicahyo | 1:33203568631b | 331 | |
rizqicahyo | 1:33203568631b | 332 | for(i=0;i<16;i++) |
rizqicahyo | 1:33203568631b | 333 | { |
rizqicahyo | 1:33203568631b | 334 | pc.printf("%d ",logic_sensor[i]); |
rizqicahyo | 1:33203568631b | 335 | } |
rizqicahyo | 1:33203568631b | 336 | pc.printf("\n"); |
rizqicahyo | 1:33203568631b | 337 | } |
rizqicahyo | 2:23fe981b6ef7 | 338 | else if(!PS3.silang) |
rizqicahyo | 1:33203568631b | 339 | { |
rizqicahyo | 2:23fe981b6ef7 | 340 | motor_kiri.brake(0); |
rizqicahyo | 2:23fe981b6ef7 | 341 | motor_kanan.brake(0); |
rizqicahyo | 1:33203568631b | 342 | pc.printf("PID stop \n"); |
rizqicahyo | 1:33203568631b | 343 | } |
rizqicahyo | 1:33203568631b | 344 | } |
rizqicahyo | 1:33203568631b | 345 | else if (gMode == 0) |
rizqicahyo | 1:33203568631b | 346 | { |
rizqicahyo | 1:33203568631b | 347 | if (PS3.atas && !PS3.bawah && !PS3.L1 && !PS3.R1) //maju |
rizqicahyo | 1:33203568631b | 348 | { |
rizqicahyo | 1:33203568631b | 349 | if (speed < 0.1) |
rizqicahyo | 1:33203568631b | 350 | speed = 0.1; |
rizqicahyo | 1:33203568631b | 351 | else |
rizqicahyo | 1:33203568631b | 352 | speed += 0.005; |
rizqicahyo | 1:33203568631b | 353 | |
rizqicahyo | 1:33203568631b | 354 | if (speed >= gMax_speed) |
rizqicahyo | 1:33203568631b | 355 | speed = gMax_speed; |
rizqicahyo | 1:33203568631b | 356 | |
rizqicahyo | 1:33203568631b | 357 | motor_kiri.speed(speed*k); |
rizqicahyo | 1:33203568631b | 358 | motor_kanan.speed(speed*k); |
rizqicahyo | 1:33203568631b | 359 | pc.printf("maju \n"); |
rizqicahyo | 1:33203568631b | 360 | } |
rizqicahyo | 1:33203568631b | 361 | else if (!PS3.atas && PS3.bawah && !PS3.L1 && !PS3.R1) //mundur |
rizqicahyo | 1:33203568631b | 362 | { |
rizqicahyo | 1:33203568631b | 363 | if (speed < 0.1) |
rizqicahyo | 1:33203568631b | 364 | speed = 0.1; |
rizqicahyo | 1:33203568631b | 365 | else |
rizqicahyo | 1:33203568631b | 366 | speed += 0.005; |
rizqicahyo | 1:33203568631b | 367 | |
rizqicahyo | 1:33203568631b | 368 | if (speed >= gMax_speed) |
rizqicahyo | 1:33203568631b | 369 | speed = gMax_speed; |
rizqicahyo | 1:33203568631b | 370 | |
rizqicahyo | 1:33203568631b | 371 | motor_kiri.speed(-speed*k); |
rizqicahyo | 1:33203568631b | 372 | motor_kanan.speed(-speed*k); |
rizqicahyo | 1:33203568631b | 373 | pc.printf("mundur \n"); |
rizqicahyo | 1:33203568631b | 374 | } |
rizqicahyo | 1:33203568631b | 375 | else if (!PS3.atas && !PS3.bawah && PS3.L1 && !PS3.R1) //pivot kiri |
rizqicahyo | 1:33203568631b | 376 | { |
rizqicahyo | 1:33203568631b | 377 | if (speed < 0.1) |
rizqicahyo | 1:33203568631b | 378 | speed = 0.1; |
rizqicahyo | 1:33203568631b | 379 | else |
rizqicahyo | 1:33203568631b | 380 | speed += 0.005; |
rizqicahyo | 1:33203568631b | 381 | |
rizqicahyo | 1:33203568631b | 382 | if (speed >= gMax_speed) |
rizqicahyo | 1:33203568631b | 383 | speed = gMax_speed; |
rizqicahyo | 1:33203568631b | 384 | |
rizqicahyo | 1:33203568631b | 385 | motor_kiri.speed(-speed*k*0.7); |
rizqicahyo | 1:33203568631b | 386 | motor_kanan.speed(speed*k*0.7); |
rizqicahyo | 1:33203568631b | 387 | pc.printf("piv kiri \n"); |
rizqicahyo | 1:33203568631b | 388 | } |
rizqicahyo | 1:33203568631b | 389 | else if (!PS3.atas && !PS3.bawah && !PS3.L1 && PS3.R1) //pivot kanan |
rizqicahyo | 1:33203568631b | 390 | { |
rizqicahyo | 1:33203568631b | 391 | if (speed < 0.1) |
rizqicahyo | 1:33203568631b | 392 | speed = 0.1; |
rizqicahyo | 1:33203568631b | 393 | else |
rizqicahyo | 1:33203568631b | 394 | speed += 0.005; |
rizqicahyo | 1:33203568631b | 395 | |
rizqicahyo | 1:33203568631b | 396 | if (speed >= gMax_speed) |
rizqicahyo | 1:33203568631b | 397 | speed = gMax_speed; |
rizqicahyo | 1:33203568631b | 398 | |
rizqicahyo | 1:33203568631b | 399 | motor_kiri.speed(speed*k*0.7); |
rizqicahyo | 1:33203568631b | 400 | motor_kanan.speed(-speed*k*0.7); |
rizqicahyo | 1:33203568631b | 401 | pc.printf("piv kanan \n"); |
rizqicahyo | 1:33203568631b | 402 | } |
rizqicahyo | 2:23fe981b6ef7 | 403 | else if (!PS3.atas && !PS3.bawah && !PS3.L1 && !PS3.R1) |
rizqicahyo | 1:33203568631b | 404 | { |
rizqicahyo | 2:23fe981b6ef7 | 405 | motor_kiri.brake(0); |
rizqicahyo | 2:23fe981b6ef7 | 406 | motor_kanan.brake(0); |
rizqicahyo | 1:33203568631b | 407 | pc.printf("stop \n"); |
rizqicahyo | 1:33203568631b | 408 | } |
rizqicahyo | 1:33203568631b | 409 | |
rizqicahyo | 2:23fe981b6ef7 | 410 | /*if(PS3.L2 == 255 && PS3.R2 == 0) |
rizqicahyo | 1:33203568631b | 411 | k=0.5; |
rizqicahyo | 1:33203568631b | 412 | else if (PS3.L2 == 0 && PS3.R2 == 255) |
rizqicahyo | 1:33203568631b | 413 | k=2; |
rizqicahyo | 1:33203568631b | 414 | else |
rizqicahyo | 2:23fe981b6ef7 | 415 | k=1;*/ |
rizqicahyo | 1:33203568631b | 416 | } |
rizqicahyo | 1:33203568631b | 417 | else |
rizqicahyo | 1:33203568631b | 418 | { |
rizqicahyo | 1:33203568631b | 419 | motor_kiri.brake(1); |
rizqicahyo | 1:33203568631b | 420 | motor_kanan.brake(1); |
rizqicahyo | 1:33203568631b | 421 | pc.printf("no PID no MANUAL \n"); |
rizqicahyo | 1:33203568631b | 422 | } |
rizqicahyo | 1:33203568631b | 423 | |
rizqicahyo | 1:33203568631b | 424 | if(PS3.SELECT && !PS3.START) |
rizqicahyo | 1:33203568631b | 425 | { |
rizqicahyo | 1:33203568631b | 426 | if (gMode==1) |
rizqicahyo | 1:33203568631b | 427 | gMode=0; |
rizqicahyo | 1:33203568631b | 428 | else |
rizqicahyo | 1:33203568631b | 429 | gMode=1; |
rizqicahyo | 1:33203568631b | 430 | } |
rizqicahyo | 1:33203568631b | 431 | |
rizqicahyo | 1:33203568631b | 432 | if(PS3.START && !PS3.SELECT) |
rizqicahyo | 1:33203568631b | 433 | gCase--; |
rizqicahyo | 1:33203568631b | 434 | |
rizqicahyo | 1:33203568631b | 435 | break; |
rizqicahyo | 1:33203568631b | 436 | } |
rizqicahyo | 0:4a1823da357f | 437 | } |
rizqicahyo | 0:4a1823da357f | 438 | } |
rizqicahyo | 0:4a1823da357f | 439 | |
rizqicahyo | 1:33203568631b | 440 | |
rizqicahyo | 1:33203568631b | 441 | /*********************************************************************************************/ |
rizqicahyo | 1:33203568631b | 442 | /*********************************************************************************************/ |
rizqicahyo | 1:33203568631b | 443 | /** PROGRAM UTAMA **/ |
rizqicahyo | 1:33203568631b | 444 | /*********************************************************************************************/ |
rizqicahyo | 1:33203568631b | 445 | /*********************************************************************************************/ |
rizqicahyo | 0:4a1823da357f | 446 | int main(void){ |
rizqicahyo | 1:33203568631b | 447 | //inisialisasi joystick |
rizqicahyo | 0:4a1823da357f | 448 | PS3.setup(); |
rizqicahyo | 1:33203568631b | 449 | |
rizqicahyo | 1:33203568631b | 450 | //inisialisasi PID |
rizqicahyo | 0:4a1823da357f | 451 | PID.setInputLimits(-15,15); |
rizqicahyo | 0:4a1823da357f | 452 | PID.setOutputLimits(-1.0,1.0); |
rizqicahyo | 0:4a1823da357f | 453 | PID.setMode(1.0); |
rizqicahyo | 0:4a1823da357f | 454 | PID.setBias(0.0); |
rizqicahyo | 0:4a1823da357f | 455 | PID.reset(); |
rizqicahyo | 1:33203568631b | 456 | |
rizqicahyo | 0:4a1823da357f | 457 | // serial PC |
rizqicahyo | 0:4a1823da357f | 458 | pc.baud(115200); |
rizqicahyo | 1:33203568631b | 459 | |
rizqicahyo | 1:33203568631b | 460 | //multitasking untuk menampilkan layar |
rizqicahyo | 2:23fe981b6ef7 | 461 | timer.attach(&showLCD,1); |
rizqicahyo | 1:33203568631b | 462 | |
rizqicahyo | 1:33203568631b | 463 | while(1){ |
rizqicahyo | 1:33203568631b | 464 | PS3.idle(); |
rizqicahyo | 0:4a1823da357f | 465 | |
rizqicahyo | 0:4a1823da357f | 466 | if(PS3.readable()) |
rizqicahyo | 0:4a1823da357f | 467 | { |
rizqicahyo | 0:4a1823da357f | 468 | // Panggil fungsi pembacaan joystik |
rizqicahyo | 0:4a1823da357f | 469 | PS3.baca_data(); |
rizqicahyo | 0:4a1823da357f | 470 | // Panggil fungsi pengolahan data joystik |
rizqicahyo | 0:4a1823da357f | 471 | PS3.olah_data(); |
rizqicahyo | 0:4a1823da357f | 472 | //pc.printf("%2x %2x %2x %2x %3d %3d %3d %3d %3d %3d\n\r",PS3.button, PS3.RL, PS3.button_click, PS3.RL_click, PS3.R2, PS3.L2, PS3.RX, PS3.RY, PS3.LX, PS3.LY); |
rizqicahyo | 1:33203568631b | 473 | running(); |
rizqicahyo | 0:4a1823da357f | 474 | } |
rizqicahyo | 0:4a1823da357f | 475 | else |
rizqicahyo | 0:4a1823da357f | 476 | { |
rizqicahyo | 0:4a1823da357f | 477 | PS3.idle(); |
rizqicahyo | 0:4a1823da357f | 478 | } |
rizqicahyo | 0:4a1823da357f | 479 | } |
rizqicahyo | 0:4a1823da357f | 480 | } |