読者です 読者をやめる 読者になる 読者になる

Re:Readme

PCトラブルや環境構築、家電量販店とかで買ったもののメモ。ご利用は自己責任で。

Raspberry Pi 3にシャットダウンボタンをつける(1)

Raspberry Pi 3には電源ボタンというものが付属していないため、起動は電源ケーブルを挿したタイミングで開始され、終了はアプリケーションメニュー(左上のラズベリーのアイコンのやつ)からシャットダウンを実行するか、ターミナルから下記のコマンドを実行する必要がある。

$ sudo shutdown -h now

そのため、電源を切るためにいちいちモニタやマウスを物理的に接続したり、ssh接続でリモート操作しなければならない。
ということで、Raspberry Piを買われた方はよく電源周りをいじくるところから始めるみたい。私も例に漏れず、シャットダウンボタンの実装を行ってみた。

資材調達

今回は電子工作っぽいことを行った。

  • LED

GPIOの電圧は3.3Vなので、順電圧の値がそれより低いものを選ぶ(でないと電圧が足りず、光らない)。
www.otsuka-shokai.co.jp
今回は千石電商で¥15の赤色LEDを購入。あそこは単品買いが出来るのがすごい。ちなみにクレジットカードも使える。10円単位の買い物でクレジットカードを使ったのは人生でここだけかも。

  • 抵抗

LEDの順電流の値を超えないような抵抗を用意する。抵抗値はオームの法則で計算する。例えばGPIOピンの電圧を3.3V、LEDの順電圧を2.0V、LEDの順電流が0.02A(=20mA)とすると、

R ≧ (V - VF) / I = 65

なので、だいたい65[Ω]になるよう抵抗を購入する。

  • ジャンパ線

一方はGPIOピンに挿し、一方はLEDなどに繋ぐ。最低でも4本使用する。
マルツパーツで購入。

  • はんだごて
  • はんだ

ケーブル同士の結線に使用。グルーガンも100円ショップで買ったけど接触不良が多発したのでやっぱりはんだ付けするのが安定かも。

  • はんだ吸取線

はんだ吸入器の方が捗るかも。

  • スイッチ(タクトスイッチ)

上から見ると[●]、横から見ると凸みたいな形をしたスイッチ。押すとON、離すとOFFになる。
足が4本あるが、( ̄)のように向かい合ってる2本はボタンを押そうが押すまいが常に導通しているので注意。忘れちゃったときは対角の足を1本ずつ使えば確実。

GPIOを使ってLEDを操作してみる

シャットダウンボタンの実装にあたってRaspberry Pi 3のGPIO端子を使用することになるが、その練習も兼ねてLEDの制御から行った(このLEDは後でボタンの押下が認識できているかをチェックするのに役に立つ)。

まず下図のように配線する。
f:id:hal_drumas:20170222015935p:plain
続いて、コマンド上からGPIOの制御を行う。操作方法については下記のページが非常に分かりやすかった。
tool-lab.com
GPIO番号(ピン番号はまた別)は、Raspberry Pi 3のGPIO配線図に従って適宜読み換えている。
http://denshikousaku.net/raspberry-pi-gpio-layout

コマンド部だけ抜粋すると下記のようになる。

$ cd /sys/class/gpio
$ ls
export gpiochip0 gpiochip100 unexport
$ sudo echo 22 > export
$ ls
export gpio22 gpiochip0 gpiochip100 unexport
$ sudo echo out > gpio22/direction
$ sudo echo 1 > gpio22/value
$ cat gpio22/value
1
$ sudo echo 0 > gpio22/value
$ cat gpio22/value
0
$ sudo echo 22 > unexport
$ ls
export gpiochip0 gpiochip100 unexport

exportにGPIO番号を書き込むと、そのGPIO端子が有効になる。
gpio22/directionにinまたはoutを書き込むことで、入力または出力を指定できる。
gpio22/valueに0または1を書き込むとLEDが付いたり消えたりする。
unexportにGPIO番号を書き込むと、そのGPIO端子が無効になる。

GPIOを使ってスイッチ押下を検出してみる

LEDが無事に光ることを確認したら、次はスイッチ入力を認識することを確認する。同様に、コマンドを抜粋。
tool-lab.com

$ echo 27 > export
$ sudo echo in > gpio27/direction
$ sudo echo high > gpio27/direction
$ cat gpio27/value
1
$ cat gpio27/value
0
$ sudo echo 27 > unexport

今度はGPIO27を有効にし、入力に指定する。
この後、GPIO27のプルアップ抵抗を有効にする。プルアップ抵抗については下記が参考になった。
http://www.geocities.jp/zattouka/GarageHouse/micon/circuit/pullup.htm
先述の配線図ではスイッチが押された状態だと0V(Low)だが、スイッチが押されていない状態だと電圧が不定になる。そこでRaspberry Pi内部のプルアップ抵抗を有効にすることで、スイッチが押されていない状態でHighにしてあげることができるのだそうだ。
で、ボタンを押したり離したりしながらgpio27/valueの番号を出力すると、入力が0になったり1になったりする。


次回はコマンドの代わりに、GPIOを制御するC言語のライブラリ(+Pythonとかのラッパー)である「WiringPi」と、それを用いたシャットダウンボタン実装の続きを述べる予定。