ラズパイをドライブレコーダーとして車載して運用する際に気を付けたいのが電源周りです。
普通にアクセサリーソケットから電源を取ればエンジンの始動と同時に自動的に起動させることが可能ですが、エンジンを止める際はシャットダウン処理を行わずにブツ切りしてしまうことになります。きちんとシャットダウンを行わないと、録画したデータやシステムそのものを破損してしまう恐れさえあります。
もっともラズパイをシャットダウンさせる方法はいろいろありますが、そのためにエンジンを止める前にわざわざ物理ボタンや音声コマンドで操作するというのは煩わしいです。
そこで私はラズパイ専用のUPSモジュール、UPS PIcoを搭載することにしました。UPS PIcoを使用すればエンジンを止めてもいきなり電源が落ちることはなく、ラズパイを安全にシャットダウンさせることが可能です。
そんなUPS PIcoの使い方についてまとめておきます。
ドライブレコーダーなラズパイを安全にシャットダウンしたい
ラズパイでドライブレコーダーを作るのは簡単ですが、電源の取り方が地味に難しいです。前述したように、アクセサリーソケットから電源を取るならエンジンを止める前にシャットダウンするのが望ましいでしょう。
そこでラズパイの電源の取り方やシャットダウン方法についてずっとあれこれ考えてきました。
最小限の労力でスマートに電源を落としたい
有線接続の物理ボタン、Bluetooth接続の物理ボタン、スマートスピーカーの音声コマンドによる操作など…ラズパイをシャットダウンする方法はいろいろ考えられますが、基本的に何かしらの操作を行わなくてはいけません。
慣れればどうってことはないかもしれませんが、せっかくアクセサリーソケットから電源を取ってエンジンスタートと同時に起動させるなら、シャットダウンも自動化させたいじゃないですか。
そこで思い付いたのがUPSです。
UPS PIcoを搭載すれば安全にシャットダウンすることが可能
UPSとはUninterruptible Power Supplyの略で、無停電電源装置のことです。電力の供給が途絶えた場合にバッテリーとして動作し、停電を感知すると機器を安全に停止させるといったことができます。
モバイルバッテリーをUPSとして代用するなんて記事を見かけたりしますが、普通のモバイルバッテリーに繋いだだけだと停電を感知してシャットダウンするなんて芸当はできません。
ラズパイドラレコにUPSを搭載しておけば自分の意思でエンジンを停止させた場合はもちろん、事故によって車から電力の供給が途絶えた場合でも録画データを保全しておける確率が高くなるでしょう。
ラズパイで使用可能な専用のUPSモジュールはいろいろありますが、今回私はPiModules製のUPS PIco HV1.1を安く手に入れられたので、これをRaspberry Pi 3Bで使用することにしました。少ないながらも日本語で解説しているブログ記事があったことが決め手です。
旧型のUPS PIcoでも最新のRaspberry Pi OSで使用可能
現在UPS PIcoの最新のリビジョンはHV3.0B+でしょうか。HV1.1はファームウェアの更新もとっくに止まっており古いモデルではありますが、正しく設定すれば最新のRaspberry Pi OSでも問題なく使えました。
まあリビジョンによる違いは供給可能な最大電流くらいで、そこまで大きな差はなさそうです。
もっともリビジョンに関係なく、現在日本国内でUPS PIcoを取り扱っている販売店はなさそうなので、これから手に入れるならPiModulesの公式サイトから直接購入、つまり個人輸入するしかなさそうですが…
多少のコストや手間をかけてでも導入する価値があるガジェットだと思います。
ただコストを重視するならAmazonでも安価なラズパイ用のUPSが販売されているので、他の製品を検討するのも良いかもしれません。
UPS PIcoの使い方
それではUPS PIcoの使い方について説明します。
大体のことは以下のブログ記事で解説されていますし、PiModulesから設定ガイドやマニュアルも公開されているのですが、この約4年間でOSの仕様が変わったらしく、これらに書かれている作業だけでは正常に動作しませんでした。
結論から言えば、I2C周辺の設定が不十分で、一部のコマンドしか正常に受け付けない状態になってしまいます。
raspi-configの設定画面なども変わっているので、最新のRaspberry Pi OSで使用する場合は注意してください。
UPS PIcoの基板に必要なパーツを取り付ける
まずはUPS PIcoの基板に必要なパーツを取り付けます。
HV1.1だとラズパイのGPIOに接続するためのピンソケットは既にはんだ付けされていましたが、リビジョンによっては自分ではんだ付けしないといけないかも…?
リチウムイオンバッテリーは単純にソケットに差し込むだけで取り付け可能です。
バッテリー容量もリビジョンによって異なるらしく、HV1.1に付属しているリチウムイオンバッテリーの容量は300mAhでした。まあ今回は給電が停止したらすぐにシャットダウンさせるので、300mAhでもまったく問題ないでしょう。
リチウムイオンバッテリー以外のスピーカーなどは必要に応じて取り付けてください。これらのパーツは要はんだ付けです。
Raspberry Pi 3BにUPS PIcoを取り付ける
UPS PIcoに必要なパーツを取り付けたら、基板をラズパイのGPIOに取り付けましょう。
すべての箇所がしっかり接続されていることを確認したら、ラズパイにUSBで給電して起動させてください。
raspi-configの設定を変更する
ラズパイのGPIOには2つのUARTピン、TXDとRXDがあります。これらはデフォルトではLinux Serialコンソールに割り当てられています。
このUARTを使用してUPS PIcoとシリアル通信を行うためには、Serialコンソールに割り当てられないようにしてやる必要があります。
Serialコンソールを無効化する
raspi-configでSerialコンソールを無効化します。
$ sudo raspi-config
Interfacing OptionsからSerial Portを選択すると2回選択肢が表示されるので、以下のように設定します。
- Would you like a login shell to be accessible over serial? > No
- Would you like the serial port hardware to be enabled? > Yes
これでUARTがSerialコンソールに割り当てられず、シリアル通信が可能となります。
I2Cを有効化する
同じくraspi-configのInterfacing OptionsからI2Cを有効化します。
- Would you like the ARM I2C interface to be enabled? > Yes
これでI2Cによるシリアル通信が可能となりました。
ただし最新のRaspberry Pi OSではUPS PIcoを動かすのに必要なI2Cモジュール、i2c-bcm2708が入っていないのでこれを導入してやる必要があります。
Raspberry Pi OSでi2c-bcm2708を使えるようにする
i2c-bcm2708を使えるようにするためにはRaspbian時代の古いOSを利用したり、カーネルバージョンをダウングレードするような方法もありますが、以下の方法で最新バージョンのRaspberry Pi OSでもi2c-bcm2708を使えるようになりました。
必要なライブラリをインストール&アップデートする
まずはPiModules公式の設定ガイドに従って、必要なライブラリをインストールおよびアップデートします。
$ sudo apt-get install python-rpi.gpio $ sudo apt-get install python-smbus $ sudo apt-get install i2c-tools
I2Cモジュールを追加する
次にエディタで/etc/modulesを編集します。
$ sudo nano /etc/modules
恐らくi2c-devは既に記述されているので、i2c-bcm2708を追記して保存してください。
設定ガイドにはここまでしか書かれていませんが、実際には以下の記事で紹介されている方法で別途モジュールをダウンロードしてやる必要がありました。
具体的には以下のgithubに投稿されている投稿のリンクからi2c1-bcm2708.dtboをダウンロードして、/boot/overlaysに置きます。
権限の関係で直接書き込むことができなければ、一旦/home/piに保存してからコピーしてみましょう。
$ sudo cp i2c1-bcm2708.dtbo /boot/overlays/i2c1-bcm2708.dtbo
そしてエディタで/boot/config.txtを編集して、末尾に以下の2行を記述します。
$ sudo nano /boot/config.txt
dtoverlay=i2c1-bcm2708 dtparam=i2c_baudrate=10000
2行目はI2Cのデータ転送速度を10kHzに変更するための記述です。デフォルトだと100kHzだそうですが、私の環境だとこのままではUPS PIcoが正常に動作しませんでした。データ転送速度は速過ぎても遅過ぎてもダメらしく、とりあえず10kHzで動いたのでこうしています。
これでようやくI2Cが正常に使えるようになりました。i2cdetectコマンドを実行して以下のように表示されればOKです。
$ sudo i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- 68 69 6a 6b -- -- -- -- 70: -- -- -- -- -- -- -- --
UPS PIcoのサポートファイルをダウンロードする
UPS Picoを使用するのに便利なサポートファイルがPiModulesより提供されているので、これをダウンロードしましょう。
$ wget http://www.pimodules.com/_zip/UPS_PIco_Supporting_Files.zip
ダウンロードしたzipファイルを解凍、展開すると5個のファイルが含まれているはずです。
$ unzip UPS_PIco_Supporting_Files.zip
- picofssd.py:電源監視システムを実行するためのスクリプト
- picofu3.py:ファームウェアを更新するためのスクリプト
- pico_status.py:ステータスを確認するためのスクリプト
- rc.local
- UPS_PIco_0x58_18_01_2016.hex recent changes.pdf
pico_status.pyを実行するとこんな感じでステータスが表示されます。
また同梱されているrc.localを利用すれば、ラズパイ起動時にpicofssd.pyを自動実行させることが可能です。現在rc.localを利用するのは非推奨とされていますが、systemdへの置き換えがどうも上手くいかないので私は今のところrc.localで自動実行させています。。
rc.localで自動実行させるなら、サポートファイルに含まれているrc.localを/etc/rc.localに置いても良いですし、/etc/rc.localを編集して以下をexit 0の直前にコピペしておくだけでもOKです。前者の場合は実行権限を与えておきましょう。
sudo python /home/pi/picofssd.py & echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device ( sleep 4; hwclock -s ) &
これでラズパイを再起動すれば、UPS PIcoによる電源監視システムも自動的に立ち上がります。
UPS PIcoの設定をコマンドで変更する
UPS PIcoの設定はコマンド操作で変更することが可能です。設定ガイドやマニュアルにはいろいろ載っていますが、ここでは基本的なコマンドだけ取り上げておきます。
給電が停止してからシャットダウンするまでの時間を変更する
UPS PIcoを使用すると、給電が停止してから指定した時間の経過後にラズパイをシャットダウンさせることが可能です。
以下のコマンドを実行すると、このような感じでシャットダウンするまでの時間を16進数で取得することができます。
$ sudo i2cget -y 1 0x6b 9 0x6b
これを変更するためには以下のどちらかの記述方法でコマンドを実行してください。
$ i2cset -y 1 0x6b 9 0x1e #16進数で30秒を指定 $ i2cset -y 1 0x6b 9 30 #10進数で30秒を指定
16進数で記述するなら0x0fや0xfdのように、頭に0xを付けて記述します。最短15秒から最長254秒まで指定することが可能です。
この状態でUSBによる給電を止めれば、30秒後自動的にシャットダウン処理が行われるようになります。車のエンジンをかければ自動的にラズパイを起動して録画を開始し、エンジンを止めれば自動かつ安全に電源を切ってくれるようになりました。
これで気兼ねなく電源をブツ切りすることができます。
限界までバッテリー駆動させてからシャットダウンさせる
時間指定でシャットダウンさせる場合は最長でも254秒しか駆動させられませんが、10進数で255、もしくは16進数なら0xffと指定すると、バッテリーの電圧が3.5Vを下回るまで放電したらシャットダウンさせるといったことが可能です。
$ i2cset -y 1 0x6b 9 0xff
要はUSBによる給電が止まってもバッテリーで駆動し続けて、残量が少なくなったらシャットダウンするというわけですね。
UPS PIcoに標準で同梱されているバッテリーの容量は少ないのであまり役に立たないでしょうけれども、もし大容量のバッテリーに繋ぎ変えて駐車中も監視カメラとして動作させたりするのであれば、このように設定しておくと良いでしょう。
まとめ
ラズパイドラレコにUPSを搭載すれば、わざわざ手動でシャットダウンを行わなくてもエンジンを止めれば、つまり給電が止まれば自動的にシャットダウン処理が行われるようにすることが可能です。
今回使用したUPS PIcoはリビジョンがHV1.1と古いモデルでしたが、最新のRaspberry Pi OSでもシリアル通信に必要なI2Cモジュールを入れてやれば問題なく使えました。
ドラレコ用途に限らず、ラズパイを安全にシャットダウンさせたかったり、停電対策を行いたいならUPSを導入してみてはいかがでしょうか。
実はこの記事を公開する頃にはHV3.0BのUPS PIcoが手元に届いてたりします。そちらについてもおいおい記事化する…かもしれません。
コメント