2022_gorobo_Ateam
/
beenbag_shoot
program to shoot beenbags
arrcmbedをインクルードしてください。
Diff: main.cpp
- Revision:
- 21:9f917ee199ff
- Parent:
- 20:4db5f042a45c
--- a/main.cpp Tue Feb 01 07:22:36 2022 +0000 +++ b/main.cpp Tue Feb 01 12:21:48 2022 +0000 @@ -1,4 +1,4 @@ -d#include "mbed.h" +#include "mbed.h" #include "rotary_inc.hpp" #include "scrp_slave.hpp" #include "Motor.hpp" @@ -19,10 +19,13 @@ //-----変数--------------------------------- int shoot_phase = 0;//発射フェーズ 0:待機 1:装填動作 2:リボルバー回転、モーター復帰(同時) 3:発射 +int shoot_phase_manual = 0;//発射フェーズ 0:待機 1:装填動作 2:リボルバー回転 3;モーター復帰 4:発射 bool turn_able = 0;//回転可否 bool back_able = 0;//復帰可否 +bool shoot_auto = 1;//手動発射か自動発射か 0:手動 1:自動 bool mode = 0;//0:手動 1:自動 + bool emergency = 0;//0:停止 1:停止 double revolver_pwm = -0.1;//リボルバー回転速度 double load_pwm = -0.5;//装填モーター速度 @@ -34,14 +37,43 @@ //-----関数--------------------------------- -//発射開始を受信 -bool get_start(int rx_data,int &tx_data){ +//自動発射開始を受信 +bool get_all(int rx_data,int &tx_data){ if(shoot_phase == 0){//フェーズ0以外は、発射できないように + shoot_auto = 1; shoot_phase = 1; } return true; } +//装填動作受信 +bool get_load(int rx_data,int &tx_data){ + shoot_auto = 0; + shoot_phase_manual = 1; + return true; +} + +//動作リボルバー受信 +bool get_revolver(int rx_data,int &tx_data){ + shoot_auto = 0; + shoot_phase_manual = 2; + return true; +} + +//復帰動作受信 +bool get_back(int rx_data,int &tx_data){ + shoot_auto = 0; + shoot_phase_manual = 3; + return true; +} + +//発射動作受信 +bool get_shoot(int rx_data,int &tx_data){ + shoot_phase_manual = 4; + shoot_auto = 0; + return true; +} + //モード変更を受信 bool get_changemode(int rx_data,int &tx_data){ if(mode == 0){ @@ -105,6 +137,20 @@ } } +//リボルバー回転のみ +void revolver(int count){ + if(turn_able == 1){ + while(roricon < 341 * count){ + //while(1){ + roricon = v.get(); + motor_revolver.output(revolver_pwm); + printf("roricon = %d\n",roricon); + wait(0.01); + } + turn_able = 0; + } +} + //------------------------------------------ int main(){ @@ -114,12 +160,18 @@ limit_1.mode(PullUp); limit_2.mode(PullUp); - slave.addCMD(2,get_start); + slave.addCMD(2,get_all); + slave.addCMD(3,get_load); + slave.addCMD(4,get_revolver); + slave.addCMD(5,get_back); + slave.addCMD(6,get_shoot); + slave.addCMD(50,get_changemode); slave.addCMD(51,get_stop); while(1){ - if(mode == 1){ +//----------自動発射------------------------------ + if(mode == 1 && shoot_auto == 1){ switch (shoot_phase){ case 0://待機 while(shoot_phase == 0){ @@ -177,5 +229,71 @@ break; } } + +//----------手動発射------------------------------ + if(mode == 1 && shoot_auto == 0){ + switch (shoot_phase_manual){ + case 0://待機 + while(shoot_phase_manual == 0){ + wait(0.1); + printf("waiting\n"); + } + printf("finished waiting\n"); + break; + + case 1://装填動作 + while(limit_1.read() == 0){ + motor_shoot.output(load_pwm); + printf("loading\n"); + wait(0.1); + if(limit_2.read() == 1){ + break; + } + } + motor_shoot.output(0); + shoot_phase_manual = 0; + printf("finished loading\n"); + wait(5); + break; + + case 2://リボルバー回転 + turn_able = 1; + revolver(count); + if(turn_able == 0){ + motor_revolver.output(0); + shoot_phase_manual = 0; + } + else{ + printf("error\n"); + } + count ++; + printf("finished turnning\n"); + break; + + case 3://モーター復帰 + while(limit_2.read() == 0){ + motor_shoot.output(back_pwm); + printf("backing\n"); + wait(0.1); + } + + motor_shoot.output(0); + shoot_phase_manual = 0; + printf("finished backing\n"); + break; + + case 4://発射動作 + servo.pulsewidth_us(theta_45); + printf("finished shooting %d shot\n",count); + wait(5); + servo.pulsewidth_us(theta_0); + motor_shoot.output(load_pwm); + wait(0.15); + motor_shoot.output(0); + shoot_phase_manual = 0; + printf("finished init\n"); + break; + } + } } } \ No newline at end of file