できること

第59回「ウォッチドック基板でラズベリーパイを自動再起動!」

raspberrypi59_main
今回は、Raspberry Pi Model B+用ウォッチドッグ基板を使って、ラズベリーパイに「ウォッチドック」を搭載させてみたいと思います!

ウォッチドッグとは – IT用語辞典 Weblio辞書
ウォッチドッグとは、システムが正常に動作しているかどうかを監視するためのデバイスの総称である。
ウォッチドッグは、システム上で動作しているそれぞれのアプリケーションに定期的に信号を送らせている。一定周期を経過してウォッチドッグに信号を送らなかったアプリケーションがあれば、そのアプリケーションがハングアップなどの異常状態に陥っていると判断し、CPUに割り込みをかけてアプリケーションを停止したり再起動したりする。

ウォッチドッグとは、システムが正常に動いているかどうかを監視してくれる機能です。今回の場合は、フリーズしてしまったときに強制的に再起動処理を走らせてくれる、というようなイメージでしょうか。
今回扱う「Raspberry Pi Model B+用ウォッチドッグ基板」は、GPIOを監視するプログラムがあらかじめ組み込まれているので、とても簡単に導入することができます!

 

Raspberry Pi Model B+用ウォッチドッグ基板

raspberrypi59_img01

図1

Raspberry Pi Model B+用ウォッチドッグ基板 – スイッチサイエンス
Raspberry Pi Model B+ にウォッチドッグ機能を追加する電源供給基板です。
カウントダウンタイマを内蔵した基板上のマイコンがRaspberry PiのGPIOを監視しており、Raspberry Piのソフトウェアが定期的にGPIOを変化させることによりマイコン内部のタイマをリセットします。
Raspberry Pi上のメインプログラムがロックするなどの異常でGPIOが変化しなくなると、カウントダウンタイマがリセットされなくなるためマイコンがRaspberry Piへの電源供給を一時停止し、Raspberry Piを再起動させます。

今回扱うのはこちらのウォッチドッグ基板です。「Raspberry Pi Model B+」とありますが、「Raspberry Pi Model A+」と「Raspberry Pi 2 Model B」にも対応しています(今回は「Raspberry Pi 2 Model B」を使用します)。

詳しい使い方については「Raspberry Pi用のウォッチドックタイマー の使い方」にまとめられています。今回はこちらのページを参考に進めていきましょう。

 

ウォッチドッグ基板をセット!

raspberrypi59_img02

図2

ウォッチドッグは、Sense HATのときと同じように、ラズベリーパイのGPIOピンに差し込んで接続します。GPIOの反対側は浮いた状態になるので、しっかり固定したい場合はスペーサを使いましょう。

raspberrypi59_img03

図3

電源は、図3のように、ウォッチドッグ基板のDCジャックから取ります。DCジャックを通電させると、ウォッチドッグだけでなく、ラズベリーパイ本体にも電源が入ります。

間違えやすい(?)ポイントは以下の2点です。

1. ウォッチドック基板上のDCジャックから電源をとる
「Raspberry Pi用のウォッチドックタイマー の使い方」のページにも太字でしっかり書かれていますねが、Sense HATなどのように、GPIOに差し込むだけで使えるものとは違います。

2. ラズベリーパイ本体の電源は使用しない
電源をウォッチドックのDCジャックからとるので、ラズベリーパイ本体の電源(microUSB)は使用しません。別電源が通っていると、ウォッチドッグが動作しても再起動されなくなってしまいます。

実はこの電源まわりを勘違いして、数日間悩んだのでした……。

raspberrypi59_img04

図4

動作確認の際は、「動作ステート用LED」が点灯させておくと分かりやすいです。省電力のためデフォルトではオフになっていますが、「LED on/offジャンパー」をショートさせるとオンになります。ショートさせるにはジャンパーピンを使いますが、写真ではジャンパーワイヤーで代用しています。

LEDの光り方は下記の3パターンです。数値ではイメージしにくいですが、実際に目で見るとかなり違いがあります。

各ステート時のLEDの光り方
・WD_default時には、ステートLEDが約2.56秒に1回点滅
・WD_Active時には、ステートLEDが約0.32秒に1回LED点滅
・WD_ReBoot時には、ステートLEDが約0.08秒に1回LED点滅

 

ウォッチドックを導入!

この記事では、ラズベリーパイは「Raspberry Pi2 Model B」を、OSは2016-11-25リリースの「Raspbian Jessie with PIXEL」を使用しています。

