マツド・サイエンス研究所

Raspberry Pi Zero W RTC と シャットダウン・ボタン

先日のブログ

にも書いたが、Raspberry Pi Zero W をアクセスポイント化して、山奥とか離れ小島とか、インターネットにアクセスする方法がない場所でも、チャットや対戦ゲームやチェックリストのオリジナルなプログラムを、仲間内だけで使うような ミニサーバーを作ろうと思っている

が、大きな問題があった

Raspberry Pi Zero W には、リアルタイムクロックが無い

これは、Raspberry Pi Zero W に限らず、Raspberry Pi シリーズは全てリアルタイムクロックがない

このため、起動すると、前回シャットダウンした時刻にシステムクロックが止まったままになる

もちろん、インターネットアクセスが可能なら、即座に NTP に接続し、システムクロックを修正するのだが、そもそもインターネットアクセスができないような場所で、チャットや対戦ゲームやチェックリストをやりたいのだから、困ったしまう

もう一つの問題は、リアルタイムクロックに比べると些細だが、単独ではシャットダウンする方法がないことだ

そこで、RTC と シャットダウンするためのボタンを追加することにした

ついでながら、ステータス表示のための LED も追加した

必要な部品 秋月電子にて

・DS1307 I2Cリアルタイムクロックモジュール(RTC) 750円

・2色LED 赤・黄緑3mmクリアボディ OSRGHC3131A (10個入) 150円 : 使うのは 1個

その他

・押しボタンスイッチ

・抵抗 5.1kΩ 2個

配線 ・Raspberry Pi Zero W 部品

・2pin 5V ⇔DS1307 P1 3pin Vcc

・3pin SDA1 ⇔DS1307 P1 4pin SDA

・5pin SCL1 ⇔DS1307 P1 5pin SCL

・30pin Gnd ⇔DS1307 P1 2pin Gnd

・29pin GPIO5 ⇔押しボタン

・33pin GPIO13 ⇔LED (赤) 5kΩ経由

・35pin GPIO19 ⇔LED (緑) 5kΩ経由

・30pin Gnd ⇔押しボタン・LED コモンカソード

シャットダウンプログラム ・ブログのせいで、インデントが表示されず、見にくいところ、申し訳ない

/usr/local/sbin/raspi_shutdown.sh

#!/bin/sh
count=0
b_status=0
b_count=0
flg_ping=0
while :
do
sleep 0.5s
if [ $b_status -eq 0 -o $b_status -eq 1 ]; then
case $count in
0)
echo 0 > /sys/class/gpio/gpio13/value
echo 1 > /sys/class/gpio/gpio19/value
;;
1)
if [ $flg_ping -eq 0 ]; then
ping -c 1 -W 1 google.com > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo 0 > /sys/class/gpio/gpio13/value
flg_ping=1
else
echo 1 > /sys/class/gpio/gpio13/value
fi
else
echo 0 > /sys/class/gpio/gpio13/value
fi
echo 0 > /sys/class/gpio/gpio19/value
;;
esac
elif [ $b_status -eq 2 -o $b_status -eq 3 ]; then
case $count in
0)
echo 1 > /sys/class/gpio/gpio13/value
echo 0 > /sys/class/gpio/gpio19/value
;;
1)
echo 0 > /sys/class/gpio/gpio13/value
echo 0 > /sys/class/gpio/gpio19/value
;;
esac
elif [ $b_status -eq 4 ]; then
echo 1 > /sys/class/gpio/gpio13/value
echo 0 > /sys/class/gpio/gpio19/value
fi
SHUTDOWN=$(/bin/cat /sys/class/gpio/gpio5/value)
case $b_status in
0)
if [ $SHUTDOWN = 0 ]; then
b_status=1
b_count=0
fi
;;
1)
if [ $SHUTDOWN = 0 ]; then
b_count=`expr $b_count + 1`
if [ $b_count -eq 10 ]; then
b_status=2
b_count=0
fi
else
b_status=0
b_count=0
fi
;;
2)
if [ $SHUTDOWN -ne 0 ]; then
b_status=3
b_count=0
fi
;;
3)
if [ $SHUTDOWN = 0 ]; then
b_status=4
b_count=0
else
b_count=`expr $b_count + 1`
if [ $b_count -eq 10 ]; then
b_status=0
b_count=0
fi
fi
;;
4)
if [ $SHUTDOWN = 0 ]; then
/sbin/shutdown -h now
else
b_status=0
b_count=0
fi
;;
esac
count=`expr $count + 1`
if [ $count -eq 2 ]; then
count=0
fi
done

なお、このプログラム、元々は日経LINUX 2017年2月号の記事を参考にしたのだが、日経LINUXの記事のままだと、Raspberry Pi Zero W の少ない CPU の負荷が100%になってしまうので、改良した

また、Raspberry Pi Zero W のステータス表示機能も追加している

RTC の設定

$ sudo raspi-config
<< i2cをイネーブルにする >> $ sudo reboot

再起動

$ sudo apt-get install i2c-tools python-smbus
$ sudo modprobe rtc-ds1307
$ sudo apt-get remove fake-hwclock
$ sudo dpkg --purge fake-hwclock

 

/etc/rc.local のファイル末に下記を追加

echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
sudo hwclock --adjust || true
sudo hwclock -s || true
echo 13 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio13/direction
echo 0 > /sys/class/gpio/gpio13/value
echo 19 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio19/direction
echo 0 > /sys/class/gpio/gpio19/value
echo 5 > /sys/class/gpio/export
echo in > /sys/class/gpio/gpio5/direction
/usr/local/sbin/raspi_shutdown.sh &
exit 0

ここで、一度、再起動

使い方

RTCモジュールについているボタン電池は、充電池なのだが、秋月電子で購入したときは、ほぼ空になっていた

起動した状態で充電できるようなので、最初は、何時間か連続で通電しておく

インターネットに接続し、NTPで時刻が正しくなっている状況で、

$ sudo hwclock -w

とやると、RTCが設定される

最初の内は、RTCの誤差が大きい(私のRTCの場合は、24時間で6秒も遅れた)

インターネットのNTPで正しい時刻にシステムクロックが設定されている時に、「$ sudo hwclock -w」を何度か繰り返しているうちに、誤差が補正される

これは、/etc/rc.local のファイルの中で、「sudo hwclock --adjust」と補正オプションが指定されているため、補正値を自動設定しているからだ

補正が正しくできるようになったら、インターネットアクセスは必要なくなる

電源が入り、OSが起動すると、LEDが点滅してステータスを表示する

インターネットアクセスにアクセスできないうちは、LEDは「赤と緑が交互に点滅」になる

そのうち、インターネットアクセスが確立したら「緑だけの点滅」になる

(当然ながら、インターネットアクセスが不可能な山の中や離れ小島では、「赤と緑が交互に点滅」のままだ)

押しボタンを長押しすると、LEDは「赤だけの点滅」に変わる

ここで一度指を離し、再びボタンを押すと「赤の点灯」になり、その後、シャットダウンする

さて、今回は、ブレッドボードで回路を作ったが、次回は、ユニバーサル基板に半田付けし、小さなケースにいれて、『ミニサーバー』にする予定だ

注意

ブログのコンテンツの内、「告知」など時期よって情報価値が無くなるのは除いてある。また、コンテンツに付いたコメントは書き込み者に著作権があるものと判断し、ここに持ってきていないので、コメントを見るときは、元々のブログコンテンツを参照してもらいたい。

その他、ブログ発表後、コメントなどの内容を反映するなど、内容を変更しているものもあるので、注意してほしい。