ジャパンオープン用のメインプログラム
Dependencies: mbed AQM1602 HMC6352 PID
main_processing/strategy_parts/output.cpp
- Committer:
- lilac0112_1
- Date:
- 2016-03-27
- Revision:
- 38:67bc78f3c0ab
- Parent:
- 34:1c86c1299ea4
File content as of revision 38:67bc78f3c0ab:
#include "mbed.h" #include "extern.h" //pid&cmps void PidUpdate(void) { cmps_set.cmps = hmc.sample()/10.0; cmps_set.InputPID = fmod( ( cmps_set.cmps+ (cmps_set.CmpsDiff -cmps_set.FrontDeg -cmps_set.AtkDeg*(sys.TurnAtkBlind==0) -cmps_set.HoldDeg*(sys.TurnHoldBlind==0) -cmps_set.GoalDeg*(sys.TurnDriBlind==0) )+ 7200.0 ), 360.0 );//0<cmps_set.cmps<359.0 pid.setProcessValue(cmps_set.InputPID); cmps_set.OutputPID = -pid.compute(); /*if((abs(cmps_set.OutputPID)<PID_OUT_MIN)&&(cmps_set.OutputPID!=0)){ if(cmps_set.OutputPID>0) cmps_set.OutputPID=PID_OUT_MIN; else cmps_set.OutputPID=-PID_OUT_MIN; }*/ } void HmcReset(void){ hmc_reset=HMC_RST; wait_us(100); hmc_reset=HMC_RUN; } void TurnAttack(void){ cmps_set.AtkDeg = 30; } void DriveTurn(void){ if(sys.TurnAtkBlind==1) return; if(sys.TurnStopFlag==1) return; if( //(data.ping[L_PING]<data.ping[R_PING])|| ((data.lnRawOrderLog1[0]==B_SPOT)&&(data.lnRawOrderLog1[1]!=A_SPOT)&&(data.lnRawOrder[0]==LINE_EMPTY)) ){ cmps_set.AtkDeg = 150; if((sys.TurnDriBlind==0)&&(cmps_set.GoalDeg>0)){ cmps_set.AtkDeg = -cmps_set.GoalDeg*2; } } else if( //(data.ping[L_PING]>data.ping[R_PING])|| ((data.lnRawOrderLog1[0]==A_SPOT)&&(data.lnRawOrderLog1[1]!=B_SPOT)&&(data.lnRawOrder[0]==LINE_EMPTY)) ){ cmps_set.AtkDeg = -150; if((sys.TurnDriBlind==0)&&(cmps_set.GoalDeg<0)){ cmps_set.AtkDeg = cmps_set.GoalDeg*2; } } else{ cmps_set.AtkDeg = 0; } if((sys.TurnDriBlind==0)&&(cmps_set.GoalDeg!=0)){ Turn_timeout.attach(&TurnSignal, .25); Turn_stop.attach(&ValidTurn, .5); } else{ Turn_timeout.attach(&TurnSignal, .25); Turn_stop.attach(&ValidTurn, .5); } sys.TurnStopFlag=1; } void TurnSignal(void){ cmps_set.AtkDeg = 0; } void ValidTurn(void){ sys.TurnStopFlag=0; } /*void ValidPidUpdate(void){ if(sys.PidFlag==0){ sys.PidFlag=1; } }*/ void FaceToFront(void){ cmps_set.AtkDeg=0; } //motor void ValidTx_motor(void){ if(sys.MotorFlag==0){ sys.MotorFlag=1; } } void tx_motor(){//モーターへの送信 array2(MD_1CH*speed[1],MD_2CH*speed[0],MD_3CH*speed[2],MD_4CH*speed[3]);//右後左ド //array2((1)*speed[1],(1)*speed[0],(-1)*speed[2],(1)*speed[3]);//右後左ドgreen //array2((1)*speed[1],(1)*speed[0],(1)*speed[2],(-1)*speed[3]);//右後左ドred motor.printf("%s",StringFIN.c_str()); } void move(int vx, int vy, int vs){//三輪オムニの移動(基本の形) uint8_t i; double pwm[4] = {0}; pwm[0] = (double)((vx) + vs); pwm[1] = (double)((-0.5 * vx) + ((sqrt(3.0) / 2.0) * vy) + vs); pwm[2] = (double)((-0.5 * vx) + ((-sqrt(3.0) / 2.0) * vy) + vs); pwm[3] = (sys.dri_pow)*(sys.DribbleFlag)*(sys.DriMotorBlind==0); for(i = 0; i < 4; i++){ if(pwm[i] > 100){ pwm[i] = 100; } else if(pwm[i] < -100){ pwm[i] = -100; } speed[i] = pwm[i]; } } //solenoid void DriveSolenoid(void){ if(sys.KickBlind==1) return; if(sys.KickStopFlag==1) return; kicker=1; sys.KickStopFlag=1; Solenoid_timeout.attach(&SolenoidSignal, .5); Kick_stop.attach(&ValidSolenoid, 2.0); } void DriveSolenoidJudge(void){ if(sys.DriBlind==0) return; if((data.irNotice==IR_CLOSER)&&((data.irPosition==10)||(data.irPosition==11)||(data.irPosition==12))){ DriveTurn(); DriveSolenoid(); } } void SolenoidSignal(void){ kicker=0; } void ValidSolenoid(void){ sys.KickStopFlag=0; } //ball void JudgeBallHold(void){ if(data.ball==1){ sys.BallHoldFlag=1; } else if(data.ball==0){ sys.BallHoldFlag=0; } sys.BallHoldJudgeFlag=0; } //line void LineLiberate(void){ LineKeeper = LINE_FREE; wait_us(10); LineKeeper = LINE_FIX; } //math uint8_t GetBit(uint8_t n, uint8_t bit){ return (n>>(bit-1))%2; }