Shohei Kamiguchi / Mbed 2 deprecated Iwatobi_Control_Modulen

Dependencies:   mbed

Committer:
DiGengengen
Date:
Sun Nov 22 12:03:42 2020 +0000
Revision:
3:2c2276646a5c
Parent:
2:1ae5e25618e0
Child:
4:ba166f7b2b8f
first commit()

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kintoki231 0:dde37cabc667 1 #include "mbed.h"
DiGengengen 3:2c2276646a5c 2 #include "IWCMD.h"
DiGengengen 3:2c2276646a5c 3
DiGengengen 3:2c2276646a5c 4 /* 設定 */
DiGengengen 3:2c2276646a5c 5 const int kModuleID = 1; // コントロールモジュールのID(い今のところ1だけ)
DiGengengen 3:2c2276646a5c 6 // Servo pulsewidth MIN MID MAX
DiGengengen 3:2c2276646a5c 7 double Servo_1_pulthwidth_range[3] = {0.0010, 0.0015, 0.0020};
DiGengengen 3:2c2276646a5c 8 double Servo_2_pulthwidth_range[3] = {0.0010, 0.0015, 0.0020};
DiGengengen 3:2c2276646a5c 9 double Servo_3_pulthwidth_range[3] = {0.0010, 0.0015, 0.0020};
DiGengengen 3:2c2276646a5c 10 double Servo_4_pulthwidth_range[3] = {0.0010, 0.0015, 0.0020};
DiGengengen 3:2c2276646a5c 11 double Servo_5_pulthwidth_range[3] = {0.0010, 0.0015, 0.0020};
DiGengengen 3:2c2276646a5c 12 double Servo_6_pulthwidth_range[3] = {0.0010, 0.0015, 0.0020};
DiGengengen 3:2c2276646a5c 13
DiGengengen 3:2c2276646a5c 14
DiGengengen 3:2c2276646a5c 15 /* 時間設定 */
DiGengengen 3:2c2276646a5c 16 /* WAIT_TIME_PM_REPLY + WAIT_TIME_PC_CMD > WDT_PERIOD => 接続状態でもWDTが必ず発動.
DiGengengen 3:2c2276646a5c 17 * WDT_PERIOD/2 < WAIT_TIME_PM_REPLY + WAIT_TIME_PC_CMD < WDT_PERIOD => 1or2回接続確認に失敗するとWDTが発動.
DiGengengen 3:2c2276646a5c 18 * WDT_PERIOD/(N+1) < WAIT_TIME_PM_REPLY + WAIT_TIME_PC_CMD < WDT_PERIOD/N => N回以上接続確認に失敗するとWDTが発動するかも.
DiGengengen 3:2c2276646a5c 19 */
DiGengengen 3:2c2276646a5c 20 const float WAIT_TIME_PM_REPLY = 0.2f; // PMの接続確認を待機する時間.xbeeの通信時間を考えて十分に長くとるべし.しかしこの時間はPCからの操作を受け付けないのでできるだけ短いほうが望ましい.
DiGengengen 3:2c2276646a5c 21 const float WAIT_TIME_PC_CMD = 3.0f; // PCからの命令を待機する時間.長いほうがより長い時間PCからのコマンドを受け付けるが,WDTの周期に注意.
DiGengengen 3:2c2276646a5c 22
DiGengengen 3:2c2276646a5c 23
DiGengengen 3:2c2276646a5c 24
kintoki231 0:dde37cabc667 25
kintoki231 0:dde37cabc667 26 /* ピン設定 */
DiGengengen 3:2c2276646a5c 27 Serial pc(USBTX, USBRX, 9600);
DiGengengen 3:2c2276646a5c 28 Serial xbee(PA_9, PA_10, 9600);
DiGengengen 3:2c2276646a5c 29 DigitalOut xbee_reset(PA_1);
kintoki231 0:dde37cabc667 30 DigitalOut led[] = {
kintoki231 0:dde37cabc667 31 DigitalOut(PB_1),
kintoki231 0:dde37cabc667 32 DigitalOut(PF_0),
kintoki231 0:dde37cabc667 33 DigitalOut(PF_1),
DiGengengen 3:2c2276646a5c 34 };
kintoki231 0:dde37cabc667 35
DiGengengen 3:2c2276646a5c 36 PwmOut Servo_1(PA_8);
DiGengengen 3:2c2276646a5c 37 // PwmOut Servo_2(PA_0); // us_tickerにてTIM2を利用中のため使用不可
DiGengengen 3:2c2276646a5c 38 DigitalOut Servo_2(PA_0);
DiGengengen 3:2c2276646a5c 39 PwmOut Servo_3(PA_6_ALT0);
DiGengengen 3:2c2276646a5c 40 PwmOut Servo_4(PA_3);
DiGengengen 3:2c2276646a5c 41 PwmOut Servo_5(PB_4);
DiGengengen 3:2c2276646a5c 42 PwmOut Servo_6(PA_7_ALT1);
kintoki231 0:dde37cabc667 43
kintoki231 0:dde37cabc667 44
kintoki231 0:dde37cabc667 45
DiGengengen 3:2c2276646a5c 46 /* タイマー設定 */
DiGengengen 3:2c2276646a5c 47 Timer tim;
DiGengengen 3:2c2276646a5c 48 Ticker s2_pwm_tick;
DiGengengen 3:2c2276646a5c 49 Timeout s2_pwm_timo;
kintoki231 0:dde37cabc667 50
kintoki231 0:dde37cabc667 51
DiGengengen 3:2c2276646a5c 52 /* グローバル変数 */
DiGengengen 3:2c2276646a5c 53 double s2_pulsewidth_curr = 0.0015;
kintoki231 0:dde37cabc667 54
kintoki231 0:dde37cabc667 55
DiGengengen 3:2c2276646a5c 56 /* プロトタイプ宣言 */
DiGengengen 3:2c2276646a5c 57 void pwm_init();
DiGengengen 3:2c2276646a5c 58 void xbee_init();
DiGengengen 3:2c2276646a5c 59 void PM_checkconnection(int);
DiGengengen 3:2c2276646a5c 60 void transmission_xbee2pc_wait_for(float);
DiGengengen 3:2c2276646a5c 61 void Servo_2_off();
DiGengengen 3:2c2276646a5c 62 void Servo_2_on();
DiGengengen 3:2c2276646a5c 63 void Servo_2_pwm_interrupt();
DiGengengen 3:2c2276646a5c 64 void Servo_2_period_ms(int);
DiGengengen 3:2c2276646a5c 65 void Servo_2_pulsewidth(double);
DiGengengen 3:2c2276646a5c 66 void cmd_exe_wait_for(float);
DiGengengen 3:2c2276646a5c 67 void cmd_exe(char);
DiGengengen 3:2c2276646a5c 68 void reset_all_motors();
DiGengengen 3:2c2276646a5c 69
DiGengengen 3:2c2276646a5c 70
DiGengengen 3:2c2276646a5c 71 Timer opt_tim;
kintoki231 0:dde37cabc667 72
DiGengengen 3:2c2276646a5c 73 /* メイン文 */
DiGengengen 3:2c2276646a5c 74 int main(){
DiGengengen 3:2c2276646a5c 75 // 初期化
DiGengengen 3:2c2276646a5c 76 pwm_init();
DiGengengen 3:2c2276646a5c 77 xbee_init();
DiGengengen 3:2c2276646a5c 78
DiGengengen 3:2c2276646a5c 79 wait(1);
DiGengengen 3:2c2276646a5c 80 led[0] = 1;
DiGengengen 3:2c2276646a5c 81
DiGengengen 3:2c2276646a5c 82 // ループ
DiGengengen 3:2c2276646a5c 83 while(1){
DiGengengen 3:2c2276646a5c 84 pc.printf("CM : %02d\n", kModuleID);
DiGengengen 3:2c2276646a5c 85 // PM1接続確認
DiGengengen 3:2c2276646a5c 86 PM_checkconnection(1); // PM1に接続確認
DiGengengen 3:2c2276646a5c 87 transmission_xbee2pc_wait_for(WAIT_TIME_PM_REPLY); // xbeeからの受信待機
DiGengengen 3:2c2276646a5c 88
DiGengengen 3:2c2276646a5c 89 // コマンド実行
DiGengengen 3:2c2276646a5c 90 cmd_exe_wait_for(WAIT_TIME_PC_CMD/2.0f); // PCからのコマンド待機
DiGengengen 3:2c2276646a5c 91
DiGengengen 3:2c2276646a5c 92 // PM2接続確認
DiGengengen 3:2c2276646a5c 93 PM_checkconnection(2); // PM2に接続確認
DiGengengen 3:2c2276646a5c 94 transmission_xbee2pc_wait_for(WAIT_TIME_PM_REPLY); // xbeeからの受信待機
DiGengengen 3:2c2276646a5c 95
DiGengengen 3:2c2276646a5c 96 // コマンド実行
DiGengengen 3:2c2276646a5c 97 cmd_exe_wait_for(WAIT_TIME_PC_CMD/2.0f); // PCからのコマンド待機
kintoki231 0:dde37cabc667 98 }
kintoki231 0:dde37cabc667 99 }
kintoki231 0:dde37cabc667 100
DiGengengen 3:2c2276646a5c 101 /* PWM初期化 */
DiGengengen 3:2c2276646a5c 102 void pwm_init(){
kintoki231 0:dde37cabc667 103 Servo_1.period_ms(20);
DiGengengen 3:2c2276646a5c 104 Servo_2_period_ms(20);
kintoki231 0:dde37cabc667 105 Servo_3.period_ms(20);
kintoki231 0:dde37cabc667 106 Servo_4.period_ms(20);
kintoki231 0:dde37cabc667 107 Servo_5.period_ms(20);
kintoki231 0:dde37cabc667 108 Servo_6.period_ms(20);
DiGengengen 3:2c2276646a5c 109 reset_all_motors();
DiGengengen 3:2c2276646a5c 110 }
DiGengengen 3:2c2276646a5c 111
DiGengengen 3:2c2276646a5c 112 /* xbee初期化 */
DiGengengen 3:2c2276646a5c 113 void xbee_init(){
DiGengengen 3:2c2276646a5c 114 xbee_reset = 1;
DiGengengen 3:2c2276646a5c 115 }
DiGengengen 3:2c2276646a5c 116
DiGengengen 3:2c2276646a5c 117
DiGengengen 3:2c2276646a5c 118 /* PMとの接続確認,PMのWDT更新 */
DiGengengen 3:2c2276646a5c 119 void PM_checkconnection(int id){
DiGengengen 3:2c2276646a5c 120 if(id == 1){
DiGengengen 3:2c2276646a5c 121 xbee.putc(IWCMD_PM1_CCO);
DiGengengen 3:2c2276646a5c 122 }else if(id == 2){
DiGengengen 3:2c2276646a5c 123 xbee.putc(IWCMD_PM2_CCO);
DiGengengen 3:2c2276646a5c 124 }
DiGengengen 3:2c2276646a5c 125 }
DiGengengen 3:2c2276646a5c 126
kintoki231 0:dde37cabc667 127
DiGengengen 3:2c2276646a5c 128 /* wait_time秒間,xbeeからの通信を受信してPCに表示 */
DiGengengen 3:2c2276646a5c 129 void transmission_xbee2pc_wait_for(float wait_time){
DiGengengen 3:2c2276646a5c 130 tim.reset();
DiGengengen 3:2c2276646a5c 131 tim.start();
DiGengengen 3:2c2276646a5c 132 while(tim.read() < wait_time){
DiGengengen 3:2c2276646a5c 133 if(xbee.readable()){
DiGengengen 3:2c2276646a5c 134 pc.putc(xbee.getc());
DiGengengen 3:2c2276646a5c 135 }
DiGengengen 3:2c2276646a5c 136 }
DiGengengen 3:2c2276646a5c 137 tim.stop();
DiGengengen 3:2c2276646a5c 138 }
DiGengengen 3:2c2276646a5c 139
kintoki231 0:dde37cabc667 140
DiGengengen 3:2c2276646a5c 141 /* wait_time秒間,PCからの通信を受信してコマンド実行 */
DiGengengen 3:2c2276646a5c 142 void cmd_exe_wait_for(float wait_time){
DiGengengen 3:2c2276646a5c 143 tim.reset();
DiGengengen 3:2c2276646a5c 144 tim.start();
DiGengengen 3:2c2276646a5c 145 while(tim.read() < wait_time){
DiGengengen 3:2c2276646a5c 146 if(pc.readable()){
DiGengengen 3:2c2276646a5c 147 cmd_exe(pc.getc());
DiGengengen 3:2c2276646a5c 148 }
DiGengengen 3:2c2276646a5c 149 }
DiGengengen 3:2c2276646a5c 150 tim.stop();
DiGengengen 3:2c2276646a5c 151 }
DiGengengen 3:2c2276646a5c 152
kintoki231 0:dde37cabc667 153
DiGengengen 3:2c2276646a5c 154 /*各コマンド実行内容*/
DiGengengen 3:2c2276646a5c 155 // 全てのモータを停止,初期位置に.
DiGengengen 3:2c2276646a5c 156 void reset_all_motors(){
DiGengengen 3:2c2276646a5c 157 Servo_1.pulsewidth(Servo_1_pulthwidth_range[1]);
DiGengengen 3:2c2276646a5c 158 Servo_2_pulsewidth(Servo_2_pulthwidth_range[1]);
DiGengengen 3:2c2276646a5c 159 Servo_3.pulsewidth(Servo_3_pulthwidth_range[1]);
DiGengengen 3:2c2276646a5c 160 Servo_4.pulsewidth(Servo_4_pulthwidth_range[1]);
DiGengengen 3:2c2276646a5c 161 Servo_5.pulsewidth(Servo_5_pulthwidth_range[1]);
DiGengengen 3:2c2276646a5c 162 Servo_6.pulsewidth(Servo_6_pulthwidth_range[1]);
DiGengengen 3:2c2276646a5c 163 xbee.putc(IWCMD_PM1_SPS);
DiGengengen 3:2c2276646a5c 164 xbee.putc(IWCMD_PM2_SPS);
DiGengengen 3:2c2276646a5c 165 }
DiGengengen 3:2c2276646a5c 166
kintoki231 0:dde37cabc667 167
DiGengengen 3:2c2276646a5c 168 /* Servo2用手動PWM */
DiGengengen 3:2c2276646a5c 169 void Servo_2_off(){
DiGengengen 3:2c2276646a5c 170 Servo_2 = 0;
DiGengengen 3:2c2276646a5c 171 }
DiGengengen 3:2c2276646a5c 172 void Servo_2_on(){
DiGengengen 3:2c2276646a5c 173 Servo_2 = 1;
DiGengengen 3:2c2276646a5c 174 s2_pwm_timo.attach(&Servo_2_off, s2_pulsewidth_curr);
DiGengengen 3:2c2276646a5c 175 }
DiGengengen 3:2c2276646a5c 176 void Servo_2_period_ms(int p_ms){
DiGengengen 3:2c2276646a5c 177 Servo_2_off();
DiGengengen 3:2c2276646a5c 178 s2_pwm_tick.attach(&Servo_2_on, (double)p_ms / 1.0e3);
DiGengengen 3:2c2276646a5c 179 }
DiGengengen 3:2c2276646a5c 180 void Servo_2_pulsewidth(double p){
DiGengengen 3:2c2276646a5c 181 s2_pulsewidth_curr = p;
DiGengengen 3:2c2276646a5c 182 }
DiGengengen 3:2c2276646a5c 183 //const int s2_division = 100; // PWM用分割数
DiGengengen 3:2c2276646a5c 184 //int s2_duty; // PWM用分割数のうちduty個分High出力
DiGengengen 3:2c2276646a5c 185 //int s2_period_us; // PWM用分割数1つあたりの周期
DiGengengen 3:2c2276646a5c 186 //
DiGengengen 3:2c2276646a5c 187 //void Servo_2_period_ms(int p_ms){
DiGengengen 3:2c2276646a5c 188 // s2_period_us = (p_ms*1000) / s2_division;
DiGengengen 3:2c2276646a5c 189 // s2_pwm_tick.attach_us(&Servo_2_pwm_interrupt, s2_period_us);
DiGengengen 3:2c2276646a5c 190 //}
DiGengengen 3:2c2276646a5c 191 //void Servo_2_pulsewidth(double pw){
DiGengengen 3:2c2276646a5c 192 // s2_duty = pw*1000000.0 / (double)s2_period_us;
DiGengengen 3:2c2276646a5c 193 //}
DiGengengen 3:2c2276646a5c 194 //void Servo_2_pwm_interrupt(){
DiGengengen 3:2c2276646a5c 195 // static int t = 0;
DiGengengen 3:2c2276646a5c 196 // if(t == s2_division){
DiGengengen 3:2c2276646a5c 197 // Servo_2 = 0;
DiGengengen 3:2c2276646a5c 198 // t = 0;
DiGengengen 3:2c2276646a5c 199 // return;
DiGengengen 3:2c2276646a5c 200 // }
DiGengengen 3:2c2276646a5c 201 // if(t == s2_division-s2_duty)
DiGengengen 3:2c2276646a5c 202 // Servo_2 = 1;
DiGengengen 3:2c2276646a5c 203 // t++;
DiGengengen 3:2c2276646a5c 204 //}
DiGengengen 3:2c2276646a5c 205
DiGengengen 3:2c2276646a5c 206
DiGengengen 3:2c2276646a5c 207 /* コマンド実行 */
DiGengengen 3:2c2276646a5c 208 void cmd_exe(char cmd){
DiGengengen 3:2c2276646a5c 209 switch(cmd){
DiGengengen 3:2c2276646a5c 210 case IWCMD_CM_SS1_PP: //スラスターサーボ1を正位置
DiGengengen 3:2c2276646a5c 211 Servo_1.pulsewidth(Servo_1_pulthwidth_range[2]);
DiGengengen 3:2c2276646a5c 212 break;
DiGengengen 3:2c2276646a5c 213 case IWCMD_CM_SS1_SP: //スラスターサーボ1を零位置
DiGengengen 3:2c2276646a5c 214 Servo_1.pulsewidth(Servo_1_pulthwidth_range[1]);
DiGengengen 3:2c2276646a5c 215 break;
DiGengengen 3:2c2276646a5c 216 case IWCMD_CM_SS1_NP: //スラスターサーボ1を負位置
DiGengengen 3:2c2276646a5c 217 Servo_1.pulsewidth(Servo_1_pulthwidth_range[0]);
DiGengengen 3:2c2276646a5c 218 break;
DiGengengen 3:2c2276646a5c 219 case IWCMD_CM_SS2_PP: //スラスターサーボ2を正位置
DiGengengen 3:2c2276646a5c 220 Servo_2_pulsewidth(Servo_2_pulthwidth_range[2]);
DiGengengen 3:2c2276646a5c 221 break;
DiGengengen 3:2c2276646a5c 222 case IWCMD_CM_SS2_SP: //スラスターサーボ2を零位置
DiGengengen 3:2c2276646a5c 223 Servo_2_pulsewidth(Servo_2_pulthwidth_range[1]);
DiGengengen 3:2c2276646a5c 224 break;
DiGengengen 3:2c2276646a5c 225 case IWCMD_CM_SS2_NP: //スラスターサーボ2を負位置
DiGengengen 3:2c2276646a5c 226 Servo_2_pulsewidth(Servo_2_pulthwidth_range[0]);
DiGengengen 3:2c2276646a5c 227 break;
DiGengengen 3:2c2276646a5c 228 case IWCMD_CM_SS3_PP: //スラスターサーボ3を正位置
DiGengengen 3:2c2276646a5c 229 Servo_3.pulsewidth(Servo_3_pulthwidth_range[2]);
DiGengengen 3:2c2276646a5c 230 break;
DiGengengen 3:2c2276646a5c 231 case IWCMD_CM_SS3_SP: //スラスターサーボ3を零位置
DiGengengen 3:2c2276646a5c 232 Servo_3.pulsewidth(Servo_3_pulthwidth_range[1]);
DiGengengen 3:2c2276646a5c 233 break;
DiGengengen 3:2c2276646a5c 234 case IWCMD_CM_SS3_NP: //スラスターサーボ3を負位置
DiGengengen 3:2c2276646a5c 235 Servo_3.pulsewidth(Servo_3_pulthwidth_range[0]);
DiGengengen 3:2c2276646a5c 236 break;
DiGengengen 3:2c2276646a5c 237 case IWCMD_CM_SS4_PP: //スラスターサーボ4を正位置
DiGengengen 3:2c2276646a5c 238 Servo_4.pulsewidth(Servo_4_pulthwidth_range[2]);
DiGengengen 3:2c2276646a5c 239 break;
DiGengengen 3:2c2276646a5c 240 case IWCMD_CM_SS4_SP: //スラスターサーボ4を零位置
DiGengengen 3:2c2276646a5c 241 Servo_4.pulsewidth(Servo_4_pulthwidth_range[1]);
DiGengengen 3:2c2276646a5c 242 break;
DiGengengen 3:2c2276646a5c 243 case IWCMD_CM_SS4_NP: //スラスターサーボ4を負位置
DiGengengen 3:2c2276646a5c 244 Servo_4.pulsewidth(Servo_4_pulthwidth_range[0]);
DiGengengen 3:2c2276646a5c 245 break;
DiGengengen 3:2c2276646a5c 246 case IWCMD_CM_SS5_PP: //スラスターサーボ5を正位置
DiGengengen 3:2c2276646a5c 247 Servo_5.pulsewidth(Servo_5_pulthwidth_range[2]);
DiGengengen 3:2c2276646a5c 248 break;
DiGengengen 3:2c2276646a5c 249 case IWCMD_CM_SS5_SP: //スラスターサーボ5を零位置
DiGengengen 3:2c2276646a5c 250 Servo_5.pulsewidth(Servo_5_pulthwidth_range[1]);
DiGengengen 3:2c2276646a5c 251 break;
DiGengengen 3:2c2276646a5c 252 case IWCMD_CM_SS5_NP: //スラスターサーボ5を負位置
DiGengengen 3:2c2276646a5c 253 Servo_5.pulsewidth(Servo_5_pulthwidth_range[0]);
DiGengengen 3:2c2276646a5c 254 break;
DiGengengen 3:2c2276646a5c 255 case IWCMD_CM_SS6_PP: //スラスターサーボ6を正位置
DiGengengen 3:2c2276646a5c 256 Servo_6.pulsewidth(Servo_6_pulthwidth_range[2]);
DiGengengen 3:2c2276646a5c 257 break;
DiGengengen 3:2c2276646a5c 258 case IWCMD_CM_SS6_SP: //スラスターサーボ6を零位置
DiGengengen 3:2c2276646a5c 259 Servo_6.pulsewidth(Servo_6_pulthwidth_range[1]);
DiGengengen 3:2c2276646a5c 260 break;
DiGengengen 3:2c2276646a5c 261 case IWCMD_CM_SS6_NP: //スラスターサーボ6を負位置
DiGengengen 3:2c2276646a5c 262 Servo_6.pulsewidth(Servo_6_pulthwidth_range[0]);
DiGengengen 3:2c2276646a5c 263 break;
DiGengengen 3:2c2276646a5c 264 case IWCMD_CM_PM1_FR: //PM1を正転(IWCMD_PM1_SUU)
DiGengengen 3:2c2276646a5c 265 xbee.putc(IWCMD_PM1_SUU);
DiGengengen 3:2c2276646a5c 266 break;
DiGengengen 3:2c2276646a5c 267 case IWCMD_CM_PM1_ST: //PM1を停止(IWCMD_PM1_SPS)
DiGengengen 3:2c2276646a5c 268 xbee.putc(IWCMD_PM1_SPS);
DiGengengen 3:2c2276646a5c 269 break;
DiGengengen 3:2c2276646a5c 270 case IWCMD_CM_PM2_FR: //PM2を正転(IWCMD_PM2_SUU)
DiGengengen 3:2c2276646a5c 271 xbee.putc(IWCMD_PM2_SUU);
DiGengengen 3:2c2276646a5c 272 break;
DiGengengen 3:2c2276646a5c 273 case IWCMD_CM_PM2_ST: //PM2を停止(IWCMD_PM2_SPS)
DiGengengen 3:2c2276646a5c 274 xbee.putc(IWCMD_PM2_SPS);
DiGengengen 3:2c2276646a5c 275 break;
DiGengengen 3:2c2276646a5c 276 default:
DiGengengen 3:2c2276646a5c 277 reset_all_motors();
DiGengengen 3:2c2276646a5c 278 break;
kintoki231 0:dde37cabc667 279 }
DiGengengen 3:2c2276646a5c 280 led[2] =~ led[2];
kintoki231 0:dde37cabc667 281 }