BH2
テクニカルノート

最終更新日: 2019/09/27
バージョン: 1.7（株）ビズライト・テクノロジー
11. 本製品について ................................
.............................................................................................
............................. 3
2. BH2 の概要 ................................
................................................................................................
.................................. 3
3. 電気二重層コンデンサ簡易 UPS 機能 ...........................................................
........................... 3
4. RTC（リアルタイムクロック）搭載（リアルタイムクロック）搭載................................................................
..................................... 45. 電源供給の安定化 ................................
........................................................................................
........................ 4
6. CPU の放熱対策 ................................
..........................................................................................
.......................... 4
7. ノイズ、静電対策 ................................
...........................................................................................
........................... 48. 電源断サポート................................
..............................................................................................
.............................. 4
9. ウォッチドッグタイマーの有効化 ................................................................
...................................... 4
10. ハード仕様 ................................
................................................................................................
................................. 5
11. 試験結果................................
................................................................................................
.................................... 6
12. 外寸と各部名称 ................................
..........................................................................................
.......................... 7
13. I/O コネクタへのアクセスと GPIO ポート .....................................................
..................... 7
14. 汎用ボタンの GPIO 割り当て ................................................................
...................................... 8
15. 汎用スイッチの無効化、リセットコントロール端子切替 ..................................
................................ 9
16. OS について................................
.............................................................................................
............................. 12
17. 高速シャットダウンの処理シーケンス .........................................................
......................... 14
18. RTC の設定シーケンス ................................................................
............................................ 16
19. ウォッチドッグタイマーのセットアップ内容 ...................................................
................... 18
20. 汎用スイッチを利用したプログラムのサンプルソース ..................................
................................ 19
21. 改訂履歴................................
................................................................................................
.................................. 25

2

1. 本製品について
この度は BH シリーズ、BH2
BH2 をご購入いただき、誠にありがとうございます。
本製品は下記を組み込んだセットを組み込んだセットとなっております。
・金属ケース（放熱用パッドつき）（放熱用パッドつき）
・Raspberry Pi2 Model B・（株）ビズライト・テクノロジー
・（株）ビズライト・テクノロジー、オリジナル基盤
・AC アダプター（7.5V3A））※microSD カードは別売となっております。
は別売となっております。

2. BH2 の概要
BH2 は Raspberry Pi2
2 Model B を使用した汎用エンベデッド STB です。
ご好評いただきました当社 BH1 のオリジナル基盤パターンを変更し汎用スイッチにパターンを変更し汎用スイッチに割り当てられている GPIO を開放できるようにするなど、機能性もアップしております。
Raspberry Pi は特に IoT 分野などに多く使われはじめております。しかし、はじめております。しかし、プロトタイ
プを終えて実際にフィールドでプを終えて実際にフィールドで利用するためには、電源断時に正常終了させたい、
電源断時に正常終了させたい、電源のブレーカー連動、システム時刻保持、電源の安定化、源のブレーカー連動、システム時刻保持、電源の安定化、耐ノイズ、放熱
耐ノイズ、放熱、ウオッチドックタイマーなどクリアしなければならない問題がたくさん出てきます。
などクリアしなければならない問題がたくさん出てきます。
などクリアしなければならない問題がたくさん出てきます。BH2
は特に堅牢性に重点を置き、フィールドでも使える STB を目指して開発されました。

3. 電気二重層コンデンサ簡易 UPS 機能
Linux ベースであるが故に正常なシャットダウンの確保は必須となります。
ベースであるが故に正常なシャットダウンの確保は必須となります。BH2 は供給電源断を検出し、CPUCPU に割込みを発生させます。電気二重層コンデンサによる
電気二重層コンデンサによる簡易 UPS 機能を持ち、1 回のシャットダウン発生時に回のシャットダウン発生時に約 30 秒程度（環境に依る）（環境に依る）の無電源動作を行うことができるため、プログラムはこの間に安全なシャットダウンプロセ
スを実行することが可能となり、スを実行することが可能となり、OS のクラッシュや Micro SD カードのクラッシュの可のクラッシュの可能性を大幅に低減させることが可能です。
これにより、Raspberry
Raspberry Pi 環境で OS レスの機器組込シングルボードと同じような扱いをすることが可能となりました。

