Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: main.cpp
- Revision:
- 27:4f2fc7172b31
- Parent:
- 26:81346a21d301
diff -r 81346a21d301 -r 4f2fc7172b31 main.cpp
--- a/main.cpp Tue Oct 08 02:03:01 2019 +0000
+++ b/main.cpp Sat Oct 19 01:10:39 2019 +0000
@@ -2,7 +2,7 @@
/* NHK ROBOCON 2019 Ibaraki Kosen A team Automatic */
/* Nucleo Type: F446RE */
/* designed by Yuhi Takaku from 5D, mail: rab1sy23@gmail.com */
-/* Actuator: RS-555*4, RS-380*2, RZ-735*2, RS-385*2, PWM_Servo(KONDO)*2 */
+/* Actuator: RS-555*4, RS-385*4, RZ-735*2, PWM_Servo(KONDO)*2 */
/* Sensor: encorder*4, limit_switch*14 */
/* ------------------------------------------------------------------- */
/* Both of areas are compleated! */
@@ -18,6 +18,9 @@
#define RED 0
#define BLUE 1
+#define wind_time1 1.00f
+#define wind_time2 1.25f
+
//PID Gain of wheels(Kp, Ti, Td, control cycle)
//前進
PID front_migimae(4500000.0, 0.0, 0.0, 0.001);
@@ -99,8 +102,8 @@
//操作の段階変数
unsigned int phase = 0;
-int kaisyu_phase = 0;
-int tyokudo_phase = 0;
+unsigned int kaisyu_phase = 0;
+unsigned int tyokudo_phase = 0;
unsigned int start_zone = 1;
bool zone = RED;
@@ -170,10 +173,11 @@
void read_limit(void);
void wheel_reset(void);
void kaisyu(int pulse, int next_phase);
-void kaisyu_nobasu(int pulse, int next_phase);
-void kaisyu_hiku(int pulse, int next_phase);
+void kaisyu_nobasu(int next_phase);
+void kaisyu_hiku(int next_phase);
void tyokudo(int pulse, int next_phase);
void arm_up(int next_phase);
+void fan_on(float first_wind_time, float second_wind_time, int next_phase);
void front(int target);
void back(int target);
void right(int target);
@@ -224,7 +228,14 @@
/*
if(start_switch == 1) {
- phase = 37;
+ //phase = 37;
+ if(zone == RED) {
+ phase = 35;
+ //phase = 37;
+ }
+ else if(zone == BLUE) {
+ phase = 37;
+ }
}
*/
@@ -254,7 +265,7 @@
//回収アームを伸ばす
case 1:
counter.reset();
- kaisyu_nobasu(arm_pulse, 2);
+ kaisyu_nobasu(2);
//サーボを開いておく
servo_data[0] = 0x03;
i2c.write(0x30, servo_data, 1);
@@ -275,7 +286,7 @@
//ちょっと前進
case 3:
counter.reset();
- front(800);
+ front(700);
if((y_pulse1 > 700) || (y_pulse2 > 700)) {
phase = 4;
}
@@ -297,21 +308,14 @@
//回収アーム引っ込める
case 5:
USR_LED3 = 1;
- //kaisyu_hiku(arm_pulse, 6);
-
- if(kaisyu_mae_limit == 0) {
- arm_motor[0] = 0x4C;
- }
- else if(kaisyu_mae_limit == 1) {
- arm_motor[0] = 0x80;
- phase = 6;
- }
-
+ counter.reset();
+ kaisyu_hiku(6);
break;
//0.5秒停止
case 6:
stop();
+ USR_LED4 = 1;
counter.start();
if(counter.read() > 0.5f) {
phase = 7;
@@ -621,8 +625,8 @@
//掛けるところまで後進
case 33:
counter.reset();
- back(-9500);
- if((y_pulse1*-1 > 9500) || (y_pulse2*-1 > 9500)) {
+ back(-9200);
+ if((y_pulse1*-1 > 9200) || (y_pulse2*-1 > 9200)) {
phase = 34;
counter.start();
}
@@ -679,7 +683,9 @@
//シーツを掛ける
case 39:
counter.start();
-
+ //fan_on(1.0f, 1.75f, FINAL_PHASE);
+ fan_on(wind_time1, wind_time2, FINAL_PHASE);
+ /*
//1秒間ファン送風
if(counter.read() <= 1.0f) {
fan_data[0] = 0xFF;
@@ -705,6 +711,7 @@
i2c.write(0x30, servo_data, 1);
phase = FINAL_PHASE;
}
+ */
break;
//終了っ!(守衛さん風)
@@ -743,7 +750,7 @@
//回収アームを伸ばす
case 1:
counter.reset();
- kaisyu_nobasu(arm_pulse, 2);
+ kaisyu_nobasu(2);
//サーボを開いておく
servo_data[0] = 0x03;
i2c.write(0x30, servo_data, 1);
@@ -783,20 +790,12 @@
//回収アーム引っ込める
case 5:
USR_LED3 = 1;
- kaisyu_hiku(arm_pulse, 6);
- /*
- if(kaisyu_mae_limit == 0) {
- arm_motor[0] = 0x4C;
- }
- else if(kaisyu_mae_limit == 1) {
- arm_motor[0] = 0x80;
- phase = 6;
- }
- */
+ kaisyu_hiku(6);
break;
//左移動
case 6:
+ USR_LED4 = 1;
counter.reset();
left(11500);
if((x_pulse1 > 11500) || (x_pulse2 > 11500)) {
@@ -1144,7 +1143,10 @@
//シーツを掛ける
case 37:
counter.start();
+ //fan_on(1.0f, 1.75f, FINAL_PHASE);
+ fan_on(wind_time1, wind_time2, FINAL_PHASE);
+ /*
//1秒間ファン送風
if(counter.read() <= 1.0f) {
fan_data[0] = 0xFF;
@@ -1170,6 +1172,7 @@
i2c.write(0x30, servo_data, 1);
phase = FINAL_PHASE;
}
+ */
break;
//終了っ!(守衛さん風)
@@ -1247,6 +1250,7 @@
}
void print_pulses(void) {
+
//pc.printf("p: %d, kp: %d, pulse: %d\n\r", phase, kaisyu_phase, arm_pulse);
//pc.printf("p: %d, k_p: %d, pulse: %d\n\r", phase, kaisyu_phase, arm_pulse);
//pc.printf("X1: %d, X2: %d, Y1: %d, Y2: %d, sum: %d\n\r", abs(x_pulse1), x_pulse2, abs(y_pulse1), y_pulse2, sum_pulse);
@@ -1572,10 +1576,12 @@
//回収MDへ書き込み
i2c.write(0x18, arm_motor, 1);
+ wait_us(20);
}
-void kaisyu_nobasu(int pulse, int next_phase) {
+void kaisyu_nobasu(int next_phase) {
+ /*
switch (kaisyu_phase) {
case 0:
//前進->減速
@@ -1599,8 +1605,8 @@
//3600pulse超えたら停止
else if(pulse >= 3600) {
arm_motor[0] = 0x80;
+ kaisyu_phase = 2;
phase = next_phase;
- kaisyu_phase = 2;
}
//後ろのリミットが押されたら強制停止
if(kaisyu_usiro_limit == 1) {
@@ -1614,12 +1620,39 @@
arm_motor[0] = 0x80;
break;
}
+ */
+
+ //前進->減速
+ //3000pulseまで高速前進
+ if(arm_pulse < 3000) {
+ arm_motor[0] = 0xFF;
+ }
+ //3000pulse超えたら低速前進
+ else if(arm_pulse >= 3000) {
+ arm_motor[0] = 0xB3;
+ }
+ //3600pulse超えたら停止
+ else if(arm_pulse >= 3600) {
+ arm_motor[0] = 0x80;
+ phase = next_phase;
+ } else {
+ arm_motor[0] = 0x80;
+ }
+
+ //後ろのリミットが押されたら強制停止
+ if(kaisyu_usiro_limit == 1) {
+ arm_motor[0] = 0x80;
+ phase = next_phase;
+ }
+
//回収MDへ書き込み
i2c.write(0x18, arm_motor, 1);
+ wait_us(20);
}
-void kaisyu_hiku(int pulse, int next_phase) {
+void kaisyu_hiku(int next_phase) {
+ /*
switch(kaisyu_phase) {
case 2:
//後進->減速
@@ -1653,8 +1686,34 @@
arm_motor[0] = 0x80;
break;
}
+ */
+
+ //後進->減速
+ //500pulseより大きい範囲で高速後進
+ if(arm_pulse > 500) {
+ arm_motor[0] = 0x00;
+ }
+ //500pulse以下になったら低速後進
+ else if(arm_pulse <= 500) {
+ arm_motor[0] = 0x4C;
+ }
+ //0pulse以下で停止
+ else if(arm_pulse <= 0) {
+ arm_motor[0] = 0x80;
+ phase = next_phase;
+ } else {
+ arm_motor[0] = 0x80;
+ }
+
+ //後ろのリミットが押されたら強制停止
+ if(kaisyu_mae_limit == 1) {
+ arm_motor[0] = 0x80;
+ phase = next_phase;
+ }
+
//回収MDへ書き込み
i2c.write(0x18, arm_motor, 1);
+ wait_us(20);
}
void tyokudo(int pulse, int next_phase) {
@@ -1728,6 +1787,7 @@
//回収MD・排出MDへ書き込み
i2c.write(0x18, arm_motor, 1);
i2c.write(0x20, drop_motor, 1);
+ wait_us(20);
}
void arm_up(int next_phase) {
@@ -1749,12 +1809,32 @@
right_arm_data[0] = 0x80; left_arm_data[0] = 0x80;
phase = next_phase;
}
-
i2c.write(0x22, right_arm_data, 1);
i2c.write(0x24, left_arm_data, 1);
wait_us(20);
}
+void fan_on(float first_wind_time, float second_wind_time, int next_phase) {
+
+ if(counter.read() <= first_wind_time) {
+ fan_data[0] = 0xFF;
+ servo_data[0] = 0x04;
+ }
+ else if((counter.read() > first_wind_time) && (counter.read() <= first_wind_time + second_wind_time)) {
+ fan_data[0] = 0xFF;
+ servo_data[0] = 0x03;
+ }
+ else if(counter.read() > first_wind_time + second_wind_time) {
+ fan_data[0] = 0x80;
+ servo_data[0] = 0x04;
+ phase = next_phase;
+ }
+ i2c.write(0x26, fan_data, 1);
+ i2c.write(0x28, fan_data, 1);
+ i2c.write(0x30, servo_data, 1);
+ wait_us(20);
+}
+
void front(int target) {
front_PID(target);