我が家のクルマにはRaspberry Pi Zero Wを使った自作GPSロガーを密かに搭載し、自前のWebサーバーにリアルタイムに位置情報を送信しています。防犯/追跡的な意味と、家族と合流する時などに詳細な現在位置を把握するためです。トヨタ車のアプリによる位置は駐車時しか更新されないので、「今こっちに向かってて、到着まであと何分くらいかかりそう」といった予測には全く使えないんですよね。
詳細はこちらの記事など。
さて、クラウンより前に契約していた某長納期車がぼちぼち1,2ヶ月以内に生産日が確定しそうという気配がしてきたので、GPSロガーももう一台作ろうと思います。盗難ランキング首位独走の車種なので、もちろんなんらかのきちんとした盗難防止セキュリティも導入するとは思いますが、それでも盗られた時に、誰も知らない秘密のGPSロガーがバックアップとしてあると無効化されにくいだろうというのと、前述の日常使いにもいいかなと。まぁ同居人が買いながら99.99%運転するのは自分になるので、そこまでリアルタイム位置情報が必要にはならなそうですが、、
先代製作から時が経ちすぎていて…
2019年にカロスポ用に壱号機を製作(後日クラウンに移設)した後、2021年に30プリウスを増車した時はまったく同じ構成のハードを揃えて、microSDの中身もクローンして設定だけ変更して流用しました。
しかしそこから4年経った現在では、
- Raspberry Pi ZeroがZero2に世代交代していた…
- 秋月のGPSモジュールが販売終了していた…
という変化が起きていました。
ZeroからZero2になるとCPUがArmV6からV8になり64bit化され、シングルコアからマルチコアになっています。当時のOSイメージでは最適化されていないどころかまともにブートしない可能性が大です。当時のOSはまだRaspberry OSという名前にすらなっていないRaspbianの頃のものなのでapt updateするにも限界があるでしょう。ということで、OSは完全新規インストールすることに。GUI関係のパッケージを省いてRaspberry Pi OS Lite (64bit)を選択。当時パッケージは何を追加したとかまったく記憶もメモも残っていないので前途多難です。
そしてもうひとつ重要なGPSモジュール+アンテナが販売終了になっていた件。直接の後継製品も同社から販売されておらず、まったく異なるチップのGPSモジュールを再セットアップする形になります。車載用なので感度を得やすいGPSアンテナは別体型から物色して、Pi Zeroと同一基板サイズのHAT型モジュールのこれを選びました。
GNSS モジュール HAT 拡張ボード 全地球測位システム QZSS 衛星測位 GPS 外部アンテナ スターターキット fo…
ちなみに背面の40ピン端子がメスヘッダーなので、ラズパイZero2の方はオスヘッダー付きのWHモデルをチョイス。ブッ刺すだけで結合完了。おそらく今回は半田付けも不要でケース内はかなりスッキリ作れそうな気がしています。
バックアップ電池としてML1220という規格の充電式コイン電池をセットできます。入れておくと衛星の位置情報をキャッシュしておけるので、電源投入からGPSを掴むまでの時間を短縮できるんだと思われます。壱号機、弐号機の秋月のGPSモジュールは普通のコイン電池だったので定期的に交換が必要でしたが、充電池ということで寿命も期待できます。残念ながらAmazonでは信頼できそうなブランドのものは見付からず、Yahoo!フリマでゲットしました。一応Amazonならコレとかでしょうけど送料も高いのでご注意ください。
DBTLAP CMOS バッテリー バッテリー と互換性があります MAXELL FDK Japan ml1220 CMOS BIOS 3v バッテリー…
ちなみにこちらのセルラーモデルもあって、車内Wi-Fiに依存せずに位置情報を発信しつづけられるならいいかもと思ったんですが、技適マークの有無について記載がなかったのと、アリエクだったかで「GPSとセルラー通信は同時に使用不可」みたいな記述があり、ちょっとリスクが高いなということで見送りました。
TOP1 SIM7080G NB-IoT/Cat-M(eMTC)/ GNSS HAT for Raspberry Pi、低電力狭帯域セルラーIoT通信モジュール…
microSDカードも大きいサイズは不要(Lite版OSのインストールサイズは2GB程度)なので、あえて小さい容量で、むしろ速度面や耐久性を優先したものを選定。最近のmicroSDはA1とかA2とかいうアプリケーションパフォーマンスクラスというランダムアクセス基準の規格があり、PiシリーズもA1まで対応してる(Zero2がどうかはよくわからず)ようなので、A1を要件としてみました(A2は対応してても活かせない)。まぁ別に直接触るものではないので、普通のU1とかU3とかでも全然問題ないんですが、値段もかわらなかったのでこちらに。購入時、Amazonが販売するもので697円でした。
【 サンディスク 正規品 】 SanDisk microSD カード 32GB UHS-I U1 Class10 Nintendo Switch メーカー動作…
容量は8GBとかで全然足りるんですが、そんな小さいのでA1は見付かりませんでした。
今回はGPS HATを取り付けるので壱/弐号機と同じケースは使えないだろうということで3Dプリンターで自作。Raspberry Pi Zero2の3Dモデルを海外サイトのGrabCADから取得(要登録)。HATも同一基板サイズなのでコピーして間隔をあわせ、それらが収まるケースをデザインしました。
■ハードウェア組立
ケースの材料は耐熱100℃のASA。GPS HATの上に高さのあるジャンパー(黄色)があるので、トータルの高さは壱、弐号機に比べてだいぶ出ちゃいました。幅70 x 奥行き35 x 高さ31mmという感じ。

