こちらの記事について、内容・翻訳・視点・長さなど、皆様のご意見をお送りください。今後の記事製作の参考にしたいと思います。
Thank you! Your feedback has been received.
There was a problem submitting your feedback, please try again later.
こちらの記事の感想をお聞かせください。
最近、折りたたみ自転車を電動自転車に変えたことを切っ掛けに、以前に輪をかけてサイクリングの楽しさや「電動」の自由さを再認識しハマってしまいました。この楽しさを共有したい!その一心でブレブレのGoPro動画をInstagramへ投稿したりもしたのですが、今回、GPSによるトラッキングデータを地図上にルートとして記録するシステムを構築してみました。
この記事では、Pycom開発キットと一緒にMicroPythonスクリプト言語を使用して、GPS、SDカード、Google Mapsサービスを使用したサイクリングルートの記録を実践してみようと思います。
部品リスト
- Pycom WiPy Development Board (172-0647)
- Pycom PyTrack Expansion board (136-8853)
- USB Power Bank(モバイルバッテリー)
- Micro USB ケーブル
GPSトラッカーの構築
このプロジェクト用に、WiPy開発ボードをメインマイクロコントローラー及びスクリプトインタープリタとして使用します。また、位置データの記録のためPyTrack拡張ボードにはGPSトランシーバーとSDカードソケットが搭載されています。ボードのプログラミングには、Visual Studio Code用のPyMakrプラグインを使用します。PyMakrにはデバッグを容易にするREPLターミナルウインドウも含まれています。
図 Pycom WiPyにPyTrack拡張ボードとモバイルバッテリーを接続
最初にコンストラクタ関数を使ってGPSトランシーバーをセットアップし、位置情報を読み取るためのリファレンスを作成する必要があります。GPSが衛星ネットワークへのリンクを確立したら、次に座標関数を使って縦方向と横方向の位置情報を返すことが可能になります。この関数をループ・ネストすることで、データを定期的に読んで処理し、その後でSDカードに保存する処理を行えます。
GPS = L76GNSS(Pycoproc(Pycoproc.PYTRACK), timeout=30)
while True:
location = GPS.coordinates()
latitude = location[0]
longitude = location[1]
GPSを初期化して緯度・経度を読み取る
Google Mapsでは、アップロードできる位置情報の数が制限されているため、SDカードにデータを保存する前に位置情報をフィルタリングすることが賢明です。そのためには、前ループの読み取り値を記録し、今回のループの読み取り値と比較する必要があります。これにより、潜在的な冗長性を取り除くことができます。下記のコードではIf文を使って2つの値を比較し、一致していれば保存処理をスキップします。
GPS_Store = ''
while True:
location = GPS.coordinates()
if location == GPS_Store:
time.sleep(5)
continue
latitude = location[0]
longitude = location[1]
重複データのフィルタリング
フィルタリング後、SDカードをソケットに挿入し、マウント機能を使用してファイルシステムへの接続を初期化します。Google Mapsのサービスを利用してサイクルルートを表示するため、位置情報を標準的なカンマ区切り(CSV)ファイル形式にフォーマットして、後でGoogle Mapsにインポートできるようにしておく必要があります。
sd = SD()
os.mount(sd, '/sd')
SDカードのファイルシステムへのマウント
デバイスは起動時に新しいデータファイルを作成するように設定されているので、既存のデータを上書きすることなく、録画セッションを簡単に区別することができます。そのために、条件付きループとopen関数を使って、一意に番号付けされたファイル名とcsvファイルの拡張子を探して割り当てます。
FileNo = 0
FileName = ''
while True:
try:
FileName = '/sd/' + str(FileNo) + '.csv'
FileNo = FileNo + 1
open(FileName, 'r')
except:
break
f = open(FileName, 'a')
f.write('Name,' + 'Latitude,' + 'Longitude' + '\r\n')
f.close()
数字増加による区別可能な固有ファイル名の作成
位置情報を保存するには、経度と緯度をカンマで区切り、キャリッジリターン(行頭復帰)で区切った文字列を作成するだけです。その後、書き込みモードでファイルを開き、データを書き込み、ファイルを閉じて保存します。録画が終わったら、ルートデータをアップロードする準備が整っている状態になっているはずです。*ファイル保存close()を忘れずに!
GPS_Store = ''
while True:
location = GPS.coordinates()
if location == GPS_Store:
time.sleep(5)
continue
GPS_Store = location
latitude = location[0]
longitude = location[1]
f = open(FileName, 'a')
f.write('Fix,' + str(latitude) + ',' + str(longitude) + '\r\n')
f.close()
time.sleep(5)
説明してきたコードを組み合わせた完全なコード
このプロジェクトのMicroPythonのコードはGitHubに掲載されています。
実証と結果
ハードウェアとソフトウェアが準備できたので、電動自転車を使ってシステムをテストし、選択したルートを進みながらGPSの精度とデータロギングのパフォーマンスを測定しました。テストには、ハードウェアをハンドルバーバッグに取り付け、大容量のモバイルバッテリーで電源を供給しました(下図)。
ハンドルバーバッグを使ってPycomハードウェアを取り付け
適切なサイクリングルートを選び、折りたたみ自転車でクロスカントリーに出かけました。出発前にはボードをリセットして、新規のデータロギングセッションを開始しました。幸いなことに、実験日当日はイギリスでは珍しく快晴でテストの条件が完璧な状態でした。
自転車とデータロガーの限界を試す
起伏の多い地形にもかかわらず、ハードウェアは異常もなく見事に動作しました。またテストの過程を自由に撮影することができました。ルートの終わりにはもう一度ボードをリセットして記録を終了し、帰宅しました。記録したデータの品質を確認しましたが、非常に精度良くCSVファイルに記録されていることに驚きました。
CSVデータファイルを確認すると、正常に取得できていることがわかりました!
サイクリングルートのデータができたら、あとはGoogle Mapsサービスにインポートするだけです。Googleアカウントを使用して、“MyMaps(マイマップ)”機能でユーザー定義の地図を作成し、データをインポートします。すると、ルートを一連のGPS位置データポイントとして描画することができました。データはCSVファイルとして正しくフォーマットされていたので「インポート」をクリックしてデータファイルを選択するだけで、簡単に取り込むことができました。
グーグルマップにデータを取り込むと、見事にルートを描画しました
テストは成功です!
私のサイクリングルートは、Pycomハードウェアによって正確に記録され、それがGoogle Mapsサービスによって見事表示されました。この記事でご覧いただいたように電子とITのちょっとした技術の組み合わせが、サステナブルなライフスタイルの演出に有効だったと思います。みなさんもちょっとした工夫で理想的なライフスタイルを演出してみませんか?