修正済みby皆川

Dependencies:   mbed Servo cansat_integrated_2 BMP180

Dependents:   cansat_integrated_2

main.cpp

Committer:
minanao
Date:
2021-10-21
Revision:
0:e7b7def631c2
Child:
1:bb89b58cfa0e

File content as of revision 0:e7b7def631c2:

#include "mbed.h"
#include "BMP180.h"
#include "getGPS.h"
#include "Servo.h"
#include "calculate.h"
#include "MPU9250.h"
#define PIN_SDA D4
#define PIN_SCL D5
#define STOPTIME 1
#define GOTIME 5
#define ROTATETIME 1


Serial xbee(PA_9, PA_10);
GPS gps(PA_2,PA_3);
DigitalOut Nichrome(A6);
BMP180 bmp180(PIN_SDA,PIN_SCL);
MPU9250 mpu9250(D4, D5);
Servo myservo1(D7);    
Servo myservo2(A3);    
Servo myservo3(A1); 
Servo myservo4(D12);
Servo myservo5(D10);
Servo myservo6(A5); 
double bias_la=0,bias_lo=0;

int landing_judgement(){
    bmp180.Initialize(27,0);
    int i,n1,n2,landing_judgement;
    float dt,dp,h,dp0,a,b,dt_ave,dp_ave;
    for(i=0;i<15;i++){
        if(bmp180.ReadData(&dt,&dp)){
            a = a + dp;
            b = b + dt;
            n1 = n1 + 1;
            n2 = n2 + 1;
            wait(1);
            }
        }
    
    dp_ave = a / n1;
    dt_ave = b / n2;    
    dp0 = calculate_dp0(dp_ave,dt_ave);
    int x,y;
    while(x<10){
            if(bmp180.ReadData(&dt,&dp)){
                h = calculate_h(dp0,dp,dt);
                if(h >= 30){
                x = x + 1;
                    }
                wait(1);
            }
    }
    //10秒以上高度30mにいた場合離陸判定
    
    wait(10);
      
    while(y<10){
            if(bmp180.ReadData(&dt,&dp)){
                h = calculate_h(dp0,dp,dt); 
                if(h <= 10){
                y = y + 1;
                    }
                wait(1);
            }
    }
    
    wait(5);
    
    landing_judgement = landing_judgement + 1;
    return landing_judgement;
    
    //離陸判定後、10秒以上高度10m以下にいた場合着地判定
    
}


//止まる
void stop()
    {
        myservo1 = 0.5;
        myservo2 = 0.5;
        myservo3 = 0.5;
        myservo4 = 0.5;
        myservo5 = 0.5;
        myservo6 = 0.5;
        wait(STOPTIME);
    }

//前進
void move_forward()
{
    myservo1 = 0;
    myservo2 = 0;
    myservo3 = 0;
    myservo4 = 0;
    myservo5 = 0;
    myservo6 = 0;
    wait(GOTIME);
}

//後退
void move_backward()
{
    myservo1 = 1;
    myservo2 = 1;
    myservo3 = 1;
    myservo4 = 1;
    myservo5 = 1;
    myservo6 = 1;
    wait(GOTIME);
}

//右に曲がる
void turn_right()
{
    myservo1 = 1;
    myservo2 = 1;
    myservo3 = 1;
    myservo4 = 0;
    myservo5 = 0;
    myservo6 = 0;
    wait(ROTATETIME);
}

//左に曲がる
void turn_left()
{
    myservo1 = 0;
    myservo2 = 0;
    myservo3 = 0;
    myservo4 = 1;
    myservo5 = 1;
    myservo6 = 1;
    wait(ROTATETIME);
}

//倒れているときの処理
void wakeup(int time)
{
    int i;
    for(i=1;i<=time;i++)
    {
    move_forward()
    move_backward()
    turn_right()
    turn_left()
    }
}



float calculation_sita(float x_0,float y_0,float x_1,float y_1,float x,float y){
    //x,yは地磁気センサの値で北の方角の角度を90度、東の方角を0度とする。
    float sita_0 = atan((y_0 - y_1)/(x_0 - x_1));  //目的地の角度
    
    if(y_0 - y_1 > 0 && x_0 - x_1 < 0){
        sita_0 = sita_0 - 180;
    }
    if(y_0 - y_1 < 0 && x_0 - x_1 < 0){
        sita_0 = sita_0 + 180;
    }
    
    float Omag_x=0,Omag_y=0; //地磁気センサのxy平面が描く円の中点
    float sita_1 = atan((y - Omag_y)/(x- Omag_x)); //CanSatの角度 
    
    if(y - Omag_y > 0 && x- Omag_x < 0){
        sita_1 = sita_1 - 180;
    }
    if(y - Omag_y < 0 && x - Omag_x < 0){
        sita_1 = sita_1 + 180;
    }
    float sita
    sita= sita_0 - sita_1;  //CanSatから見た目的地の角度
    return sita
}    
      
    
    
int parachute_separation()
{
        Nichrome=1;
        wait(10);
        Nichrome=0;
    return 0;
    }

int end_flag=0;
double bias_la=0,bias_lo=0;



int main(void)
{   
int land_judgement_1=0,sep_judge=1;
//着地判定
while(1)
{
    land_judgement=landing_judgement()
    if(land_judgement_1==1)
    {
xbee.printf("landing\r\n");  
        break;
    }  
}
wait(30);
//パラシュート切り離し
while(1)
{
    sep_judge==1;
    sep_judge=parachute_separation();
    if(sep_judge==0)
    {
        xbee.printf("did separation\r\n");
        xbee.printf("separation complleted?\ty/n")
        int received_data = xbee.getc();
        if(received_data==89||received_data==121)
        {   
            xbee.printf("separation complieted\n\r");
            break;
        }
        if(received_data==78||received_data==110)
        {   
            xbee.printf("try again now\n\r");
        }
    }
}
//中間座標の取得
double midpoint_latitude,midpoint_longtitude;
xbee.printf("\r\n-----------------------\r\n");
xbee.printf("midpoint latitude:");
xbee.scanf("%lf",&midpoint_latitude);
xbee.printf("\r\nmidpoint longtitude:");
xbee.scanf("%lf",&midpoint_longtitude);
xbee.printf("\r\n-----------------------\r\n");
//倒れているかの判定
int i;
gps
for(i=1;i<=2;i++)
{
    move_forward();
}


move_forward();

//倒れているときの処理
wakeup(2)


#
}