Dependencies:   PID Serialservo TCS3200 XQ_servo encoder encoder2 mbed moter

Fork of nhk_2018_undercarry_test09 by ケンタ ミヤザキ

Committer:
kenken0721
Date:
Sun Apr 01 11:58:23 2018 +0000
Revision:
6:ff7fd6556a81
Parent:
5:c5a2a5cf600d
Child:
7:f1a924244b76

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenken0721 0:f6828b914b1c 1 #include "mbed.h"
kenken0721 0:f6828b914b1c 2 #include "config.h"
kenken0721 0:f6828b914b1c 3 #include "moter.h"
kenken0721 0:f6828b914b1c 4 #include "PID.h"
kenken0721 1:f4dbd6b9cc27 5 #include "encoder.h"
kenken0721 4:eabb7a738ff8 6 #include "encoder2.h"
kenken0721 4:eabb7a738ff8 7 #include "Serialservo.h"
kenken0721 4:eabb7a738ff8 8 #include "XQ_servo.h"
kenken0721 0:f6828b914b1c 9
kenken0721 0:f6828b914b1c 10 Serial pc(USBTX, USBRX);
kenken0721 0:f6828b914b1c 11 Serial kbtpc(PC_12 ,PD_2);//serial5
kenken0721 0:f6828b914b1c 12 I2C master(sda, scl);
kenken0721 4:eabb7a738ff8 13 DigitalOut led2(LED2);//チェック用
kenken0721 0:f6828b914b1c 14 PID S_pid(SP, SI, SD, 0.0);
kenken0721 2:c5996dd62e9c 15 PID R_pid(RP, RI, RD, 0.0);
kenken0721 2:c5996dd62e9c 16 PID L_pid(LP, LI, LD, 0.0);
kenken0721 4:eabb7a738ff8 17
kenken0721 2:c5996dd62e9c 18 Encoder Enc_Carry_Y(PA_15,PA_14,PC_1);
kenken0721 2:c5996dd62e9c 19 Encoder Enc_Carry_X(PA_4,PB_0,PB_7);
kenken0721 4:eabb7a738ff8 20 Encoder2 Enc_Arm(PF_1,PA_0,PA_1);
kenken0721 4:eabb7a738ff8 21
kenken0721 3:aaa2fde4fafd 22 DigitalOut buzzer(PA_10);
kenken0721 3:aaa2fde4fafd 23 DigitalOut lamp(PC_3);
kenken0721 3:aaa2fde4fafd 24 Timer timer;
kenken0721 4:eabb7a738ff8 25 Serialservo servo1(PC_10, PC_11);//アームの肘
kenken0721 4:eabb7a738ff8 26 Serialservo servo2(PC_10, PC_11);//回転軸
kenken0721 4:eabb7a738ff8 27 XQ_servo servo_hand(PB_5);
kenken0721 6:ff7fd6556a81 28 DigitalOut throwing_relay(PC_9);
kenken0721 4:eabb7a738ff8 29 DigitalIn distance(PC_2);
kenken0721 4:eabb7a738ff8 30 DigitalIn redIn(PC_4);
kenken0721 4:eabb7a738ff8 31 DigitalIn blueIn(PB_2);
kenken0721 4:eabb7a738ff8 32 DigitalIn micro_switch(PC_0);
kenken0721 4:eabb7a738ff8 33 DigitalOut air(PB_4);
kenken0721 4:eabb7a738ff8 34
kenken0721 5:c5a2a5cf600d 35 DigitalOut motor_dir1(PA_8);
kenken0721 4:eabb7a738ff8 36 DigitalOut motor_dir2(PA_9);
kenken0721 4:eabb7a738ff8 37 PwmOut motor_pwm(PB_3);
kenken0721 4:eabb7a738ff8 38
kenken0721 0:f6828b914b1c 39 PwmOut pwm_pins[] = {
kenken0721 0:f6828b914b1c 40 PwmOut( PC_8 ),
kenken0721 0:f6828b914b1c 41 PwmOut( PC_6 ),
kenken0721 0:f6828b914b1c 42 PwmOut( PB_14 ),
kenken0721 0:f6828b914b1c 43 PwmOut( PB_13 )
kenken0721 0:f6828b914b1c 44 };
kenken0721 0:f6828b914b1c 45
kenken0721 0:f6828b914b1c 46 DigitalOut dir_pins_1[] = {
kenken0721 0:f6828b914b1c 47 DigitalOut( PC_5 ),
kenken0721 0:f6828b914b1c 48 DigitalOut( PA_7 ),
kenken0721 2:c5996dd62e9c 49 DigitalOut( PB_6 ),
kenken0721 2:c5996dd62e9c 50 DigitalOut( PB_1)
kenken0721 0:f6828b914b1c 51 };
kenken0721 0:f6828b914b1c 52
kenken0721 0:f6828b914b1c 53 DigitalOut dir_pins_2[] = {
kenken0721 0:f6828b914b1c 54 DigitalOut( PB_12 ),
kenken0721 0:f6828b914b1c 55 DigitalOut( PA_6 ),
kenken0721 2:c5996dd62e9c 56 DigitalOut( PC_7 ),
kenken0721 2:c5996dd62e9c 57 DigitalOut( PB_15)
kenken0721 0:f6828b914b1c 58 };
kenken0721 0:f6828b914b1c 59
kenken0721 6:ff7fd6556a81 60
kenken0721 6:ff7fd6556a81 61 void linecheck(char *buff ,int data[2]);
kenken0721 6:ff7fd6556a81 62 void LineCheck(int dmode);
kenken0721 6:ff7fd6556a81 63 void syokikanomai(void);
kenken0721 6:ff7fd6556a81 64 void syokikanomai2(void);
kenken0721 6:ff7fd6556a81 65 void touteki(float armpower, int pos, bool thro_mode);
kenken0721 6:ff7fd6556a81 66
kenken0721 2:c5996dd62e9c 67 int crosscount = 0;
kenken0721 0:f6828b914b1c 68 bool mode = true;//trueでラジコン、falseでオート
kenken0721 0:f6828b914b1c 69 bool stopflag = true;//trueで機体停止
kenken0721 0:f6828b914b1c 70 double power = POWER;
kenken0721 2:c5996dd62e9c 71 double rpower = POWER;
kenken0721 2:c5996dd62e9c 72 double lpower = POWER;
kenken0721 0:f6828b914b1c 73 int kbtread = 0;
kenken0721 0:f6828b914b1c 74 int count = 0;
kenken0721 0:f6828b914b1c 75 int counter = 0;
kenken0721 2:c5996dd62e9c 76 int linedata_1[2] = {0};
kenken0721 2:c5996dd62e9c 77 int linedata_2[2] = {0};
kenken0721 2:c5996dd62e9c 78 int linedata_3[2] = {0};
kenken0721 0:f6828b914b1c 79 int prelinedata = 0;
kenken0721 0:f6828b914b1c 80 double output = 0.0;
kenken0721 1:f4dbd6b9cc27 81 char buff1[2];
kenken0721 1:f4dbd6b9cc27 82 char buff2[2];
kenken0721 1:f4dbd6b9cc27 83 char buff3[2];
kenken0721 1:f4dbd6b9cc27 84 float x_dist = 0.0;
kenken0721 1:f4dbd6b9cc27 85 float y_dist = 0.0;
kenken0721 2:c5996dd62e9c 86 float tar_x_dist = 0.0;
kenken0721 2:c5996dd62e9c 87 float tar_y_dist = 0.0;
kenken0721 2:c5996dd62e9c 88 bool ontheline = false;
kenken0721 2:c5996dd62e9c 89 int directmode = STRAIGHT;
kenken0721 3:aaa2fde4fafd 90 int state = START;
kenken0721 3:aaa2fde4fafd 91 int times = 0;
kenken0721 4:eabb7a738ff8 92 int redcount = 0;
kenken0721 4:eabb7a738ff8 93 int bluecount = 0;
kenken0721 4:eabb7a738ff8 94 int yellowcount = 0;
kenken0721 4:eabb7a738ff8 95 bool syokika_flag=false;
kenken0721 4:eabb7a738ff8 96 bool set_flag = false;
kenken0721 4:eabb7a738ff8 97 int encoder_count = 1000;
kenken0721 4:eabb7a738ff8 98
kenken0721 3:aaa2fde4fafd 99 int main() {
kenken0721 3:aaa2fde4fafd 100 timer.reset();
kenken0721 3:aaa2fde4fafd 101 timer.stop();
kenken0721 6:ff7fd6556a81 102 throwing_relay=0;
kenken0721 4:eabb7a738ff8 103 lamp=1;
kenken0721 4:eabb7a738ff8 104 air=1.0;
kenken0721 4:eabb7a738ff8 105 buzzer = 0.0;
kenken0721 4:eabb7a738ff8 106 micro_switch.mode(PullUp);
kenken0721 4:eabb7a738ff8 107 motor_pwm=0;
kenken0721 6:ff7fd6556a81 108 motor_dir1=1;
kenken0721 4:eabb7a738ff8 109 motor_dir2=1;
kenken0721 6:ff7fd6556a81 110 servo1.init(0);//アーム
kenken0721 6:ff7fd6556a81 111 servo2.init(1);//回転軸
kenken0721 1:f4dbd6b9cc27 112 S_pid.init();
kenken0721 3:aaa2fde4fafd 113 R_pid.init();
kenken0721 3:aaa2fde4fafd 114 L_pid.init();
kenken0721 1:f4dbd6b9cc27 115 pwm_pins[0].period(0.00005);
kenken0721 1:f4dbd6b9cc27 116 pwm_pins[1].period(0.00005);
kenken0721 1:f4dbd6b9cc27 117 pwm_pins[2].period(0.00005);
kenken0721 1:f4dbd6b9cc27 118 pwm_pins[3].period(0.00005);
kenken0721 4:eabb7a738ff8 119 motor_pwm.period(0.00005);
kenken0721 6:ff7fd6556a81 120 //------通信スピード----------------------------------------------
kenken0721 3:aaa2fde4fafd 121 pc.baud(115200);
kenken0721 2:c5996dd62e9c 122 kbtpc.baud(9600);
kenken0721 2:c5996dd62e9c 123 master.frequency(100000);
kenken0721 6:ff7fd6556a81 124 lamp = 1.0;
kenken0721 6:ff7fd6556a81 125 //-------初期化-------------------------------------------------
kenken0721 4:eabb7a738ff8 126 syokikanomai();
kenken0721 4:eabb7a738ff8 127 buzzer = 0;
kenken0721 6:ff7fd6556a81 128 //-----------メインループ----------------------------------------
kenken0721 1:f4dbd6b9cc27 129 while (true) {
kenken0721 4:eabb7a738ff8 130 master.read(addr1,buff1,2);
kenken0721 4:eabb7a738ff8 131 linecheck(buff1,linedata_1);
kenken0721 4:eabb7a738ff8 132 master.read(addr2,buff2,2);
kenken0721 4:eabb7a738ff8 133 linecheck(buff2,linedata_2);
kenken0721 4:eabb7a738ff8 134 master.read(addr3,buff3,2);
kenken0721 4:eabb7a738ff8 135 linecheck(buff3,linedata_3);
kenken0721 2:c5996dd62e9c 136 x_dist = Enc_Carry_X.read_rotate();
kenken0721 2:c5996dd62e9c 137 y_dist = Enc_Carry_Y.read_rotate();
kenken0721 3:aaa2fde4fafd 138 kbtpc.putc(state);
kenken0721 1:f4dbd6b9cc27 139 if(kbtpc.readable()){
kenken0721 1:f4dbd6b9cc27 140 kbtread = kbtpc.getc();
kenken0721 1:f4dbd6b9cc27 141 }
kenken0721 1:f4dbd6b9cc27 142 if(kbtread == 255){
kenken0721 1:f4dbd6b9cc27 143 mode = true;
kenken0721 1:f4dbd6b9cc27 144 }else if(kbtread == 150){
kenken0721 1:f4dbd6b9cc27 145 mode = false;
kenken0721 1:f4dbd6b9cc27 146 }else if(kbtread == 100){
kenken0721 1:f4dbd6b9cc27 147 stopflag = true;
kenken0721 1:f4dbd6b9cc27 148 }else if(kbtread == 200){
kenken0721 1:f4dbd6b9cc27 149 stopflag = false;
kenken0721 2:c5996dd62e9c 150 }else if(kbtread == STRAIGHT){
kenken0721 2:c5996dd62e9c 151 directmode = STRAIGHT;
kenken0721 2:c5996dd62e9c 152 }else if(kbtread == RIGHT){
kenken0721 2:c5996dd62e9c 153 directmode = RIGHT;
kenken0721 2:c5996dd62e9c 154 }else if(kbtread == LEFT){
kenken0721 2:c5996dd62e9c 155 directmode = LEFT;
kenken0721 3:aaa2fde4fafd 156 }else if(kbtread == START){
kenken0721 3:aaa2fde4fafd 157 state = START;
kenken0721 1:f4dbd6b9cc27 158 }
kenken0721 1:f4dbd6b9cc27 159 //--------------手動--------------------------------------
kenken0721 1:f4dbd6b9cc27 160 if(mode == true){
kenken0721 1:f4dbd6b9cc27 161 led2 = 1.0;
kenken0721 2:c5996dd62e9c 162 if(kbtread == STRAIGHT){
kenken0721 1:f4dbd6b9cc27 163 Straight(power, power, pwm_pins, dir_pins_1, dir_pins_2);
kenken0721 2:c5996dd62e9c 164 }else if(kbtread == BACK){
kenken0721 1:f4dbd6b9cc27 165 Back(power, power, pwm_pins, dir_pins_1, dir_pins_2);
kenken0721 2:c5996dd62e9c 166 }else if(kbtread == RIGHT){
kenken0721 1:f4dbd6b9cc27 167 Right(power, power, pwm_pins, dir_pins_1, dir_pins_2);
kenken0721 2:c5996dd62e9c 168 }else if(kbtread == LEFT){
kenken0721 1:f4dbd6b9cc27 169 Left(power, power, pwm_pins, dir_pins_1, dir_pins_2);
kenken0721 1:f4dbd6b9cc27 170 }else{
kenken0721 1:f4dbd6b9cc27 171 Stop(pwm_pins, dir_pins_1, dir_pins_2);
kenken0721 1:f4dbd6b9cc27 172 }
kenken0721 1:f4dbd6b9cc27 173 //--------------自動---------------------------------
kenken0721 1:f4dbd6b9cc27 174 }else if(mode == false){
kenken0721 1:f4dbd6b9cc27 175 led2 = 0.0;
kenken0721 1:f4dbd6b9cc27 176 if(stopflag == true){
kenken0721 1:f4dbd6b9cc27 177 Stop(pwm_pins, dir_pins_1, dir_pins_2);
kenken0721 1:f4dbd6b9cc27 178 }else{
kenken0721 2:c5996dd62e9c 179 LineCheck(directmode);
kenken0721 3:aaa2fde4fafd 180 switch(state){
kenken0721 4:eabb7a738ff8 181 //------------------初期位置から待機位置1------------------------------------------
kenken0721 3:aaa2fde4fafd 182 case START:
kenken0721 3:aaa2fde4fafd 183 if(crosscount == 0){
kenken0721 3:aaa2fde4fafd 184 directmode = STRAIGHT;
kenken0721 6:ff7fd6556a81 185 }else if(crosscount == 1){
kenken0721 6:ff7fd6556a81 186 if(directmode == STRAIGHT){
kenken0721 6:ff7fd6556a81 187 directmode = LEFT;
kenken0721 6:ff7fd6556a81 188 prelinedata = 0;
kenken0721 6:ff7fd6556a81 189 }else if(directmode == LEFT){
kenken0721 6:ff7fd6556a81 190 directmode = LEFT;
kenken0721 6:ff7fd6556a81 191 }
kenken0721 3:aaa2fde4fafd 192 }else if(crosscount == 2){
kenken0721 3:aaa2fde4fafd 193 directmode = STOP;
kenken0721 3:aaa2fde4fafd 194 state = STAND_BY_1;
kenken0721 3:aaa2fde4fafd 195 crosscount = 0;
kenken0721 3:aaa2fde4fafd 196 prelinedata = 0;
kenken0721 3:aaa2fde4fafd 197 }
kenken0721 3:aaa2fde4fafd 198 break;
kenken0721 4:eabb7a738ff8 199 //------------------待機位置1----------------------------------------------------
kenken0721 3:aaa2fde4fafd 200 case STAND_BY_1:
kenken0721 3:aaa2fde4fafd 201 crosscount = 0;
kenken0721 3:aaa2fde4fafd 202 directmode = STOP;
kenken0721 4:eabb7a738ff8 203 if(distance == 1.0){
kenken0721 4:eabb7a738ff8 204 if(redIn == 1.0){
kenken0721 4:eabb7a738ff8 205 buzzer = 1.0;
kenken0721 4:eabb7a738ff8 206 redcount++;
kenken0721 4:eabb7a738ff8 207 }else if(blueIn == 1.0){
kenken0721 4:eabb7a738ff8 208 buzzer = 1.0;
kenken0721 4:eabb7a738ff8 209 bluecount++;
kenken0721 4:eabb7a738ff8 210 }else{
kenken0721 4:eabb7a738ff8 211 buzzer = 0.0;
kenken0721 4:eabb7a738ff8 212 }
kenken0721 4:eabb7a738ff8 213 if(redcount >= 100 ){
kenken0721 4:eabb7a738ff8 214 servo_hand.move(hand_tsukami_degree);
kenken0721 4:eabb7a738ff8 215 servo1.move(hiji_tsukami_degree);
kenken0721 6:ff7fd6556a81 216 servo1.move(hiji_tsukami_degree);
kenken0721 4:eabb7a738ff8 217 }else if(bluecount >= 100){
kenken0721 4:eabb7a738ff8 218 servo_hand.move(hand_tsukami_degree);
kenken0721 4:eabb7a738ff8 219 servo1.move(hiji_tsukami_degree);
kenken0721 6:ff7fd6556a81 220 servo1.move(hiji_tsukami_degree);
kenken0721 4:eabb7a738ff8 221 }
kenken0721 4:eabb7a738ff8 222 }else if(distance == 0.0 && redcount >= 100){
kenken0721 4:eabb7a738ff8 223 servo2.move(koshi_nage_degree);
kenken0721 6:ff7fd6556a81 224 servo2.move(koshi_nage_degree);
kenken0721 3:aaa2fde4fafd 225 state = RED_RECEIVE;
kenken0721 4:eabb7a738ff8 226 directmode = STOP;
kenken0721 4:eabb7a738ff8 227 redcount = 0;
kenken0721 4:eabb7a738ff8 228 crosscount = 0;
kenken0721 4:eabb7a738ff8 229 }else if(distance == 0.0 && bluecount >= 100){
kenken0721 4:eabb7a738ff8 230 state = BLUE_RECEIVE_1;
kenken0721 4:eabb7a738ff8 231 directmode = STOP;
kenken0721 4:eabb7a738ff8 232 bluecount = 0;
kenken0721 4:eabb7a738ff8 233 crosscount = 0;
kenken0721 4:eabb7a738ff8 234 }
kenken0721 3:aaa2fde4fafd 235 break;
kenken0721 4:eabb7a738ff8 236 //------------------待機位置1から投てき位置1----------------------------------------
kenken0721 3:aaa2fde4fafd 237 case RED_RECEIVE:
kenken0721 3:aaa2fde4fafd 238 if(crosscount == 0){
kenken0721 3:aaa2fde4fafd 239 directmode = LEFT;
kenken0721 4:eabb7a738ff8 240 }else if(crosscount == 1){
kenken0721 3:aaa2fde4fafd 241 directmode = STOP;
kenken0721 3:aaa2fde4fafd 242 prelinedata = 0;
kenken0721 4:eabb7a738ff8 243 touteki(0.8,190,0);
kenken0721 4:eabb7a738ff8 244 if(set_flag == false){
kenken0721 3:aaa2fde4fafd 245 directmode = RIGHT;
kenken0721 3:aaa2fde4fafd 246 }
kenken0721 3:aaa2fde4fafd 247 }else if(crosscount == 2){
kenken0721 3:aaa2fde4fafd 248 directmode = STOP;
kenken0721 4:eabb7a738ff8 249 syokikanomai2();
kenken0721 4:eabb7a738ff8 250 if(set_flag == true){
kenken0721 4:eabb7a738ff8 251 state = STAND_BY_1;
kenken0721 4:eabb7a738ff8 252 crosscount = 0;
kenken0721 4:eabb7a738ff8 253 }
kenken0721 3:aaa2fde4fafd 254 }
kenken0721 3:aaa2fde4fafd 255 break;
kenken0721 4:eabb7a738ff8 256 //------------------待機位置1から投てき位置2----------------------------------------
kenken0721 3:aaa2fde4fafd 257 case BLUE_RECEIVE_1:
kenken0721 3:aaa2fde4fafd 258 if(crosscount == 0){
kenken0721 3:aaa2fde4fafd 259 directmode = RIGHT;
kenken0721 3:aaa2fde4fafd 260 }else if(crosscount == 1){
kenken0721 3:aaa2fde4fafd 261 directmode = STRAIGHT;
kenken0721 3:aaa2fde4fafd 262 }else if(crosscount == 2){
kenken0721 3:aaa2fde4fafd 263 directmode = LEFT;
kenken0721 3:aaa2fde4fafd 264 }else if(crosscount == 3){
kenken0721 3:aaa2fde4fafd 265 directmode = STOP;
kenken0721 3:aaa2fde4fafd 266 prelinedata = 0;
kenken0721 4:eabb7a738ff8 267 state = BLUE_RECEIVE_2;
kenken0721 3:aaa2fde4fafd 268 crosscount = 0;
kenken0721 3:aaa2fde4fafd 269 }
kenken0721 3:aaa2fde4fafd 270 break;
kenken0721 4:eabb7a738ff8 271 //------------------待機位置2----------------------------------------------------
kenken0721 3:aaa2fde4fafd 272 case STAND_BY_2:
kenken0721 3:aaa2fde4fafd 273 crosscount = 0;
kenken0721 4:eabb7a738ff8 274 directmode = STOP;
kenken0721 4:eabb7a738ff8 275 if(distance == 1.0){
kenken0721 4:eabb7a738ff8 276 if(blueIn == 1.0){
kenken0721 4:eabb7a738ff8 277 buzzer = 1.0;
kenken0721 4:eabb7a738ff8 278 bluecount++;
kenken0721 4:eabb7a738ff8 279 }else if(micro_switch == 1.0){
kenken0721 4:eabb7a738ff8 280 buzzer = 1.0;
kenken0721 4:eabb7a738ff8 281 yellowcount++;
kenken0721 4:eabb7a738ff8 282 }else{
kenken0721 4:eabb7a738ff8 283 buzzer = 0.0;
kenken0721 4:eabb7a738ff8 284 }
kenken0721 5:c5a2a5cf600d 285 if(bluecount >= 100){
kenken0721 5:c5a2a5cf600d 286 servo_hand.move(hand_tsukami_degree);
kenken0721 5:c5a2a5cf600d 287 servo1.move(hiji_tsukami_degree);
kenken0721 6:ff7fd6556a81 288 servo1.move(hiji_tsukami_degree);
kenken0721 4:eabb7a738ff8 289 }else if(yellowcount >= 500){
kenken0721 5:c5a2a5cf600d 290 air = 0.0;
kenken0721 4:eabb7a738ff8 291 }
kenken0721 5:c5a2a5cf600d 292 }else if(distance == 0.0 && bluecount >= 100){
kenken0721 5:c5a2a5cf600d 293 servo2.move(koshi_nage_degree);
kenken0721 6:ff7fd6556a81 294 servo2.move(koshi_nage_degree);
kenken0721 4:eabb7a738ff8 295 state = BLUE_RECEIVE_2;
kenken0721 4:eabb7a738ff8 296 directmode = STOP;
kenken0721 4:eabb7a738ff8 297 bluecount = 0;
kenken0721 4:eabb7a738ff8 298 crosscount = 0;
kenken0721 4:eabb7a738ff8 299 }
kenken0721 3:aaa2fde4fafd 300 break;
kenken0721 4:eabb7a738ff8 301 //------------------投てき位置2---------------------------------------------------
kenken0721 3:aaa2fde4fafd 302 case BLUE_RECEIVE_2:
kenken0721 3:aaa2fde4fafd 303 if(crosscount == 0){
kenken0721 3:aaa2fde4fafd 304 directmode = LEFT;
kenken0721 3:aaa2fde4fafd 305 }else if(crosscount == 1){
kenken0721 5:c5a2a5cf600d 306 directmode = STOP;
kenken0721 5:c5a2a5cf600d 307 prelinedata = 0;
kenken0721 5:c5a2a5cf600d 308 touteki(1.0,190,1);
kenken0721 5:c5a2a5cf600d 309 if(set_flag == false){
kenken0721 5:c5a2a5cf600d 310 directmode = RIGHT;
kenken0721 3:aaa2fde4fafd 311 }
kenken0721 3:aaa2fde4fafd 312 }else if(crosscount == 2){
kenken0721 3:aaa2fde4fafd 313 directmode = STOP;
kenken0721 5:c5a2a5cf600d 314 syokikanomai2();
kenken0721 5:c5a2a5cf600d 315 if(set_flag == true){
kenken0721 5:c5a2a5cf600d 316 state = STAND_BY_2;
kenken0721 5:c5a2a5cf600d 317 crosscount = 0;
kenken0721 5:c5a2a5cf600d 318 }
kenken0721 5:c5a2a5cf600d 319 }
kenken0721 3:aaa2fde4fafd 320 break;
kenken0721 4:eabb7a738ff8 321 //------------------投てき位置3---------------------------------------------------
kenken0721 3:aaa2fde4fafd 322 case YELLOW_RECEIVE:
kenken0721 3:aaa2fde4fafd 323 if(crosscount != 4){
kenken0721 3:aaa2fde4fafd 324 directmode = LEFT;
kenken0721 3:aaa2fde4fafd 325 }else{
kenken0721 3:aaa2fde4fafd 326 directmode = STOP;
kenken0721 3:aaa2fde4fafd 327 }
kenken0721 3:aaa2fde4fafd 328 break;
kenken0721 3:aaa2fde4fafd 329 default:
kenken0721 3:aaa2fde4fafd 330 break;
kenken0721 3:aaa2fde4fafd 331 }
kenken0721 4:eabb7a738ff8 332 //--------------進行方向---------------------------------------------------------
kenken0721 3:aaa2fde4fafd 333 switch(directmode){
kenken0721 2:c5996dd62e9c 334 case STOP:
kenken0721 2:c5996dd62e9c 335 Stop(pwm_pins, dir_pins_1, dir_pins_2);
kenken0721 2:c5996dd62e9c 336 break;
kenken0721 2:c5996dd62e9c 337 case STRAIGHT:
kenken0721 2:c5996dd62e9c 338 output = S_pid.compute((double)linedata_1[0]);
kenken0721 2:c5996dd62e9c 339 if(output >= 0){
kenken0721 2:c5996dd62e9c 340 rpower = power;
kenken0721 2:c5996dd62e9c 341 lpower = power + output;
kenken0721 2:c5996dd62e9c 342 Straight(rpower, lpower, pwm_pins, dir_pins_1, dir_pins_2);
kenken0721 2:c5996dd62e9c 343 }else {
kenken0721 2:c5996dd62e9c 344 rpower = power + (-1 * output);
kenken0721 2:c5996dd62e9c 345 lpower = power;
kenken0721 2:c5996dd62e9c 346 Straight(rpower, lpower, pwm_pins, dir_pins_1, dir_pins_2);
kenken0721 2:c5996dd62e9c 347 }
kenken0721 2:c5996dd62e9c 348 break;
kenken0721 2:c5996dd62e9c 349 case RIGHT:
kenken0721 2:c5996dd62e9c 350 output = R_pid.compute((double)linedata_2[0]);
kenken0721 1:f4dbd6b9cc27 351 if(output >= 0){
kenken0721 2:c5996dd62e9c 352 rpower = power;
kenken0721 2:c5996dd62e9c 353 lpower = power + output;
kenken0721 2:c5996dd62e9c 354 Right(rpower, lpower, pwm_pins, dir_pins_1, dir_pins_2);
kenken0721 1:f4dbd6b9cc27 355 }else {
kenken0721 2:c5996dd62e9c 356 rpower = power + (-1 * output);
kenken0721 2:c5996dd62e9c 357 lpower = power;
kenken0721 2:c5996dd62e9c 358 Right(rpower, lpower, pwm_pins, dir_pins_1, dir_pins_2);
kenken0721 2:c5996dd62e9c 359 }
kenken0721 2:c5996dd62e9c 360 break;
kenken0721 2:c5996dd62e9c 361 case LEFT:
kenken0721 2:c5996dd62e9c 362 output = L_pid.compute((double)linedata_3[0]);
kenken0721 2:c5996dd62e9c 363 if(output >= 0){
kenken0721 2:c5996dd62e9c 364 rpower = power;
kenken0721 2:c5996dd62e9c 365 lpower = power + output;
kenken0721 3:aaa2fde4fafd 366 Left(rpower, lpower, pwm_pins, dir_pins_1, dir_pins_2);
kenken0721 2:c5996dd62e9c 367 }else {
kenken0721 2:c5996dd62e9c 368 rpower = power + (-1 * output);
kenken0721 2:c5996dd62e9c 369 lpower = power;
kenken0721 2:c5996dd62e9c 370 Left(rpower, lpower, pwm_pins, dir_pins_1, dir_pins_2);
kenken0721 2:c5996dd62e9c 371 }
kenken0721 2:c5996dd62e9c 372 break;
kenken0721 2:c5996dd62e9c 373 default:
kenken0721 2:c5996dd62e9c 374 break;
kenken0721 1:f4dbd6b9cc27 375 }
kenken0721 1:f4dbd6b9cc27 376 }
kenken0721 1:f4dbd6b9cc27 377 }
kenken0721 3:aaa2fde4fafd 378 //pc.printf("kbtread = %d \r" ,kbtread);
kenken0721 2:c5996dd62e9c 379 //pc.printf("buff1[0] = %d \r" ,buff1[0]);
kenken0721 2:c5996dd62e9c 380 //pc.printf("buff2[0] = %d \r" ,buff2[0]);
kenken0721 2:c5996dd62e9c 381 //pc.printf("line1 = %d \r" ,linedata_1[0]);
kenken0721 3:aaa2fde4fafd 382 //pc.printf("line2 = %d \r" ,linedata_3[1]);
kenken0721 4:eabb7a738ff8 383 pc.printf("xdist = %f \r",x_dist);
kenken0721 3:aaa2fde4fafd 384 //pc.printf("tar_xdist = %f \r",tar_x_dist);
kenken0721 3:aaa2fde4fafd 385 //pc.printf("ontheline = %d \r",ontheline);
kenken0721 3:aaa2fde4fafd 386
kenken0721 4:eabb7a738ff8 387 pc.printf("ydist = %f \r",y_dist);
kenken0721 2:c5996dd62e9c 388 //pc.printf("tary = %f \r",tar_y_dist);
kenken0721 2:c5996dd62e9c 389 //pc.printf("stopflag = %d \r",stopflag);
kenken0721 2:c5996dd62e9c 390 //pc.printf("cross = %d \r",crosscount);
kenken0721 1:f4dbd6b9cc27 391 //pc.printf("buff[1] = %d" ,buff1[1]);
kenken0721 2:c5996dd62e9c 392 //pc.printf("line = %d" ,line);
kenken0721 2:c5996dd62e9c 393 //pc.printf("rpower = %lf" ,rpower);
kenken0721 3:aaa2fde4fafd 394 //pc.printf("lpower = %lf" ,lpower);
kenken0721 4:eabb7a738ff8 395 //pc.printf("dicmode = %d \r",directmode);
kenken0721 1:f4dbd6b9cc27 396 pc.printf("output = %lf \n" ,output);
kenken0721 1:f4dbd6b9cc27 397 }
kenken0721 1:f4dbd6b9cc27 398 }
kenken0721 1:f4dbd6b9cc27 399
kenken0721 4:eabb7a738ff8 400 //---------------初期化---------------------------
kenken0721 4:eabb7a738ff8 401 void syokikanomai(void){
kenken0721 4:eabb7a738ff8 402 syokika_flag = false;
kenken0721 4:eabb7a738ff8 403 while (set_flag==false) {
kenken0721 4:eabb7a738ff8 404 encoder_count= Enc_Arm.read_rotate();
kenken0721 4:eabb7a738ff8 405 servo_hand.move(hand_uke_degree);
kenken0721 4:eabb7a738ff8 406 servo1.move(hiji_nage_degree);//退避
kenken0721 4:eabb7a738ff8 407 servo2.move(koshi_uke_degree);
kenken0721 6:ff7fd6556a81 408 servo1.move(hiji_nage_degree);//退避
kenken0721 6:ff7fd6556a81 409 servo2.move(koshi_uke_degree);
kenken0721 4:eabb7a738ff8 410 motor_dir1=0;
kenken0721 4:eabb7a738ff8 411 motor_dir2=1;
kenken0721 4:eabb7a738ff8 412 motor_pwm=0.15;
kenken0721 4:eabb7a738ff8 413 if(Enc_Arm.read_z() == 1) {
kenken0721 4:eabb7a738ff8 414 syokika_flag=true;
kenken0721 4:eabb7a738ff8 415 buzzer = 1.0;
kenken0721 4:eabb7a738ff8 416 }
kenken0721 4:eabb7a738ff8 417
kenken0721 4:eabb7a738ff8 418 if (syokika_flag==true) {
kenken0721 4:eabb7a738ff8 419 if(encoder_count == 170) {
kenken0721 4:eabb7a738ff8 420 motor_pwm=0;
kenken0721 4:eabb7a738ff8 421 motor_dir1=1;
kenken0721 4:eabb7a738ff8 422 motor_dir2=1;
kenken0721 4:eabb7a738ff8 423 set_flag=true; //投てき後,falseにする.
kenken0721 4:eabb7a738ff8 424 }
kenken0721 4:eabb7a738ff8 425 }
kenken0721 4:eabb7a738ff8 426 }
kenken0721 4:eabb7a738ff8 427 servo1.move(hiji_uke_degree);
kenken0721 4:eabb7a738ff8 428 servo1.move(hiji_uke_degree);
kenken0721 4:eabb7a738ff8 429 }
kenken0721 4:eabb7a738ff8 430
kenken0721 4:eabb7a738ff8 431 void syokikanomai2(void){
kenken0721 4:eabb7a738ff8 432 if(set_flag==false) {
kenken0721 4:eabb7a738ff8 433 encoder_count= Enc_Arm.read_rotate();
kenken0721 4:eabb7a738ff8 434 servo_hand.move(hand_uke_degree);
kenken0721 4:eabb7a738ff8 435 servo1.move(hiji_nage_degree);//退避
kenken0721 4:eabb7a738ff8 436 servo2.move(koshi_uke_degree);
kenken0721 6:ff7fd6556a81 437 servo1.move(hiji_nage_degree);//退避
kenken0721 6:ff7fd6556a81 438 servo2.move(koshi_uke_degree);
kenken0721 4:eabb7a738ff8 439 motor_dir1=0;
kenken0721 4:eabb7a738ff8 440 motor_dir2=1;
kenken0721 4:eabb7a738ff8 441 motor_pwm=0.15;
kenken0721 4:eabb7a738ff8 442 if(Enc_Arm.read_z() == 1) {
kenken0721 4:eabb7a738ff8 443 syokika_flag = true;
kenken0721 4:eabb7a738ff8 444 buzzer = 1.0;
kenken0721 4:eabb7a738ff8 445 }
kenken0721 4:eabb7a738ff8 446 if (syokika_flag==true) {
kenken0721 4:eabb7a738ff8 447 if(encoder_count == 170) {
kenken0721 4:eabb7a738ff8 448 motor_pwm=0;
kenken0721 4:eabb7a738ff8 449 motor_dir1=1;
kenken0721 4:eabb7a738ff8 450 motor_dir2=1;
kenken0721 4:eabb7a738ff8 451 servo1.move(hiji_uke_degree);
kenken0721 4:eabb7a738ff8 452 servo1.move(hiji_uke_degree);
kenken0721 4:eabb7a738ff8 453 set_flag = true; //投てき後,falseにする.
kenken0721 4:eabb7a738ff8 454 }
kenken0721 4:eabb7a738ff8 455 }
kenken0721 4:eabb7a738ff8 456 }
kenken0721 4:eabb7a738ff8 457 }
kenken0721 4:eabb7a738ff8 458
kenken0721 6:ff7fd6556a81 459 void touteki(float armpower ,int pos, bool throwing_mode){
kenken0721 4:eabb7a738ff8 460 if(set_flag == true){
kenken0721 4:eabb7a738ff8 461 timer.start();
kenken0721 4:eabb7a738ff8 462 }
kenken0721 4:eabb7a738ff8 463 int times = timer.read();
kenken0721 4:eabb7a738ff8 464 if(times >= 1.0 && times < 2.0){
kenken0721 4:eabb7a738ff8 465 servo_hand.move(hand_uke_degree);
kenken0721 6:ff7fd6556a81 466 }
kenken0721 4:eabb7a738ff8 467 if(times >= 2.0 && times < 3.0){
kenken0721 4:eabb7a738ff8 468 servo1.move(hiji_nage_degree);
kenken0721 4:eabb7a738ff8 469 }
kenken0721 4:eabb7a738ff8 470 if(times >= 3.0 && times < 5.0){
kenken0721 4:eabb7a738ff8 471 lamp = 0.0;
kenken0721 4:eabb7a738ff8 472 while(Enc_Arm.read_rotate() < pos) {
kenken0721 4:eabb7a738ff8 473 motor_dir1 = 0;
kenken0721 4:eabb7a738ff8 474 motor_dir2 = 1;
kenken0721 4:eabb7a738ff8 475 motor_pwm = 0.15;
kenken0721 4:eabb7a738ff8 476 }
kenken0721 4:eabb7a738ff8 477 }
kenken0721 4:eabb7a738ff8 478 motor_dir1=1;
kenken0721 4:eabb7a738ff8 479 motor_dir2=1;
kenken0721 4:eabb7a738ff8 480 motor_pwm=0;
kenken0721 4:eabb7a738ff8 481 //----投てき-------------------------
kenken0721 6:ff7fd6556a81 482 if(throwing_mode == 0.0){
kenken0721 5:c5a2a5cf600d 483 if(times >= 5.0 && times < 6.0){
kenken0721 5:c5a2a5cf600d 484 motor_dir1 = 0;
kenken0721 5:c5a2a5cf600d 485 motor_dir2 = 1;
kenken0721 5:c5a2a5cf600d 486 motor_pwm = armpower;
kenken0721 5:c5a2a5cf600d 487 }
kenken0721 6:ff7fd6556a81 488 }else if(throwing_mode == 1.0){
kenken0721 5:c5a2a5cf600d 489 if(times >= 5.0 && times < 5.5){
kenken0721 6:ff7fd6556a81 490 throwing_relay = 1.0;
kenken0721 5:c5a2a5cf600d 491 }else{
kenken0721 6:ff7fd6556a81 492 throwing_relay = 0.0;
kenken0721 5:c5a2a5cf600d 493 }
kenken0721 4:eabb7a738ff8 494 }
kenken0721 4:eabb7a738ff8 495 if(times >= 6.0 && times <7.0){
kenken0721 4:eabb7a738ff8 496 motor_pwm = 0.0;
kenken0721 4:eabb7a738ff8 497 motor_dir1 = 0;
kenken0721 4:eabb7a738ff8 498 motor_dir2 = 0;
kenken0721 4:eabb7a738ff8 499 buzzer = 0;
kenken0721 4:eabb7a738ff8 500 lamp = 1.0;
kenken0721 4:eabb7a738ff8 501 set_flag = false;
kenken0721 4:eabb7a738ff8 502 timer.reset();
kenken0721 4:eabb7a738ff8 503 timer.stop();
kenken0721 4:eabb7a738ff8 504 }
kenken0721 4:eabb7a738ff8 505 }
kenken0721 4:eabb7a738ff8 506
kenken0721 2:c5996dd62e9c 507 void LineCheck(int dmode){
kenken0721 2:c5996dd62e9c 508 if(dmode == STRAIGHT){
kenken0721 2:c5996dd62e9c 509 if(linedata_1[1] == 1){
kenken0721 2:c5996dd62e9c 510 ontheline = true;
kenken0721 2:c5996dd62e9c 511 tar_y_dist = y_dist;
kenken0721 2:c5996dd62e9c 512 }
kenken0721 2:c5996dd62e9c 513 if(ontheline == true){
kenken0721 3:aaa2fde4fafd 514 if((y_dist - tar_y_dist) >= Y_STOP_DIST){
kenken0721 2:c5996dd62e9c 515 ontheline = false;
kenken0721 2:c5996dd62e9c 516 crosscount++;
kenken0721 2:c5996dd62e9c 517 }
kenken0721 2:c5996dd62e9c 518 }
kenken0721 2:c5996dd62e9c 519 }else if(dmode == RIGHT){
kenken0721 3:aaa2fde4fafd 520 if(linedata_2[1] == 1){
kenken0721 3:aaa2fde4fafd 521 ontheline = true;
kenken0721 3:aaa2fde4fafd 522 tar_x_dist = x_dist;
kenken0721 3:aaa2fde4fafd 523 }
kenken0721 2:c5996dd62e9c 524 if(ontheline == true){
kenken0721 3:aaa2fde4fafd 525 if((x_dist - tar_x_dist) >= X_STOP_DIST){
kenken0721 2:c5996dd62e9c 526 ontheline = false;
kenken0721 2:c5996dd62e9c 527 crosscount++;
kenken0721 2:c5996dd62e9c 528 }
kenken0721 2:c5996dd62e9c 529 }
kenken0721 2:c5996dd62e9c 530 }else if(dmode == LEFT){
kenken0721 3:aaa2fde4fafd 531 if(linedata_3[1] == 1){
kenken0721 3:aaa2fde4fafd 532 ontheline = true;
kenken0721 3:aaa2fde4fafd 533 tar_x_dist = x_dist;
kenken0721 3:aaa2fde4fafd 534 }
kenken0721 2:c5996dd62e9c 535 if(ontheline == true){
kenken0721 3:aaa2fde4fafd 536 if((tar_x_dist - x_dist) >= X_STOP_DIST){
kenken0721 2:c5996dd62e9c 537 ontheline = false;
kenken0721 2:c5996dd62e9c 538 crosscount++;
kenken0721 2:c5996dd62e9c 539 }
kenken0721 2:c5996dd62e9c 540 }
kenken0721 2:c5996dd62e9c 541 }
kenken0721 2:c5996dd62e9c 542 }
kenken0721 0:f6828b914b1c 543
kenken0721 2:c5996dd62e9c 544 void linecheck(char *buff, int data[2]){
kenken0721 0:f6828b914b1c 545 if(buff[0] == 24){
kenken0721 2:c5996dd62e9c 546 data[0] = 0;
kenken0721 2:c5996dd62e9c 547 data[1] = 0;
kenken0721 0:f6828b914b1c 548 }else if(buff[0] == 56){
kenken0721 2:c5996dd62e9c 549 data[0] = 1;
kenken0721 2:c5996dd62e9c 550 data[1] = 0;
kenken0721 0:f6828b914b1c 551 }else if(buff[0] == 48){
kenken0721 2:c5996dd62e9c 552 data[0] = 2;
kenken0721 2:c5996dd62e9c 553 data[1] = 0;
kenken0721 0:f6828b914b1c 554 }else if(buff[0] == 112){
kenken0721 2:c5996dd62e9c 555 data[0] = 3;
kenken0721 2:c5996dd62e9c 556 data[1] = 0;
kenken0721 0:f6828b914b1c 557 }else if(buff[0] == 96){
kenken0721 2:c5996dd62e9c 558 data[0] = 4;
kenken0721 2:c5996dd62e9c 559 data[1] = 0;
kenken0721 0:f6828b914b1c 560 }else if(buff[0] == 224){
kenken0721 2:c5996dd62e9c 561 data[0] = 5;
kenken0721 2:c5996dd62e9c 562 data[1] = 0;
kenken0721 0:f6828b914b1c 563 }else if(buff[0] == 192){
kenken0721 2:c5996dd62e9c 564 data[0] = 6;
kenken0721 2:c5996dd62e9c 565 data[1] = 0;
kenken0721 0:f6828b914b1c 566 }else if(buff[0] == 128){
kenken0721 2:c5996dd62e9c 567 data[0] = 7;
kenken0721 2:c5996dd62e9c 568 data[1] = 0;
kenken0721 0:f6828b914b1c 569 }else if(buff[0] == 28){
kenken0721 2:c5996dd62e9c 570 data[0] = -1;
kenken0721 2:c5996dd62e9c 571 data[1] = 0;
kenken0721 0:f6828b914b1c 572 }else if(buff[0] == 12){
kenken0721 2:c5996dd62e9c 573 data[0] = -2;
kenken0721 2:c5996dd62e9c 574 data[1] = 0;
kenken0721 0:f6828b914b1c 575 }else if(buff[0] == 14){
kenken0721 2:c5996dd62e9c 576 data[0] = -3;
kenken0721 2:c5996dd62e9c 577 data[1] = 0;
kenken0721 0:f6828b914b1c 578 }else if(buff[0] == 6){
kenken0721 2:c5996dd62e9c 579 data[0] = -4;
kenken0721 2:c5996dd62e9c 580 data[1] = 0;
kenken0721 0:f6828b914b1c 581 }else if(buff[0] == 7){
kenken0721 2:c5996dd62e9c 582 data[0] = -5;
kenken0721 2:c5996dd62e9c 583 data[1] = 0;
kenken0721 0:f6828b914b1c 584 }else if(buff[0] == 3){
kenken0721 2:c5996dd62e9c 585 data[0] = -6;
kenken0721 2:c5996dd62e9c 586 data[1] = 0;
kenken0721 0:f6828b914b1c 587 }else if(buff[0] == 1){
kenken0721 2:c5996dd62e9c 588 data[0] = -7;
kenken0721 2:c5996dd62e9c 589 data[1] = 0;
kenken0721 2:c5996dd62e9c 590 }else if(buff[0] == 255){
kenken0721 2:c5996dd62e9c 591 data[0] = prelinedata;
kenken0721 2:c5996dd62e9c 592 data[1] = 1;
kenken0721 2:c5996dd62e9c 593 }else if(buff[0] == 0){
kenken0721 2:c5996dd62e9c 594 data[0] = prelinedata;
kenken0721 2:c5996dd62e9c 595 data[1] = 0;
kenken0721 0:f6828b914b1c 596 }else{
kenken0721 2:c5996dd62e9c 597 data[0] = prelinedata;
kenken0721 2:c5996dd62e9c 598 data[1] = 0;
kenken0721 0:f6828b914b1c 599 }
kenken0721 2:c5996dd62e9c 600 prelinedata = data[0];
kenken0721 3:aaa2fde4fafd 601 }