こんにちは.20-Samejimaです.初めての投稿なので見にくいところもあるとは思いますが,よろしくお願いします.
さて,今回は,GPSデータの記録装置を作ったお話をしようと思います.(最後に,新潟へ自転車旅した話をします.)
経緯
僕の趣味はサイクリングで,毎回自分がどのようなルートを通ったかスマホのアプリで記録していました.しかし,一つ重大な問題を抱えていました.
それは...スマホの電池がすぐ無くなる!!
数時間のサイクリングならたいしたことは無いのですが,長距離サイクリングになるとルートを調べたり連絡を取ったりするのに携帯が使えなくなってしまいます.
そこでルートを記録する装置(GPSロガー)を別で作ってスマホの電池消耗問題を解決することにしました.
目次
- スマホアプリの仕組み
- 作ったもの(GPSロガー)
- プログラム
- “.csv” を ” .gpx” に変換する
- gpxを表示する
- まとめ
- オマケ~新潟自転車旅の記録~
スマホアプリの仕組み
作ったものをお見せする前に,スマホのアプリがどのように走行ルートを記録しているのか見てみましょう.
皆さんご存じの通りスマホにはGPS機能があり,複数のGPS衛星から送られてくるデータをもとに,スマホの位置(緯度と経度)を計算します.また,時刻も計算できちゃいます.
計算で得られた緯度と経度は,アプリの中で”.gpx”という形式で保存されます.
gpxというファイルは,Wikipediaによると「GPS/GNSS装置やGPS/GNSSソフトウェアなど、アプリケーション間でGPS/GNSSのデータをやりとりするためのデータフォーマット」ということだそうです.簡単に言うと,共通のGPS記録方法といった感じです.
このファイルには,緯度や経度,時間などを記録できます.そのため,ルートの記録によく使われているそうです.
まとめると,スマホのGPSアプリは,GPSからのデータをもとに緯度と経度などを計算し,その緯度と経度をgpxファイルの中に書き込むことで,ルートを記録しています.
作ったもの(GPSロガー)
それでは僕が作ったGPS記録装置(GPSロガーと呼ぶことにします)の紹介をします.
↓写真はこちら
基板まで作りこむ余裕がなく,手作り感満載ですが,ご容赦ください(^^;)
この装置は主に以下の3つの構成要素でできています.
- マイコン Arduino Uno
- GPSモジュール GY-NEO-6M(←GPSを受信)
- SDカードモジュール (←データをSDカードに保存)
マイコンは家に置いてあったArduinoを使い,GPSモジュールとSDカードモジュールはアマゾンで買いました(それぞれ1000円,140円くらい).
GPSモジュールは,GPS衛星からの信号を受信し,位置や時刻などを出力してくれるモジュールのことです.衛星の電波から必要な情報を自動で計算してくれるので,こちらは何もしなくて便利です.
SDカードモジュールは,SDカードにデータを読み書きする装置です.今回はマイクロSDカードを差し込むタイプにしました(PCがマイクロSDカードしか差せないので).
マイコンとGPSモジュールはUART,マイコンとSDカードモジュールはSPIで通信しました.
電源はモバイルバッテリーから供給しているのですが,1日使っても25%くらいしか消費しないので,安心してGPSを記録できます.
プログラム
コードはすべてお見せするには長すぎるので,主な一部分だけ紹介します.なお,こちらのサイトに載っていたコードを参考に作りました(記録周期や記録内容などを変えました).GPS信号の処理には,TinyGPS++というモジュールを使っています(参考サイト).
プログラムはArduino IDEで書きました.
プログラムの流れはこんな感じ↓
以下でプログラムの説明をしていきます.
プログラムの最初にいろいろ準備するものを書き,GPS信号を受け取ったらファイル名を作成してSDカードに書き込みます.Arduinoでファイルを作るときは,ファイル名の長さに制限があるようで,どのようなファイル名にしようか悩みました.結局,日付と時間(hour)の情報を入れています.
ちなみにprintHeader()はCSVの先頭行に,time, longitudeなどの見出しを書いてくれる関数です.
while (tinyGPS.location.isUpdated()==0){ //GPS信号を受信するまでループ
while (gpsPort.available()){
tinyGPS.encode(gpsPort.read()); //GPS信号のデータを変数に記録
}
}
sprintf(logFileName,"%2d%02d%02d%02d.CSV",tinyGPS.date.year()%100,tinyGPS.date.month(),tinyGPS.date.day(),tinyGPS.time.hour()); //ファイル名の作成
printHeader(); //ファイルの作成と先頭行の書き込み
次に,GPS信号を1秒ごとに受信し,その都度データをSDカードに書き込みます.ついでに外部に取り付けたLEDを一瞬消すことで,ちゃんと記録できてますってことを外から分かるようにしました.
logGPSData()という関数が,先ほど作ったcsvファイルにデータを書き込む関数です.
if ((lastLog + LOG_RATE) <= millis()){ //1秒(=LOG_RATE)ごとに以下のコードを実行
if (tinyGPS.location.isUpdated()) // GPS信号が受信できていたら...
{
if (logGPSData()) //GPSデータを記録できたら...
{
digitalWrite(LED_SD,LOW); //緑のLEDを消灯
lastLog = millis(); // 最後に記録した時間を覚えておく
delay(50);
digitalWrite(LED_SD,HIGH); //緑のLEDを点灯
}
}
}
作ったプログラムは全体で250行くらいになりましたが,以上のコードを骨として書かれています.GPSデータを処理するのもSDカードにデータを書き込むのも初めての経験でした.そのため,幾重にも重なるエラーの壁に苦労しましたが,結果としてはちゃんと思い通りに動作し安心です.(知識も少し増えました.)
“.csv” を ” .gpx” に変換する
さて,先ほど作ったArduinoのプログラムによって,csvファイルがSDカードに保存されました.しかし,このままでは地図アプリなどで読み込んで表示することはできません.そこで,csvファイルから必要な情報を読みだして,gpxファイルに変換するツールが必要になります.それをPythonで書いてみることにしました(イメージ図↓).ちなみにPythonにした理由は,単に久しぶりに使いたくなったからです.
Pythonには,”pandas”というデータ解析用のモジュールがあり,これを使いました(参考にさせていただいた記事).csvデータを読み込むのは割と簡単でしたが,gpxファイルの作成に苦労しました.なぜなら,形式がかっちりと決まっていて,記述する量も多いため,コードを書くのがちょっと大変だったからです.
ちなみに,PCを持っていないときでも変換できるように,スマホでもPythonを使えるようにしました.(Pydroidというアプリです!)ファイルの保存先の指定で少し戸惑ってしまいましたが,外出時でもcsvをgpxに変換できるようになりました.PCいらずでプログラムを動かせるので,便利です.
gpxを表示する
gpxファイルを作ったら,そのデータを表示します.
いろいろなやり方はあると思いますが,僕は次のような方法で表示しています.
<PCの場合>
Google Earth というソフトを使います.gpxファイルを地図上にドラッグアンドドロップするだけで表示してくれ,速度や標高もグラフで表示してくれます.また,記録を再生でき,矢印のアイコンがちょこまかと動くのも面白いです.(あるサイクリングの記録↓)
<スマホの場合>
Geo Tracker というアプリを使いました.Google Earth のような矢印が動く機能はありませんが,大きなファイルでもサクサク動きます.長旅でPCを持っていけないときに重宝しています.(あるサイクリングの記録↓)
まとめ
いかがだったでしょうか.今回はスマホの充電問題を解決するために作ったGPSロガーの紹介をしてみました.GPSやSDカードなど初めて使うツールや,データを表示する方法も初めて知り,苦労をしましたが大変勉強になりました.今後もスマホの充電を気にせず,思う存分サイクリングの記録をとっていきたいと思います.
オマケ~新潟自転車旅の記録~
さて,ここからは,GPSロガーを作った後に行った7日間700kmの自転車旅をご紹介します!
(書いてみたらその気になってたくさん書いてしまいました(^^;))
全体の記録はこちら↓(スマホで表示しています)
旅のスケジュールは下のような感じです.
1日目 自宅 → 高崎 (100km)
2日目 高崎 → 湯沢 (120km)
3日目 湯沢 → 柏崎 (120km)
4日目 柏崎 → 湯沢 (100km)
5日目 湯沢でロ技研合宿!
6日目 湯沢 → 自宅 (200km)
7日目 自宅 → 東京湾 (60km)
ロ技研の合宿が湯沢であったので,それに合わせて日程を組みました.
それでは,それぞれの日の出来事を書き並べていきたいと思います.
<1日目>
自宅を出発し,熊谷桜堤でお昼ご飯を食べた.半日で意外とここまで来られるんだと驚き.(春だったらきれいな桜が見れただろうに...)
国道17号をたどって,夕方に高崎に到着.大通りで基本は走りやすいけど,ところどころ車が多くて怖かった.1日目はここで1泊.
<2日目>
朝,すき家のメガ盛り牛丼を食べでエネルギーを補給.友達に教えてもらった利根川自転車道を走って渋川まで(走りやすかったので,帰りもここを走ろうかな).みなかみの辺りまで,17号を走ったが,途中細い山道でその割に交通量がすごく多くかった(ライトも付けなるべく邪魔にならないようにしていたけれど,車を運転していた方々ごめんなさい).
みなかみ中心部を越えると本格的に上り坂が増えてくる.永遠と続く上り坂を目にして絶望しかけたとき,補給予定地の湖が現れた!その湖(赤谷湖)の近くにある食事処で昼食.とんかつ定食を頼み,ご飯を3杯くらい食べてエネルギー補給(こんなに食べれるなんて…).
そこからは三国峠をひたすら上り続ける.くねくねした上り坂を登っては休み,登っては休みの繰り返し.気温もだいぶ下がり,山に霧みたいなものがかかっているなと思ってしばらくすると,新潟・・・ではなく,クロソイド曲線記念碑が!草に覆われてひっそりとたたずんでいるが,機械系の人間はこれを見ずにはいられない.(どうやらこの三国峠で日本で初めて使われたらしい.ちなみに,クロソイド曲線とは,道路のカーブに使われる曲線です.wikipedia)
記念碑を眺め終わり,走り始めるとすぐ新三国トンネルが現れた.1kmを越えるこのトンネルを抜けると,そこには「新潟県 湯沢町」の標識が!ついに群馬と新潟の県境をまたいだ.だが,うれしくなった理由はこれだけではない.”あとは下るだけ!” 今までに頑張って貯めてきた位置エネルギを思う存分解放し,聞き覚えのあるスキー場が姿を現す.季節が3か月くらいずれてるなと思いながら通過し,湯沢を通り過ぎ,南魚沼にて一泊.
ちなみに,道中道路に目を向けると,地面から水を撒いて雪を解かすための設備や,縦向きになった信号,屋根のついた標識など,雪国を感じる要素がたくさんあった.こういうのを見てみるのも面白い.
<3日目>
この日は朝から本格的な雨.数時間か待てば止む予報だったが,日没後の山道は何としてでも避けたいため,強行突破することにした.用意したかっぱを着,自転車の荷物にもカバーをかけて雨中の新潟を駆け抜けた.しばらくすると雨が止み,それまで気づかなかった田んぼを発見.ちょうど稲刈り前のきれいな時期で,雨の疲れがちょっぴり癒された.
国道17号を順調に進み,長岡に到着.ロボコンを経験したことがある人なら誰もがこの地名を聞いて思い浮かべるだろう.ここは長岡技術科学大学がある場所だ.ロボコンに関わっていた身としては,じっくりと見てみてみたいところではあったが,午後の予定もあるので,外から軽く眺めるにとどめておいた.
その近辺(と言っても歩ける距離ではない)で昼食をとり,柏崎(日本海)に向け午後の部スタート.山を一つ越えなければならなかったが,昨日の山登りに比べたら大したことはない.難なく越え,柏崎に到着.原発がすぐそこにあり,放射線量計が設置されていてそのことを実感した.海岸沿いに着くと海!と思いきや何やら柵が並んでいる.砂が飛ばないようにしているのか?と思いながら扉を開けると日本海が見えた!人生初の日本海で少し興奮した.
いったん宿に荷物を置き,柏崎海岸へ.目的は日本海の夕日だ.無事日没前に到着し,夕日が沈むのをじっと見つめた.ちょうど飛行機雲も見え,きれいな景色に今までの疲れが吹き飛んだ.
<4日目>
4日目からは後半戦,南に向かって進んでいく.この日の目標は湯沢.ロ技研の夏合宿が開催される場所だ.昨日は山を迂回する形でルートを選んだが,できるだけ早く目的地に着きたかったので,山を二つ越えるが最短のルートを通ることにした.
一つ目の山を越え,十日町に到着(「雪ときもの のとおかまち」とモニュメントに書いてあった).ここで昼食を食べた.それにしてもこの日は日差しが強かった.新潟の太陽で肌がこんがり焼けた.
もう一つの山を越え,昨日も通った魚沼に到着.道の駅に寄ってお土産を買い,湯沢にあるロ技研の合宿場所へ向かった.
1時間ほど漕いで,無事に合宿場所に到着した.他の部員(もちろんバスで来ている)と,大学から遠く離れた地で合流し不思議な気分.今日の出来事を語り合いながらみんなで夕食をとった後,花火大会が開催された.炎色反応を思い浮かべながら楽しんだ.
<5日目>
ロギ合宿2日目は自由行動なので,同期と魚釣りに行くことにした.川岸の岩に腰を下ろし,十分に足を休めることができた.魚を釣るのは小学生以来で,釣り針を魚の口から外すのが大変だったが,無事3匹ゲット.自分たちで魚をさばいて,串焼きにした.美味しい.
夜は合宿恒例 rogiゼミ のお時間.希望する部員が各々好きなテーマを発表した.テーマは2足歩行ロボットの話から自律神経の話まで多岐にわたった(自分もGPSロガーや自転車旅の発表をした).そのあとは楽しい楽しい宴会・・・といきたいところだが,体力温存のため布団に入った.やっぱり合宿はバスで行く方がいいのかもしれない(当たり前).
<6日目>
タイヤの空気など点検し,宿で過ごしていた部員に見送られながら,午前10時に出発.来た道を戻った.湯沢に来ていた時点で割と標高を稼げていたため,新三国トンネルまでは割とすぐに行けた.そこからは楽しい下り坂.行きでのぼった速度の数倍の速度で駆け抜ける.これはハマってしまうかもしれない.見たことのある景色を見て,数日前の出来事を思い出しながら,さようならと声をかけていった.
みなかみを通り過ぎ,有名だという「永井食堂」で遅めの昼食.席に座り,モツ定食を注文すると,30秒くらいでモツ定食が出てきた.驚異の回転率だった.今までに食べたことのないモツの柔らかさにもビックリ.有名な理由が分かった気がする.
利根川自転車道に入ってからは渋川ー前橋ー高崎ー熊谷と一気に進んだ(信号がなく走りやすい).山道と違って街中の道路は明かりがあるため,日没後もどんどん漕ぎ進め,深夜に出発地点に帰還.結局この日は200kmも走った.今までの自分の最長記録である.
<7日目>
6日目までで新潟からの往復チャレンジは達成したが,本当の意味で日本を横断したいと思い,東京湾へ.多摩川の神奈川側を進み続け,アクアラインの入り口が目と鼻の先にある浮島町公園に到着.これで海から海へと4日間で漕ぎ切り,日本を東西に走る全ての道路に出会ったという称号を手に入れた.(対岸に見える羽田空港も眺められ,うっかり日が暮れる直前まで飛行機を見てしまった.)
旅の記録 おわり
その後自宅に戻り,1週間をかけた自転車旅は無事幕を閉じました.旅全体を通して,根性とちょっとの準備があればどんなところにも行けるんだということを学びました.同時に,こんなに長い距離にアスファルトを敷き,ガードレールのボルトが1本1本ちゃんと締まっているのを見ると,この道路を作った人たちの根気強さもすごいなと感心しました.そんなに速度が速くない自転車だからこそ,気づけたことだと思います.そんなことを思っている間,GPSロガーは走行記録をずっと取り続けてくれました.ブレッドボードとジャンプワイヤで作り,箱に入れただけでしたが,自転車の振動に耐え続け,スマホは電池切れになることはなく,無事職務を遂行してくれました,ありがとう!
以上,長々と最後まで見てくださってありがとうございました!今後も自転車についていろいろ作っていこうと思っているので,お楽しみに.