ラベル GPS の投稿を表示しています。 すべての投稿を表示
ラベル GPS の投稿を表示しています。 すべての投稿を表示

2024年3月17日日曜日

NMEAの経度・緯度を、Google Mapの形式に変換する

 緯度経度を目にするのはGoogle Map経由という人が大多数だと思う。

Google Mapでは、「https://www.google.com/maps/@<緯度>,<経度>,15z?entry=ttu」として緯度・経度を入力すると、その場所を中心とした地図を表示してくれる。

Google Mapで使う緯度経度は、DEGというフォーマットのよう。
他に、DMMなりDMSなりPOTなりがあって非常にわかりづらい。
GPSの吐き出す生データ(NMEA)は、DMM形式。
よくわからなくなることが多いので、変換方法をメモしておく。

■経度、緯度のフォーマットと相互変換方法メモ

DMM:度分.分
例)北緯3542.60402度=スカイツリー

DEG:度.度
例)北緯35.710067度=スカイツリー

DMM→DEG:int(mod(input, 100)) + mod(input, 100) / 60

DEG→DMM:int(input)*100 + mod(input, 1) * 60


※スカイツリー公式サイトから借用


2024年3月1日金曜日

GPSモジュールAT6558を試す

 m5のGPSユニットは安くなく、サイズも大きいので、aitendoの安いモジュール(AT6558)を使えないか試してみる。
https://www.aitendo.com/product/17122
今は税抜き\900と、m5の半額で買える。
ただし、アンテナは別で必要。

chinaの主張を感じる

aitendoから拝借
この画像がめちゃくちゃ役に立つ

汚い配線だが気にしない
とりあえずV,G,RX,TXだけ繋ぐ

早速仮配線し、atom matrixで繋いでみる。

小さくて便利
このチップは3.3Vでないとダメなので、5Vのボードとは繋げない

極々シンプルなプログラム

まずはアンテナ無しで試してみる。
結果、以下のようなメッセージが出る。
電波が拾えずうまく繋げていないことがわかる。

$GNGGA,,,,,,0,00,25.5,,,,,,*64
$GNGLL,,,,,,V,M*79
$GPGSA,A,1,,,,,,,,,,,,,25.5,25.5,25.5*02
$BDGSA,A,1,,,,,,,,,,,,,25.5,25.5,25.5*13
$GPGSV,1,1,00*79
$BDGSV,1,1,00*68
$GNRMC,,V,,,,,,,,,,M*4E$GNVTG,,,,,,,,,M*2D
$GNZDA,,,,,,*56
$GPTXT,01,01,01,ANTENNA OPEN*25

続いて、アンテナを繋いでリトライ。


ちなみに、このアンテナは特価品で\199のもの。
もうすぐ無くなりそう。
https://www.aitendo.com/product/17558

アンテナを繋ぐと、起動して少し待てば衛星と繋がり、時間や座標を正しく知らせてくれるようになる。

$GNGGA,142138.000,3xxx.1177,N,1xxxx.6385,E,1,10,1.1,4.0,M,0.0,M,,*79
$GNGLL,3xxx.1177,N,1xxxx.6385,E,142138.000,A,A*49
$GPGSA,A,3,13,11,06,29,30,07,36,20,35,,,,2.1,1.1,1.8*32
$BDGSA,A,3,19,,,,,,,,,,,,2.1,1.1,1.8*21
$GPGSV,3,1,11,06,38,135,15,07,30,071,18,09,,,25,11,76,126,17*42
$GPGSV,3,2,11,13,46,214,37,15,14,233,,20,66,000,24,29,22,308,22*7C
$GPGSV,3' 
※xで緯度経度の一部を塗りつぶしています

思ったより簡単に動く。
これで小型化・安価化を達成できそう。

2024年2月25日日曜日

GPSと地磁気センサで、目的地までの距離と方角だけを出す簡易ナビを作る

タイトルの通り。
LSM9DS1をいじっていたのは、これを作るため。

いいアイデアだと思っていたが、既に先駆者がいて製品化までされている。(https://www.plotonline.com/motor/beeline/)
先を越されたのは悔しいから、こっちはネット環境無しでも使えるものを目指したい。
今悩んでいるのは、目的地の緯度・経度をどうやって入力するか?
今のバージョンは、プログラム中に直打ちしてしまっている。

プロトタイプ
左上のマスキングテープの下にLSM9DS1がある
GPSはm5純正品、U032というやつ
完成したら円形液晶とか使って格好よく仕上げたい

コード実行だらけのUI FLOW
素直にmicropythonやArduino C++を使ったほうがいいのかもしれない

初代m5stickc用の.m5fをgithubに上げたので、詳細な中身が知りたいときはそちらをご覧ください。
https://github.com/matsuura-h/lsm9ds1_micropython/tree/main
■方角検出
地味に苦労したのは、磁気センサの値を方角に変換する部分。
atan2に行きつくまでに相当時間がかかった。
地磁気のx, yをプロットしてみると、中心が相当ずれていることがわかる。
現物合わせだが、コード内に直書きでx+0.03, y-0.25の補正を加えている。
本来はoffsetをセンサに書き込むべき。
補正後のx,yを、参考URLのように位相を横軸にプロットしてみる。
それなりのsin, cos波になった。

ちなみに、LSM9DS1をGPSやm5stickcの傍で動かすと、磁界の影響でめちゃくちゃな値になるので注意。

atan2で処理した後も、まずラジアン角から度に直し、±180度から0-360度レンジに変換し、さらに東西南北=90度-270度-180度-0度になるように補正する必要がある。

コード例は以下の通り。
mx0,my0,mz0 = lsm.read_magnet()
deg = math.atan2(my0-0.25, mx0+0.03)*180/math.pi
deg = deg if deg >= 0 else 360 + deg
deg = (deg + 180) % 360

1行目は、自作ライブラリで磁気センサを読み取る部分。
2行目でオフセット補正+角度算出+ラジアン→度への変換をやっている。
続いて、3行目で±180から0-360度に変換。
最後に、このままだと南が0度なので、180度回転させている。
もしセンサを裏表逆に使う場合、最初に正負逆転させるか、atan2の引数の符号を変えることで対応可能。

実際に動かしてみたときの動画
薄い赤の△が北、黒の▲が目的地の方角を示している
m5stickcの描画が遅いのでブレがあるが、ロジック自体は問題無し
あとはフィールド試験