フライトモードのプログラム 発射判定,頂点判定,高度判定の順に行う

Dependencies:   MPU6050 MS5607 SDFileSystem mbed

main.cpp

Committer:
RyotaNakamura
Date:
2017-02-19
Revision:
0:266e722e382f

File content as of revision 0:266e722e382f:

#include "mbed.h"
//#include "MS5607SPI.h"
#include "MS5607I2C.h"
#include "MPU6050.h"
#include "SDFileSystem.h"
#define ON  1
#define OFF 0
#define acc 16384
#define TBD1 0.95             //TBDは適当に設定
#define TBD2 10
#define TBD3 0.98
#define TBD4 15
#define TBD5 5
#define TBD6 20
#define TBD7 8

//MS5607SPI ms5607(p11, p12, p13, p3);
MS5607I2C ms5607(p9,p10, false);
MPU6050 mpu(p9,p10);
SDFileSystem sd(p5,p6,p7,p8,"sd");
PwmOut servo1(p21);           //パラシュート開放用servo
PwmOut servo2(p22);
PwmOut servo3(p23);           //CanSat開放用servo
PwmOut servo4(p24);        
Serial pc(USBTX, USBRX);
FILE*fp;
Timer timer1,timer2,timer3;
Ticker ticker;
double decision1,decision2,decision3;
double time1,time2,time3;

float a[3];
float g[3];
float Pre=ms5607.getPressure();
float Tem=ms5607.getTemperature();
float Alt = ms5607.getAltitude();

void dateWriting()
{
    fp=fopen("Fright_date.txt","a");

    mpu.getAccelero(a);
    mpu.getGyro(g);

    fprintf(fp,"%f,%f,%f,%f,%f,%f,%f,%f,%f\r\n",a[0],a[1],a[2],g[0],g[1],g[2],Pre,Tem,Alt);

    fclose(fp);
}

int main()
{
    fp=fopen("Fright_date.txt","a");

    if(fp==NULL) {
        pc.printf("Open Failed!\n");
    } else {
        pc.printf("Open Success!\n");
    }

    pc.printf("Start!\n");

    fprintf(fp,"加速度x,加速度y,加速度z,ジャイロx,ジャイロy,ジャイロz,気圧[Pa],温度[degC],高度[m]\r\n");

    servo1.period_ms(20);
    servo2.period_ms(20);                   //パルス周期=20ms
    servo3.period_ms(20);
    servo4.period_ms(20);

    //SG90の動作パルス幅は50µs~2400µs(0度~180度)
    servo1.pulsewidth(0.0005);
    servo2.pulsewidth(0.0005);
    servo3.pulsewidth(0.0005);
    servo4.pulsewidth(0.0005);

    while(decision1<0.9) {                  //取得加速度の9割がTBD3より大きければループを抜ける
        mpu.setAcceleroRange(0);            //変数初期化
        mpu.setGyroRange(0);

        while(a[2]<TBD1) {
            ticker.attach(&dateWriting, 0.1);
        }

        /*************************発射判定ループ開始*************************/

        while(time1<TBD2) {
            int i,counter1=0;
            float az[i];                                  //取得加速度を格納する配列要素
            for(i=0; i<=20; i++) {                        //条件式はTBD2により決定
                timer1.start();
                ticker.attach(&dateWriting, 0.1);         //タイマー割込み
                az[i]=a[2];                     
                if(az[i]>TBD3) {
                    counter1++;                           //取得加速度がTBD3より大きければプラス1
                }
                timer1.stop();
                time1=timer1.read();
            }
            decision1=counter1/(i+1);                     //(TBD3より大きい取得加速度の数)÷(取得加速度の総数)
        }
    }

    while(decision2<0.9) {                                //取得高度の9割が下降を検知すればループを抜ける
        int j=0;
        float alt1[j];                                    //取得高度を各格納する配列要素
        
        while(j>0&&alt1[j]>alt1[j-1]) {
            ticker.attach(&dateWriting, 0.1);             //タイマー割込み
            alt1[j]=Alt;      
            j++; 
        }

        /*************************頂点判定ループ開始*************************/

        while(time2<TBD4) {
            int k,counter2=0;
            float alt2[k];                                //取得高度を格納する配列要素
            for(k=0; k<=20; k++) {                        //条件式はTBD4により決定
                timer2.start();
                ticker.attach(&dateWriting, 0.1);         //タイマー割込み
                alt2[k]=Alt;
                if(k>0&&alt2[k]<alt2[k-1]) {
                    counter2++;                           //下降検知をすればプラス1
                }
                timer2.stop();
                time2=timer2.read();
            }
            decision2=counter2/(k+1);                     //(下降検知した回数)÷(取得高度の総数)
        }
    }

    wait(0.1);
    servo1.pulsewidth(0.0015);                            //CanSat開放用servo                    
    servo2.pulsewidth(0.0015);
    
    while(decision3<0.6) {                                //取得高度の6割が初期高度+TBD5以下ならばループを抜ける
        int m=0;
        float alt3[m];                                    //取得高度を格納する配列要素
        float datum1=alt3[m]+TBD5;
        
        while(alt3[0]>datum1) {
            ticker.attach(&dateWriting, 0.1);             //タイマー割込み
            alt3[m]=Alt;
            m++;
        }

        /*************************高度判定ループ開始*************************/

        while(time3<TBD6) {
            int n,counter3=0;
            float alt4[n],datum2=alt4[n]+TBD7;
            for(n=0; n<=20; n++) {                        //条件式はTBD6により決定
                timer3.start();
                ticker.attach(&dateWriting, 0.1);         //タイマー割込み
                alt4[n]=Alt;
                if(alt4[n]<=datum2) {
                    counter3++;                           //取得高度の6割が初期高度+TBD5以下ならばプラス1
                }
                timer3.stop();
                time3=timer3.read();
            }
            decision3=counter3/(n+1);                     //(取得高度のうち初期高度+TBD5以下の数)÷(取得高度の総数)
        }
    }

    wait(0.1);
    servo3.pulsewidth(0.0015);                            //CanSat開放(servo角度を90度に設定)
    servo4.pulsewidth(0.0015);

    pc.printf("Finish!\n");
}