Raspberry PiでGPIO制御

Raspberry PiのGPIOをライブラリを使って制御します。またライブラリを使うことでJavaScriptからでもGPIOの制御ができるようになります。まずはGPIOを叩いてみるところと、ハマるポイントを書いておきます。

Raspberry PiのGPIOの情報

ここがまとまってるような。 今回はsu無しで制御したいのと、JavaScript経由でアクセスしたかったので、Cなどのライブラリ経由ではなく、WirinigPiというコマンドレベルのライブラリを使います。これをインストールするだけでもコンソールからGPIO制御可能なので、簡単な動作確認にも便利です。

Wiring Piのインストール

この通りにやれば問題ありません。

$ git clone git://git.drogon.net/wiringPi

で、

$ cd wiringPi
$ ./build

とすればインストール完了です。

$ man gpio

で使い方の説明が参照できます。

GPIOの取得

まずはGPIOの状態を取得してみましょう。

$ gpio readall
+----------+------+--------+-------+
| wiringPi | GPIO | Name   | Value |
+----------+------+--------+-------+
|      0   |  17  | GPIO 0 | Low   |
|      1   |  18  | GPIO 1 | Low   |
|      2   |  27  | GPIO 2 | Low   |
|      3   |  22  | GPIO 3 | Low   |
|      4   |  23  | GPIO 4 | Low   |
|      5   |  24  | GPIO 5 | Low   |
|      6   |  25  | GPIO 6 | Low   |
|      7   |   4  | GPIO 7 | Low   |
|      8   |   2  | SDA    | High  |
|      9   |   3  | SCL    | High  |
|     10   |   8  | CE0    | Low   |
|     11   |   7  | CE1    | Low   |
|     12   |  10  | MOSI   | Low   |
|     13   |   9  | MISO   | Low   |
|     14   |  11  | SCLK   | Low   |
|     15   |  14  | TxD    | High  |
|     16   |  15  | RxD    | High  |
+----------+------+--------+-------+
|     17   |  28  | GPIO 8 | Low   |
|     18   |  29  | GPIO 9 | Low   |
|     19   |  30  | GPIO10 | Low   |
|     20   |  31  | GPIO11 | Low   |
+----------+------+--------+-------+

こんな感じで各GPIOの状態が取得出来ます。 ここで、"GPIO"と"Name"の関係がわかりにくく、ハマるポイントでした。

GPIO概要

先の参考ページの配置図ですが、これとの対比が取れてない・・・と思ったら、Raspberry Piのピン名とCPUのBroadcomのピン名があってこれが混乱する元になっている模様です。 出展 #ちなみに右図の12pin GPIO1はGPIO18の間違い

というわけで"Name"は左図との対比(GPIO8-11は無し)となってます。GPIOの制御は"GPIO"番号で行うため基本的には右図でいいのですが、混乱する元になりますね。

GPIOを制御

では、実際にGPIOに出力してみます。

|      6   |  25  | GPIO 6 | Low   |

この、GPIO6 : 25にLEDを接続して1を書き込みます。

$ gpio -g mode 25 out
$ gpio -g write 25 1

これでLEDが点灯します。ここで再度

$ gpio readall
+----------+------+--------+-------+
| wiringPi | GPIO | Name   | Value |
+----------+------+--------+-------+
|      0   |  17  | GPIO 0 | Low   |
|      1   |  18  | GPIO 1 | Low   |
|      2   |  27  | GPIO 2 | Low   |
|      3   |  22  | GPIO 3 | Low   |
|      4   |  23  | GPIO 4 | Low   |
|      5   |  24  | GPIO 5 | Low   |
|      6   |  25  | GPIO 6 | High  |
|      7   |   4  | GPIO 7 | Low   |
|      8   |   2  | SDA    | High  |
|      9   |   3  | SCL    | High  |
|     10   |   8  | CE0    | Low   |
|     11   |   7  | CE1    | Low   |
|     12   |  10  | MOSI   | Low   |
|     13   |   9  | MISO   | Low   |
|     14   |  11  | SCLK   | Low   |
|     15   |  14  | TxD    | High  |
|     16   |  15  | RxD    | High  |
+----------+------+--------+-------+
|     17   |  28  | GPIO 8 | Low   |
|     18   |  29  | GPIO 9 | Low   |
|     19   |  30  | GPIO10 | Low   |
|     20   |  31  | GPIO11 | Low   |
+----------+------+--------+-------+

GPIO6:25が"High"になっています。消灯させる場合は

$ gpio -g write 25 0

ブレッドボードで確認しましたがこんな感じに点灯します。

f:id:tomo_watanabe:20130114173732j:plain

回路はざっくりこんなんで

f:id:tomo_watanabe:20130114175533p:plain

追記:50Ωでは小さいんじゃない?と言う指摘を頂きました。確かに100Ωくらいの方が安全だと思います(^^;