修正済みby皆川

Dependencies:   mbed Servo cansat_integrated_2 BMP180

Dependents:   cansat_integrated_2

Revision:
1:bb89b58cfa0e
Parent:
0:e7b7def631c2
Child:
2:d2cb6b50a8c4
--- a/main.cpp	Thu Oct 21 01:58:35 2021 +0000
+++ b/main.cpp	Wed Oct 27 19:11:01 2021 +0000
@@ -2,33 +2,116 @@
 #include "BMP180.h"
 #include "getGPS.h"
 #include "Servo.h"
-#include "calculate.h"
-#include "MPU9250.h"
+#include "Movement.h"
+#include "direction.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);
+GPS gps(D1,D0);
 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;
 
+//nの階乗を計算する関数
+int fact(int n)
+{
+  int i, result = 1;
+  
+  if(n == 0)
+    return 1;
+  else
+    {
+      for(i = 1;i <= n;i++)
+    {
+      result *= i;
+    } 
+      return result;
+    }
+}
+
+float my_pow(float x, int n)
+{
+  int i;
+  float pow_result = 1;
+ 
+  if(n == 0)
+    return 1;
+  else
+    {
+      for(i = 0;i < n;i++)
+    {
+      pow_result *= x;
+    }
+      return pow_result;
+    }
+}
+
+float my_exp(float x)
+{
+  int i;
+  float result = 0;
+
+
+  for(i = 1;i <= 25; i++)
+    {
+      result += my_pow(x, i) / fact(i);
+    }
+
+  return result + 1;
+}
+
+float my_log(float x)
+{
+  int i;
+  float result1, result2;
+
+  x -= 1;
+  result1 = 0;
+  result2 = 0;
+
+  for(i = 1;i <= 40;i++)
+    {
+      if(i % 2 == 1)
+    result1 += my_pow(x, i) / i;
+      else
+
+    result2 += my_pow(x, i) / i;
+    }
+
+  return result1 - result2;
+}
+   
+//累乗 
+float mypow(float x, float y)
+{
+  return my_exp(y * my_log(x));
+}
+
+//高度計算
+float calculate_h(float dP0FIX,float dp,float dt){
+    float dpow = 1.0/5.256;
+    float dP0 = 1013.25;
+    float a = (dt+(float)273.15)/(float)0.0065;
+    float s = (mypow(dP0/dp,dpow)- mypow(dP0/dP0FIX,dpow))*a - 27;
+    return s;
+    }
+
+//海面気圧計算
+float calculate_dp0(float dp,float dt){
+    float s = dp*mypow(1 - (0.0065*27)/(dt+0.0065*27+273.15),-5.257);
+    return s;
+    }
+    
 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++){
+    
+    int x ,y ,n1 , n2 ;
+    int landing_judgement=0 ;
+    float h,dp,dt,dp0;
+    float a ,b ,dp_ave,dt_ave;
+    
+    bmp180.Initialize(27,BMP180_OSS_ULTRA_LOW_POWER);//27は府大の海抜高度
+    
+    for(int i=0;i<15;i++){
         if(bmp180.ReadData(&dt,&dp)){
             a = a + dp;
             b = b + dt;
@@ -41,7 +124,7 @@
     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);
@@ -72,111 +155,8 @@
     
     //離陸判定後、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;
@@ -185,70 +165,27 @@
     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()
+    land_judgement_1 = 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();
+//中間地点を経由してゴール地点まで自律移動
+direction.walk();
 
-//倒れているときの処理
-wakeup(2)
+return 0;
 
-
-#
 }