最近になってようやくRaspberry PiとOpenAuto Proを使って本気でAndroid Auto搭載カーナビを自作しようとしてる筆者ですが、Raspberry Piを車載するにあたって非常に悩んだのが電源です。
ACC電源から給電すればエンジンのON/OFFと連動させることはできますが、シャットダウンせずに電源をぶつ切りするのはシステムファイルを破損させる恐れがあります。ROM化すればそのリスクは抑えられますが、ファイルシステムを変更したい場合はいちいち解除する必要がありますし、なんとなく気分の良い方法ではありません。なんとなく。
実際に使い始めてみると、新しい端末をペアリングしてもリセットされてしまいますし、音量レベルも何もかもがその都度リセットされるのでやっぱりちょっと不便です。
調べてみると遅延回路なるものを自作して、ACC電源がOFFになったことを検知してシャットダウンしてから電源を切断…といったことをしている方もいますが、物理が苦手な筆者には一体何がなんなのやら…
と思っていたら、同じような働きをしてくれる遅延リレーをAmazonで見つけました。これとさらに別途用意したリレーを組み合わせれば、Raspberry Piの電源をACC電源に連動させながらシャットダウンを自動化することが可能になる…!
というわけで車載したRaspberry Piを安全にシャットダウンする新たな方法を紹介します。
Raspberry Piを遅延リレーで安全にシャットダウンする仕組み
Raspberry Piの電源を連動させたいのはACC電源ですが、直接ACC電源に繋いでしまうとエンジンOFFと同時にRaspberry Piへの給電も止まってしまいます。
そこでRaspberry Piの電源としてはACC電源ではなく、常時電源に繋ぐことにします。そしてエンジンがOFFになったことを検知したらshutdownコマンドを実行。これは一般的なリレーで実現可能です。
ただし、これだけだとシャットダウン後もRaspberry Piに通電し続けており、次にエンジンがONになっても自動的に電源が入りません。もっと言えば、車のバッテリーを消費し続けることになるので何かしらの対策が必要です。
そこでタイマー機能付きの遅延リレーを利用して常時電源に繋ぐことにします。エンジンがONになったら常時電源に接続し、エンジンがOFFになった場合はシャットダウン完了を待って常時電源から切断させるというわけです。
これならRaspberry Piの電源をエンジンのON/OFFに連動させつつ、安全にシャットダウンさせることができます。
遅延リレーの設定と配線について
今回筆者が購入したDROKのタイマー機能付き遅延リレーには7つのモードが用意されていますが、使用するのはP7です。例えばタイマーを10秒に設定しておくと、トリガーがOFFになってから10秒後にリレーもOFFになります。ここの時間はシャットダウンにかかる時間を考慮して10~15秒くらいで設定すれば良いでしょう。
電源はMicroUSBからも取れますが、車載するなら12Vの電源を直接繋いでも良いです。いずれにせよエンジンOFF後も動作してもらう必要があるので、この遅延リレーの電源は常時電源から取らなくてはいけません。Amazonのレビューを読んだ限りでは待機電力は微量のようなので、こちらを通電させたままにしておくのは問題ないと思いますが…まあそこは自己責任で。。
あとはトリガーとしてACC電源を接続。トリガー時に電源が入るように、NOにRaspberry Piの電源回路を組み込みます。
ちなみにRaspberry Piの電源もUSBではなく、DC-DCコンバータを使用して12Vから5Vに降圧し、GPIOから給電してやれば良いと思います。Raspberry PiはGPIOの5VとGNDを電源に繋ぐことでも起動、使用することが可能です。
そのほうが配線がすっきりとしますし、下記のDC-DCコンバーターなら5Aまで出力可能なので電力も十分に得られます。なおこちらのDROK製DC-DCコンバータ、何故か商品画像と外観が異なる製品が送られてきますが…性能的には同一で問題なさそうなのでとりあえず良しとしておきます。
2023年7月3日時点で掲載されている商品画像は実際に届いた製品と同一なので問題ありません。いつの間にか差し替えられていたようです。
エンジンOFFを検知してシャットダウンする方法
エンジンOFFをトリガーとするのは同じですが、こちらは普通のリレーでOKです。
リレーを介してGPIOピンに電圧を印加するように回路を作り、印加されたらshutdownコマンドを実行するようにします。やり方はいろいろあるかと思いますが、筆者はPythonで以下のようなプログラムを作ってみました。
#!/usr/bin/env python3 import RPi.GPIO as GPIO import time import sys import os GPIO.setmode(GPIO.BCM) GPIO.setup(19, GPIO.IN, pull_up_down=GPIO.PUD_UP) while True: try: GPIO.wait_for_edge(19, GPIO.FALLING) os.system('sudo shutdown -h now') except KeyboardInterrupt: GPIO.cleanup() sys.exit()
簡単に説明すると、まず10行目でGPIOの19番ピンについてプルアップ抵抗を有効にします。こうしておくとGNDと繋いだ際に3.3Vの信号が入力されたと検知することが可能です。
そして12行目からのwhile文で19番ピンの状態を監視します。GPIO.wait_for_edge()関数で信号が入力されるまで待機し、入力されたらshutdownコマンドを実行するという仕組みです。
したがってこのプログラムの場合だと、19番ピンとGNDをリレー非作動時に通電するように繋ぐことになり、以下のような5極のリレーが必要になります。
4極のリレーでも、0Vになったことを検知させれば同じことが可能な気はしますが、リレーを通電させておかないと勝手にシャットダウンしてしまうので恐らく面倒なことになります。。
まあいずれにせよプログラムが期待通りに動作することを確認したら、systemdで自動起動するようにしておきましょう。
遅延リレーを導入することによるその他のメリット
遅延リレーを導入したことで副次的なメリットも得られました。それはポップノイズ対策です。
現在パワーアンプを繋いで車のスピーカーから音声を流していますが、エンジン停止で電源をぶつ切りするとアンプよりもRaspberry Piのほうが先に電源を切断されてボツッという大きなポップノイズが鳴るんですよね。ポップノイズが発生するかどうかはアンプの機種や構成にもよりますが…
しかしアンプの電源が落ちてからシャットダウンが完了するように調整した後は、不快な音が鳴ることはなくなりました。
ROM化して電源ぶつ切りで運用するほうが簡単ではありますが、筆者のようにポップノイズが乗って困っている方はぜひ遅延リレーの使用をおすすめします。
まとめ
今回は車載利用を想定したRaspberry Piの安全なシャットダウン方法を紹介しました。
高温になりやすい車だとUPSを搭載するのはリスキーですし、ROM化だとシステムファイルを弄れなくなるのが不都合な場合もあるでしょう。しかしタイマー付きの遅延リレーならこれといったデメリットはなく、安全に電源を落とすことができます。
Raspberry Piでカーナビやドラレコなどを自作する際の参考になれば幸いです。
コメント