This program is for the prototype measurement circuit of UAV.

Dependencies:   test_BMX055

Files at this revision

API Documentation at this revision

Comitter:
Joeatsumi
Date:
Sat Jul 25 11:06:13 2020 +0000
Commit message:
This program is for the prototype measurement circuit of UAV.; The circuit consisted of mbed LPC1768 ,BMX055,BME280 and microSD slot.

Changed in this revision

.gitignore Show annotated file Show diff for this revision Revisions of this file
CONTRIBUTING.md Show annotated file Show diff for this revision Revisions of this file
README.md Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed-os.lib Show annotated file Show diff for this revision Revisions of this file
mbed_app.json Show annotated file Show diff for this revision Revisions of this file
resources/official_armmbed_example_badge.png Show annotated file Show diff for this revision Revisions of this file
test_BMX055.lib Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.gitignore	Sat Jul 25 11:06:13 2020 +0000
@@ -0,0 +1,4 @@
+.build
+.mbed
+projectfiles
+*.py*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CONTRIBUTING.md	Sat Jul 25 11:06:13 2020 +0000
@@ -0,0 +1,5 @@
+# Contributing to Mbed OS
+
+Mbed OS is an open-source, device software platform for the Internet of Things. Contributions are an important part of the platform, and our goal is to make it as simple as possible to become a contributor.
+
+To encourage productive collaboration, as well as robust, consistent and maintainable code, we have a set of guidelines for [contributing to Mbed OS](https://os.mbed.com/docs/mbed-os/latest/contributing/index.html).
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/README.md	Sat Jul 25 11:06:13 2020 +0000
@@ -0,0 +1,64 @@
+![](./resources/official_armmbed_example_badge.png)
+# Blinky Mbed OS example
+
+The example project is part of the [Arm Mbed OS Official Examples](https://os.mbed.com/code/) and is the [getting started example for Mbed OS](https://os.mbed.com/docs/mbed-os/v5.14/quick-start/index.html). It contains an application that repeatedly blinks an LED on supported [Mbed boards](https://os.mbed.com/platforms/).
+
+You can build the project with all supported [Mbed OS build tools](https://os.mbed.com/docs/mbed-os/latest/tools/index.html). However, this example project specifically refers to the command-line interface tool [Arm Mbed CLI](https://github.com/ARMmbed/mbed-cli#installing-mbed-cli).
+(Note: To see a rendered example you can import into the Arm Online Compiler, please see our [import quick start](https://os.mbed.com/docs/mbed-os/latest/quick-start/online-with-the-online-compiler.html#importing-the-code).)
+
+1. [Install Mbed CLI](https://os.mbed.com/docs/mbed-os/latest/quick-start/offline-with-mbed-cli.html).
+
+1. Clone this repository on your system, and change the current directory to where the project was cloned:
+
+    ```bash
+    $ git clone git@github.com:armmbed/mbed-os-example-blinky && cd mbed-os-example-blinky
+    ```
+
+    Alternatively, you can download the example project with Arm Mbed CLI using the `import` subcommand:
+
+    ```bash
+    $ mbed import mbed-os-example-blinky && cd mbed-os-example-blinky
+    ```
+
+
+## Application functionality
+
+The `main()` function is the single thread in the application. It toggles the state of a digital output connected to an LED on the board.
+
+## Building and running
+
+1. Connect a USB cable between the USB port on the board and the host computer.
+2. <a name="build_cmd"></a> Run the following command to build the example project and program the microcontroller flash memory:
+    ```bash
+    $ mbed compile -m <TARGET> -t <TOOLCHAIN> --flash
+    ```
+The binary is located at `./BUILD/<TARGET>/<TOOLCHAIN>/mbed-os-example-blinky.bin`.
+
+Alternatively, you can manually copy the binary to the board, which you mount on the host computer over USB.
+
+Depending on the target, you can build the example project with the `GCC_ARM`, `ARM` or `IAR` toolchain. After installing Arm Mbed CLI, run the command below to determine which toolchain supports your target:
+
+```bash
+$ mbed compile -S
+```
+
+## Expected output
+The LED on your target turns on and off every 500 milliseconds.
+
+
+## Troubleshooting
+If you have problems, you can review the [documentation](https://os.mbed.com/docs/latest/tutorials/debugging.html) for suggestions on what could be wrong and how to fix it.
+
+## Related Links
+
+* [Mbed OS Stats API](https://os.mbed.com/docs/latest/apis/mbed-statistics.html).
+* [Mbed OS Configuration](https://os.mbed.com/docs/latest/reference/configuration.html).
+* [Mbed OS Serial Communication](https://os.mbed.com/docs/latest/tutorials/serial-communication.html).
+* [Mbed OS bare metal](https://os.mbed.com/docs/mbed-os/latest/reference/mbed-os-bare-metal.html).
+* [Mbed boards](https://os.mbed.com/platforms/).
+
+### License and contributions
+
+The software is provided under Apache-2.0 license. Contributions to this project are accepted under the same license. Please see contributing.md for more info.
+
+This project contains code from other projects. The original license text is included in those source files. They must comply with our license guide.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sat Jul 25 11:06:13 2020 +0000
@@ -0,0 +1,723 @@
+//==================================================
+//Auto pilot(prototype3)
+//
+//MPU board: mbed LPC1768
+//Multiplexer TC74HC157AP
+//Accelerometer +Gyro sensor : BMX055
+//Pressure sensor BME280
+//GPS module AE-GPS
+//
+//2020/7/24 A.Toda
+//mbed os5を使用して、9軸センサとGPS,
+//気圧センサのログを取得する。
+//姿勢計算や機体制御は行わない
+//==================================================
+
+#include "mbed.h"
+
+#include "stdio.h"
+#include "math.h"
+#include "errno.h"
+#include "ctype.h"
+
+// Entry point for the example
+#include "SDBlockDevice.h"
+#include "FATFileSystem.h"
+
+//Header file for pressure sensor
+#include "BME280.h"
+
+//Header file for inertial sensor
+#include "test_BMX055.h"
+
+Mutex stdio_mutex;
+EventQueue queue1(32 * EVENTS_EVENT_SIZE);
+
+EventQueue queue2(32 * EVENTS_EVENT_SIZE);
+
+EventQueue queue3(32 * EVENTS_EVENT_SIZE);
+//==================================================
+
+#define INITIAL_ALTITUDE 0.0
+#define DIGIT_TO_VAL(_x)        (_x - '0')
+#define RAD_TO_DEG 57.3
+
+#define MAG_OFFSET_X 0.0
+#define MAG_OFFSET_Y 0.0
+#define MAG_OFFSET_Z 0.0
+
+#define GRAVITY 9.80665
+//==================================================
+//Port Setting
+DigitalOut myled(LED1);
+
+I2C         i2c( p9, p10 );
+
+test_BMX055 inertial_sensor(i2c,(0x76 << 1));//(sda, scl);
+
+Serial pc(USBTX, USBRX); // tx, rx
+Serial gps(p13,p14);//tx,rx
+
+SDBlockDevice   blockDevice(p5, p6, p7, p8);  // mosi, miso, sck, cs
+
+DigitalIn gps_sw(p11);
+
+DigitalIn sd_switch(p12);
+
+//=========================================================
+//Ticker
+Ticker timer1; //for gps notification
+Ticker timer2; //for attitude calculation
+
+//Timer
+Timer passed_time;
+int dummy_counter;
+//==================================================
+//Timer variables
+//==================================================
+float time_new,time_old,time_gps_nof;
+float feedback_rate = 10000; //usec
+
+//==================================================
+//Vetor variables
+float quaternion[4][1],pre_quaternion[4][1],damp_1[4][1];//クォータニオン
+
+//==================================================
+//GPS variables
+//==================================================
+int fp_count=0;
+int h_time=0,m_time=0,s_time=0;
+
+int notification_from_sub;
+
+float g_hokui,g_tokei;
+float gps_azi;
+float speed_m;
+
+//==================================================
+//Pressure variables
+//==================================================
+float pressure_1,temperature_1;
+float altitude_1,altitude_offset;
+
+//==================================================
+//Inertial sonsor  variables
+//==================================================
+float gx,gy,gz;
+float ax,ay,az;
+
+float gx_mean,gy_mean,gz_mean;
+int mean_counter=2000;
+
+float limit_acc;
+
+float euler_roll_pitch[2];
+
+//==================================================
+//Geomagnetrometer  variables
+//==================================================
+float mx,my,mz;
+float yaw;
+
+//==================================================
+//Predeclaration for functions
+//==================================================
+
+void gps_receiver();
+void gps_receiver_2();
+void gps_receiver_3();
+
+void gps_notification();
+void inertial_sensor_function();
+
+float get_altitude(float offset);
+
+int gyro_float2int(float gyro_data);
+int acc_float2int(float acc_data);
+//=========================================================
+//SD file 
+//=========================================================
+// File system declaration
+FATFileSystem   fileSystem("fs");
+int err;
+int sd_flag;
+
+
+int TimeIndex[1] = {0};
+char Six_axis_Index[1] = {'A'};
+char GPSIndex[1] = {'G'};
+
+char mag_ir_Index[1] = {'M'};
+
+//ジャイロデータ
+int gx_int[1] = {0};
+int gy_int[1] = {0};
+int gz_int[1] = {0};
+
+//加速度
+int ax_int[1] = {0};
+int ay_int[1] = {0};
+int az_int[1] = {0};
+
+//緯度
+int lat_int[1] = {0};
+//経度
+int longi_int[1] = {0};
+//移動方位
+int m_azi_int[1] = {0};
+//対地速度
+int gspeed_int[1] = {0};
+//大気圧高度
+int altitude_int[1] = {0};
+
+//x軸地磁気
+int mx_int[1] = {0};
+//y軸地磁気
+int my_int[1] = {0};
+//z軸地磁気
+int mz_int[1] = {0};
+
+//ダミーデータ
+char Dump_Index[1] = {'D'};
+
+FILE*   f;
+
+void sd_open_first(){
+    
+    printf("--- Mbed OS filesystem example ---\n");
+
+    // Try to mount the filesystem
+    printf("Mounting the filesystem... ");
+    fflush(stdout);
+
+    err = fileSystem.mount(&blockDevice);
+    printf("%s\n", (err ? "Fail :(" : "OK"));
+    
+    if (err) {
+        // Reformat if we can't mount the filesystem
+        // this should only happen on the first boot
+        printf("No filesystem found, formatting... ");
+        fflush(stdout);
+        err = fileSystem.reformat(&blockDevice);
+        printf("%s\n", (err ? "Fail :(" : "OK"));
+        if (err) {
+            error("error: %s (%d)\n", strerror(-err), err);
+        }
+    }
+
+    // Open the numbers file
+    printf("Opening \"/fs/numbers.dat\"... ");
+    fflush(stdout);
+
+    //====================
+    //センサ用のファイル
+    //====================
+    //f = fopen("/fs/numbers.txt", "a+");//テキスト形式の書き込み
+    f = fopen("/fs/numbers.dat", "ab+");//バイナリ形式の書き込み
+    
+    printf("%s\n", (!f ? "Fail :(" : "OK"));
+    if (!f) {
+        // Create the numbers file if it doesn't exist
+        printf("No file found, creating a new file... ");
+        fflush(stdout);
+        //f = fopen("/fs/numbers.txt", "a+");//テキスト形式の書き込み
+        f = fopen("/fs/numbers.dat", "ab+");//バイナリ形式の書き込み
+        
+        printf("%s\n", (!f ? "Fail :(" : "OK"));
+        if (!f) {
+            error("error: %s (%d)\n", strerror(errno), -errno);
+        }
+        
+        fflush(stdout);
+    }
+    
+}//sd open first
+
+
+void sd_close(){
+    
+    // Close the file which also flushes any cached writes
+    printf("Closing \"/fs/numbers.dat\"... ");
+    fflush(stdout);
+    err = fclose(f);
+    printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
+    if (err < 0) {
+        error("error: %s (%d)\n", strerror(errno), -errno);
+    }
+    
+    printf("Mbed OS filesystem example done!\n");
+    
+}
+
+void sd_open(){
+    
+    //====================
+    //センサ用のファイル
+    //====================
+    //f = fopen("/fs/numbers.txt", "a+");//テキスト形式の書き込み
+    f = fopen("/fs/numbers.dat", "ab+");//バイナリ形式の書き込み
+    
+    printf("%s\n", (!f ? "Fail :(" : "OK"));
+    if (!f) {
+        // Create the numbers file if it doesn't exist
+        printf("No file found, creating a new file... ");
+        fflush(stdout);
+        //f = fopen("/fs/numbers.txt", "a+");//テキスト形式の書き込み
+        f = fopen("/fs/numbers.dat", "ab+");//バイナリ形式の書き込み
+        printf("%s\n", (!f ? "Fail :(" : "OK"));
+        if (!f) {
+            error("error: %s (%d)\n", strerror(errno), -errno);
+        }
+        
+        fflush(stdout);
+    }
+    
+}//sd open first
+//=========================================================
+//Gps receiver function
+//=========================================================
+void gps_receiver()
+{
+
+    //variables
+    int numbers_of_nmea;
+    char gps_data[256];
+
+
+
+    numbers_of_nmea=0;
+    while(gps.getc()!='$') {
+    }
+
+    while( (gps_data[numbers_of_nmea]=gps.getc()) != '\r') {
+
+        numbers_of_nmea++;
+        if(numbers_of_nmea==256) {
+            numbers_of_nmea=255;
+            break;
+        }
+    }
+
+    gps_data[numbers_of_nmea]='\0';
+
+    //char gps_datae[256]="$GNRMC,222219.000,A,3605.4010,N,14006.8240,E,0.11,109.92,191016,,,A";
+    if( sscanf(gps_data, "GNRMC,%f,%f,%f,%f\r",&g_hokui,&g_tokei,&gps_azi,&speed_m) >= 1) {
+        //pc.printf("変換前データ %f,%f,%f\r\n",g_hokui,g_tokei,azi);
+    } else {
+    }//if ends
+}
+
+
+//=========================================================
+//gps notification function
+//=========================================================
+void gps_notification()
+{
+    //pc.printf("processing\r\n");
+    if(gps_sw==1) {
+        notification_from_sub=1;
+         time_gps_nof=passed_time.read_ms();
+    } else {
+        notification_from_sub=0;
+    }
+    
+}
+
+void observation_update()
+{
+    if((sd_switch==1)&&(sd_flag==0)){
+        sd_open();
+        sd_flag=1;
+        pc.printf("Logging was started.\r\n");
+    }else if((sd_switch==1)&&(sd_flag==1)){
+        //何もしない
+    }else if((sd_switch==0)&&(sd_flag==1)){
+        sd_close();
+        sd_flag=0;
+        pc.printf("Logging was closed.\r\n");
+    }else if((sd_switch==0)&&(sd_flag==0)){
+        //何もしない
+    }
+    
+    if(notification_from_sub==1) {
+        
+        //最新の時間の取得
+        time_new=passed_time.read_ms();
+        //離散時間の更新
+        time_old=time_new;
+        
+        if((time_new-time_gps_nof)<=10.0){
+            
+            myled=1;
+            
+            //gpsプロセッサからのシリアル信号を受信
+            gps_receiver();
+            notification_from_sub=0;
+            //高度情報の取得
+            altitude_1=get_altitude(altitude_offset);
+            
+            //処理時間の計算
+            //最新の時間の取得
+            time_new=passed_time.read_ms();
+            //pc.printf("%f\r\n",time_new-time_old);
+            //
+            //デバッグの為の表示
+            //pc.printf("%f,%f,%f,%f,%f\r\n",g_hokui,g_tokei,altitude_1,speed_m,gps_azi);
+        
+            //地磁気センサの計測
+            mx = inertial_sensor.get_mag_x_data();
+            my = inertial_sensor.get_mag_y_data();
+            mz = inertial_sensor.get_mag_z_data();
+            //デバッグの為の表示
+            //pc.printf("%f,%f,%f\r\n",mx,my,mz);
+            
+            myled=0;
+            
+            if(sd_flag==1){                    
+                
+                //緯度
+                lat_int[0] = int(g_hokui*1000000.0);
+                //経度
+                longi_int[0] = int(g_tokei*1000000.0);
+                //移動方位
+                m_azi_int[0] = int(gps_azi*1000000.0);
+                //対地速度
+                gspeed_int[0] = int(speed_m*100.0);
+                //大気圧高度
+                altitude_int[0] = int((altitude_1+50000.0)*100.0);
+                
+                //地磁気センサ x,y軸
+                //8192
+                //x軸地磁気
+                mx_int[0] = int(mx+8192.0);
+                //y軸地磁気
+                my_int[0] = int(my+8192.0);
+                //地磁気センサ z軸
+                mz_int[0] = int(mz+32768.0);
+                
+                //GPSデータ列
+                err =fwrite(GPSIndex, 1, 1, f);
+                err =fwrite(TimeIndex, 1, 4, f);
+    
+                err =fwrite(lat_int, 1, 4, f);
+                err =fwrite(longi_int, 1, 4, f);
+                err =fwrite(m_azi_int, 1, 4, f);
+                err =fwrite(gspeed_int, 1, 4, f);
+                err =fwrite(altitude_int, 1, 4, f);
+                
+                //Dump_Index パケットを32byteにするための埋め合わせ
+                err =fwrite(Dump_Index, 1, 1, f);
+                err =fwrite(Dump_Index, 1, 1, f);
+                err =fwrite(Dump_Index, 1, 1, f);
+                err =fwrite(Dump_Index, 1, 1, f);
+                err =fwrite(Dump_Index, 1, 1, f);
+                err =fwrite(Dump_Index, 1, 1, f);
+                err =fwrite(Dump_Index, 1, 1, f);
+                
+                //地磁気と赤外線センサ
+                err =fwrite(mag_ir_Index, 1, 1, f);
+                err =fwrite(TimeIndex, 1, 4, f);
+    
+                err =fwrite(mx_int, 1, 4, f);
+                err =fwrite(my_int, 1, 4, f);
+                err =fwrite(mz_int, 1, 4, f);
+
+                //Dump_Index パケットを32byteにするための埋め合わせ
+                err =fwrite(Dump_Index, 1, 1, f);
+                err =fwrite(Dump_Index, 1, 1, f);
+                err =fwrite(Dump_Index, 1, 1, f);
+                err =fwrite(Dump_Index, 1, 1, f);
+                err =fwrite(Dump_Index, 1, 1, f);
+                err =fwrite(Dump_Index, 1, 1, f);
+                err =fwrite(Dump_Index, 1, 1, f);
+                err =fwrite(Dump_Index, 1, 1, f);
+                err =fwrite(Dump_Index, 1, 1, f);
+                err =fwrite(Dump_Index, 1, 1, f);
+                err =fwrite(Dump_Index, 1, 1, f);
+                err =fwrite(Dump_Index, 1, 1, f);
+                err =fwrite(Dump_Index, 1, 1, f);
+                err =fwrite(Dump_Index, 1, 1, f);
+                err =fwrite(Dump_Index, 1, 1, f);
+                
+            }else{}
+        }else{notification_from_sub=0;}
+        
+    }else{
+
+        }
+}
+
+void inertial_sensor_function()
+{     
+        int counter;
+
+        gx=inertial_sensor.get_gyro_x_data();
+        gy=inertial_sensor.get_gyro_y_data();
+        gz=inertial_sensor.get_gyro_z_data();
+        
+        ax = inertial_sensor.get_acc_x_data();
+        ay = inertial_sensor.get_acc_y_data();
+        az = inertial_sensor.get_acc_z_data();
+            
+        gx -=gx_mean; 
+        gy -=gy_mean;
+        gz -=gz_mean;
+            
+        //最新の時間の取得
+        time_new=passed_time.read_ms();
+        
+        //離散時間の更新
+        time_old=time_new;
+    
+        if(sd_flag==1){
+
+            //バイナリ形式でsdカードに書き込む
+            TimeIndex[0] = int(time_new);
+            
+            //ジャイロのレンジは+-250deg/s
+            //ジャイロセンサ計測値をintにする
+            
+            int gx_pre,gy_pre,gz_pre;
+            /*
+            gx_pre = gyro_float2int(gx);
+            gy_pre = gyro_float2int(gy);
+            gz_pre = gyro_float2int(gz);
+            */
+            gx_pre = int((gx+500.0)*10000.0);//0.1 m deg/sの分解能とする。このレンジでの分解能は7.6m deg/s
+            gy_pre = int((gy+500.0)*10000.0);
+            gz_pre = int((gz+500.0)*10000.0);
+            
+            gx_int[0] = gx_pre;
+            gy_int[0] = gy_pre;
+            gz_int[0] = gz_pre;
+            
+            //加速度センサ計測値をintにする
+                        
+            int ax_pre,ay_pre,az_pre;
+            /*
+            ax_pre = acc_float2int(ax);
+            ay_pre = acc_float2int(ay);
+            az_pre = acc_float2int(az);
+            */
+            ax_pre = int((ax+GRAVITY*16.0)*100000.0);//±8g3.91mg/LSB 0.01mg
+            ay_pre = int((ay+GRAVITY*16.0)*100000.0);
+            az_pre = int((az+GRAVITY*16.0)*100000.0);
+            
+            ax_int[0] = ax_pre;
+            ay_int[0] = ay_pre;
+            az_int[0] = az_pre;
+            
+            //sdカードへの書き込み
+            //慣性センサのヘッダ
+            //Six_axis_Index[1] = {'A'};
+            
+            err =fwrite(Six_axis_Index, 1, 1, f);
+            err =fwrite(TimeIndex, 1, 4, f);
+
+            err =fwrite(gx_int, 1, 4, f);
+            err =fwrite(gy_int, 1, 4, f);
+            err =fwrite(gz_int, 1, 4, f);
+            
+            err =fwrite(ax_int, 1, 4, f);
+            err =fwrite(ay_int, 1, 4, f);
+            err =fwrite(az_int, 1, 4, f);
+            
+            //Dump_Index パケットを32byteにするための埋め合わせ
+            err =fwrite(Dump_Index, 1, 1, f);
+            err =fwrite(Dump_Index, 1, 1, f);
+            err =fwrite(Dump_Index, 1, 1, f);
+            
+            
+        }else{}
+    
+    
+}
+
+//gps_notification
+void sensor_function(){
+    
+    inertial_sensor_function();
+    gps_notification();
+    
+    }
+//=========================================================
+//altitude function
+//=========================================================
+float get_altitude(float offset)
+{
+
+    pressure_1=inertial_sensor.getPressure();
+    //pressure_1=pressure_sensor.getPressure();
+    
+    temperature_1=inertial_sensor.getTemperature();
+    //temperature_1=pressure_sensor.getTemperature();
+    //pressure_sensor
+    
+    float altitude=pow((1013.25/pressure_1),0.190);
+    altitude-=1.0;
+    altitude*=(temperature_1+273.15);
+    altitude/=0.0065;
+    altitude-=offset;
+    altitude+=INITIAL_ALTITUDE;
+
+    //デバッグ用の表示
+    pc.printf("pressure=%f,tempreture=%f,altitude=%f\r\n",pressure_1,temperature_1,altitude);
+    
+    return altitude;
+
+}
+
+//=========================================================
+//Timer function
+//=========================================================
+void timer_reset()
+{
+    passed_time.reset();//reset timer counter
+}
+
+void timer_read()
+{
+    time_new=passed_time.read_ms();
+    //pc.printf("経過時間=%f\r\n",time_new);
+}
+
+//float型のgyroデータをintに変換する
+int gyro_float2int(float gyro_data){
+    
+    int gyro_int_data;
+    
+    if(gyro_data>=0.0){
+        //gyro_scale_factor=0.0305f;
+        //gyro_scale_factor)/RAD_TO_DEG
+        gyro_int_data = int(gyro_data*RAD_TO_DEG/0.0305f);
+    }else if(gyro_data<0.0){
+        /*
+        x_data = -1 * (65536 - x_data);
+        */
+        gyro_int_data = int((gyro_data*RAD_TO_DEG)/0.0305f);
+        gyro_int_data=gyro_int_data+65536;
+        
+        }
+    
+    return gyro_int_data;
+}
+
+//float型のaccデータをintに変換する
+int acc_float2int(float acc_data){
+    
+    int acc_int_data;
+    
+    if(acc_data>=0.0){
+        //acc_scale_factor=256;
+        //x_acc=float(x_data)*GRAVITY/acc_scale_factor;//m/s^2
+        acc_int_data = int(acc_data*256/GRAVITY);
+        
+    }else if(acc_data<0.0){
+        //x_data = -1 * (4096 - x_data);  
+        
+        acc_int_data = int(acc_data*256/GRAVITY);
+        acc_int_data=acc_int_data+4096;
+        
+        }
+    
+    return acc_int_data;
+}
+
+
+//=========================================================
+// main
+//=========================================================
+int main()
+{
+    
+    //UART initialization
+    pc.baud(115200); //115.2 kbps
+    gps.baud(115200); //115.2 kbps
+    
+    blockDevice.frequency(25000000);
+    
+    /*sdカードにファイルを構成する そのファイルを書き込み状態にする*/
+    //Mount the filesystem
+    sd_flag=0;
+    sd_open_first();
+    
+    //Range setting for inertial sensor
+    //慣性センサのレンジ設定
+    inertial_sensor.set_gyro_range(3);//±250°/s131.2 LSB/°/s 7.6 m°/s / LSB
+    inertial_sensor.set_acc_range(2);//±8g3.91mg/LSB
+
+    //地磁気センサの初期化
+    inertial_sensor.initiate_mag();
+    
+    //Initialization for pressure sensor
+    //気圧センサの初期化
+    //pressure_sensor.initialize();
+    inertial_sensor.initialize();
+               
+    notification_from_sub=0;//サブマイコンからの通知を初期化
+    dummy_counter=0;
+
+    //-------------------------------------------
+    //altitude initialization
+    /*
+    2回目からの計測でまともな高度が得られるので、オフセット計測を2回する
+    */
+    //-------------------------------------------
+    altitude_offset=get_altitude(0.0);//初期高度を取得(オフセットの取得)
+    wait_us (100000);//wait 0.1 s
+    altitude_offset=get_altitude(0.0);//初期高度を取得(オフセットの取得)
+
+    //------------------------------------------
+    //ジャイロオフセットの計算
+    gx_mean=gy_mean=gz_mean=0.0;
+    
+    pc.printf("offset calculation.\r\n");
+    
+    for(int counter=0;counter<mean_counter;counter++){
+        
+        gx=inertial_sensor.get_gyro_x_data();
+        gy=inertial_sensor.get_gyro_y_data();
+        gz=inertial_sensor.get_gyro_z_data();
+    
+        gx_mean+=gx;
+        gy_mean+=gy;
+        gz_mean+=gz;
+        wait_us(10000);
+        }
+    
+    gx_mean/=mean_counter;
+    gy_mean/=mean_counter;
+    gz_mean/=mean_counter;
+    
+    pc.printf("offset calculation has been done.\r\n");
+    //-------------------------------------------
+    //Thread
+    //-------------------------------------------
+    //set priority of sensor threads
+    Thread thread1(osPriorityAboveNormal);
+    Thread thread2(osPriorityNormal);
+    
+    //set prioority of main
+    osThreadSetPriority(osThreadGetId(), osPriorityIdle);
+    
+    //start threads
+    thread1.start(callback(&queue1, &EventQueue::dispatch_forever));
+    thread2.start(callback(&queue2, &EventQueue::dispatch_forever));
+    
+    pc.printf("Ticker setup has been done.\r\n");
+    
+    //-------------------------------------------
+    //Timer starts
+    //-------------------------------------------
+    passed_time.start();
+    
+    pc.printf("Activated.\r\n");
+    
+    //thread are called every 1 or 5ms
+    queue1.call_every(10,&observation_update);//observation_update
+    queue2.call_every(10,&sensor_function);//sensor_function
+    
+    while(1) {
+        
+    }// while(1)ends
+}//int main ends
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-os.lib	Sat Jul 25 11:06:13 2020 +0000
@@ -0,0 +1,1 @@
+https://github.com/ARMmbed/mbed-os/#cf4f12a123c05fcae83fc56d76442015cb8a39e9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed_app.json	Sat Jul 25 11:06:13 2020 +0000
@@ -0,0 +1,7 @@
+{
+    "target_overrides": {
+        "*": {
+            "target.components_add": ["SD"]
+        }
+    }
+}
\ No newline at end of file
Binary file resources/official_armmbed_example_badge.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test_BMX055.lib	Sat Jul 25 11:06:13 2020 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/Joeatsumi/code/test_BMX055/#b387585de3b5