![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
2018 HongoMechaTech A
main.cpp@0:e83b840a5f86, 2018-09-18 (annotated)
- Committer:
- Komazawa_sun
- Date:
- Tue Sep 18 03:11:01 2018 +0000
- Revision:
- 0:e83b840a5f86
????????????????
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Komazawa_sun | 0:e83b840a5f86 | 1 | #include <string.h> |
Komazawa_sun | 0:e83b840a5f86 | 2 | |
Komazawa_sun | 0:e83b840a5f86 | 3 | #include "mbed.h" |
Komazawa_sun | 0:e83b840a5f86 | 4 | #include "Pin.h" |
Komazawa_sun | 0:e83b840a5f86 | 5 | #include "LinearFunction.h" |
Komazawa_sun | 0:e83b840a5f86 | 6 | #include "QEI.h" |
Komazawa_sun | 0:e83b840a5f86 | 7 | #include "MD.h" |
Komazawa_sun | 0:e83b840a5f86 | 8 | #include "StraightMD.h" |
Komazawa_sun | 0:e83b840a5f86 | 9 | #include "Timer_PID.h" |
Komazawa_sun | 0:e83b840a5f86 | 10 | #include "MDPIDSpeed.h" |
Komazawa_sun | 0:e83b840a5f86 | 11 | |
Komazawa_sun | 0:e83b840a5f86 | 12 | #define MY_ADDRESS 0xd0 |
Komazawa_sun | 0:e83b840a5f86 | 13 | |
Komazawa_sun | 0:e83b840a5f86 | 14 | #define M_PI 3.14159265359 |
Komazawa_sun | 0:e83b840a5f86 | 15 | #define DEBUG_ENABLE 0 |
Komazawa_sun | 0:e83b840a5f86 | 16 | #if DEBUG_ENABLE == 1 |
Komazawa_sun | 0:e83b840a5f86 | 17 | #define DEBUG if(DEBUG_ENABLE) |
Komazawa_sun | 0:e83b840a5f86 | 18 | #define NDEBUG if(!DEBUG_ENABLE) |
Komazawa_sun | 0:e83b840a5f86 | 19 | #else |
Komazawa_sun | 0:e83b840a5f86 | 20 | #define DEBUG if(DEBUG_ENABLE) |
Komazawa_sun | 0:e83b840a5f86 | 21 | #define NDEBUG if(!DEBUG_ENABLE) |
Komazawa_sun | 0:e83b840a5f86 | 22 | #endif |
Komazawa_sun | 0:e83b840a5f86 | 23 | #define ROTE_LIMIT ((360.0 * 10) / 360.0) |
Komazawa_sun | 0:e83b840a5f86 | 24 | #define QEI_MAX_PULSES 512 //エンコーダパルス数(1層分) |
Komazawa_sun | 0:e83b840a5f86 | 25 | //#define CONTROL_INTERVAL 25 //制御周期 |
Komazawa_sun | 0:e83b840a5f86 | 26 | |
Komazawa_sun | 0:e83b840a5f86 | 27 | #define DIM_DEG (double)360.00 |
Komazawa_sun | 0:e83b840a5f86 | 28 | |
Komazawa_sun | 0:e83b840a5f86 | 29 | const double begin_angle = 5.0 / 360.00; //初期角 |
Komazawa_sun | 0:e83b840a5f86 | 30 | double shoot_angle = (325.0 + 9) / 360.00; //発射角 //成功vパラメータ |
Komazawa_sun | 0:e83b840a5f86 | 31 | double shoot_open_angle = (295.0 + 10 + 10) / 360.00; //成功vパラメータ |
Komazawa_sun | 0:e83b840a5f86 | 32 | |
Komazawa_sun | 0:e83b840a5f86 | 33 | double shoot_speed = -210.0; //発射速度[RPM] |
Komazawa_sun | 0:e83b840a5f86 | 34 | const double speed_limit = 1500; |
Komazawa_sun | 0:e83b840a5f86 | 35 | |
Komazawa_sun | 0:e83b840a5f86 | 36 | const double offset_allowable_error = begin_angle * (13.0 / 100.0); //初期角許容誤差率 |
Komazawa_sun | 0:e83b840a5f86 | 37 | const double shoot_allowable_error = shoot_speed * (1.5 / 100.0); //発射速度許容誤差率 |
Komazawa_sun | 0:e83b840a5f86 | 38 | const double shoot_ang_allowable_error = 5.0 / 360.0; |
Komazawa_sun | 0:e83b840a5f86 | 39 | |
Komazawa_sun | 0:e83b840a5f86 | 40 | const unsigned int topspeed_time_ms = 300; //射出速度に達するまでの時間 |
Komazawa_sun | 0:e83b840a5f86 | 41 | |
Komazawa_sun | 0:e83b840a5f86 | 42 | const unsigned int convergence_time_ms = 2000; //初期収束時間 |
Komazawa_sun | 0:e83b840a5f86 | 43 | |
Komazawa_sun | 0:e83b840a5f86 | 44 | const double offset_pwr_limit = 0.6; //初期角収束時の出力制限 |
Komazawa_sun | 0:e83b840a5f86 | 45 | const double offset_pwr_gain = 0.10; //オフセット時のPWM出力 |
Komazawa_sun | 0:e83b840a5f86 | 46 | |
Komazawa_sun | 0:e83b840a5f86 | 47 | const double const_moment = 0.027; //角度制御で考慮するモーメントの大きさの係数 |
Komazawa_sun | 0:e83b840a5f86 | 48 | |
Komazawa_sun | 0:e83b840a5f86 | 49 | |
Komazawa_sun | 0:e83b840a5f86 | 50 | const bool encorder_rev = true; |
Komazawa_sun | 0:e83b840a5f86 | 51 | |
Komazawa_sun | 0:e83b840a5f86 | 52 | I2CSlave slave(pin::sda, pin::scl); |
Komazawa_sun | 0:e83b840a5f86 | 53 | Ticker I2C_event_trigger; |
Komazawa_sun | 0:e83b840a5f86 | 54 | Ticker read_angle_timer; |
Komazawa_sun | 0:e83b840a5f86 | 55 | char I2C_cmd_shoot[4] = "SHT"; |
Komazawa_sun | 0:e83b840a5f86 | 56 | char I2C_cmd_grip[4] = "GRP"; |
Komazawa_sun | 0:e83b840a5f86 | 57 | char I2C_cmd_reset[4] = "RST"; |
Komazawa_sun | 0:e83b840a5f86 | 58 | const int I2C_buffer_size = 16; |
Komazawa_sun | 0:e83b840a5f86 | 59 | bool I2C_shoot_start = false; |
Komazawa_sun | 0:e83b840a5f86 | 60 | |
Komazawa_sun | 0:e83b840a5f86 | 61 | LinearFunction line(1); |
Komazawa_sun | 0:e83b840a5f86 | 62 | |
Komazawa_sun | 0:e83b840a5f86 | 63 | InterruptIn on_zero_point(pin::ft_ts); |
Komazawa_sun | 0:e83b840a5f86 | 64 | |
Komazawa_sun | 0:e83b840a5f86 | 65 | //DigitalIn button(A3); |
Komazawa_sun | 0:e83b840a5f86 | 66 | DigitalIn button(PC_13); |
Komazawa_sun | 0:e83b840a5f86 | 67 | |
Komazawa_sun | 0:e83b840a5f86 | 68 | DigitalOut dbg_led[3] = |
Komazawa_sun | 0:e83b840a5f86 | 69 | { pin::led1, pin::led2, pin::led3 }; |
Komazawa_sun | 0:e83b840a5f86 | 70 | DigitalOut ESV(pin::esv); |
Komazawa_sun | 0:e83b840a5f86 | 71 | |
Komazawa_sun | 0:e83b840a5f86 | 72 | PwmOut pwm_out(pin::pwm); |
Komazawa_sun | 0:e83b840a5f86 | 73 | DigitalOut dir_out(pin::dir); |
Komazawa_sun | 0:e83b840a5f86 | 74 | |
Komazawa_sun | 0:e83b840a5f86 | 75 | MD *output; |
Komazawa_sun | 0:e83b840a5f86 | 76 | QEI *rote; |
Komazawa_sun | 0:e83b840a5f86 | 77 | |
Komazawa_sun | 0:e83b840a5f86 | 78 | //------制御動作部分----------------------- |
Komazawa_sun | 0:e83b840a5f86 | 79 | typedef struct PIDConstract{ |
Komazawa_sun | 0:e83b840a5f86 | 80 | const double kp; |
Komazawa_sun | 0:e83b840a5f86 | 81 | const double ki; |
Komazawa_sun | 0:e83b840a5f86 | 82 | const double kd; |
Komazawa_sun | 0:e83b840a5f86 | 83 | }PID_constract; |
Komazawa_sun | 0:e83b840a5f86 | 84 | |
Komazawa_sun | 0:e83b840a5f86 | 85 | //PID_constract PID_const[2] = {{5.6, 2.5, 0.05},{0.00025, 0.00001, 0.000007}}; |
Komazawa_sun | 0:e83b840a5f86 | 86 | PID_constract PID_const[2] = {{5.6, 2.5, 0.05},{0.00020, 0.00001, 0}}; |
Komazawa_sun | 0:e83b840a5f86 | 87 | |
Komazawa_sun | 0:e83b840a5f86 | 88 | Timer_PID Position_PID(PID_const[0].kp, PID_const[0].ki, PID_const[0].kd); |
Komazawa_sun | 0:e83b840a5f86 | 89 | |
Komazawa_sun | 0:e83b840a5f86 | 90 | bool offset_position(bool dir_enable_CW); |
Komazawa_sun | 0:e83b840a5f86 | 91 | bool set_position(double angle, int time_ms, double allowable_error, |
Komazawa_sun | 0:e83b840a5f86 | 92 | double pwr_limit); |
Komazawa_sun | 0:e83b840a5f86 | 93 | //------------------------------------------ |
Komazawa_sun | 0:e83b840a5f86 | 94 | |
Komazawa_sun | 0:e83b840a5f86 | 95 | //------腕動作のリセット及び角度測定部分------------ |
Komazawa_sun | 0:e83b840a5f86 | 96 | bool on_offset = false; |
Komazawa_sun | 0:e83b840a5f86 | 97 | bool rote_reset_enable = false; |
Komazawa_sun | 0:e83b840a5f86 | 98 | void encorder_angle_reset(); |
Komazawa_sun | 0:e83b840a5f86 | 99 | //----------------------------------------- |
Komazawa_sun | 0:e83b840a5f86 | 100 | |
Komazawa_sun | 0:e83b840a5f86 | 101 | //------動作モードトグル部分--------------------- |
Komazawa_sun | 0:e83b840a5f86 | 102 | bool dump_button(bool input, bool reset); |
Komazawa_sun | 0:e83b840a5f86 | 103 | bool reset = 0; |
Komazawa_sun | 0:e83b840a5f86 | 104 | //------------------------------------------ |
Komazawa_sun | 0:e83b840a5f86 | 105 | |
Komazawa_sun | 0:e83b840a5f86 | 106 | void move_ESV(DigitalOut *output, bool close); |
Komazawa_sun | 0:e83b840a5f86 | 107 | |
Komazawa_sun | 0:e83b840a5f86 | 108 | double read_angle(bool enable_over_angle, bool dir_rev); |
Komazawa_sun | 0:e83b840a5f86 | 109 | void on_I2C_event(); |
Komazawa_sun | 0:e83b840a5f86 | 110 | |
Komazawa_sun | 0:e83b840a5f86 | 111 | void on_read_angle(); |
Komazawa_sun | 0:e83b840a5f86 | 112 | double real_time_angle; |
Komazawa_sun | 0:e83b840a5f86 | 113 | |
Komazawa_sun | 0:e83b840a5f86 | 114 | int main() |
Komazawa_sun | 0:e83b840a5f86 | 115 | { |
Komazawa_sun | 0:e83b840a5f86 | 116 | button.mode(PullUp); |
Komazawa_sun | 0:e83b840a5f86 | 117 | //slave.address(MY_ADDRESS); |
Komazawa_sun | 0:e83b840a5f86 | 118 | //I2C_event_trigger.attach(&on_I2C_event, 100); |
Komazawa_sun | 0:e83b840a5f86 | 119 | output = new StraightMD(pin::pwm, pin::dir); |
Komazawa_sun | 0:e83b840a5f86 | 120 | rote = new QEI(pin::a_lyr, pin::b_lyr, QEI_MAX_PULSES, 0.005); |
Komazawa_sun | 0:e83b840a5f86 | 121 | |
Komazawa_sun | 0:e83b840a5f86 | 122 | MD_PID_Speed Speed_PID(output, rote, PID_const[1].kp, PID_const[1].ki, PID_const[1].kd); |
Komazawa_sun | 0:e83b840a5f86 | 123 | |
Komazawa_sun | 0:e83b840a5f86 | 124 | on_zero_point.rise(&encorder_angle_reset); |
Komazawa_sun | 0:e83b840a5f86 | 125 | |
Komazawa_sun | 0:e83b840a5f86 | 126 | on_offset = false; |
Komazawa_sun | 0:e83b840a5f86 | 127 | while(!offset_position(false)){ |
Komazawa_sun | 0:e83b840a5f86 | 128 | DEBUG printf("move to offset(init)\tANGLE : %lf\r\n", read_angle(true, encorder_rev) * DIM_DEG); |
Komazawa_sun | 0:e83b840a5f86 | 129 | } |
Komazawa_sun | 0:e83b840a5f86 | 130 | DEBUG printf("Initial Ready\r\n"); |
Komazawa_sun | 0:e83b840a5f86 | 131 | |
Komazawa_sun | 0:e83b840a5f86 | 132 | while(1){ |
Komazawa_sun | 0:e83b840a5f86 | 133 | bool shot_button = dump_button(!button.read() | I2C_shoot_start, reset);; |
Komazawa_sun | 0:e83b840a5f86 | 134 | //on_offset = false; |
Komazawa_sun | 0:e83b840a5f86 | 135 | |
Komazawa_sun | 0:e83b840a5f86 | 136 | if(shot_button){//発射管制モード |
Komazawa_sun | 0:e83b840a5f86 | 137 | dbg_led[2].write(false); |
Komazawa_sun | 0:e83b840a5f86 | 138 | move_ESV(&ESV, true); |
Komazawa_sun | 0:e83b840a5f86 | 139 | wait_ms(500); |
Komazawa_sun | 0:e83b840a5f86 | 140 | |
Komazawa_sun | 0:e83b840a5f86 | 141 | line.reset(); |
Komazawa_sun | 0:e83b840a5f86 | 142 | Position_PID.reset(); |
Komazawa_sun | 0:e83b840a5f86 | 143 | |
Komazawa_sun | 0:e83b840a5f86 | 144 | |
Komazawa_sun | 0:e83b840a5f86 | 145 | read_angle_timer.attach_us(&on_read_angle, 100); |
Komazawa_sun | 0:e83b840a5f86 | 146 | do{ |
Komazawa_sun | 0:e83b840a5f86 | 147 | |
Komazawa_sun | 0:e83b840a5f86 | 148 | //line.set(shoot_speed, 0, topspeed_time_ms); |
Komazawa_sun | 0:e83b840a5f86 | 149 | //line.set(-0.70 + 0.079, 0, topspeed_time_ms); //成功vパラメータ |
Komazawa_sun | 0:e83b840a5f86 | 150 | line.set(-0.70 + 0.0795, 0, topspeed_time_ms); |
Komazawa_sun | 0:e83b840a5f86 | 151 | //Speed_PID.drive(line.get_val()); |
Komazawa_sun | 0:e83b840a5f86 | 152 | //Speed_PID.drive(shoot_speed); |
Komazawa_sun | 0:e83b840a5f86 | 153 | output->drive(line.get_val()); |
Komazawa_sun | 0:e83b840a5f86 | 154 | if( |
Komazawa_sun | 0:e83b840a5f86 | 155 | /*read_angle(true, encorder_rev) >= 1.0 |
Komazawa_sun | 0:e83b840a5f86 | 156 | && read_angle(false, encorder_rev) <= shoot_open_angle |
Komazawa_sun | 0:e83b840a5f86 | 157 | && read_angle(false, encorder_rev) >= (shoot_open_angle - shoot_ang_allowable_error))*/ |
Komazawa_sun | 0:e83b840a5f86 | 158 | read_angle(true, encorder_rev) >= 1.0 |
Komazawa_sun | 0:e83b840a5f86 | 159 | && real_time_angle <= shoot_open_angle |
Komazawa_sun | 0:e83b840a5f86 | 160 | && real_time_angle >= (shoot_open_angle - shoot_ang_allowable_error)){ |
Komazawa_sun | 0:e83b840a5f86 | 161 | move_ESV(&ESV, false); |
Komazawa_sun | 0:e83b840a5f86 | 162 | |
Komazawa_sun | 0:e83b840a5f86 | 163 | while(/*read_angle(false, encorder_rev)*/real_time_angle <= shoot_angle){ |
Komazawa_sun | 0:e83b840a5f86 | 164 | //Speed_PID.drive(line.get_val()); |
Komazawa_sun | 0:e83b840a5f86 | 165 | output->drive(line.get_val()); |
Komazawa_sun | 0:e83b840a5f86 | 166 | } |
Komazawa_sun | 0:e83b840a5f86 | 167 | //wait_ms(250); |
Komazawa_sun | 0:e83b840a5f86 | 168 | output->drive(0.00); |
Komazawa_sun | 0:e83b840a5f86 | 169 | DEBUG printf("stop!\r\n"); |
Komazawa_sun | 0:e83b840a5f86 | 170 | //Speed_PID.reset(); |
Komazawa_sun | 0:e83b840a5f86 | 171 | line.reset(); |
Komazawa_sun | 0:e83b840a5f86 | 172 | wait_ms(500); |
Komazawa_sun | 0:e83b840a5f86 | 173 | break; |
Komazawa_sun | 0:e83b840a5f86 | 174 | } |
Komazawa_sun | 0:e83b840a5f86 | 175 | //DEBUG printf("SpeedPID TAR : %.1lf_%.1lf RPM : %lf\tPWM : %lf\tF_ANG : %.1lf\tANG : %.3lf\r\n", |
Komazawa_sun | 0:e83b840a5f86 | 176 | // shoot_speed + shoot_allowable_error, shoot_speed - shoot_allowable_error, Speed_PID.get_current_rpm(), Speed_PID.get_duty(), read_angle(true, encorder_rev), read_angle(false, encorder_rev)); |
Komazawa_sun | 0:e83b840a5f86 | 177 | DEBUG printf("%lf \r\n", Speed_PID.get_current_rpm()/*real_time_angle*/); |
Komazawa_sun | 0:e83b840a5f86 | 178 | //NDEBUG wait_ms(5); |
Komazawa_sun | 0:e83b840a5f86 | 179 | //Speed_PID.read_interval(); |
Komazawa_sun | 0:e83b840a5f86 | 180 | }while(fabs(read_angle(true, encorder_rev)) < ROTE_LIMIT); |
Komazawa_sun | 0:e83b840a5f86 | 181 | read_angle_timer.detach(); |
Komazawa_sun | 0:e83b840a5f86 | 182 | |
Komazawa_sun | 0:e83b840a5f86 | 183 | //Speed_PID.reset(); |
Komazawa_sun | 0:e83b840a5f86 | 184 | line.reset(); |
Komazawa_sun | 0:e83b840a5f86 | 185 | line.set(0.0, Speed_PID.get_current_rpm(), 1000); |
Komazawa_sun | 0:e83b840a5f86 | 186 | do{ |
Komazawa_sun | 0:e83b840a5f86 | 187 | Speed_PID.drive(line.get_val()); |
Komazawa_sun | 0:e83b840a5f86 | 188 | DEBUG printf("breaking : %lf\r\n", line.get_val()); |
Komazawa_sun | 0:e83b840a5f86 | 189 | NDEBUG wait_ms(50); |
Komazawa_sun | 0:e83b840a5f86 | 190 | //wait_ms(500); |
Komazawa_sun | 0:e83b840a5f86 | 191 | }while(line.get_val() != 0); |
Komazawa_sun | 0:e83b840a5f86 | 192 | |
Komazawa_sun | 0:e83b840a5f86 | 193 | wait_ms(900); |
Komazawa_sun | 0:e83b840a5f86 | 194 | |
Komazawa_sun | 0:e83b840a5f86 | 195 | Speed_PID.reset(); |
Komazawa_sun | 0:e83b840a5f86 | 196 | I2C_shoot_start = false; |
Komazawa_sun | 0:e83b840a5f86 | 197 | on_offset = false; |
Komazawa_sun | 0:e83b840a5f86 | 198 | while(!offset_position(false)){ |
Komazawa_sun | 0:e83b840a5f86 | 199 | DEBUG printf("move to offset\tANGLE : %lf\r\n", read_angle(true, encorder_rev) * DIM_DEG); |
Komazawa_sun | 0:e83b840a5f86 | 200 | } |
Komazawa_sun | 0:e83b840a5f86 | 201 | |
Komazawa_sun | 0:e83b840a5f86 | 202 | move_ESV(&ESV, false); |
Komazawa_sun | 0:e83b840a5f86 | 203 | line.reset(); |
Komazawa_sun | 0:e83b840a5f86 | 204 | Position_PID.reset(); |
Komazawa_sun | 0:e83b840a5f86 | 205 | reset = 1; |
Komazawa_sun | 0:e83b840a5f86 | 206 | |
Komazawa_sun | 0:e83b840a5f86 | 207 | }else{//姿勢管制モード |
Komazawa_sun | 0:e83b840a5f86 | 208 | if(!set_position(begin_angle, convergence_time_ms, offset_allowable_error, offset_pwr_limit)){ |
Komazawa_sun | 0:e83b840a5f86 | 209 | reset = 0; |
Komazawa_sun | 0:e83b840a5f86 | 210 | dbg_led[2].write(true); |
Komazawa_sun | 0:e83b840a5f86 | 211 | }else{ |
Komazawa_sun | 0:e83b840a5f86 | 212 | dbg_led[2].write(false); |
Komazawa_sun | 0:e83b840a5f86 | 213 | } |
Komazawa_sun | 0:e83b840a5f86 | 214 | Position_PID.read_interval(); |
Komazawa_sun | 0:e83b840a5f86 | 215 | } |
Komazawa_sun | 0:e83b840a5f86 | 216 | } |
Komazawa_sun | 0:e83b840a5f86 | 217 | } |
Komazawa_sun | 0:e83b840a5f86 | 218 | |
Komazawa_sun | 0:e83b840a5f86 | 219 | bool dump_button(bool input, bool reset) |
Komazawa_sun | 0:e83b840a5f86 | 220 | { |
Komazawa_sun | 0:e83b840a5f86 | 221 | static bool pushed_flg = false; |
Komazawa_sun | 0:e83b840a5f86 | 222 | |
Komazawa_sun | 0:e83b840a5f86 | 223 | if (input && !pushed_flg) |
Komazawa_sun | 0:e83b840a5f86 | 224 | { |
Komazawa_sun | 0:e83b840a5f86 | 225 | pushed_flg = true; |
Komazawa_sun | 0:e83b840a5f86 | 226 | } |
Komazawa_sun | 0:e83b840a5f86 | 227 | |
Komazawa_sun | 0:e83b840a5f86 | 228 | if (reset) |
Komazawa_sun | 0:e83b840a5f86 | 229 | { |
Komazawa_sun | 0:e83b840a5f86 | 230 | pushed_flg = false; |
Komazawa_sun | 0:e83b840a5f86 | 231 | } |
Komazawa_sun | 0:e83b840a5f86 | 232 | |
Komazawa_sun | 0:e83b840a5f86 | 233 | return pushed_flg; |
Komazawa_sun | 0:e83b840a5f86 | 234 | } |
Komazawa_sun | 0:e83b840a5f86 | 235 | |
Komazawa_sun | 0:e83b840a5f86 | 236 | bool offset_position(bool dir_enable_CW) |
Komazawa_sun | 0:e83b840a5f86 | 237 | { |
Komazawa_sun | 0:e83b840a5f86 | 238 | double pwr = (dir_enable_CW) ? offset_pwr_gain * -2.0 : offset_pwr_gain * 2.0; |
Komazawa_sun | 0:e83b840a5f86 | 239 | |
Komazawa_sun | 0:e83b840a5f86 | 240 | if(fabs(read_angle(true, encorder_rev)) <= 19.0){ |
Komazawa_sun | 0:e83b840a5f86 | 241 | pwr = (dir_enable_CW) ? offset_pwr_gain * -1 : offset_pwr_gain; |
Komazawa_sun | 0:e83b840a5f86 | 242 | rote_reset_enable = true; |
Komazawa_sun | 0:e83b840a5f86 | 243 | } |
Komazawa_sun | 0:e83b840a5f86 | 244 | |
Komazawa_sun | 0:e83b840a5f86 | 245 | if(!on_offset){ |
Komazawa_sun | 0:e83b840a5f86 | 246 | output->drive(pwr); |
Komazawa_sun | 0:e83b840a5f86 | 247 | wait_ms(10); |
Komazawa_sun | 0:e83b840a5f86 | 248 | return false; |
Komazawa_sun | 0:e83b840a5f86 | 249 | }else{ |
Komazawa_sun | 0:e83b840a5f86 | 250 | rote_reset_enable = false; |
Komazawa_sun | 0:e83b840a5f86 | 251 | output->drive(0.00); |
Komazawa_sun | 0:e83b840a5f86 | 252 | wait_ms(500); |
Komazawa_sun | 0:e83b840a5f86 | 253 | return true; |
Komazawa_sun | 0:e83b840a5f86 | 254 | } |
Komazawa_sun | 0:e83b840a5f86 | 255 | } |
Komazawa_sun | 0:e83b840a5f86 | 256 | |
Komazawa_sun | 0:e83b840a5f86 | 257 | bool set_position(double angle, int time_ms, double allowable_error, |
Komazawa_sun | 0:e83b840a5f86 | 258 | double power_limit) |
Komazawa_sun | 0:e83b840a5f86 | 259 | { |
Komazawa_sun | 0:e83b840a5f86 | 260 | static double standard_angle = read_angle(true, encorder_rev); |
Komazawa_sun | 0:e83b840a5f86 | 261 | |
Komazawa_sun | 0:e83b840a5f86 | 262 | line.set(angle, standard_angle, time_ms); |
Komazawa_sun | 0:e83b840a5f86 | 263 | double duty = -1 * Position_PID.PID(read_angle(true, encorder_rev), line.get_val()) - cos(2 * M_PI * read_angle(true, encorder_rev)) * const_moment; |
Komazawa_sun | 0:e83b840a5f86 | 264 | if(duty >= power_limit) |
Komazawa_sun | 0:e83b840a5f86 | 265 | duty = power_limit; |
Komazawa_sun | 0:e83b840a5f86 | 266 | |
Komazawa_sun | 0:e83b840a5f86 | 267 | output->drive(duty); |
Komazawa_sun | 0:e83b840a5f86 | 268 | //DEBUG printf("position PID TAR : %lf-%lf ANGLE : %lf PWM : %lf\r\n", (line.get_val() + allowable_error) * DIM_DEG, (line.get_val() - allowable_error) * DIM_DEG, read_angle(true, encorder_rev) * DIM_DEG, duty); |
Komazawa_sun | 0:e83b840a5f86 | 269 | //DEBUG printf("set_position\r\n"); |
Komazawa_sun | 0:e83b840a5f86 | 270 | wait_ms(2); |
Komazawa_sun | 0:e83b840a5f86 | 271 | |
Komazawa_sun | 0:e83b840a5f86 | 272 | if(((angle + allowable_error) < read_angle(true, encorder_rev) || (angle - allowable_error) > read_angle(true, encorder_rev))){ |
Komazawa_sun | 0:e83b840a5f86 | 273 | return true; |
Komazawa_sun | 0:e83b840a5f86 | 274 | }else{ |
Komazawa_sun | 0:e83b840a5f86 | 275 | return false; |
Komazawa_sun | 0:e83b840a5f86 | 276 | } |
Komazawa_sun | 0:e83b840a5f86 | 277 | } |
Komazawa_sun | 0:e83b840a5f86 | 278 | |
Komazawa_sun | 0:e83b840a5f86 | 279 | void encorder_angle_reset() |
Komazawa_sun | 0:e83b840a5f86 | 280 | { |
Komazawa_sun | 0:e83b840a5f86 | 281 | if (rote_reset_enable) |
Komazawa_sun | 0:e83b840a5f86 | 282 | { |
Komazawa_sun | 0:e83b840a5f86 | 283 | printf("reset"); |
Komazawa_sun | 0:e83b840a5f86 | 284 | rote->reset(); |
Komazawa_sun | 0:e83b840a5f86 | 285 | on_offset = true; |
Komazawa_sun | 0:e83b840a5f86 | 286 | } |
Komazawa_sun | 0:e83b840a5f86 | 287 | } |
Komazawa_sun | 0:e83b840a5f86 | 288 | |
Komazawa_sun | 0:e83b840a5f86 | 289 | void move_ESV(DigitalOut *output, bool close) |
Komazawa_sun | 0:e83b840a5f86 | 290 | { |
Komazawa_sun | 0:e83b840a5f86 | 291 | dbg_led[0].write(close); |
Komazawa_sun | 0:e83b840a5f86 | 292 | output->write(close); |
Komazawa_sun | 0:e83b840a5f86 | 293 | } |
Komazawa_sun | 0:e83b840a5f86 | 294 | |
Komazawa_sun | 0:e83b840a5f86 | 295 | double read_angle(bool enable_over_angle, bool dir_rev) |
Komazawa_sun | 0:e83b840a5f86 | 296 | { |
Komazawa_sun | 0:e83b840a5f86 | 297 | double angle = 0; |
Komazawa_sun | 0:e83b840a5f86 | 298 | if(enable_over_angle == true) |
Komazawa_sun | 0:e83b840a5f86 | 299 | angle = (dir_rev) ? -1 * rote->over_angle() : 1 * rote->over_angle(); |
Komazawa_sun | 0:e83b840a5f86 | 300 | else |
Komazawa_sun | 0:e83b840a5f86 | 301 | angle = (dir_rev) ? 1.00 - rote->angle() : rote->angle(); |
Komazawa_sun | 0:e83b840a5f86 | 302 | return angle; |
Komazawa_sun | 0:e83b840a5f86 | 303 | } |
Komazawa_sun | 0:e83b840a5f86 | 304 | |
Komazawa_sun | 0:e83b840a5f86 | 305 | void on_read_angle(){ |
Komazawa_sun | 0:e83b840a5f86 | 306 | real_time_angle = read_angle(false, encorder_rev); |
Komazawa_sun | 0:e83b840a5f86 | 307 | } |
Komazawa_sun | 0:e83b840a5f86 | 308 | |
Komazawa_sun | 0:e83b840a5f86 | 309 | //SHT 角度[deg] 速度[rpm] :発射コマンド |
Komazawa_sun | 0:e83b840a5f86 | 310 | //SHT 000.0 0000.0 |16文字 |
Komazawa_sun | 0:e83b840a5f86 | 311 | //GRP :掴みコマンド(発射用フラグ) |
Komazawa_sun | 0:e83b840a5f86 | 312 | //RST :リセットコマンド |
Komazawa_sun | 0:e83b840a5f86 | 313 | |
Komazawa_sun | 0:e83b840a5f86 | 314 | void on_I2C_event() |
Komazawa_sun | 0:e83b840a5f86 | 315 | { |
Komazawa_sun | 0:e83b840a5f86 | 316 | char buffer[I2C_buffer_size] = {}; |
Komazawa_sun | 0:e83b840a5f86 | 317 | switch (slave.receive()) |
Komazawa_sun | 0:e83b840a5f86 | 318 | { |
Komazawa_sun | 0:e83b840a5f86 | 319 | case I2CSlave::ReadAddressed: |
Komazawa_sun | 0:e83b840a5f86 | 320 | sprintf(buffer, "%3.1lf %4.1lf %d", shoot_angle, shoot_speed, reset); |
Komazawa_sun | 0:e83b840a5f86 | 321 | slave.write(buffer, I2C_buffer_size); |
Komazawa_sun | 0:e83b840a5f86 | 322 | break; |
Komazawa_sun | 0:e83b840a5f86 | 323 | case I2CSlave::WriteAddressed: |
Komazawa_sun | 0:e83b840a5f86 | 324 | slave.read(buffer, I2C_buffer_size); |
Komazawa_sun | 0:e83b840a5f86 | 325 | char cmd[4] = {buffer[0], buffer[1], buffer[2], '\0'}; |
Komazawa_sun | 0:e83b840a5f86 | 326 | |
Komazawa_sun | 0:e83b840a5f86 | 327 | if(strcmp(cmd, I2C_cmd_shoot) == 0 && ESV.read()){ |
Komazawa_sun | 0:e83b840a5f86 | 328 | char option_angle[5] = {buffer[4], buffer[5], buffer[6], buffer[7], buffer[8]}; |
Komazawa_sun | 0:e83b840a5f86 | 329 | char option_speed[6] = {buffer[10], buffer[11], buffer[12], buffer[13], buffer[14], buffer[15]}; |
Komazawa_sun | 0:e83b840a5f86 | 330 | |
Komazawa_sun | 0:e83b840a5f86 | 331 | shoot_angle = (360 >= atof(option_angle) && 0 <= atof(option_angle)) ? atof(option_angle) / 360.0 : shoot_angle; |
Komazawa_sun | 0:e83b840a5f86 | 332 | shoot_speed = (speed_limit >= atof(option_speed) && 0 <= atof(option_speed)) ? atof(option_speed) : shoot_speed; |
Komazawa_sun | 0:e83b840a5f86 | 333 | |
Komazawa_sun | 0:e83b840a5f86 | 334 | I2C_shoot_start = true; |
Komazawa_sun | 0:e83b840a5f86 | 335 | }else if(strcmp(cmd, I2C_cmd_grip) == 0 && !I2C_shoot_start) |
Komazawa_sun | 0:e83b840a5f86 | 336 | move_ESV(&ESV, true); |
Komazawa_sun | 0:e83b840a5f86 | 337 | else if(strcmp(cmd, I2C_cmd_reset) == 0) |
Komazawa_sun | 0:e83b840a5f86 | 338 | NVIC_SystemReset(); |
Komazawa_sun | 0:e83b840a5f86 | 339 | break; |
Komazawa_sun | 0:e83b840a5f86 | 340 | }; |
Komazawa_sun | 0:e83b840a5f86 | 341 | } |
Komazawa_sun | 0:e83b840a5f86 | 342 |