3

4. RTC（リアルタイムクロック）搭載（リアルタイムクロック）搭載
データロギングなど大抵のアプリケーションには
データロギングなど大抵のアプリケーションには、正しいシステム時刻
時刻が必要です。
BH2 はバッテリでバックアップされた RTC を搭載しています。

5. 電源供給の安定化
供給の安定化
Raspberry Pi は通常ミニ USB コネクタから電源を供給しますが、消費電流が増加したときに、このコネクタの内部抵抗が問題になり、電源が不安定になることがありました。BH2 は I/O バスポートから電源を供給していますので、この問題が発生しません。
また、内部にレギュレーターを搭載し、安定した動作電圧を確保しています。

6. CPU の放熱対策
BH2 はケースに熱伝導パッドを装着し、これをケースに熱伝導パッドを装着し、これを CPU に密着させることにより、放熱対に密着させることにより策をしています。50℃の外部環境での動作テストをクリアしていますので、フィールド
℃の外部環境での動作テストをクリアしていますので、フィールドで安心してご利用になれます。

7. ノイズ、静電対策
金属ケースの採用や、グランド処理などにより、静電気、雷サージ、
金属ケースの採用や、グランド処理などにより、静電気、雷サージ、GPIO
GPIO ラインノイズなどの対策を施しています
ズなどの対策を施しています。

8. 電源断サポート
電源切断時に電源断検出
電源切断時に電源断検出(GPIO23)の信号を受けて高速シャットダウン
シャットダウンが可能です。
高速シャットダウン時に任意のコマンド時に任意のコマンド(独自に作成したプログラムなど
独自に作成したプログラムなど)を実行することが可能です。

9. ウォッチドッグタイマー
ウォッチドッグタイマーの有効化
Raspberry Pi に搭載されたに搭載されたウォッチドッグタイマーを有効にし、万が一を有効にし、万が一 CPU が暴走した場合でも、ハードウェア的に CPU をリブートさせます。システムがハングアップしたままになる可能性を減らすことが可能です。
を減らすことが可能です。

410. ハード仕様
OS

Raspbian 3.18 以上

CPU

Raspberry Pi2 Model B
900MHz quad-core ARM Cortex-A7

GPU

250 MHz / Broadcom VideoCore IV

メモリ

1GB

簡易 UPS

電気二重層コンデンサ

電源断検出

GPIO23 L レベルで検出

RTC

MAXIM DS3231 I2C 接続（10KΩでプルアップ済み）
でプルアップ済み）
GPIO2、3 を使用

リセットコントロール

GPIO18 を使用

汎用スイッチセンター、上下左右モメンタリスイッチを搭載

ビデオ出力

HDMI(1.3 / 1.4)

音声出力

3.5mm ジャック / HDMI

USB

USB2.0×4

I/O コネクタ

40 ピン（ピンアサインはオリジナルと同様）

ネットワーク

10 / 100Mbps イーサネット

ストレージ

Micro SD カード(別売)CPU 熱対策

CPU よりケースへ放熱。0℃〜50℃ 動作試験

静電試験

接触 4KV 放電 8KV

電源AC100-240V、50/60Hz （専用 AC アダプタ使用時）
アダプタ
DC 7.5V 3A

外寸

高さ 32mm×幅 115mm×奥行き 115mm

重量440g（AC アダプタ含まず）

動作保障温度

0 度～40 度（非結露）動作保障湿度

10%～80%5

11. 試験結果
試験場所:

地方独立行政法人 北海道立総合研究機構 工業試験場
北海道札幌市北区北 19 条西 11 丁目

雷サージ許容度試験（試験装置
雷サージ許容度試験（試験装置: ノイズ研究所㈱LSS-15AX-C3）
試験内容

AC ラインより 1KV の雷サージを、正負 1 回ずつ、20回ずつ、 秒間隔で 5回、合計 10 回与える。

試験結果

正常

試験内容

AC ラインより 2KV の雷サージを、正負 1 回ずつ、20回ずつ、 秒間隔で 5回、合計 10 回与える。

試験結果

正常

静電気許容度試験（試験装置
試験装置: ノイズ研究所㈱ESS-2000 & 放電ガン TC=815R）
試験内容

