2021 nhk A team
Dependencies: mbed QEI led beep softPWM Servo_softpwm IR2302 lpf
main.cpp
- Committer:
- THtakahiro702286
- Date:
- 2021-10-30
- Revision:
- 30:00a513858a44
- Parent:
- 29:3bd99866801f
- Child:
- 31:ce079259f559
File content as of revision 30:00a513858a44:
//2021/10/23 紐掴むだけ #include "mbed.h" #include "jy901.h" #include "Servo.h" #include "QEI.h" #include "IR2302.h" #include "pin_config.h" #include "control_parameter.h" #include "lpf.h" #include "beep.h" Serial pc(USBTX,USBRX,115200); Beep buzzer(BEEP); JY901 jy(SDA, SCL); //DigitalOut stop(STOP); QEI encoder(QEI1 ,QEI2 ,NC ,100 ,QEI::X4_ENCODING); lpf yAcc(LPF_C_TIME, LPF_A_TIME); lpf zAcc(LPF_C_TIME, LPF_A_TIME); lpf mSp(MOT_C_TIME, MOT_A_TIME); Servo servo[3] = {SERVO1, SERVO2, SERVO3}; IR2302 ir2302(MD_A,MD_B);//梅沢追加 IR2302 Timer setWait,nextWait,jumpWait; AnalogIn ph[3] = {PHOTO1,PHOTO2,PHOTO3}; DigitalOut light[3] = {ROPE1,ROPE2,ROPE3}; DigitalIn ub(USER_BUTTON); DigitalIn ab(PA_15); int main() { int i=0,j=0,k=3,l=0;//0,0,2,0 double acc[3]; //加速度 double abac[3]={0};//初期座標軸での加速度 double angle[3]; float lpfY,lpfZ; //ローパス後の加速度 float lpfM; //モータのローパス jy.calibrateAll(50); int nowPalse; float phI[3] = {0};//フォトインタラプタ bool rope = 0; bool setFlag = 1;//1 bool firstFlag = 0;//0 bool secondFlag= 0;//0 bool thirdFlag = 0;//0 bool swingFlag = 1;//1 bool flyFlag = 0;//0 bool catchFlag = 0;//0 int8_t way = 1;//1or-1 bool resetFlag = 0;//0 float fiveYAcc[5]={0}; float servoAngle[3]; float motor=0; for(int i=0;i < 3; i++)servo[i].calibrate(0.00095, 90); servoAngle[0] = 0.2; servoAngle[1] = 0.2; servoAngle[2] = 0.8; for(i=0;i<3;i++) servo[i].write(servoAngle[i]); for(i=0; i<3; i++) light[i] = true; ub.mode(PullDown); while(1) { //センシング /* //jy901 acc[1] = jy.getYaxisAcceleration()*10; acc[2] = jy.getZaxisAcceleration()*10; angle[0] = jy.getXaxisAngle(); angle[1] = jy.getYaxisAngle(); angle[2] = jy.getZaxisAngle(); for(i=0; i<3; i++) { if(acc[i] > 1567)acc[i] -= 3134; } abac[1] = acc[1]*cos(angle[0]/180.0*PI) - acc[2] * sin(angle[0]/180.0*PI); abac[2] = acc[2]*cos(angle[0]/180.0*PI) + acc[1] * sin(angle[0]/180.0*PI); //ローパスフィルタ lpfY = yAcc.path_value(abac[1]); lpfZ = zAcc.path_value(abac[2]); //swingで使うやつ fiveYAcc[j%5]= lpfY; j++; */ //ロータリーエンコーダ 向き変ったので-1掛け nowPalse = encoder.getPulses() * -1; //紐センサ for(i=0; i<3; i++) phI[i]=ph[i]; //処理部 //セッティング if(setFlag) { if(!ub && !ab) motor=0.25; else if(ab && ub) motor=-0.25; else if(!ab && ub) motor=0; else if(!ub && ab) { setFlag = 0; firstFlag = 1; buzzer.beep(3000,1.0); wait(5); buzzer.nobeep(); } } //加速1段目 if(firstFlag) { motor = FIRST_POWER * way * swingFlag; //振り子を振る、wayで反転を制御 motor = mSp.path_value(motor); if(nowPalse * way > FURIKO_STOP_LINE) //エンコーダーの値が一定以上なら(少し間をおいて)反転 { way *= -1; nextWait.start(); setWait.start(); swingFlag = 0; if(nextWait > SECOND_LINE) //一定時間経過したらsecondに移行 { firstFlag = 0; secondFlag = 1; swingFlag = 0; nextWait.stop(); nextWait.reset(); } } if(setWait > FIRST_WAIT) { setWait.stop(); setWait.reset(); swingFlag = 1; } } //加速2段目 if(secondFlag) { motor = SECOND_POWER * way * swingFlag; //振り子を振る、wayで反転を制御 nextWait.start(); if(nowPalse * way > FURIKO_STOP_LINE) //エンコーダーの値が一定以上なら(少し間をおいて)反転 { way *= -1; setWait.start(); swingFlag = 0; if(nextWait > THIRD_LINE) //一定時間経過したらthirdに移行 { secondFlag = 0; thirdFlag = 1; swingFlag = 0; nextWait.stop(); nextWait.reset(); } } if(setWait > SECOND_WAIT) { setWait.stop(); setWait.reset(); swingFlag = 1; } } //加速3段目 if(thirdFlag) { jumpWait.start(); motor = THIRD_POWER * way * swingFlag; //振り子を振る、wayで反転を制御 if(nowPalse * way > FURIKO_STOP_LINE) //エンコーダーの値が一定以上なら(少し間をおいて)反転 { way *= -1; nextWait.start(); setWait.start(); swingFlag = 0; } if(setWait > THIRD_WAIT) { setWait.stop(); setWait.reset(); swingFlag = 1; } if((jumpWait > JUMP_TIME) && (nowPalse < JUMP_LINE) && (nowPalse > JUMP_LINE-10) && (way == -1)) //一定時間たったら前に飛ぶ { flyFlag = 1; thirdFlag = 0; } } //ジャンプ if(flyFlag) { // if(lpfZ < RELEASE_LINE) { servoAngle[(k-1)%3] = 0.1;//サーボ離す servoAngle[k%3] = 0.7; // l++; l=1; flyFlag = 0; catchFlag=1; } motor=0; } //キャッチ if(catchFlag) { if(phI[k%3] < ROPE_ACRROS[k%3]) { catchFlag=0; motor = 0; resetFlag=1; k++; } } //掴んだ後 if(resetFlag) { if(nowPalse < NEXT_PALSE * l) { motor=0.35; } else { motor=0; resetFlag = 0; // firstFlag = 1; } } //実験用記述----------- /* if(flyFlag) { // if(lpfZ < RELEASELINE) { for(i=0; i < 3; i++) servoAngle[i] = -1.0;//サーボ離す // k++; flyFlag = 0; } motor=0; } */ /* for(i=0; i<3; i++) { if(phI[i] < ROPE_ACRROS[i]) servoAngle[i] = -0.8; } */ /* if(phI[k%3] < ROPE_ACRROS[k%3]) { servoAngle[k%3] = 0.85; servoAngle[(k+1)%3] = 0.4; k++; } */ // if(!b) motor=0.3; // else motor=0; //------------------- //駆動系 //サーボ for(i=0;i<3;i++) servo[i].write(servoAngle[i]); //モーター ir2302.SetMotorSpeed(motor); //表示系 // pc.printf("%.2f,%.2f,%.2f",angle[0],angle[1],angle[2]); pc.printf("%.2f,%.2f,%.2f,",servoAngle[0],servoAngle[1],servoAngle[2]); pc.printf("%.4f,",motor); // pc.printf("%.2f,%.2f,",abac[1],abac[2]); // pc.printf("%.2f,%.2f,",lpfY,lpfZ); // pc.printf("%d,",nowPalse); pc.printf("%d,",setFlag); // pc.printf("%d,",resetFlag); // pc.printf("%.2f,",lpfM); // pc.printf("%.3f,%.3f,%.3f,",phI[0],phI[1],phI[2]); // pc.printf("%d,",k); pc.printf("\r\n"); } }