はじめに
RPi zeroを使ったラジコンカーでは,電池でも動作するように設計してあります.このため,電池残量がなくなってきた時,ユーザにそれを知らせることで,速やかにRPiの再起動をさせるように促す必要があります.RPi zeroを使ったラジコンカーにはそのために電池の電圧を検知する機能をつけておきました.ここではその方法について説明します.
環境
- ハードウェア: Raspberry Pi zero WH
- OS: Raspberry Pi OS Buster
- 端子制御用ライブラリ: wiring pi
方法
まず,ハードウェアについて説明します.RPi zeroにコンパレータNJM2903を接続しています.秋月電商でも買える手ごろなコンパレータです.コンパレータで比較する電圧は,片方が5[V]であり,これは電池の電源をレギュレータで5[V]にドロップしたものになります.もう片方が電池の電圧となるわけですが,ここでは8[V]以下になったら警告を表すLEDを点灯するようにしたいため,電池の電圧が8[V]になったら5[V]になるように分圧します.従いまして,5/8となるような分圧をします.切りのいい抵抗としては5/8=20/32=20/(12+20)ということで,12[kΩ]と20[kΩ]の抵抗を使用しました.下の図はコンパレータ周りの回路を表します.R7とR8で分圧しています.また,今回使っているコンパレータはオープンコレクタのようなので,R12でプルアップしています.
次にソフトウェアに関して説明します.上記回路図に置いて,コンパレータの1番端子がRPi zeroの35番端子につながっています.この端子がHigh(=1)となる時に電池の電圧が8[V]より低くなっていることを表します.つまり,Highになるということはコンパレータの+側(3番端子)のほうが-側(2番端子)よりも高い電圧であるということだからです.RPi zeroの35番端子はwiring piでいうとGPIO19番端子になります.
電池の電圧が8[V]より低くなったら,GPIO25番端子で制御できるLEDを点灯させます.詳しい回路は省きますが,Highを出力すると点灯し,Lowを出力すると消灯するようになっています.
以上のことを踏まえて下に示すスクリプトを作成しました.ここでは,check_voltage.shという名前のファイルにしました.GPIO19番端子の状態をチェックし,HighならGPIO25番端子をHighに,そうでなければLowにするようになっています.また,5秒に1度チェックするようにするため,sleepコマンドを入れてあります.
#!/bin/sh /usr/bin/gpio -g mode 25 out /usr/bin/gpio -g mode 19 in while [ 1 -eq 1 ] do IS_LOW=`/usr/bin/gpio -g read 19` if [ $IS_LOW -eq 1 ] then /usr/bin/gpio -g write 25 1 else /usr/bin/gpio -g write 25 0 fi sleep 5 done
スーパユーザである必要はないのですが,このファイルのユーザをrootにします.また,スクリプトに実行権限を付加します.最後に,/usr/local/binの下に移動します.これらのことを下のように行います.
% sudo chwon root.rootcheck_voltage.sh $ sudo chmod a+x check_voltage.sh % sudo mvcheck_voltage.sh /usr/local/bin/
あとはこのスクリプトを起動時に実行させるべく/etc/rc.localに追記しておきます.
# Check voltage /usr/local/bin/check_voltage.sh &
これで再起動すればよいです.
動作確認をするため,電池の代わりに安定化電源を使い,電圧を制御できるようにしてみました.おおよそ8.2[V]程度でLEDが点灯することを確認できました.下の図は8.23[V]の時の様子です.LEDが消灯しています.
一方,下の図は8.21[V]の時の様子です.LEDが点灯しています.このように,電圧に応じてLEDが変化することを確認できました.今回はLEDでユーザに電圧を知らせましたが,場合によっては強制的にシャットダウンプロセスを実行することもできると思います.