間接放電（本装置から 10 センチメートル離れたところで放電する）

試験結果

8KV * 20 回: 正常
15KV * 20 回: 正常

試験内容

直接放電（本装置に放電ガンを接触させて放電する）

試験結果

4KV * 20 回: 正常
8KV * 20 回: 正常

ただし間接、直接双方とも放電時にモニタ画面が一瞬乱れて 1 秒以内に正常に戻るという現象が見られた。本体リセットがかかったのではなく、高圧パルスによるノ
イズで HDMI の同期が一瞬だけ外れることが原因と推測する。
電子機器用低温恒温恒湿試験（
電子機器用低温恒温恒湿試験（試験装置: エスペック㈱PL-4KP）
試験内容

0℃において本装置をにおいて本装置を 24 時間連続運転する。

試験結果

正常

試験内容

50℃において本装置をにおいて本装置を 24 時間連続運転する。

試験結果

正常

6

12. 外寸と各部名称

⑦

⑧

⑥
⑧
①

⑤
②

③

④

①電源スイッチ②電源ジャック③HDMI ジャック
④3.5mm ジャック
⑤10 / 100Mbps イーサネット⑥USB2.0×4⑦I/O コネクタ⑧汎用ボタン
Micro SD カードは、裏蓋を裏蓋を開けて、Raspberry Pi に直接挿します。

13. I/O コネクタへのアクセス
へのアクセスと GPIO ポート⑦I/O コネクタのネジと蓋をはずすと、コネクタのネジと蓋をはずすと、I/O コネクタにアクセスできます。
GPIO ポート番号は下図のようになっております。

714. 汎用ボタンの GPIO 割り当て8

① UP ボタン： GPIO 17② DOWN ボタン：
GPIO 27③ LEFT ボタン：
GPIO 24④ RIGHT ボタン：
GPIO 22⑤ ENTER ボタン：
GPIO 25

PULLUP モード(Raspberry
Raspberry Pi 内蔵のプルアップ抵抗を有効)ににします
汎用ボタンは GPIO のピンと GND が接続されています(外付けのプルアップ抵抗
外付けのプルアップ抵抗は接続されていません)
押されていない場合は H レベル(1)、押された場合は L レベル(0)(0)の値になります
コマンドラインから値を取得する場合の例(Wiring Pi の gpio コマンドを利用して up ボタンの値を取得する
を取得する場合):
gpio -gg mode 17 input
gpio -gg mode 17 up
gpio -g read 17

15. 汎用スイッチの無効化、汎用スイッチの無効化、リセットコントロール端子切替
本製品では、ジャンパピンによって汎用スイッチ
本製品では、ジャンパピンによって汎用スイッチを無効化しスイッチに割り当てられてしスイッチに割り当てられている GPIO ポートを利用するようにすることができます。
リセットコントロール端子は、リセットコントロール端子は、GPIO ポート番号を変更することが可能となっております。

9ジャンパピンへのアクセスは裏蓋を開け、ジャンパピンへのアクセスは裏蓋を開け、Raspberry Pi をはずすことによりアクセス
可能です。
JP-1

出荷時はリセットコントロールと OS 起動 LED 制御を GPIO18 に設定しております。ジャンパピンの切り替えで GPIO5 に変更できます。

JP-2

ジャンパピンを抜くと、ジャンパピンを抜くと、UP ボタンを無効化し GPIO17 が利用できるよ
うになります。

JP-3

ジャンパピンを抜くと、ジャンパピンを抜くと、DOWN ボタンを無効化し GPIO27
GPIO が利用できるようになります。

JP-4

ジャンパピンを抜くと、ジャンパピンを抜くと、LEFT ボタンを無効化し GPIO24 が利用できるようになります。

JP-5

ジャンパピンを抜くと、ジャンパピンを抜くと、RIGHT ボタンを無効化し GPIO22 が利用できるようになります。

JP-6

ジャンパピンを抜くと、ジャンパピンを抜くと、ENTER ボタンを無効化し GPIO25 が利用できるようになります。

