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の描画が遅いのでブレがあるが、ロジック自体は問題無し
あとはフィールド試験




0 件のコメント:

コメントを投稿