ジャパンオープン用のメインプログラム
Dependencies: mbed AQM1602 HMC6352 PID
output.cpp
00001 #include "mbed.h" 00002 #include "extern.h" 00003 00004 //pid&cmps 00005 void PidUpdate(void) 00006 { 00007 cmps_set.cmps = hmc.sample()/10.0; 00008 cmps_set.InputPID = 00009 fmod( 00010 ( 00011 cmps_set.cmps+ 00012 (cmps_set.CmpsDiff 00013 -cmps_set.FrontDeg 00014 -cmps_set.AtkDeg*(sys.TurnAtkBlind==0) 00015 -cmps_set.HoldDeg*(sys.TurnHoldBlind==0) 00016 -cmps_set.GoalDeg*(sys.TurnDriBlind==0) 00017 )+ 00018 7200.0 00019 ), 00020 360.0 00021 );//0<cmps_set.cmps<359.0 00022 pid.setProcessValue(cmps_set.InputPID); 00023 cmps_set.OutputPID = -pid.compute(); 00024 /*if((abs(cmps_set.OutputPID)<PID_OUT_MIN)&&(cmps_set.OutputPID!=0)){ 00025 if(cmps_set.OutputPID>0) cmps_set.OutputPID=PID_OUT_MIN; 00026 else cmps_set.OutputPID=-PID_OUT_MIN; 00027 }*/ 00028 } 00029 void HmcReset(void){ 00030 hmc_reset=HMC_RST; 00031 wait_us(100); 00032 hmc_reset=HMC_RUN; 00033 } 00034 void TurnAttack(void){ 00035 cmps_set.AtkDeg = 30; 00036 } 00037 void DriveTurn(void){ 00038 if(sys.TurnAtkBlind==1) return; 00039 if(sys.TurnStopFlag==1) return; 00040 00041 if( 00042 //(data.ping[L_PING]<data.ping[R_PING])|| 00043 ((data.lnRawOrderLog1[0]==B_SPOT)&&(data.lnRawOrderLog1[1]!=A_SPOT)&&(data.lnRawOrder[0]==LINE_EMPTY)) 00044 ){ 00045 cmps_set.AtkDeg = 150; 00046 if((sys.TurnDriBlind==0)&&(cmps_set.GoalDeg>0)){ 00047 cmps_set.AtkDeg = -cmps_set.GoalDeg*2; 00048 } 00049 } 00050 else if( 00051 //(data.ping[L_PING]>data.ping[R_PING])|| 00052 ((data.lnRawOrderLog1[0]==A_SPOT)&&(data.lnRawOrderLog1[1]!=B_SPOT)&&(data.lnRawOrder[0]==LINE_EMPTY)) 00053 ){ 00054 cmps_set.AtkDeg = -150; 00055 if((sys.TurnDriBlind==0)&&(cmps_set.GoalDeg<0)){ 00056 cmps_set.AtkDeg = cmps_set.GoalDeg*2; 00057 } 00058 } 00059 else{ 00060 cmps_set.AtkDeg = 0; 00061 } 00062 if((sys.TurnDriBlind==0)&&(cmps_set.GoalDeg!=0)){ 00063 Turn_timeout.attach(&TurnSignal, .25); 00064 Turn_stop.attach(&ValidTurn, .5); 00065 } 00066 else{ 00067 Turn_timeout.attach(&TurnSignal, .25); 00068 Turn_stop.attach(&ValidTurn, .5); 00069 } 00070 sys.TurnStopFlag=1; 00071 00072 } 00073 void TurnSignal(void){ 00074 cmps_set.AtkDeg = 0; 00075 } 00076 void ValidTurn(void){ 00077 sys.TurnStopFlag=0; 00078 } 00079 /*void ValidPidUpdate(void){ 00080 if(sys.PidFlag==0){ 00081 sys.PidFlag=1; 00082 } 00083 }*/ 00084 void FaceToFront(void){ 00085 cmps_set.AtkDeg=0; 00086 } 00087 //motor 00088 void ValidTx_motor(void){ 00089 if(sys.MotorFlag==0){ 00090 sys.MotorFlag=1; 00091 } 00092 } 00093 void tx_motor(){//モーターへの送信 00094 array2(MD_1CH*speed[1],MD_2CH*speed[0],MD_3CH*speed[2],MD_4CH*speed[3]);//右後左ド 00095 //array2((1)*speed[1],(1)*speed[0],(-1)*speed[2],(1)*speed[3]);//右後左ドgreen 00096 //array2((1)*speed[1],(1)*speed[0],(1)*speed[2],(-1)*speed[3]);//右後左ドred 00097 motor.printf("%s",StringFIN.c_str()); 00098 } 00099 void move(int vx, int vy, int vs){//三輪オムニの移動(基本の形) 00100 uint8_t i; 00101 double pwm[4] = {0}; 00102 00103 pwm[0] = (double)((vx) + vs); 00104 pwm[1] = (double)((-0.5 * vx) + ((sqrt(3.0) / 2.0) * vy) + vs); 00105 pwm[2] = (double)((-0.5 * vx) + ((-sqrt(3.0) / 2.0) * vy) + vs); 00106 pwm[3] = (sys.dri_pow)*(sys.DribbleFlag)*(sys.DriMotorBlind==0); 00107 00108 for(i = 0; i < 4; i++){ 00109 if(pwm[i] > 100){ 00110 pwm[i] = 100; 00111 } else if(pwm[i] < -100){ 00112 pwm[i] = -100; 00113 } 00114 speed[i] = pwm[i]; 00115 } 00116 } 00117 //solenoid 00118 void DriveSolenoid(void){ 00119 if(sys.KickBlind==1) return; 00120 if(sys.KickStopFlag==1) return; 00121 00122 kicker=1; 00123 sys.KickStopFlag=1; 00124 Solenoid_timeout.attach(&SolenoidSignal, .5); 00125 Kick_stop.attach(&ValidSolenoid, 2.0); 00126 } 00127 void DriveSolenoidJudge(void){ 00128 if(sys.DriBlind==0) return; 00129 if((data.irNotice==IR_CLOSER)&&((data.irPosition==10)||(data.irPosition==11)||(data.irPosition==12))){ 00130 DriveTurn(); 00131 DriveSolenoid(); 00132 } 00133 } 00134 void SolenoidSignal(void){ 00135 kicker=0; 00136 } 00137 void ValidSolenoid(void){ 00138 sys.KickStopFlag=0; 00139 } 00140 //ball 00141 void JudgeBallHold(void){ 00142 if(data.ball==1){ 00143 sys.BallHoldFlag=1; 00144 } 00145 else if(data.ball==0){ 00146 sys.BallHoldFlag=0; 00147 } 00148 sys.BallHoldJudgeFlag=0; 00149 } 00150 //line 00151 void LineLiberate(void){ 00152 LineKeeper = LINE_FREE; 00153 wait_us(10); 00154 LineKeeper = LINE_FIX; 00155 } 00156 //math 00157 uint8_t GetBit(uint8_t n, uint8_t bit){ 00158 return (n>>(bit-1))%2; 00159 }
Generated on Wed Jul 13 2022 02:59:03 by 1.7.2