JP-1 GPIO5 に 変 更 し た 場 合 は 、 設 定 フ ァ イ ル shutdownSensor.conf
shutdownSensor.con を/usr/local/sbin/以下に下記の内容で作成し、保存します。
以下に下記の内容で作成し、保存します。設定ファイルを設定ファイルを保存後、OS の再起動が必要です。
/usr/local/sbin/shutdownSensor.conf
shutdownSensor.conf# Shutdown sensor config fileenrun pin = 5101116. OS について
Raspbian に対してセットアップ
セットアップツールをインストールします。
セットアップツールを利用するとを利用すると、次の機能を追加します。
 電源切断による高速シャットダウン
 OS 起動時に RTC 時刻をシステム
時刻をシステム時刻に設定
 ntpdate を利用して現在
現在時刻を取得し RTC 時刻に設定(設定タイミング: ネットワーク接続時、ネットワーク接続時、毎時 30 分(1 時間毎))
 ウォッチドッグタイマー
ウォッチドッグタイマーの有効化
セットアップツールは、以下からダウンロードできます。
は、以下からダウンロードできます。
http://dl.bizright.jp/bh/bh
dl.bizright.jp/bh/bh-tools-latest.tar.gz（対応 OS: Raspbian 3.18 以上）
Raspbian 3.18 以上をインストール後、次のコマンドを実行します。
セットアップツールのインストール
インストールコマンド:
curl -O http://dl.bizright.jp/bh
http://dl.bizright.jp/bh/bh-tools-latest.tar.gz
tar xfvz bh-tools-latest.tar.gz
latest.tar.gz
cd bh-tools./build （※Installation
Installation of BH tools completed.が表示されれば成功）が表示されれば成功）
sudo reboot
注意: build ファイル内で git や apt-get を呼び出しているためインターネットに接続できる状態で実行します
します。
既にセットアップツールを導入済みの方でバージョンアップする場合もこちらのコマンドを実行します。
一緒にインストールされる
一緒にインストールされるライブラリやパッケージ一覧:






Wiring Pi
ntpdatewatchdog
upstart(systemd がインストールされていない場合にがインストールされていない場合にインストールされる
インストールされる)git(git がインストールされていない場合にインストールされるがインストールされていない場合にインストールされる)
12

セットアップツールをアンインストールする場合はツールをアンインストールする場合は次のコマンドを実行します。
次のコマンドを実行します。
セットアップツールのアンインストール
アンインストールコマンド:
cd bh-tools (※インストール時
インストール時に利用したディレクトリに移動)./build uninstall（※Uninstall of BH tools completed.
completed.が表示されれば成功）
cd wiringPi./build uninstall (※今後
今後 Wiring Pi を利用しない場合)
sudo apt-get -yy remove ntpdate (※今後 ntpdate を利用しない場合)
を利用しない場合
sudo apt-get -yy remove watchdog (※今後 watchdog を利用しない場合)
を利用しない場合
sudo reboot -f※セットアップツールでエラーが出てインストールできない場合
Error: WDT module is unknown.
のようなエラーが出てインストールが正常に行えない場合は、
apt-get update
apt-get upgradeを行った後に、BH を再起動していない可能性があります。
sudo rebootを行った後、再度セットアップツールのインストールを行ってください。

13

