はじめに
「車載用電子コンパスを作る」の記事の中でも「GPSと組み合わせて、指定した位置の方向をひたすら指さし続けるガジェットを作ろうと思い立ちました」と書いたのですが、イメージとしては、東急ハンズの手のようなものが目的地の方向を逐一指すようなものを作りたいと考えていました。しかし、部分試作をしてみてステッパーモーターがかなり熱を持ってしまうこと、回転位置リセットが少々面倒であることがわかり、今回は目的地の方向計算と表示ができればいいや、ということにしました。
Dec 19, 2021追記
目的地方向を指さすガジェットを作ることができました。こちらの記事もご覧ください。
May 28, 2022 追記
Apr 19, 2023 追記
GPSからの位置情報をもとに、telegramにメッセージを送信できるようにしました。
材料
- Adafruit Metro Mini 328 – Arduino-Compatible – 5V 16MHz
Arduino UNO相当です。 - Adafruit Ultimate GPS Breakout – 66 channel w/10 Hz updates – Version 3
GPSモジュール。Metro Miniへはシリアル通信で接続します。 - Adafruit 0.56″ 4-Digit 7-Segment Display w/I2C Backpack – Green
目的地の方向を表示します。 - Adafruit 0.56″ 4-Digit 7-Segment Display w/I2C Backpack – Yellow
目的地までの直線距離を表示させます。 - 7 segment display (from somewhere)
いつどこから購入したのか忘れてしまいました。カソードコモン。 - 7セグメントLEDシリアルドライバキット(DIP化キット LED別売)
上の7セグ表示器をコントロールするためのもの。 - LED (green, red)
部品引き出しにあったもの。 - tactical button
目的地切り替えボタンとして。 - breadboard
half sizeになんとか詰め込めました。 - 抵抗
330Ω(LED用)、10KΩ(ボタン用) - ジャンパーケーブル、ワイヤー
接続図
GPSモジュールはシリアル通信(ソフトウエアシリアル)、方向と距離を表示させるための4桁7セグメントディスプレイは、I2C接続です。ボタンはLOW -> HIGHを拾うようにしています。Metro Miniからの電力供給(5V)だけで間に合っています。
コード
コード(Arduino)は一つだけです。myGPS-proto-7seg.inoという名前でGitHubにあげておきました。
やりたいことをするための部分コードを探してきては切り貼り、テスト、改変を繰り返したので、ごちゃごちゃして見通しが悪いのですが、無事動いています。
目的地のcoordinates (latitude, longitude)はgoogle mapから得ることができます。map上で右クリックするとその場所のcoordinatesが表示されますので、表示された数字をクリックするとクリップボードに値が保存されます。得られた値は、dest_lats, dest_lonsに格納して使います。
進行方向に対する目的地の方向(角度)は、bearingとangle(進行方向)から計算しています。初期バージョンでは目的地の方向によって-198度とか、330度などという値が出ることがあってわかりにくかったので、-180から180度までの値になるように変更してあります。0度は進行方向そのもの、90度は右、左は-90度、後ろが180度という具合です。
インターフェースの説明
- 10個までの目的地(緯度、経度)をあらかじめ登録しておくことができます。(プログラムにhard codingしておきます)
- 目的地切り替えボタンで番号(0から9)を選びます。
- 移動速度が不十分(のろのろ運転)な場合、進行方向がうまくとれないことがあるので、移動速度が1ノット(約1.85km/h)以下の場合には赤のLEDが点灯します。(それ以上の速度での移動時には緑のLEDが点灯します)
- 進行方向をゼロとしたときの目的地方向を角度で表示します。(-180から180度までになるようにしてあります)
- 目的地までの直線距離は、10km以上はkm単位で、それ以下はm単位で表示します。(4桁しかないので)
参考にしたページ
- Finding Your Way With GPS
ここを参考にあれこれ試しました。最終的にはTinyGPSモジュールを便利に使うことができず、Adafruitのモジュールでコードを書きました。 - Formula to Find Bearing or Heading angle between two points: Latitude Longitude
緯度経度からbearingやheadingを計算する方法についての説明があります。 - Adafruit Ultimate GPSのページ
部品を売っているだけでなく、使い方の説明やモジュールの作成など、かなりの労力をつぎ込んでいてくれる尊敬すべき会社。 - Arduino Forumページ
CalcDistance(), CalcBearing()などの関数をここからコピーしました。
使ってみて
いつも自画自賛ですが、(だって、趣味ですから。自賛できないことはしませんし)面白いです。道は曲がっていても、目的地にまっすぐ狙いを定めて運転している感じになれます。地面を走って移動するんですが、まっすぐ飛んでいく感覚が少し持てます。学校まではあと3キロ、-6度の方向、とか、会社まで10.5キロ、165度、右に振り返ったぐらいの方向、さていくか、って思えるわけです。
ちなみにGPSモジュールからは補足衛星の数も出ているので、それも表示しようかな、と思ったのですが、あまり意味がないので止めました。
さて、位置情報がとれているので、何に使おうかというところですが、例えば誰かを迎えにいくときに、もうじきつきますよ情報を自動で飛ばせると面白いと思います。運転中は携帯電話さわれませんし。いま出発しました、あと5キロ、あと1キロ、100メートル以内にいます、ぐらいの3段階で3GモジュールからSMSやSlack, Whatsapp, LINEでもSignalでも何でもいいんですが、送信できると便利なような気がすることもあります。帰宅時には、パパ接近情報としてバス情報表示板で使ったLED掲示板に、台風情報のように表示すれば、みそ汁の温め開始の目安ぐらいにはなるかもしれない。まあそこまでして帰るぜ帰るぜって、帰宅しなくていいんですが、普通に帰ってくれば。
それにしても、GPS衛星からの情報を無料で使えるってすごいことですね。また何か面白いことができないか、考えてみます。