yuto kawamura
/
MR2_n_1_class
l
main.cpp@0:111abd91b0cb, 2018-12-14 (annotated)
- Committer:
- eri
- Date:
- Fri Dec 14 10:49:59 2018 +0000
- Revision:
- 0:111abd91b0cb
- Child:
- 1:3ae63be5592b
a;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
eri | 0:111abd91b0cb | 1 | #include "mbed.h" |
eri | 0:111abd91b0cb | 2 | #include "EC.h" |
eri | 0:111abd91b0cb | 3 | #include "KondoServo.h" |
eri | 0:111abd91b0cb | 4 | #include "hcsr04.h" |
eri | 0:111abd91b0cb | 5 | |
eri | 0:111abd91b0cb | 6 | Serial pc(USBTX,USBRX); |
eri | 0:111abd91b0cb | 7 | Timer timer; |
eri | 0:111abd91b0cb | 8 | |
eri | 0:111abd91b0cb | 9 | //パラメタ |
eri | 0:111abd91b0cb | 10 | double dutylimit = 0.6; // duty出力の上限値 |
eri | 0:111abd91b0cb | 11 | int resolution = 1000; //エンコーダの分解能×逓倍 |
eri | 0:111abd91b0cb | 12 | int ecgear = 35; //エンコーダのギアの歯数 |
eri | 0:111abd91b0cb | 13 | double Kp = 0.342000; //P値 |
eri | 0:111abd91b0cb | 14 | double Ki = 0.013062; //I値 |
eri | 0:111abd91b0cb | 15 | double Kd = 0.003266; //D値 |
eri | 0:111abd91b0cb | 16 | double leg_wait_time = 0.3; //脚の伸縮にかかる時間 |
eri | 0:111abd91b0cb | 17 | double turn_wait_time = 1.5; //旋回にかかる時間 |
eri | 0:111abd91b0cb | 18 | double target_max = 690; //直動機構の目標座標の上限(オーバーシュートを考慮して短めに設定) |
eri | 0:111abd91b0cb | 19 | double target_min = 20; //直動機構の目標座標の下限(オーバーシュートを考慮して短めに設定) |
eri | 0:111abd91b0cb | 20 | double rail_len = 710; |
eri | 0:111abd91b0cb | 21 | double turn_error=10; //旋回の際のY脚のずれの許容誤差 |
eri | 0:111abd91b0cb | 22 | double servo_iniposi=105; //サーボ初期角度 |
eri | 0:111abd91b0cb | 23 | |
eri | 0:111abd91b0cb | 24 | double target_plot[][2]={ //(mode,target) mode 0→standby 1→straight 2→turn 3→sand dune 4→tussock 5→wait_shagai 6→mountain~finish |
eri | 0:111abd91b0cb | 25 | {0,0}, |
eri | 0:111abd91b0cb | 26 | {1,3450}, |
eri | 0:111abd91b0cb | 27 | {2,-45}, |
eri | 0:111abd91b0cb | 28 | {3,0}, |
eri | 0:111abd91b0cb | 29 | {2,-45}, |
eri | 0:111abd91b0cb | 30 | {1,1030}, |
eri | 0:111abd91b0cb | 31 | {2,90}, |
eri | 0:111abd91b0cb | 32 | {1,2390}, |
eri | 0:111abd91b0cb | 33 | {2,90}, |
eri | 0:111abd91b0cb | 34 | {5,0}, |
eri | 0:111abd91b0cb | 35 | {6,0} |
eri | 0:111abd91b0cb | 36 | }; |
eri | 0:111abd91b0cb | 37 | |
eri | 0:111abd91b0cb | 38 | |
eri | 0:111abd91b0cb | 39 | |
eri | 0:111abd91b0cb | 40 | //定数 |
eri | 0:111abd91b0cb | 41 | #define Pi 3.14159265359 //円周率π |
eri | 0:111abd91b0cb | 42 | |
eri | 0:111abd91b0cb | 43 | //変数 |
eri | 0:111abd91b0cb | 44 | double linear_posi=0; //直線移動での距離 1プロットごとにリセットする? |
eri | 0:111abd91b0cb | 45 | int target_num=0; //現在の目標プロット |
eri | 0:111abd91b0cb | 46 | |
eri | 0:111abd91b0cb | 47 | |
eri | 0:111abd91b0cb | 48 | |
eri | 0:111abd91b0cb | 49 | //ピン宣言 |
eri | 0:111abd91b0cb | 50 | PwmOut motor_f(p21); //モータ正転 |
eri | 0:111abd91b0cb | 51 | PwmOut motor_b(p22); //モータ逆転 |
eri | 0:111abd91b0cb | 52 | DigitalIn switch_max(p9); //直動機構の上限のリミットスイッチ |
eri | 0:111abd91b0cb | 53 | DigitalIn switch_min(p8); //直動機構の下限のリミットスイッチ |
eri | 0:111abd91b0cb | 54 | DigitalIn switch_x(p7); //X脚の接地を判定するスイッチ(今後実装予定) |
eri | 0:111abd91b0cb | 55 | DigitalIn switch_y(p5); //Y脚の接地を判定するスイッチ(今後実装予定) |
eri | 0:111abd91b0cb | 56 | DigitalIn switch_hand(p6); //ゲルゲ回収アームのスイッチ |
eri | 0:111abd91b0cb | 57 | DigitalOut air_x(p18); //X脚の伸縮 |
eri | 0:111abd91b0cb | 58 | DigitalOut air_y(p17); //Y脚の伸縮 |
eri | 0:111abd91b0cb | 59 | DigitalOut air_x_sub(p14); //X脚の先端の伸縮(今後実装予定) |
eri | 0:111abd91b0cb | 60 | DigitalOut air_y_sub(p16); //Y脚の先端の伸縮(今後実装予定) |
eri | 0:111abd91b0cb | 61 | DigitalOut air_hand(p19); //ゲルゲ回収アームのハンド部開閉 |
eri | 0:111abd91b0cb | 62 | DigitalOut air_trig(p20); //ゲルゲ持ち上げ機構のロック解除 |
eri | 0:111abd91b0cb | 63 | Ec ec(p24,p23,NC,resolution,0.01); //直動機構のエンコーダ |
eri | 0:111abd91b0cb | 64 | KondoServo servo(p28,p27,1,115200); //旋回用のシリアルサーボ |
eri | 0:111abd91b0cb | 65 | HCSR04 sensor(p30, p29); |
eri | 0:111abd91b0cb | 66 | |
eri | 0:111abd91b0cb | 67 | |
eri | 0:111abd91b0cb | 68 | |
eri | 0:111abd91b0cb | 69 | void setup(); |
eri | 0:111abd91b0cb | 70 | void out(double);//モーターの出力 |
eri | 0:111abd91b0cb | 71 | void move(double,double); //PID (移動先の座標(機体内)[mm],許容誤差の絶対値[mm]) |
eri | 0:111abd91b0cb | 72 | void up_x(); |
eri | 0:111abd91b0cb | 73 | void down_x(); |
eri | 0:111abd91b0cb | 74 | void up_y(); |
eri | 0:111abd91b0cb | 75 | void down_y(); |
eri | 0:111abd91b0cb | 76 | void move_x (double,double);//X脚を移動 |
eri | 0:111abd91b0cb | 77 | void move_y (double,double);//Y脚を移動 |
eri | 0:111abd91b0cb | 78 | void reset(); //脚位置の初期化 |
eri | 0:111abd91b0cb | 79 | void turn(double); //旋回動作 |
eri | 0:111abd91b0cb | 80 | void straight(double); //目的地まで直進 |
eri | 0:111abd91b0cb | 81 | void wait_MR1(); |
eri | 0:111abd91b0cb | 82 | |
eri | 0:111abd91b0cb | 83 | |
eri | 0:111abd91b0cb | 84 | int main() { |
eri | 0:111abd91b0cb | 85 | setup(); |
eri | 0:111abd91b0cb | 86 | while(switch_x==1){ |
eri | 0:111abd91b0cb | 87 | } |
eri | 0:111abd91b0cb | 88 | |
eri | 0:111abd91b0cb | 89 | reset(); |
eri | 0:111abd91b0cb | 90 | |
eri | 0:111abd91b0cb | 91 | /*while(1){ |
eri | 0:111abd91b0cb | 92 | move(680,10); |
eri | 0:111abd91b0cb | 93 | pc.printf("%f , ",1.0*ecgear*Pi*ec.getCount()/resolution); |
eri | 0:111abd91b0cb | 94 | wait(0.5); |
eri | 0:111abd91b0cb | 95 | move(20,10); |
eri | 0:111abd91b0cb | 96 | pc.printf("%f\r\n",1.0*ecgear*Pi*ec.getCount()/resolution); |
eri | 0:111abd91b0cb | 97 | wait(0.5); |
eri | 0:111abd91b0cb | 98 | }*/ |
eri | 0:111abd91b0cb | 99 | |
eri | 0:111abd91b0cb | 100 | //up_x(); |
eri | 0:111abd91b0cb | 101 | /*while(1){ |
eri | 0:111abd91b0cb | 102 | servo.set_degree(0,105); |
eri | 0:111abd91b0cb | 103 | wait(1); |
eri | 0:111abd91b0cb | 104 | servo.set_degree(0,135); |
eri | 0:111abd91b0cb | 105 | wait(1); |
eri | 0:111abd91b0cb | 106 | servo.set_degree(0,75); |
eri | 0:111abd91b0cb | 107 | wait(1); |
eri | 0:111abd91b0cb | 108 | }*/ |
eri | 0:111abd91b0cb | 109 | //down_x(); |
eri | 0:111abd91b0cb | 110 | |
eri | 0:111abd91b0cb | 111 | //reset(); |
eri | 0:111abd91b0cb | 112 | |
eri | 0:111abd91b0cb | 113 | /*while(1){ |
eri | 0:111abd91b0cb | 114 | out(0.2); |
eri | 0:111abd91b0cb | 115 | }*/ |
eri | 0:111abd91b0cb | 116 | |
eri | 0:111abd91b0cb | 117 | //move_x(360,10); |
eri | 0:111abd91b0cb | 118 | //turn(90); |
eri | 0:111abd91b0cb | 119 | //turn(-45); |
eri | 0:111abd91b0cb | 120 | |
eri | 0:111abd91b0cb | 121 | |
eri | 0:111abd91b0cb | 122 | |
eri | 0:111abd91b0cb | 123 | |
eri | 0:111abd91b0cb | 124 | while(1) { |
eri | 0:111abd91b0cb | 125 | switch((int)(target_plot[target_num][0])){ |
eri | 0:111abd91b0cb | 126 | case 0: |
eri | 0:111abd91b0cb | 127 | wait_MR1(); |
eri | 0:111abd91b0cb | 128 | break; |
eri | 0:111abd91b0cb | 129 | |
eri | 0:111abd91b0cb | 130 | case 1: |
eri | 0:111abd91b0cb | 131 | straight(target_plot[target_num][1]); |
eri | 0:111abd91b0cb | 132 | pc.printf("%f\r\n",linear_posi); |
eri | 0:111abd91b0cb | 133 | //while(1); |
eri | 0:111abd91b0cb | 134 | break; |
eri | 0:111abd91b0cb | 135 | |
eri | 0:111abd91b0cb | 136 | case 2: |
eri | 0:111abd91b0cb | 137 | turn(target_plot[target_num][1]); |
eri | 0:111abd91b0cb | 138 | break; |
eri | 0:111abd91b0cb | 139 | |
eri | 0:111abd91b0cb | 140 | case 3: |
eri | 0:111abd91b0cb | 141 | move_x(target_max,10); |
eri | 0:111abd91b0cb | 142 | move_y(target_min,10); |
eri | 0:111abd91b0cb | 143 | move_x(target_max,10); |
eri | 0:111abd91b0cb | 144 | move_y(target_min,10); |
eri | 0:111abd91b0cb | 145 | move_x(rail_len*0.5,10); |
eri | 0:111abd91b0cb | 146 | |
eri | 0:111abd91b0cb | 147 | default: |
eri | 0:111abd91b0cb | 148 | break; |
eri | 0:111abd91b0cb | 149 | } |
eri | 0:111abd91b0cb | 150 | target_num++; |
eri | 0:111abd91b0cb | 151 | linear_posi=0; |
eri | 0:111abd91b0cb | 152 | } |
eri | 0:111abd91b0cb | 153 | } |
eri | 0:111abd91b0cb | 154 | |
eri | 0:111abd91b0cb | 155 | double get_dist(){ |
eri | 0:111abd91b0cb | 156 | sensor.start(); |
eri | 0:111abd91b0cb | 157 | wait_ms(50); //sensor.start()で信号を送ったあと反射波が帰ってきてから距離データが更新されるため、少し待つ必要がある。 |
eri | 0:111abd91b0cb | 158 | //何ループも回す場合は不要。また、時間は適当だから調整が必要。 |
eri | 0:111abd91b0cb | 159 | return sensor.get_dist_cm(); |
eri | 0:111abd91b0cb | 160 | } |
eri | 0:111abd91b0cb | 161 | |
eri | 0:111abd91b0cb | 162 | |
eri | 0:111abd91b0cb | 163 | |
eri | 0:111abd91b0cb | 164 | //初期設定 |
eri | 0:111abd91b0cb | 165 | void setup() |
eri | 0:111abd91b0cb | 166 | { |
eri | 0:111abd91b0cb | 167 | motor_f.period_us(100); |
eri | 0:111abd91b0cb | 168 | motor_b.period_us(100); |
eri | 0:111abd91b0cb | 169 | switch_max.mode(PullUp); |
eri | 0:111abd91b0cb | 170 | switch_min.mode(PullUp); |
eri | 0:111abd91b0cb | 171 | switch_x.mode(PullUp); |
eri | 0:111abd91b0cb | 172 | switch_y.mode(PullUp); |
eri | 0:111abd91b0cb | 173 | switch_hand.mode(PullUp); |
eri | 0:111abd91b0cb | 174 | air_x=0; |
eri | 0:111abd91b0cb | 175 | air_y=0; |
eri | 0:111abd91b0cb | 176 | air_x_sub=0; |
eri | 0:111abd91b0cb | 177 | air_y_sub=0; |
eri | 0:111abd91b0cb | 178 | air_hand=0; |
eri | 0:111abd91b0cb | 179 | air_trig=0; |
eri | 0:111abd91b0cb | 180 | servo.setSpeed(0,127); |
eri | 0:111abd91b0cb | 181 | wait_us(1000); |
eri | 0:111abd91b0cb | 182 | servo.init(); |
eri | 0:111abd91b0cb | 183 | //servo.set_degree(0,servo_iniposi); |
eri | 0:111abd91b0cb | 184 | } |
eri | 0:111abd91b0cb | 185 | //モーターの出力 |
eri | 0:111abd91b0cb | 186 | void out (double duty) |
eri | 0:111abd91b0cb | 187 | { |
eri | 0:111abd91b0cb | 188 | if(duty > 0) { //入力duty比が正の場合 |
eri | 0:111abd91b0cb | 189 | if(switch_max == 0){ //上限のリミットスイッチが押されていない場合 |
eri | 0:111abd91b0cb | 190 | if( fabs( duty ) < dutylimit ) { //制限値内 |
eri | 0:111abd91b0cb | 191 | motor_f = fabs(duty); |
eri | 0:111abd91b0cb | 192 | motor_b = 0; |
eri | 0:111abd91b0cb | 193 | } else { //制限値超 |
eri | 0:111abd91b0cb | 194 | motor_f = dutylimit; |
eri | 0:111abd91b0cb | 195 | motor_b = 0; |
eri | 0:111abd91b0cb | 196 | } |
eri | 0:111abd91b0cb | 197 | } else { //上限のリミットスイッチが押されている場合 |
eri | 0:111abd91b0cb | 198 | motor_f = 0; |
eri | 0:111abd91b0cb | 199 | motor_b = 0; |
eri | 0:111abd91b0cb | 200 | //pc.printf("%f\r\n",1.0*ecgear*Pi*ec.getCount()/resolution); |
eri | 0:111abd91b0cb | 201 | } |
eri | 0:111abd91b0cb | 202 | |
eri | 0:111abd91b0cb | 203 | } else {//入力duty比が負の場合 |
eri | 0:111abd91b0cb | 204 | if(switch_min == 0){ //下限のリミットスイッチが押されていない場合 |
eri | 0:111abd91b0cb | 205 | if( fabs(duty) < dutylimit) { //制限値内 |
eri | 0:111abd91b0cb | 206 | motor_f = 0; |
eri | 0:111abd91b0cb | 207 | motor_b = fabs(duty); |
eri | 0:111abd91b0cb | 208 | } else { //制限値超 |
eri | 0:111abd91b0cb | 209 | motor_f = 0; |
eri | 0:111abd91b0cb | 210 | motor_b = dutylimit; |
eri | 0:111abd91b0cb | 211 | } |
eri | 0:111abd91b0cb | 212 | }else { //下限のリミットスイッチが押されている場合 |
eri | 0:111abd91b0cb | 213 | motor_f = 0; |
eri | 0:111abd91b0cb | 214 | motor_b = 0; |
eri | 0:111abd91b0cb | 215 | } |
eri | 0:111abd91b0cb | 216 | } |
eri | 0:111abd91b0cb | 217 | } |
eri | 0:111abd91b0cb | 218 | |
eri | 0:111abd91b0cb | 219 | //PID制御 |
eri | 0:111abd91b0cb | 220 | void move(double target,double error) //(移動先の座標(機体内)[mm],許容誤差の絶対値[mm]) |
eri | 0:111abd91b0cb | 221 | { |
eri | 0:111abd91b0cb | 222 | double pile=0,deviation,distance,distance_old=0; |
eri | 0:111abd91b0cb | 223 | int i=0; |
eri | 0:111abd91b0cb | 224 | timer.start(); |
eri | 0:111abd91b0cb | 225 | while(1) { |
eri | 0:111abd91b0cb | 226 | distance = 1.0*ecgear*Pi*ec.getCount()/resolution; |
eri | 0:111abd91b0cb | 227 | deviation = target - distance; |
eri | 0:111abd91b0cb | 228 | pile += deviation; |
eri | 0:111abd91b0cb | 229 | double period = timer.read(); |
eri | 0:111abd91b0cb | 230 | out(deviation * Kp - (distance - distance_old) / period * Kd + pile * Ki * period); |
eri | 0:111abd91b0cb | 231 | timer.reset(); |
eri | 0:111abd91b0cb | 232 | distance_old = distance; |
eri | 0:111abd91b0cb | 233 | if (fabs(deviation) < error) { |
eri | 0:111abd91b0cb | 234 | i++; |
eri | 0:111abd91b0cb | 235 | if (i==3000) { |
eri | 0:111abd91b0cb | 236 | out(0); |
eri | 0:111abd91b0cb | 237 | timer.stop(); |
eri | 0:111abd91b0cb | 238 | //pc.printf("%f\r\n",1.0*ecgear*Pi*ec.getCount()/resolution); |
eri | 0:111abd91b0cb | 239 | break; |
eri | 0:111abd91b0cb | 240 | } |
eri | 0:111abd91b0cb | 241 | } else { |
eri | 0:111abd91b0cb | 242 | i=0; |
eri | 0:111abd91b0cb | 243 | } |
eri | 0:111abd91b0cb | 244 | } |
eri | 0:111abd91b0cb | 245 | } |
eri | 0:111abd91b0cb | 246 | |
eri | 0:111abd91b0cb | 247 | //X脚を上げる |
eri | 0:111abd91b0cb | 248 | void up_x() |
eri | 0:111abd91b0cb | 249 | { |
eri | 0:111abd91b0cb | 250 | air_x =1; |
eri | 0:111abd91b0cb | 251 | wait(leg_wait_time); |
eri | 0:111abd91b0cb | 252 | } |
eri | 0:111abd91b0cb | 253 | |
eri | 0:111abd91b0cb | 254 | //X脚を降ろす |
eri | 0:111abd91b0cb | 255 | void down_x() |
eri | 0:111abd91b0cb | 256 | { |
eri | 0:111abd91b0cb | 257 | air_x =0; |
eri | 0:111abd91b0cb | 258 | wait(leg_wait_time); |
eri | 0:111abd91b0cb | 259 | } |
eri | 0:111abd91b0cb | 260 | |
eri | 0:111abd91b0cb | 261 | //Y脚を上げる |
eri | 0:111abd91b0cb | 262 | void up_y() |
eri | 0:111abd91b0cb | 263 | { |
eri | 0:111abd91b0cb | 264 | air_y =1; |
eri | 0:111abd91b0cb | 265 | wait(leg_wait_time); |
eri | 0:111abd91b0cb | 266 | } |
eri | 0:111abd91b0cb | 267 | |
eri | 0:111abd91b0cb | 268 | //Y脚を降ろす |
eri | 0:111abd91b0cb | 269 | void down_y() |
eri | 0:111abd91b0cb | 270 | { |
eri | 0:111abd91b0cb | 271 | air_y =0; |
eri | 0:111abd91b0cb | 272 | wait(leg_wait_time); |
eri | 0:111abd91b0cb | 273 | } |
eri | 0:111abd91b0cb | 274 | //X脚を移動 |
eri | 0:111abd91b0cb | 275 | void move_x (double x,double error) |
eri | 0:111abd91b0cb | 276 | { |
eri | 0:111abd91b0cb | 277 | //pc.printf("x target=%f , posi=%f\r\n",x,linear_posi); |
eri | 0:111abd91b0cb | 278 | double pre_posi=1.0*ecgear*Pi*ec.getCount()/resolution; |
eri | 0:111abd91b0cb | 279 | up_x(); |
eri | 0:111abd91b0cb | 280 | if(x>target_max)x=target_max; |
eri | 0:111abd91b0cb | 281 | else if(x<target_min)x=target_min; |
eri | 0:111abd91b0cb | 282 | move(x,error); |
eri | 0:111abd91b0cb | 283 | down_x(); |
eri | 0:111abd91b0cb | 284 | linear_posi+=1.0*ecgear*Pi*ec.getCount()/resolution-pre_posi; |
eri | 0:111abd91b0cb | 285 | } |
eri | 0:111abd91b0cb | 286 | |
eri | 0:111abd91b0cb | 287 | //Y脚を移動 |
eri | 0:111abd91b0cb | 288 | void move_y (double y,double error) |
eri | 0:111abd91b0cb | 289 | { |
eri | 0:111abd91b0cb | 290 | //pc.printf("y target=%f , posi=%f\r\n",y,linear_posi); |
eri | 0:111abd91b0cb | 291 | up_y(); |
eri | 0:111abd91b0cb | 292 | if(y>target_max)y=target_max; |
eri | 0:111abd91b0cb | 293 | else if(y<target_min)y=target_min; |
eri | 0:111abd91b0cb | 294 | move(y,error); |
eri | 0:111abd91b0cb | 295 | down_y(); |
eri | 0:111abd91b0cb | 296 | } |
eri | 0:111abd91b0cb | 297 | |
eri | 0:111abd91b0cb | 298 | int k=0; |
eri | 0:111abd91b0cb | 299 | //脚位置の初期化 |
eri | 0:111abd91b0cb | 300 | void reset() |
eri | 0:111abd91b0cb | 301 | { |
eri | 0:111abd91b0cb | 302 | //servo.set_degree(0,servo_iniposi); |
eri | 0:111abd91b0cb | 303 | up_x(); |
eri | 0:111abd91b0cb | 304 | while(switch_min == 0) { |
eri | 0:111abd91b0cb | 305 | out(-0.2); |
eri | 0:111abd91b0cb | 306 | k++; |
eri | 0:111abd91b0cb | 307 | if(k>5000){ |
eri | 0:111abd91b0cb | 308 | servo.set_degree(0,servo_iniposi); |
eri | 0:111abd91b0cb | 309 | k=0; |
eri | 0:111abd91b0cb | 310 | } |
eri | 0:111abd91b0cb | 311 | } |
eri | 0:111abd91b0cb | 312 | //pc.printf("%d\r\n",ec.getCount()); |
eri | 0:111abd91b0cb | 313 | ec.reset(); |
eri | 0:111abd91b0cb | 314 | out(0); |
eri | 0:111abd91b0cb | 315 | down_x(); |
eri | 0:111abd91b0cb | 316 | //pc.printf("%d\r\n",ec.getCount()); |
eri | 0:111abd91b0cb | 317 | } |
eri | 0:111abd91b0cb | 318 | |
eri | 0:111abd91b0cb | 319 | //旋回動作 |
eri | 0:111abd91b0cb | 320 | void turn(double degree) |
eri | 0:111abd91b0cb | 321 | { |
eri | 0:111abd91b0cb | 322 | if(fabs(1.0*ecgear*Pi*ec.getCount()/resolution-rail_len*0.5)>turn_error){ |
eri | 0:111abd91b0cb | 323 | move_y(rail_len*0.5,turn_error); |
eri | 0:111abd91b0cb | 324 | } |
eri | 0:111abd91b0cb | 325 | bool turn_finish=0; |
eri | 0:111abd91b0cb | 326 | while(turn_finish==0){ |
eri | 0:111abd91b0cb | 327 | double degree_out=0; |
eri | 0:111abd91b0cb | 328 | if(fabs(degree)<=45){ |
eri | 0:111abd91b0cb | 329 | degree_out=degree; |
eri | 0:111abd91b0cb | 330 | turn_finish=1; |
eri | 0:111abd91b0cb | 331 | }else if(degree>45){ |
eri | 0:111abd91b0cb | 332 | degree_out=45; |
eri | 0:111abd91b0cb | 333 | degree-=45; |
eri | 0:111abd91b0cb | 334 | }else{ |
eri | 0:111abd91b0cb | 335 | degree_out=-45; |
eri | 0:111abd91b0cb | 336 | degree+=45; |
eri | 0:111abd91b0cb | 337 | } |
eri | 0:111abd91b0cb | 338 | up_y(); |
eri | 0:111abd91b0cb | 339 | servo.set_degree(0,servo_iniposi+degree_out); |
eri | 0:111abd91b0cb | 340 | wait(turn_wait_time); |
eri | 0:111abd91b0cb | 341 | down_y(); |
eri | 0:111abd91b0cb | 342 | up_x(); |
eri | 0:111abd91b0cb | 343 | servo.set_degree(0,servo_iniposi); |
eri | 0:111abd91b0cb | 344 | wait(turn_wait_time); |
eri | 0:111abd91b0cb | 345 | down_x(); |
eri | 0:111abd91b0cb | 346 | } |
eri | 0:111abd91b0cb | 347 | } |
eri | 0:111abd91b0cb | 348 | |
eri | 0:111abd91b0cb | 349 | |
eri | 0:111abd91b0cb | 350 | |
eri | 0:111abd91b0cb | 351 | void straight(double target){ |
eri | 0:111abd91b0cb | 352 | while(1){ |
eri | 0:111abd91b0cb | 353 | double xleg_posi=1.0*ecgear*Pi*ec.getCount()/resolution; //機体内のX脚位置 |
eri | 0:111abd91b0cb | 354 | double dist=target-linear_posi; |
eri | 0:111abd91b0cb | 355 | pc.printf("leg=%f,dist=%f,linear_posi=%f\r\n",xleg_posi,dist,linear_posi); |
eri | 0:111abd91b0cb | 356 | if(fabs(dist)<10){ |
eri | 0:111abd91b0cb | 357 | break; |
eri | 0:111abd91b0cb | 358 | }else if((dist>0 && dist<=(target_max-xleg_posi)) || (dist<0 && dist>=(target_min-xleg_posi))){ |
eri | 0:111abd91b0cb | 359 | move_x(xleg_posi+dist,10); |
eri | 0:111abd91b0cb | 360 | }else if(dist<0){ |
eri | 0:111abd91b0cb | 361 | pc.printf("distance < 0"); |
eri | 0:111abd91b0cb | 362 | break; |
eri | 0:111abd91b0cb | 363 | }else if(dist<=(target_max-target_min-10)){ |
eri | 0:111abd91b0cb | 364 | if(dist<=(rail_len*0.5-target_min-10)){ |
eri | 0:111abd91b0cb | 365 | move_y(dist+xleg_posi-rail_len*0.5,10); |
eri | 0:111abd91b0cb | 366 | }else{ |
eri | 0:111abd91b0cb | 367 | move_y(target_min,10); |
eri | 0:111abd91b0cb | 368 | } |
eri | 0:111abd91b0cb | 369 | }else{ |
eri | 0:111abd91b0cb | 370 | if(xleg_posi<(rail_len*0.5))move_x(target_max,10); |
eri | 0:111abd91b0cb | 371 | else move_y(target_min,10); |
eri | 0:111abd91b0cb | 372 | } |
eri | 0:111abd91b0cb | 373 | } |
eri | 0:111abd91b0cb | 374 | } |
eri | 0:111abd91b0cb | 375 | |
eri | 0:111abd91b0cb | 376 | void wait_MR1(){ |
eri | 0:111abd91b0cb | 377 | /*while(switch_x==1){ |
eri | 0:111abd91b0cb | 378 | |
eri | 0:111abd91b0cb | 379 | }*/ |
eri | 0:111abd91b0cb | 380 | while(switch_hand==0); |
eri | 0:111abd91b0cb | 381 | air_hand=1; |
eri | 0:111abd91b0cb | 382 | wait(1); |
eri | 0:111abd91b0cb | 383 | |
eri | 0:111abd91b0cb | 384 | } |