17. 高速シャットダウンの処理
高速シャットダウンの処理シーケンス
BH2 上での高速シャットダウンする際の処理
高速シャットダウンする際の処理シーケンスです。
1. BH2 の電源切断時に GPIO の 23 番（INPUT モード）が H レベル(1)からレベル
Lレ
ベル(0)になります
2. 常駐プログラム「/usr/local/sbin/shutdownSensor/usr/local/sbin/shutdownSensor」が 1.の割り込み
割り込みを受けて次のスクリプトを実行します
を実行します /usr/local/sbin/fastshutdown
 /usr/local/sbin/__fastdown/usr/local/sbin/__fastdown-function(fastshutdown から呼ばれます
呼ばれます)
3. 開始時間をログに出力
開始時間をログに出力します(高速シャットダウンの処理時間を計測する
高速シャットダウンの処理時間を計測するため)
出力先: /var/log/fastshutdown.log/log/fastshutdown.log
Start time: (/proc/uptime の内容)
4. ディスプレイの信号を OFF にします
5. /usr/local/sbin/system/usr/local/sbin/system-stop-use-usb スクリプトを実行します(10 秒経過するとタイムアウト
秒経過するとタイムアウトとなり、強制終了します)
6. USB コントローラの電源を OFF にします(シャットダウン時の消費電力をシャットダウン時の消費電力を減らす
ため、有線 LAN と USB に接続された機器を利用不可にします))
7. /usr/local/sbin/system/usr/local/sbin/system-stop スクリプトを実行します(10 秒経過するとタイムアウトとなり秒経過するとタイムアウトとなり、強制終了します)
8. 現在の時刻を保存します
します(RTC が接続されていない場合でも動作可能にするが接続されていない場合でも動作可能にするため)
9. 全てのプロセスを正常正常終了させます10. メモリ上のデータの内容を強制的にディスクにメモリ上のデータの内容を強制的にディスクに書き込みます
11. 全てのプロセスを強制終了
全てのプロセスを強制終了します
12. 終了時間をログに出力
終了時間をログに出力します(高速シャットダウンの処理時間を計測する
高速シャットダウンの処理時間を計測するため)
出力先:: /var/log/fastshutdown.log
End time: (/proc/uptime の内容)
13. メモリ上のデータの内容を強制的にディスクにメモリ上のデータの内容を強制的にディスクに書き込みます
14. マウントされているすべてのファイルシステムを読み込み専用モードで再マウント
します
15. GPIO の 23 番（INPUT
INPUT モード）が H レベル(1)の場合はシステムをの場合はシステムを再起動、L レ
ベル(0)の場合はシステムを停止
システムを停止します(ユーザが誤って AC 電源を切ってしまい、シャットダウンプロセスが走り始めたのに AC 電源を復旧させたようなケースを想定
電源を復旧させたようなケースを想定)

14

高速シャットダウン時に任意のコマンド
任意のコマンド(独自に作成したプログラムなど
独自に作成したプログラムなど)を実行したい
場合は、次のスクリプトに任意のコマンドを追加します。
に任意のコマンドを追加します。
/usr/local/sbin/system-stopstop
任意のコマンド内でネットワーク
ネットワークと通信する処理や USB を利用した処理(有線を利用した処理LANや 無 線 LAN の 利 用 、 USB メ モ リ へ の フ ァ イ ル 保 存 な ど ) を 行 う 場 合 は 、「/usr/local/sbin/system-stopstop」に記述せずに次のスクリプトに任意のコマンドを追加
次のスクリプトに任意のコマンドを追加します。
/usr/local/sbin/system-stop
stop-use-usb
system-stop スクリプトと systemsystem-stop-use-usb スクリプトは 10 秒以内に処理を完了
してください。10 秒経過するとタイムアウトとなり、秒経過するとタイムアウトとなり、強制終了します。
タイムアウトの秒数は次のスクリプトで変更可能です。
秒数は次のスクリプトで変更可能です。
/usr/local/sbin/__fastdown/usr/local/sbin/__fastdown-function
timeout -s 9 タイムアウト
タイムアウトの秒数 /usr/local/sbin/system-stop-use
use-usb
timeout -s 9 タイムアウト
タイムアウトの秒数 /usr/local/sbin/system-stop
高速シャットダウン時に独自に作成したプログラム
独自に作成したプログラム内でファイルのクローズ処理などをファイルのクローズ処理などを行う場合は、kill シグナルの割込みを受けてファイルのクローズ処理をシグナルの割込みを受けてファイルのクローズ処理を行います。
system-stop スクリプトまたは system-stop-use-usb スクリプトに killall コマンドなどを追加して、高速シャットダウン時に高速シャットダウン時に独自に作成したプログラムに対してに対して kill シグナルが送られるようにします。
追加例:/usr/local/sbin/system-stopstop
killall 独自に作成したプログラム名
OS 起動中に予期しないリセットが発生しないようにするため中に予期しないリセットが発生しないようにするため、常駐プログラム
常駐プログラム「/usr/local/sbin/shutdownSensor/usr/local/sbin/shutdownSensor」の起動時(OS 起動時)に GPIO の 18 番(OUTモード)を H レベル(1)にし、シャットダウンにし、シャットダウン完了までそのままの状態を保持
完了までそのままの状態を保持しています。

15