右側面から生えているのがGPSアンテナです。
SDカード&端子面がこちら。miniHDMIとmicroUSB端子を挿せるようにするのに、基板と壁の隙間を極限まで狭めて、肉厚も1.8mmとしました。結果としてかなりギチギチでネジ止めの必要がなさそうなレベル。むしろ取り出しに苦労します。底に押しだし用の穴を空けておけば良かった。GPSアンテナのコネクターもホットボンドで固めようと思ったんですが、将来的に基板を取り出す時に困りそうなので保留。外側にケーブルガイド的なものをつければ良かったかも。

結果としてケーブルもそのまま挿せるし、microSDも素手で抜ける形にまとまりました。
あとは排熱性が不安ではあります。もう少し穴をたくさんあけて通気性を確保しようとも思ったんですが、車内でホコリやゴミが入るのを嫌ったのと、3Dプリント的に側面に穴があくと造形が難しくなるという理由でまずは穴開けは端子部のみとしました。どうにも動作が不安定になりそうならヒートシンクをつけたり最悪ファンをつけようと思いますが、ChatGPTさん曰く、ロード100%でぶん回すとかしない限りヒートシンクも不要、とのことだったのでまずは様子見。
■ソフトウェア整備
OSは前述の64bit版LiteをPi Imagerでサクっとセットアップ。一旦自宅のWi-Fiに接続し、基本sshでセッテイング作業を進めます。スクリプトはPythonで作られているので、それ回りをインストール。
GPS HATの公式ガイドはこちら。赤字の
If you use bookworm system, only the lgpio library is available, bcm2835 and wiringPi libarary cannot be installed or used. Please note that the python library does not need to install, you can directly run the demo.
という部分に注目。bookwormシステムの場合はlgpioライブラリだけでOKということです。bookwormとはDebian 12系のことで今回使用したRaspberry OSも当てはまります。minicomというツールをいれてサンプル通りにテストしたらあっさりデータが落ちてきました。いうてシリアルポート通信するだけなのでドライバーとかライブラリといっても特殊なことはなかったです。
先代はgpsdというシリアルポートからGPS情報を取り出してネットワーク経由で配信するデーモンを介していたんですが、対外的な通信をするわけではないので、今回はPythonから直接シリアルポートを叩くアプローチに変更。先代よりパワーアップしているのでそこまでリソースをケチる必要もないですが、無駄を残す必要もないかと。というかここでもChatGPTさん大活躍。必要なライブラリを挙げてもらい先代スクリプトを渡して書き直してくれと指示したらほぼ一発で修正してくれました。これがなければ自分で書き直そうとは思わず、そのままgpsd経由を踏襲していたと思います。
pipでgps3というライブラリを入れようとしたらセキュリティポリシーでエラー。今時はシステムワイドにライブラリを入れずにユーザーレベルの仮想環境というのを作ってやる作法らしい。全部ChatGPTさん情報!マジありがたい。
継続的にシリアルから送られてくる行のステータスがA(正常)の時は緯度経度などの値をコンソールに出力。それ以外のステータスではエラーメッセージを吐いてくれるので状況が一目瞭然です。新規導入ハードであるGPS HATがすんなり動いてくれてホッとしました。
また本番スクリプトでは徐々にサーバー送信が遅延していく現象が起き、ChatGPTさんの見立てでは、print文によるコンソール出力のバッファーあふれではないかということで、「, flush=True」を追加しています。これでバッファーに貯めずに即時出力されるらしい。もう少し検証予定。
あと、別記事のリソース最適化をする中でBluetoothを無効化したところ、使用するシリアルポートが/dev/ttyS0から/dev/ttyAMA0になりました。