タイトルの通り。
LSM9DS1をいじっていたのは、これを作るため。
いいアイデアだと思っていたが、既に先駆者がいて製品化までされている。(https://www.plotonline.com/motor/beeline/)
先を越されたのは悔しいから、こっちはネット環境無しでも使えるものを目指したい。
今悩んでいるのは、目的地の緯度・経度をどうやって入力するか?
今のバージョンは、プログラム中に直打ちしてしまっている。
プロトタイプ
左上のマスキングテープの下にLSM9DS1がある
GPSはm5純正品、U032というやつ
GPSはm5純正品、U032というやつ
完成したら円形液晶とか使って格好よく仕上げたい
コード実行だらけのUI FLOW
素直にmicropythonやArduino C++を使ったほうがいいのかもしれない
初代m5stickc用の.m5fをgithubに上げたので、詳細な中身が知りたいときはそちらをご覧ください。
https://github.com/matsuura-h/lsm9ds1_micropython/tree/main
https://github.com/matsuura-h/lsm9ds1_micropython/tree/main
■方角検出
地味に苦労したのは、磁気センサの値を方角に変換する部分。atan2に行きつくまでに相当時間がかかった。
参考URLを貼っておきます。
https://garchiving.com/angle-calculation-from-magnetic-sensor/
https://takk-mc.hatenadiary.jp/entry/2019/02/05/192846
https://garchiving.com/angle-calculation-from-magnetic-sensor/
https://takk-mc.hatenadiary.jp/entry/2019/02/05/192846
地磁気のx, yをプロットしてみると、中心が相当ずれていることがわかる。
現物合わせだが、コード内に直書きでx+0.03, y-0.25の補正を加えている。
本来はoffsetをセンサに書き込むべき。
現物合わせだが、コード内に直書きでx+0.03, y-0.25の補正を加えている。
本来はoffsetをセンサに書き込むべき。
ちなみに、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.pideg = deg if deg >= 0 else 360 + degdeg = (deg + 180) % 360
1行目は、自作ライブラリで磁気センサを読み取る部分。
2行目でオフセット補正+角度算出+ラジアン→度への変換をやっている。
続いて、3行目で±180から0-360度に変換。
最後に、このままだと南が0度なので、180度回転させている。
もしセンサを裏表逆に使う場合、最初に正負逆転させるか、atan2の引数の符号を変えることで対応可能。
実際に動かしてみたときの動画
薄い赤の△が北、黒の▲が目的地の方角を示している
m5stickcの描画が遅いのでブレがあるが、ロジック自体は問題無し
あとはフィールド試験
0 件のコメント:
コメントを投稿