18. RTC の設定シーケンス
設定シーケンス
OS 起動時(/usr/local/sbin/
usr/local/sbin/set-rtc)：
1. RTC の I2C 接続を初期化
初期化します2. RTC 時刻をシステム時刻に設定
時刻をシステム時刻に設定します
3. 2.の実行結果が失敗の場合、の実行結果が失敗の場合、fake-hwclock を利用して前回のシャットダウン時
シャットダウン時
刻をシステム時刻に設定
刻をシステム時刻に設定します
ネットワーク接続時と毎時
毎時 30 分(1 時間毎))に実行(/etc/network/if-up.d/ntpdate
up.d/ntpdate)：
1. 重複起動をチェックします
します(既に起動中の場合は処理を停止)
2. 20 秒間待機します(ネットワーク接続直後はネットワーク接続直後は ntpdate が失敗しやすいため)が失敗しやすい3. /usr/sbin/ntpdate-debiandebian コマンドを実行し、ネットワーク経由でネットワーク経由でシステム時刻を設定します
4. 3. の実行結果が成功
成功の場合、システム時刻を RTC 時刻に設定します
時刻に設定
5. 3. の実行結果が成功
成功の場合、10 分間待機します(ntpdate が連続して実行されるのを防ぐため実行されるのを防ぐため)
ntpdate の実行間隔は次のファイルで変更可能です。
/etc/cron.d/ntpdate（毎時（毎時 30 分(1 時間毎)の場合）
30 * * * * root /etc/network/if/etc/network/if-up.d/ntpdate
up.d/ntpdate > /dev/null 2>&1
NTP サーバーを指定する場合は次のファイルを修正します。
する場合は次のファイルを修正します。
/etc/default/ntpdate
NTPSERVERS="ntp.nict.jp ntp.jst.mfeed.ad.jp ntp.ring.gr.jp"
手動で nptdate を実行
を実行し、システム時刻を RTC に設定する場合は次のコマンドをする場合は次のコマンドを実行します。
sudo /usr/sbin/ntpdate
ntpdate-debiansudo hwclock -w

16

ネットワークに接続しない場合やに接続しない場合や ntpdate を利用してシステム時刻を合わせる必要がない場合は次のファイルを削除します。
次のファイルを削除します。
/etc/cron.d/ntpdate/etc/network/if-up.d/ntpdate
up.d/ntpdate
任意の時刻を RTC に設定する場合は次のコマンドを実行します。
設定する場合は次のコマンドを実行します。
sudo date -s '時刻(例: 2015-06-19 00:00:00)'
sudo hwclock -w
RTC 時刻を表示する場合は次のコマンドを実行します。
sudo hwclock -r
RTC 時刻をシステム時刻に設定する場合は次のコマンドを実行します。
sudo hwclock -s

17

19. ウォッチドッグタイマー
ウォッチドッグタイマーのセットアップ内容
セットアップツールを利用した場合、次のコマンドを実行してを利用した場合、次のコマンドを実行してウォッチドッグタイマー
ウォッチドッグタイマーを有効化しています。watchdog
watchdog のプログラムをインストールして設定ファイルを変更し、OS 起動時に bcm2708_wdog モジュール(Raspbian 4.2 以下の場合)または以下の場合
bcm2835_wdt モジュール
モジュール(Raspbian 4.3 以上の場合)を自動的にロードします。
を自動的にロードします。
sudo apt-get
get install watchdog
sudo vi /etc/default/watchdog
変更前:
watchdog_module=
watchdog_module="none"
変更後(Raspbian
aspbian 4.2 以下の場合):
watchdog_module="bcm2708_wdog"
変更後(Raspbian
aspbian 4.3 以上の場合):
watchdog_module=" bcm2835_wdt "sudo vi /etc/watchdog.confwatchdog.conf
変更前:#max-load
load-1= 24#watchdog#watchdog-device = /dev/watchdog
変更後:
max-loadload-1= 24
watchdog
watchdog-device = /dev/watchdog
watchdog
watchdog-timeout = 10
sudo vi /etc/modules
最終行に追加(Raspbian
aspbian 4.2 以下の場合):
bcm2708_wdog
最終行に追加(Raspbian
aspbian 4.3 以上の場合):
bcm2835_wdt
sudo vi /lib/systemd/system/watchdog.service
systemd/system/watchdog.service
最終行に追加(ファイル内のファイル内の[Install]の下に追加)
WantedBy=multi
WantedBy=multi-user.target
sudo update-rc.d
rc.d watchdog enablesudo reboot