sudo apt-get update
sudo apt-get upgrade

SDカードにRaspbianを書き込んだ後、いつものコマンドを実行し終えたところからのスタートです。

 

ウォッチドッグは図5のように動作します。
電源を入れただけは起動せず、「ステートLEDが約2.56秒に1回点滅」のデフォルト状態が続きます。
ウォッチドッグを起動させる具体的な方法については、「Raspberry Pi用のウォッチドックタイマー の使い方」の下部に記載されています。

Raspberry Pi側で準備する事は、ブートアップして準備が整ったら、監視ポート(標準ではGPIO17)にパルス信号を出すプログラムを自動で走らせる事です。

太字でしっかりと書かれている部分ですね。
この処理を行うプログラムソースも合わせて公開されています。

Raspberry Pi サンプルプログラム(python)
プログラムの動作は、「1秒に一回、GPIO17にパルスを1回出す。」です。
ウォッチドッグ基板と連携をとる場合には、このGPIOにパルスを出すプルグラムを自動的に起動する必要があります。 こうする事で、Raspberry Piがリブートした場合にもウォッチドック機能を自動的に再利用できるようになります。

それでは、このプログラムを使ってウォッチドッグを動かしてみましょう!

sudo nano blink17.py

#!/usr/bin/env python

import RPi.GPIO as GPIO
import time

LEDPIN = 17

GPIO.setwarnings(False)

GPIO.setmode(GPIO.BCM)
GPIO.setup(LEDPIN, GPIO.OUT)

while True:
    LEDon = GPIO.output(LEDPIN, 0)
    time.sleep(0.5)
    LEDoff = GPIO.output(LEDPIN, 1)
    time.sleep(0.5)

まずはプログラムソースを適当な場所に保存して、下記のコマンドで実行です。

python blink17.py

ウォッチドックは5回のパルスを感知すると起動するので、このプログラムの場合は実行から5秒で「ステートLEDが約0.32秒に1回LED点滅」する状態になります。その後、5秒以上パルスの無い状態が続くと、「ステートLEDが約0.08秒に1回LED点滅」する状態に変わり、自動的に再起動が行われます(動画では、[Ctrl]+[C]で強制終了させています)。

 

自動起動テスト

自動での再起動後も処理が走るように、ウォッチドック用のプログラムは起動時に実行するように設定して便利ですね!

ここでは、30秒間だけ処理を行うように調整したプログラムを使ってテストしてみましょう(あまり短くしてしまうとcronを解除するのが大変なので、短くても30程度がおすすめです)。

sudo nano blink17_30sec.py

#!/usr/bin/env python

import RPi.GPIO as GPIO
import time

LEDPIN = 17
SEC    = 0

GPIO.setwarnings(False)

GPIO.setmode(GPIO.BCM)
GPIO.setup(LEDPIN, GPIO.OUT)

while SEC < 30:
    LEDon = GPIO.output(LEDPIN, 0)
    time.sleep(0.5)
    LEDoff = GPIO.output(LEDPIN, 1)
    time.sleep(0.5)
    SEC = SEC + 1
    print SEC

次に、実行権限を与えてからcronに登録します。

sudo chmod 755 blink17_30sec.py
crontab -e

「起動時」に実行させたいので、「@reboot」を指定しましょう。最終行に下記のように追記しました。

@reboot python /home/pi/blink17_30sec.py

cronを再読み込みさせてから、ラズベリーパイを再起動します。

sudo /etc/init.d/cron restart
sudo reboot

LEDを見ると状態がわかりやすいですね!

動作確認を終えたら、cronの設定は解除しておきましょう。導入する際には、cronで呼び出すプログラムを、制限なくパルスを送り続けるものに変更(ここではblink17.py)すればOKです。

 

まとめ

ウォッチドッグを導入しておくと、ラズベリーパイの処理がスタックしてしまった場合でも、物理的に電源を抜き差しせずに再起動できるので、遠隔で利用するような場合に重宝しそうですね!
とはいえ、処理がスタックしてしまったときにきちんとパルスが止まるかどうか、処理が競合してしまうものがないか、しっかりとテストする必要がありそうです。ウォッチドッグに頼りすぎず、「保険」のような位置づけでの導入がオススメです。

アバター画像

プロフィール:プログラミング暦通算4年、最近IT業界に舞い戻ってきたプログラマーです。女子です。

ラズパイと液晶画面で、顔を判別してぴったりの動画を流すデジタルサイネージをつくろう!