ソフト ロケット 缶サットソフト 電子班

MbedでGPS使ってみた

2022-04-28

こんにちは、hiroです!今回はMbed IDEでGPSモジュールを使う方法を紹介します。

Mbedの環境構築

開発の準備

Mbedを初めて使う方はこちらの記事をご覧ください。Mbed IDEについて詳しく説明しています。

Mbedでマイコン開発をする方法

2022/5/7  

こんにちは、hiroです!今回はMbedIDEという開発環境を使ってマイコンに書き込む方法をご紹介します。 Mbedを使おう! Mbedとは? マイコンの開発環境ってたくさんあるよね!例えばArdui ...

GPSを使う方法

GPSのライブラリ

今回使用するライブラリは https://os.mbed.com/users/Tomo073/code/GPS/ です。

ライブラリの導入方法がわからない方はこちらの記事をご覧ください。

Mbed ライブラリ追加方法

2022/10/12  

こんにちは、hiroです!今回はMbedIDEのライブラリのインポート(追加)方法について紹介します。また、ライブラリのリビジョン(バージョン変更)方法についても紹介します。 MbedIDEについてあ ...

バージョンは5:b97034d6df35を使用しています。

このバージョンは2018年に公開されたものであるので、mbedの標準ライブラリも2018年のものにリビジョンすることをお勧めします。

mbedライブラリのリビジョン方法はこちらの記事をご覧ください。

サンプルコード

環境が整ったら、早速コードを書いていきます。

このライブラリは主に次のような機能を持っています。

  • GPS(TX,RX); [コンストラクタ、ピン宣言]
  • void GPS::attach(関数名); [割り込み処理設定]
  • void GPS::GetDefault(); [編集前データ出力]
    • char GPS::datadefault に生データが入る
  • void GPS::GetData(); [編集データ出力]
    • long double GPS::latitude, GPS::longtitude, GPS::time にデータが入る

サンプルプログラムを載せておきます。

下のコードの引用先です。

https://os.mbed.com/users/Tomo073/code/GPS//file/b97034d6df35/GPS.h/
#include "mbed.h"
#include "GPS.h"
 
GPS gps(p28,p27); //(tx,rx)
Serial pc(USBTX, USBRX);
 
void getGPS(){
    //NVIC_SetPriority(UART2_IRQn,0); //割り込み優先順位(必要に応じて)
    gps.GetData(); //データ抽出
    if(gps.readable == true){ 
       pc.printf("longtitude:%f latitude:%f altitude:%f time:%f\r\n", gps.longtitude, gps.latitude, gps.altitude, gps.time); //書き込み(経度、緯度、時間)
    }
}
 
int main(){
    //pc.baud(115200); //mbedのボーレート(必要に応じて)
    gps.attach(getGPS); //割り込み(関数名)
    while(1){
        //gps.GetDefault(); //元のデータ
        //pc.printf("%c",gps.datadefault);  //書き込み
    }
}

コードの説明、ライブラリの注意点

4行目のGPS gps(p28,p27);でインスタンスを生成しています。(p28,p27)は自身のマイコンの環境のtx,rxに書き換えてください。必ずmain関数内にgps.attach(getGPS);を記述してください。

GPS::attach(関数名)はそのブロックでしか割り込みができません。

また、割り込みが行われたとき、GPS::attach()の引数の関数は複数回実行されます。しかし、実際はgps.readable == trueの時だけしか正しいデータは取得されていません。変数への代入や、シリアルへの出力はこのタイミングで行います。

gps.readable == trueの時だけしか正しい値が取れませんが、このタイミングはとても短くシビアであるため、if(gps.readable == true){}の中は簡単な処理しか記述できません。for文など回せないことに注意してください。変数への代入程度にしておくことをお勧めします。データの処理は一度グローバル変数に値を格納してから違う関数内で行うと良いです。

  • この記事を書いた人
  • 最新記事
hiro

hiro

FTE12期電子班所属
東北大学電気情報物理工学科2年
FTEラーメン班にも所属している
このサイトの管理者

-ソフト, ロケット, 缶サットソフト, 電子班