1820. 汎用スイッチを利用したプログラムの
汎用スイッチを利用したプログラムのサンプルソース
汎用スイッチを押すとボタン名を表示する
を押すとボタン名を表示するプログラムのサンプルソース
サンプルソースです。
このサンプルソースは、以下からダウンロードできます。
、以下からダウンロードできます。
http://dl.bizright.jp/bh/bhButton.zip
dl.bizright.jp/bh/bhButton.zip
C 言語で Wiring Pi を利用したを利用した場合：
bhButton.c#include <stdio.h>#include <sys/time.h>#include <wiringPi.h>#define GPIO_UP 17#define GPIO_DOWN 27#define GPIO_RIGHT 22#define GPIO_LEFT 24#define GPIO_ENTER 25#define BUTTON_USLEEP 50000#define RESET_SEC 5
int setupGpio();void isrUp();
void isrDown();
void isrRight();
void isrLeft();void isrEnter();void isrButton(int pin, char *button);// 現在押されているボタン名
static volatile char *currentButton = NULL;// 押された時間
static volatile long currentButtonTime = 0;// メイン関数
int main(int argc, char *argv[]) {19

struct timeval now;// GPIO の初期化
if (setupGpio() == -1) return 1;
while (1) {sleep(1);// 現在、汎用ボタンが押されている場合// 他の汎他の汎用ボタンを最大 RESET_SEC(5 秒)間無効
間無効
if (currentButton != NULL) {gettimeofday(&now, NULL);
if (RESET_SEC < now.tv_sec - currentButtonTime) {currentButton = NULL;}}}
return 0;}// GPIO の初期化関数
int setupGpio() {// WiringPi の初期化
if (wiringPiSetupGpio()
wiringPiSetupGpio() == -1) return -1;// 入力モードに設定
pinMode(GPIO_UP, INPUT);
pinMode(GPIO_DOWN, INPUT);
pinMode(GPIO_RIGHT, INPUT);
pinMode(GPIO_LEFT, INPUT);
pinMode(GPIO_ENTER, INPUT);// PULLUP モードに設定
pullUpDnControl(GPIO_UP, PUD_UP);
pullUpDnControl(GPIO_DOWN,
Control(GPIO_DOWN, PUD_UP);
pullUpDnControl(GPIO_RIGHT, PUD_UP);
20

pullUpDnControl(GPIO_LEFT, PUD_UP);
pullUpDnControl(GPIO_ENTER, PUD_UP);// GPIO の値の変化を検出し、割り込み処理を行う
wiringPiISR(GPIO_UP, INT_EDGE_BOTH, &isrUp);
wiringPiISR(GPIO_DOWN, INT_EDGE_BOTH, &&isrDown);
isrDown);
wiringPiISR(GPIO_RIGHT, INT_EDGE_BOTH, &isrRight);
wiringPiISR(GPIO_LEFT, INT_EDGE_BOTH, &isrLeft);wiringPiISR(GPIO_ENTER, INT_EDGE_BOTH, &isrEnter);return 0;}// up ボタンの割込み関数
void isrUp() {isrButton(GPIO_UP, "up");}// down ボタンの割込み関数
void isrDown() {isrButton(GPIO_DOWN, "down");}// right ボタンの割込み関数
void isrRight() {isrButton(GPIO_RIGHT, "right");}// left ボタンの割込み関数
void isrLeft() {isrButton(GPIO_LEFT, "left");}// enter ボタンの割込み関数
void isrEnter() {isrButton(GPIO_ENTER, "enter"enter");}21

// ボタンの割込み関数
void isrButton(int pin, char *button) {int read1, read2;
struct timeval now;// チャタリングによる誤動作防止のため// BUTTON_USLEEP(0.05 秒)の間隔で GPIO の値を 2 回取得し// 一致する場合のみボタン名を表示
read1 = digitalRead(pin);usleep(BUTTON_USLEEP);
read2 = digitalRead
digitalRead(pin);
if (read1 == 0 && read2 == 0) {if (currentButton == NULL) {gettimeofday(&now, NULL);
currentButtonTime = now.tv_sec;
currentButton = button;
printf("%sprintf("%s¥n", button);}} else if (currentButton == button && read1 == 1 && read2 == 1
1) {currentButton = NULL;}}
ビルドコマンド:
gcc -lwiringPi -o bhButton
Button bhButton.c
実行コマンド:sudo ./bhButton

22

Python で RPi.GPIO を利用したを利用した場合：

bhButton.py# coding: UTF-8
import RPi.GPIO as GPIO
import time
GPIO_UP = 17
GPIO_DOWN = 27
GPIO_RIGHT = 22
GPIO_LEFT = 24
GPIO_ENTER = 25
BUTTON_SLEEP = 0.05
# ボタンの割込み関数
def gpio_callback(channel):# チャタリングによる誤動作防止のため# BUTTON_SLEEP(0.05 秒)の間隔で GPIO の値を 2 回取得し# 一致する場合のみボタン名を表示
value1 = GPIO.input(channel)
if value1 == 1:
returntime.sleep(BUTTON_SLEEP)
value2 = GPIO.input(channel)
if value2 == 1:
returnif value1 != value2:
returnif channel == GPIO_UP:
print('up')elif channel == GPIO_DOWN:
print('down')
elif channel == GPIO_RIGHT:
print('right')
23

elif channel == GPIO_LEFT:
print('left')
elif channel == GPIO_ENTER:
print('enter')# 入力モード,PULLUP モードに設定
GPIO.setmode(GPIO.BCM)
GPIO.setup(GPIO_UP, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(GPIO_DOWN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(GPIO_RIGHT, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(GPIO_LEFT, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(GPIO_ENTER, GPIO.IN, pull_up_down=GPIO.PUD_UP)# GPIO の値の変化(1 から 0)を検出し、割り込み処理を行う
GPIO.add_event_detect(GPIO_UP, GPIO.FALLING)
GPIO.add_event_detect(GPIO_DOWN, GPIO.FALLING)
GPIO.add_event_detect(GPIO_RIGHT,
etect(GPIO_RIGHT, GPIO.FALLING)
GPIO.add_event_detect(GPIO_LEFT, GPIO.FALLING)
GPIO.add_event_detect(GPIO_ENTER, GPIO.FALLING)
GPIO.add_event_callback(GPIO_UP, gpio_callback)
GPIO.add_event_callback(GPIO_DOWN, gpio_callback)
GPIO.add_event_callback(GPIO_RI
GPIO.add_event_callback(GPIO_RIGHT, gpio_callback)
GPIO.add_event_callback(GPIO_LEFT, gpio_callback)
GPIO.add_event_callback(GPIO_ENTER, gpio_callback)while 1:
time.sleep(1)実行コマンド:sudo python bhButton.py
Button.py

2421. 改訂履歴
更新日

バージョン

内容

2016/02/19 1.0

初版

2016/05/24 1.1「 20. ウ ォ ッ チ ド ッ グ タ イ マ ー の セ ッ ト ア ッ プ 内 容 」 でRaspbian 4.3 以上の場合にウォッチドッグタイマー
ウォッチドッグタイマーのモジュール名が「bcm2708_wdog」から「bcm2835_wdt
bcm2835_wdt」に変更になったため、設定コマンドの内容を修正

2016/05/27 1.2「16. OS について」
次の文言を追加
git(git がインストールされていない場合にインストールされる)

2016/05/30 1.3「16. OS について」
専用 OS イメージについての説明を削除（今後は Raspbian に対してセットアップツールをインスト
セットアップツールをインストールする方法のみとする）「17.コンソール / SSH でのログイン」を削除」を削除（専用 OS イメージについての説明のため削除）

2016/06/24 1.4「12.外寸と各部名称」⑦⑧の説明が逆だったため修正「13.I/O コネクタへのアクセスと GPIO ポート」
ポート
GPIO のポートの図を変更

2016/12/06 1.5「17.高速シャットダウンの処理シーケンス
高速シャットダウンの処理シーケンス」
8.現在の時刻を保存します の後に、すべてのプロセスを正常終了させるシーケンスを追加

2017/05/08 1.6「16. OS について」
セットアップツールのインストール時にエラーが出た場合の対応について追記

2019/09/27 1.7

誤記訂正

25