M5Stack + GPSユニット
GPSは初めてですがネットで調べてみるとGPSユニットからでてくる情報はそのまま使える(何か変換とかしないくてよい)ので抽出も楽そうです。
GPUユニットからはいくつか情報がでてきますがその中で$xxRMC(xxはGPUユニットでより違ってGNだったりGPだったりするらしい。今回使用のGPSユニットはGN)を見ると緯度、経度、日時がわかります。
例. $GNGGA,051537.000,3521.63630,N,13843.64480,E,1,09,1.3,766.7,M,0.0,M,,7E
例. $GNRMC,051536.000,A,3521.63630,N,13843.64480,E,0.00,129.95,080221,,,A7C
051536→05:15:36→+9:00:00で日本時間14:15:36
A→有効
3521.6363,N→北緯35°21.6363′
13843.6448,E→東経138°43.6448′
080221→2021年02月08日
あと$xxGGAも見ると使用衛星数、標高もわかります。
09→使用衛星数 9個
766.7→海抜766.7m
これらを整理してLCDに表示させてみたいと思います。
ちなみにこれをGoogleマップで確認するにはGoogleマップの検索窓で”35 21.63630,138 43.64480″と入力します₍いきなり普通の検索窓からでもできます)。この”35″と”21″、”138″と”43″の間にスペースを入れるのがうっかりしやすいところで詰めてしまうとそんな場所はありませんと言われてしまいます。ちなみにこの場所は富士山です。
では値を抽出していきましょう。
C言語は古い言語なので他の言語に比べて文字列の扱いが難しいところがあります。私もネット情報を見ながら見様見真似で作ってみました。ですので最後にプロジェクト全体をGitHubに載せていますが、参考程度に見てください。
ということで概略を説明していきます。
“strstr”で$GNRMCから始まる文字列を抜き出します。次いで”strtok”で改行までで区切り$GNRMC行を抽出します。
1 2 |
gnrmcData = strstr((char*)data, "$GNRMC"); strtok(gnrmcData, "\n"); |
そしてこの$GNRMC行を”,”で切り分けるのですが”strtok”ではデータがないとうまくいかないので”,”を検出してその間の文字列を抜き出すように個別にコードを書いてみました。
こうして取り出したデータのうち時間はグリニッジ標準時ですのでそれに9を足して日本時間にします(夏時間は対応していません)。9を足して日にちが変わった場合に年月日も変わるようにしました(うるう年も未対応)。
こうして取り出した日時を”2021/02/17 09:30:15″のようなフォーマットに整形しました。
次いで緯度、経度を取り出し”Lat. 35 79.13579′ N/Long. 135 79.13579′ E”のようなフォーマットにしました。”°”がうまく表示できないので” “(スペース)にしています。
ステータスが”A”(有効)の場合のみ緯度・経度を表示して、”V”(警告)の場合は単に”NG”とだけ表示するようにしました。
$GNGGAも$GNRMCと同様に取り出し、衛星数・標高を取り出しました。
日時、緯度・経度、衛星数・標高をそれぞれ1行にします。表示を既存ファームウェアの4行と差し替えました(1行は空行)。
表示位置を決める”label”は例えば”lat_lon_label”などと変えたほうがいいかと思いますが手抜きでそのまま”mpu6886_lable”などを使っています。
で、GPSデータを表示させた結果が以下の写真になります。
プロジェクト全体はGitHubにあります。