a
Dependencies: mbed MPU6050 FastPWM
Line_Avoid.cpp
- Committer:
- tokoro
- Date:
- 2021-11-15
- Revision:
- 0:67a3f3de0758
File content as of revision 0:67a3f3de0758:
#include "mbed.h" #include "FastPWM.h" #include "MPU6050.h" Serial pc(USBTX, USBRX); void Line_(); void Line_Print(); AnalogIn Line_Flont(PA_7); AnalogIn Line_Back(PA_5); AnalogIn Line_Right(PA_4); AnalogIn Line_Left(PA_6); MPU6050 mpu(PB_7,PB_6);/////////MPU6050 double Degree; double dt=0.00860; float gx,gy,gz,ax,ay,az; double GZ; double preGZ; Timer MPU6050timer; void MPU6050(); float Kp = 3.06; //3.06 2.26 //PID設定 float Kd = 0.00; //0.58 float Ki = 0.00; //5.03 int Gyro_power = 0; int GyroE ; int GyroE_1; float Line_Flont_Value; float Line_Back_Value; float Line_Right_Value; float Line_Left_Value; float Line_Flont_Judg = 0.4; float Line_Back_Judg = 0.4; float Line_Right_Judg = 0.65; float Line_Left_Judg = 0.65; void Motor_Speed (int Port,int Power); void Motor_Stop (); void Motor_Angle(int Dgree); void Motor_Direction(int Dgree,int Baisepower); double V[4];//行列 double kesu[4][3] = {0.71, 0.71, 0.00, 0.71, -0.71, 0.00, -0.71, -0.71, 0.00, -0.71, 0.71, 0.00, }; double yoso[3] ; float pi = 3.141592; float deg, rad; double Vx, Vy, L; int Baisepower=0; int Directionpower1; int Directionpower2; int Directionpower3; int Directionpower4; FastPWM MotorPWM1(PF_0); FastPWM MotorPWM2(PA_12);//PA_11 PWM出力おかしい FastPWM MotorPWM3(PB_5); FastPWM MotorPWM4(PA_8); DigitalOut Buzzer(PA_1); int main() { MotorPWM1.period_us(5); MotorPWM2.period_us(5); MotorPWM3.period_us(5); MotorPWM4.period_us(5); if(mpu.getID()==0x68){//72 pc.printf("MPU6050 OK"); wait(1); } else { pc.printf("MPU6050 error ID=0x%x\r\n",mpu.getID()); while(1) { } } mpu.start(); while(1) { while(1){ MPU6050(); Line_Flont_Value = Line_Flont.read(); Line_Back_Value = Line_Back.read(); Line_Right_Value = Line_Right.read(); Line_Left_Value = Line_Left.read(); Line_Print(); if(Line_Right_Value > Line_Right_Judg){ Buzzer = 1; while(1){ Motor_Direction(-90,50); wait(0.2); Line_Right_Value = Line_Right.read(); if(Line_Right_Value < Line_Right_Judg){ Buzzer = 0; Motor_Stop(); wait(0.2); break; } } }else if(Line_Left_Value > Line_Left_Judg){ Buzzer = 1; while(1){ Motor_Direction(90,50); wait(0.2); Line_Left_Value = Line_Left.read(); if(Line_Left_Value < Line_Left_Judg){ Buzzer = 0; Motor_Stop(); wait(0.2); break; } } }else if(Line_Flont_Value > Line_Flont_Judg){ Buzzer = 1; while(1){ Motor_Direction(180,50); wait(0.5); Line_Flont_Value = Line_Flont.read(); if(Line_Flont_Value < Line_Flont_Judg){ Buzzer = 0; Motor_Stop(); wait(0.5); break; } } }else if(Line_Back_Value > Line_Back_Judg){ Buzzer = 1; while(1){ Motor_Direction(0,50); wait(0.2); Line_Back_Value = Line_Back.read(); if(Line_Back_Value < Line_Back_Judg){ Buzzer = 0; Motor_Stop(); wait(0.2); break; } } } Motor_Angle(0); //Motor_Stop(); Baisepower=50; Directionpower1=V[0]*Baisepower; Directionpower2=V[1]*Baisepower; Directionpower3=V[2]*Baisepower; Directionpower4=V[3]*Baisepower; Motor_Speed(1,Directionpower1+Gyro_power); Motor_Speed(2,Directionpower2+Gyro_power); Motor_Speed(3,Directionpower3+Gyro_power); Motor_Speed(4,Directionpower4+Gyro_power); } } } void Line_Print(){ printf("Float//"); printf("%2f//",Line_Flont_Value); printf("Back_//"); printf("%2f//",Line_Back_Value); printf("Right//"); printf("%2f//",Line_Right_Value); printf("Left//"); printf("%2f//\r\n",Line_Left_Value); } void Motor_Speed (int Port,int Power){ // モータ速度関数(モーター番号、速度{-100~100}) if(Power>93){ Power=93; }else if(Power<-93){ Power=-93; } float motorPWM=(Power/2)*0.01+0.5; //PWM 0.0~0.5~1.0 回転~停止~回転 if(Port==1){ MotorPWM1.write(motorPWM); }else if(Port==2){ MotorPWM2.write(motorPWM); }else if(Port==3){ MotorPWM3.write(motorPWM); }else if(Port==4){ MotorPWM4.write(motorPWM); } } void Motor_Stop(){ Motor_Speed(1,0); Motor_Speed(2,0); Motor_Speed(3,0); Motor_Speed(4,0); } void Motor_Angle(int Dgree){ V[0] = 0.00; V[1] = 0.00; V[2] = 0.00; V[3] = 0.00; rad = Dgree * pi / 180; Vx = sin(rad); Vy = cos(rad); L = 0.00; yoso[0] = Vx; yoso[1] = Vy; yoso[2] = L; for (int i = 0; i <= 3; i++){ for (int j = 0; j <= 2; j++){ V[i] = V[i] + (yoso[j] * kesu[i][j]); } } } void Motor_Direction(int Dgree,int Baisepower){ Motor_Angle(Dgree); Directionpower1=V[0]*Baisepower; Directionpower2=V[1]*Baisepower; Directionpower3=V[2]*Baisepower; Directionpower4=V[3]*Baisepower; Motor_Speed(1,Directionpower1); Motor_Speed(2,Directionpower2); Motor_Speed(3,Directionpower3); Motor_Speed(4,Directionpower4); } void MPU6050(){ MPU6050timer.stop(); dt=MPU6050timer.read(); mpu.read(&gx,&gy,&gz,&ax,&ay,&az); MPU6050timer.reset(); MPU6050timer.start(); double gz_=gz; GZ=0.97*gz_+0.03*preGZ; if((GZ<=0.95)&&(GZ>=-0.95)){ GZ=0; } Degree+=(preGZ+GZ)*dt/2; preGZ=GZ; //pc.printf("%f\r\n",GZ); }