Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed Servo LPS25HB_I2C MPU6050 SDFileSystem
Revision 4:ec40fbfb90f6, committed 2022-02-28
- Comitter:
- kosukesuzuki
- Date:
- Mon Feb 28 09:45:43 2022 +0000
- Parent:
- 3:14b178724982
- Commit message:
- a
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/main.cpp Fri Feb 25 06:06:57 2022 +0000
+++ b/main.cpp Mon Feb 28 09:45:43 2022 +0000
@@ -7,13 +7,17 @@
const double dt = 0.01; //微小時間(変更)
-const double Kp =5; //変更
-const double Ki =3; //変更
-const double Kd =3; //変更
+const double Kp =11; //変更
+const double Ki =7; //変更
+const double Kd =5; //変更
+
+const double k =0.25; //プロペラの定数(適当に置いたやつ)
-const double mc = 1995; //最大トルク(変更)
+const double mc = 3000; //最大トルク(変更)
-const double T =0; //目標角度°(変更)
+const double T = 0; //目標角度°(変更)
+
+DigitalOut led[]={LED1,LED2,LED3,LED4};
I2C i2c(p28,p27);
LPS ps(i2c);
@@ -22,15 +26,13 @@
Serial xbee(p13,p14);
Serial pc(USBTX,USBRX);
-Servo motor1(p21);
-Servo motor2(p22);
-Servo motor3(p23);
-Servo motor4(p24);
+Servo myservo1(p21);
+Servo myservo2(p22);
+Servo myservo3(p23);
+Servo myservo4(p24);
Timer ti;
-int cmd = xbee.getc();
-
int gyro[3];
int accel[3];
@@ -38,21 +40,31 @@
double GX,GY,GZ;
double Tgx,Tgy,Tgz;
-
+int cmd;
int main() {
+ xbee.printf("motor start\r\n");
+ led[0]=1;
//モーター準備開始(一時待つ事が必要)
- motor1 = motor2 = motor3 = motor4 = 0.0;
- wait(0.5);
- motor1 = motor2 = motor3 = motor4 = 1.0;
+ myservo1 = myservo2 = myservo3 = myservo4 = 0.0;
+ wait(0.5);
+ myservo1 = myservo2 = myservo3 = myservo4 = 1.0;
wait(8);
- motor1 = motor2 = motor3 = motor4 = 0.0;
+ myservo1 = myservo2 = myservo3 = myservo4 = 0.0;
wait(8);
+ xbee.printf("motor end\r\n");
//モーター準備終了
- //pcのxbeeからのコマンド「c」で開始
- if(cmd = 'c'){
+ led[1]=1;
+ //約5秒で開始
+ wait(5);
+ wait(1.0);
+ led[0]=1;
+ wait(1.0);
+ led[0]=0;
+
+ led[1]=0;
xbee.printf("start\r\n");
pc.printf("start\r\n");
@@ -74,7 +86,6 @@
ti.start();
while(1){
-
if(fp == NULL) {
error("Could not open file for write\n");
}
@@ -83,8 +94,8 @@
//角度算出
mpu.readGyroData(gyro);
int gx = gyro[0]+3656-3505-50-1850+2223-24; //変更
- int gy = gyro[1]-30+710-140-300+375-50; //変更
- int gz = gyro[2]+5+195-453+300-244-20-10; //変更
+ int gy = gyro[1]-30+710-140-300+375-50-420+255; //変更
+ int gz = gyro[2]+5+195-453+300-244-20-10+95+72; //変更
//printf("%d %d %d\r\n",gx,gy,gz);
double gX = gx*0.02562; //0.0128114995(測定レンジ±500) //変更
@@ -142,7 +153,7 @@
float AX = ax*0.000597964111328125; //変更
float AY = ay*0.000597964111328125; //変更
float AZ = az*0.000597964111328125; //変更
- double a = AX*AX+AY*AY+AZ*AZ-95.982071137936;
+ double ad = AX*AX+AY*AY+AZ*AZ-95.982071137936;
//気圧・標高・温度算出
@@ -158,47 +169,48 @@
f1 = T - GX;
f2 = T - GY;
- c1 = Kp*f1+Ki*f1*dt+Kd*gX1; //トルク
- c2 = Kp*f2+Ki*f2*dt+Kd*gY1;
+ c1 = Kp*f1+Ki*f1*dt-Kd*gX1; //トルク
+ c2 = Kp*f2+Ki*f2*dt-Kd*gY1;
//printf("%.2f %.2f\r\n",c1,c2); //トルク
//回転トルク→duty比を算出
double d1,d2;
d1 = c1/mc;
d2 = c2/mc;
-
+
+
+ //
if(d1 > 0.9){ //変更
d1 = 0.9; //変更
}
if(d2 > 0.9){ //変更
d2 = 0.9; //変更
}
- //printf("%.2f %.2f\r\n",d1,d2); //duty比
-
-
+ printf("%.2f %.2f\r\n",d1,d2); //duty比
+
//試行回数
count = count + 1;
-
+
//duty比からmotorを動かす。
if(GX > 0){
- motor1 = abs(d1);
- motor2 = 0.5-abs(d1)/2; //変更
- }else if(c1 < 0){
- motor2 = abs(d1);
- motor1 = 0.5-abs(d1)/2; //変更
- }else{
- motor1 = motor2 = 0;
- }
+ myservo1 = abs(d1);
+ myservo2 = abs(d1)*k;
+ }else if(GX < 0){
+ myservo2 = abs(d1);
+ myservo1 = abs(d1)*k;
+ }else{
+ myservo1 = myservo2 = 0.025;
+ }
- if(GX > 0){
- motor3 = abs(d2);
- motor4 = 0.5-abs(d2)/2; //変更
- }else if(c2 < 0){
- motor4 = abs(d2);
- motor3 = 0.5-abs(d2)/2; //変更
- }else{
- motor3 = motor4 = 0;
- }
+ if(GY > 0){
+ myservo3 = abs(d2);
+ myservo4 = abs(d2)*k;
+ }else if(GY < 0){
+ myservo4 = abs(d2);
+ myservo3 = abs(d2)*k;
+ }else{
+ myservo3 = myservo4 = 0.025;
+ }
/*主なセンサー表示
pc.printf("T %.2f\r\n",ti.read());
@@ -208,22 +220,26 @@
pc.printf("p%.2f alt%.2f t%.2f\r\n",pres,altit,tempe);
*/
- pc.printf("c%d, T%.2f, ax%.2f,ay%.2f,az%.2f,|a|%.2f, gx%.2f,gy%.2f,gz%.2f, p%.2f,al%.2f,t%.2f\r\n",count,ti.read(),AX,AY,AZ,a,GX,GY,GZ,pres,altit,tempe);
- xbee.printf("%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f\r\n",AX,AY,AZ,a,GX,GY,GZ,pres,altit,tempe);
- fprintf(fp, "%d %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f\r\n",count,ti.read(),AX,AY,AZ,a,GX,GY,GZ,pres,altit,tempe,c1,c2,d1,d2);
+ //pc.printf("c%d, T%.2f, ax%.2f,ay%.2f,az%.2f,|a|%.2f, gx%.2f,gy%.2f,gz%.2f, p%.2f,al%.2f,t%.2f\r\n",count,ti.read(),AX,AY,AZ,a,GX,GY,GZ,pres,altit,tempe);
+ //xbee.printf("%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f\r\n",AX,AY,AZ,a,GX,GY,GZ,pres,altit,tempe);
+ //fprintf(fp, "%d %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f\r\n",count,ti.read(),AX,AY,AZ,a,GX,GY,GZ,pres,altit,tempe,c1,c2,d1,d2);
//fprintf(fp,"%.2f %.2f %.2f %.2f %.2f\r\n",ti.read(),c1,c2,d1,d2); //調整用
wait(dt);
- if(AZ > 9 && AZ < 11 && a > 8 && a < 11 && 3 < ti.read()){
+/* if(AZ > 9 && AZ < 11 && a > 8 && a < 11 && 5 < ti.read()){
fprintf(fp,"end\r\n");
fclose(fp); //注意:ここまで行わないと、SDカードに保存されない
xbee.printf("end\r\n");
pc.printf("end\r\n");
ti.stop();
- return 0;
+ myservo1 = myservo2 = myservo3 = myservo4 = 0.0;
+ led[2]=1;
+ break;}
+*/
}
- }
- }
-}
\ No newline at end of file
+ //led[1]=0;
+ //led[3]=1;
+
+ }
\ No newline at end of file