2
Dependencies: AQM0802A HMC6352 PID Servo mbed
Diff: main.cpp
- Revision:
- 5:dace4f3b6e4a
- Parent:
- 4:f7946508daa8
--- a/main.cpp Tue Mar 03 02:36:28 2015 +0000 +++ b/main.cpp Wed Mar 04 07:01:19 2015 +0000 @@ -53,12 +53,13 @@ Led[0] = 0; Led[1] = !val; - //wait_ms(.25); + wait_ms(1); val = Sensor.read(Address|1, output, num);// IRデータを受信 Led[0] = !val; Led[1] = 0; + wait_ms(1); } void ReceiveFast(uint8_t Address, char kind, char output[],int num){ @@ -75,9 +76,10 @@ **/ bool val; + Led[0] = 0; val = Sensor.read(Address|1,output,num); + wait_ms(1); Led[0] = !val; - Led[1] = 0; } @@ -90,9 +92,8 @@ */ char data_r[3] = {0},data_l[3] = {0}; - ReceiveFast(ADDRESS_R,BALL,data_r,3); - wait_ms(0.5); - ReceiveFast(ADDRESS_L,BALL,data_l,3); + Receive(ADDRESS_R,BALL,data_r,3); + Receive(ADDRESS_L,BALL,data_l,3); if((data_r[0] == 125)||(data_l[0] == 125)){/*ボールを検知しているかチェック*/ if((data_r[0] == 125)&&(data_l[0] == 125)){ @@ -143,7 +144,6 @@ char data_r[3] = {0},data_l[3] = {0}; ReceiveFast(ADDRESS_R,BALL,data_r,3); - wait_ms(0.5); ReceiveFast(ADDRESS_L,BALL,data_l,3); if((data_r[0] == 125)||(data_l[0] == 125)){/*ボールを検知しているかチェック*/ @@ -191,10 +191,10 @@ } -void move(int vr,int vl, double vs ){ +void move(int vr,int vl, double vs ,int Rad){ double pwm[4] = {0}; uint8_t i = 0; - pwm[0] = -vr + vs; + pwm[0] = vr - vs; pwm[1] = 0; pwm[2] = 0; pwm[3] = vl + vs; @@ -207,69 +207,63 @@ } speed[i] = pwm[i]; } + SetRad = Rad; } +void fool (int *Rad, int *Power){ + static int Last_Rad = 0; + static int Last_Vector = 1; + int rad = *Rad; + int Temp; + Temp = Last_Rad % 180; -char LazyBum(unsigned int Rad){//怠け者 -/* - * Radは角度(0~360), - * Lastには過去の角度(0~360) - * - * 最終的には+-90度で表すことになる. - */ -/* - static unsigned int Last;//static付けて宣言すると勝手に0で初期化されるハズ.... - static char Rotation = CW;//CW or CCW - char trans[4] = {1,-1,1,-1}; - unsigned int temp,temp0 ; - - temp = Rad%180; - - if((temp > 70)&&(temp < 110)){ - temp0 = Last%180; - - if((temp0 > 70)&&(temp0 < 110)){ - - if(abs(Rad - Last)<40){{ - - if(Rad<110){ - S555.position(Rad*1.0); - Last = Rad; - Rotation = trans[Rad/110]; - return; + if((Temp>70) &&(Temp<110)){ + Temp = *Rad % 180; + if((Temp>70) &&(Temp<110)){ + Temp = abs(*Rad - Last_Rad); + if(Temp>160){ + Last_Vector = -1 * Last_Vector;//正転逆転切り替え + if(*Rad/180){ + *Rad = Angle[Last_Rad%180] -(Last_Rad - *Rad%180); + *Power = *Power * Last_Vector; + }else{ + *Rad = Angle[Last_Rad%180] -(Last_Rad%180 - *Rad); + *Power = *Power * Last_Vector; } - S555.position((-360+Rad)*1.0); - Last = Rad; - Rotation = 1; - return Rotation; - } - if(Last<110){ - S555.postiton((-360+Rad)*-1.0); - Last = Rad; - Rotation = trans[(90+Rad)/90]; - return Rotation; + Last_Rad = rad; + return; + }else if((Last_Vector+2) == 1){ + /*逆転のまま角度拡張*/ + if(*Rad/180){ + *Rad = -360 + *Rad ; + *Power = *Power * Last_Vector; + }else{ + *Power = *Power * Last_Vector; + } + Last_Rad = rad; + return; + + }else if((Last_Vector+2) == 3){ + /*正転のまま*/ + if(*Rad/180){ + *Rad = -360 + *Rad ; + *Power = *Power * Last_Vector; + }else{ + *Power = *Power * Last_Vector; + Last_Rad = rad; + } + Last_Rad = rad; + return; } - S555.postiton(Rad*-1.0); - Last = Rad; - Rotation = trans[(90+Rad)/90]; - return Rotation; } } - - if(temp < 90){ - S555.position((Rad%90)*1.0); - Rotation = [Rad/90]; - Last = Rad; - return Rotation; - } - S555.position((Rad%90- 180)*1.0); - Last = Rad; - Rotation = [Rad/90]; - return Rotation; - */ - return 0; + /*通常動作*/ + Last_Vector = RadToVector[(*Rad-1)/90]; + *Rad = Angle[*Rad%180]; + *Power = *Power * Last_Vector; + Last_Rad = rad; + } - void IrFrontAction(int *CompassDef , uint8_t IrMemo[],double ReV)//ball 12 or 0 o-clock { @@ -305,7 +299,7 @@ { //止まっとく S555.position(0.0); - move(0,0,ReV); + move(0,0,ReV,0); /*line検知をしないバージョン*/ /* @@ -323,18 +317,18 @@ */ } -double PidUpdate(int CompassDef , double SetAngle) +void PidUpdate(int CompassDef , double SetAngle, double *Pid_up) { int Compass; double inputPID = 0.0; Compass = ((hmc6352.sample() / 10) + 540 - CompassDef) % 360; - + wait_ms(10); pid.setSetPoint((int)((REFERENCE + SetAngle) / 1.0)); inputPID = Compass; pid.setProcessValue(inputPID); - return -(pid.compute()); + *Pid_up = -(pid.compute()); } uint8_t SwRead(){ @@ -371,6 +365,7 @@ void tx_motor(){ array(speed[0],speed[1],speed[3],speed[2]); Motor.printf("%s",StringFIN.c_str()); + S555.position(SetRad); } void SetUp(int *CompassDef){ @@ -389,15 +384,16 @@ Motor.baud(115200); //ボーレート設定 Motor.printf("1F0002F0003F0004F000\r\n"); //モータ停止 Motor.attach(&tx_motor,Serial::TxIrq); //送信空き割り込み(モータ用) - //move(0,0,0);//停止 + S555.calibrate(0.0005, 120.0); S555.position(0.0); //初期位置にセット - + move(0,0,0,0);//停止 + Sensor.frequency(100000); hmc6352.setOpMode(HMC6352_CONTINUOUS, 1, 20); *CompassDef = (hmc6352.sample() / 10); - for(i = 0;i<10;i++){ - ReV = PidUpdate(*CompassDef,0); + for(i = 0;i<15;i++){ + PidUpdate(*CompassDef,0,&ReV); } Lcd.printf("%f\n",ReV); @@ -509,6 +505,14 @@ } if(State == Calibration){ Led[0] = Led[1] = Led[2] = 0; + move(20,20,0,0); + while((State == Calibration)){ + wait_ms(100); + State = SwRead(); + + } + move(0,0,0,0); + /* hmc6352.setCalibrationMode(ENTER); while((State == Calibration)){ State = SwRead(); @@ -516,7 +520,7 @@ hmc6352.setCalibrationMode(EXIT); wait(0.3);//必要 Led[3] = 0; - + */ /*calibration command enter*/ continue; } @@ -540,6 +544,7 @@ /*PID補正move加算値 Revise */ double ReV = 0.0; + int Rad = 0; /*State */ //Direction LineIr = NA;//方位設定奴...エラーでてめんどくさいので後でまたやることにする。 @@ -547,7 +552,7 @@ uint8_t IrChange[13] ={0x01,0x01,0x02,0x02,0x02,0x04, 0x04,0x04,0x08,0x08,0x08,0x01,0x00}; - + int Power = 0; /*関数ポインタ*/ void (*AnotherAction[3])(int *, uint8_t [],double); @@ -571,32 +576,43 @@ Led[0] = 1; /*白線を読んでいないか確認する*/ - /* + LineData = (~Line+0x00) & 0x0F; if(LineData){ - IrNum = IrReceiveFast(); - LineIr = LineData & IrChange[IrNum]; //一箇所でも一致すればlineを検知している. - while(LineIr){ - move(0,0,0);// + //IrNum = IrReceiveFast(); + //LineIr = LineData & IrChange[IrNum]; //一箇所でも一致すればlineを検知している. + while(LineData){ + move(0,0,0,0);// Led[1] = Led[2] = Led[3] = 1; LineData = (~Line+0x00) & 0x0F; - IrNum = IrReceiveFast(); - LineIr = LineData & IrChange[IrNum];//一箇所でも一致すればlineを検知している. + //IrNum = IrReceiveFast(); + wait_ms(10); + //LineIr = LineData & IrChange[IrNum];//一箇所でも一致すればlineを検知している. + } Led[1] = Led[2] = Led[3] = 0; - continue; + //wait(0.02); + } - */ + + Led[2] = 1; IrNum = IrReceive(IrData); - ReV = 0;//PidUpdate(CompassDef ,SetAngle); - move(vr[IrNum],vl[IrNum],ReV); - wait_ms(10); - S555.position(s_deg[IrNum]); + wait_ms(100); + Led[2] = 0; + //PidUpdate(CompassDef ,SetAngle,&ReV); + Led[3] = 1; + Power = 20; + Rad = 359-IrNum*30; + fool(&Rad,&Power); + move(Power,Power,ReV,Rad); + wait_ms(100); + Led[3] = 0; - + Led[2] = 1; + wait_ms(200); - Led[0] = 0; - wait_ms(200); + Led[0] = Led[1] = Led[2] = Led[3] = 0; + } /*