NHK2022Aチームの足回りと機構のセット メインプログラム
Dependencies: FEP_RX22 OmniPosition PID R1370 SerialMultiByte Servo ikarashiMDC_2byte_ver omni_wheel
Diff: main.cpp
- Revision:
- 6:d4b82ba4836a
- Parent:
- 5:885bffdceaa2
- Child:
- 7:778eaeae8128
--- a/main.cpp Sun Oct 09 06:34:58 2022 +0000 +++ b/main.cpp Sun Oct 09 10:17:42 2022 +0000 @@ -18,12 +18,18 @@ uint8_t b[16]; int16_t stick[4]; int16_t trigger[4]; +int16_t volume[3]; +uint8_t toggle[4]; +uint8_t timeout; +uint8_t data[128]; +int pw; double engine[4]; double speed[6]; double spin_power; double posiX , posiY , posiTheta; - -DigitalOut stop(A3); +int TargetAngle = 0; +int StartAngle = 0; +DigitalOut stop(PA_5); ikarashiMDC motor[] = { ikarashiMDC(0,0,SM,&RS485), ikarashiMDC(0,1,SM,&RS485), @@ -55,7 +61,7 @@ angle.setMode(1); angle.setSetPoint(0); while(1){ - stop = 1; + stop = toggle[0]; chassis(); } @@ -63,7 +69,6 @@ void chassis(){ - int TargetAngle = 0; /*ジャイロ読み取り*/ posiX = posi.getX(); @@ -71,40 +76,59 @@ posiTheta = posi.getTheta()*(180.0/M_PI);//OmniPositionライブラリが弧度法で角度をつけていたため60分法に変換 pc.printf("x:%5.2f Y:%5.2f theta:%0.3f | ",posiX, posiY,posiTheta); /*コントローラー受信*/ - for (int i=0; i<16; i++) b[i] = mycon.getButton(i); - for (int i=0; i<4; i++){ - stick[i] = mycon.getStick(i); - trigger[i] = mycon.getTrigger(i); + mycon.getData(data); + for (int i=0, tmp=1; i<8; i++) { + pw = pow((float)2,i); + b[i] = (int)((data[0] & tmp)/pw); + pc.printf("%d ", b[i]); + tmp *= 2; + } + for (int i=8, tmp=1, j=0; i<16; i++, j++) { + pw = pow((float)2,j); + b[i] = (int)((data[1] & tmp)/pw); + pc.printf("%d ", b[i]); + tmp *= 2; + } + pc.printf(" | "); + + for (int i=0; i<4; i++) { + stick[i] = data[i+2]; + pc.printf("%3d ", stick[i]); } - for (int i=0; i<8; i++) pc.printf("%d ", b[i]); + pc.printf(" | "); + + for (int i=0; i<2; i++) { + trigger[i] = data[i+6]; + pc.printf("%3d ", trigger[i]); + } pc.printf(" | "); - for (int i=0; i<4; i++) pc.printf("%3d ", stick[i]); + + for (int i=0; i<3; i++) { + volume[i] = data[i+9]; + pc.printf("%3d ", volume[i]); + } pc.printf(" | "); - for (int i=0; i<4; i++) pc.printf("%3d ", trigger[i]); + + for (int i=0; i<4; i++) { + toggle[i] = data[i+12]; + pc.printf("%d ", toggle[i]); + } + pc.printf(" | "); + + timeout = data[8]; + pc.printf("%3d ", timeout); + pc.printf(" | "); + if(mycon.getStatus()) pc.printf("received\r\n"); else{ pc.printf("anything error...\r\n"); for( int i=0; i<4; i++){ motor[i].setSpeed(0); } } - - /*全方位*/ - for(int i=0; i<4; i++){ - if(abs(stick[i]) > 10){ - if(trigger[1]<10) trigger[1] = 0; - engine[i] = maxSpeed*(stick[i]/128.0)*(trigger[1]/255.0); - }else if(b[i]%2){ - if(trigger[1]<10) trigger[1] = 0; - //b[1]のとき左向き(負)b[3]のとき右向き(正) - engine[0] = maxSpeed*pm(i-2)*(trigger[1]/255.0); - }else if(b[i]%2==0){ - if(trigger[1]<10) trigger[1] = 0; - //b[0]のとき上向き(正)b[2]のとき下向き(負) - engine[1] = -maxSpeed*pm(i-1)*(trigger[1]/255.0); - }else{ - engine[i] = 0; - } + for(int i=0;i<4;i++){ + stick[i] = stick[i] - 128; } + /*PID*/ /*スパゲッティコードで申し訳ないです...*/ if(abs(stick[2]) < 10){/* @@ -167,15 +191,39 @@ else if((posiTheta == i) ||(posiTheta == i+1) ||(posiTheta == i-1)){ } }*/ +// if(fabs(posiTheta)<8){ +// spin(StartAngle); +// } +// if(fabs(TargetAngle-posiTheta)<8){ +// spin(TargetAngle); +// } if(fabs(TargetAngle-posiTheta)>8){ TargetAngle += 15*pm(posiTheta-TargetAngle); if(abs(TargetAngle)==195){//abs(TargetAngle)==180だと永遠にこのif文に捕らわれてしまいそう。 TargetAngle += -360*pm(TargetAngle); } - spin(TargetAngle); } + spin(TargetAngle); } - + /*全方位*/ + for(int i=0; i<4; i++){ + if(abs(stick[i]) > 10){ + if(trigger[1]<10) trigger[1] = 0; + engine[i] = maxSpeed*(stick[i]/128.0)*(trigger[1]/255.0); + }else if(b[i]%2){ + if(trigger[1]<10) trigger[1] = 0; + //b[1]のとき左向き(負)b[3]のとき右向き(正) + engine[0] = maxSpeed*pm(i-2)*(trigger[1]/255.0); + engine[1] = 0; + }else if(b[i]%2==0){ + if(trigger[1]<10) trigger[1] = 0; + //b[0]のとき上向き(正)b[2]のとき下向き(負) + engine[1] = -maxSpeed*pm(i-1)*(trigger[1]/255.0); + engine[0] = 0; + }else{ + engine[i] = 0; + } + } /*旋回*/ if(abs(stick[2]) > 10){ spin_power = engine[2]; @@ -195,7 +243,7 @@ angle.setSetPoint(ang); posiTheta = posi.getTheta()*(180.0/M_PI); angle.setProcessValue(posiTheta); - pc.printf("ang:%.2f pid:%.2f posi:%.2f\r\n",ang,-angle.compute(),posiTheta); + pc.printf("ang:%.2f pid:%.2f posi:%.2f T-p:%.2f\r\n",ang,-angle.compute(),posiTheta,TargetAngle-posiTheta); //for(int i=4; i<12; i++) motor[i].setSpeed(0);射出機構とかのモーターが出てきたときに[//]を消す } int pm(double num){