WiringPiというライブラリ&ツールを使用してRaspberry PiのGPIOを制御してみます。
WiringPiとは
前回、Raspberry PiのGPIOを制御は echo コマンドを使用して仮想ファイルにアクセスする方法で行いました。ただ、echoの後に長いパスを打ち込んだりしてちょっと面倒でしたよね。さらにC言語やPythonなどのスクリプト言語から制御する場合も、プログラム中でechoコマンドを呼び出すようにすれば制御できますが、ちょっとスマートではないですよね。そこで今回は、もっと使い勝手の良いWiringPiというライブラリ&ツールをインストールして制御してみます。
WiringPiはRaspberry PiのGPIOを制御するためのC言語ライブラリですが、他の言語、例えばPythonやPHPなどからもこのライブラリにアクセスできるようになっています(具体的にはラッパが用意されています)。またライブラリだけではなく、コマンドラインから実行できるツール(gpioコマンド)も用意されています。いずれもGPIO制御を意識してつくられていますので、プログラミングやコマンドがechoコマンドを使う場合よりわかりやすくなっています。
WiringPiのインストール
WiringPiを使用するには、I2CライブラリとWiringPi本体をインストールする必要があります。I2Cライブラリはインストールしなくても動作しますが、いずれI2C通信なども行いますのでインストールしておきましょう。
それではI2Cライブラリをインストールしましょう。「libi2c-dev」というライブラリをapt-getでインストールします。
pi@raspberrypi ~ $ sudo apt-get install libi2c-dev
インストールが始まると、途中で続行確認があります。
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の特別パッケージがインストールされます:
i2c-tools
提案パッケージ:
python-smbus
以下のパッケージが新たにインストールされます:
i2c-tools libi2c-dev
アップグレード: 0 個、新規インストール: 2 個、削除: 0 個、保留: 0 個。
70.1 kB のアーカイブを取得する必要があります。
この操作後に追加で 243 kB のディスク容量が消費されます。
続行しますか [Y/n]?
続行確認の質問がありますので、そのままリターンキーを押します。
Linuxの慣習として [Y/n] などと、片方が大文字の場合は何も入力しないでリターンキーを押した時のデフォルトを示しています。 [Y/n]の場合にリターンキーを押した場合は「Y」が入力されたものとみなされます。yと入力してリターンキーを押しても同じです。キャンセルしたい場合は n と入力します。
取得:1 http://mirrordirector.raspbian.org/raspbian/ wheezy/main i2c-tools armhf 3.1.0-2 [59.5 kB]
取得:2 http://mirrordirector.raspbian.org/raspbian/ wheezy/main libi2c-dev all 3.1.0-2 [10.5 kB]
70.1 kB を 1秒 で取得しました (51.8 kB/s)
以前に未選択のパッケージ i2c-tools を選択しています。
(データベースを読み込んでいます ... 現在 68400 個のファイルとディレクトリがインストールされています。)
(.../i2c-tools_3.1.0-2_armhf.deb から) i2c-tools を展開しています...
以前に未選択のパッケージ libi2c-dev を選択しています。
(.../libi2c-dev_3.1.0-2_all.deb から) libi2c-dev を展開しています...
'libi2c-dev による /usr/include/linux/i2c-dev.h から /usr/include/linux/i2c-dev.h.kernel への退避 (divert)' を追加しています
man-db のトリガを処理しています ...
i2c-tools (3.1.0-2) を設定しています ...
/run/udev or .udevdb or .udev presence implies active udev. Aborting MAKEDEV invocation.
libi2c-dev (3.1.0-2) を設定しています ...
なんかいろいろとメッセージがでてきますね。こんな感じでインストールが終わります。
次にWiringPi本体ですが、残念ながらapt-getではインストールできず、ソースコードを取得してビルドが必要になります。ビルドといってもソースはgit経由で取得、その後ビルドするだけですので簡単ですよ。
まず、コマンドプロンプトで以下のように入力してみてください。
pi@raspberrypi ~ $ git --version
git version 1.7.10.4
こんな感じでバージョンが表示されればOKですが、なんかエラーっぽいメッセージが表示された場合はgitをインストールしてください。インストールは以下のように行います。もちろんバージョンがきちんと表示されていればgitは使えますので以下のインストール操作は不要です。
pi@raspberrypi ~ $ sudo apt-get install git-core
次に、WiringPiのソースコードを取得します。
pi@raspberrypi ~ $ git clone git://git.drogon.net/wiringPi
ダウンロードが完了すると、カレントディレクトリにwiringPiディレクトリができていますので、そこに入ってビルドします。
pi@raspberrypi ~ $ cd wiringPi
pi@raspberrypi ~/wiringPi $ ./build
ビルドが完了するとgpioコマンドが使えるようになっています。バージョンを確認してみます。バージョンが表示されればOKです。
pi@raspberrypi ~ $ gpio -v
gpio version: 2.13
Copyright (c) 2012-2013 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty
This Raspberry Pi is a revision 2 board.
これでインストール完了です。
WiringPiをコマンドラインで使う
WiringPiではコマンドラインでGPIOを制御するために”gpio”コマンドが用意されています。gpioコマンドは裏ではechoコマンドと同様に、/sys/class/gpio/にある仮想ファイルに対して書き込み/読み取りをしています。ここで留意点があります。/sys/class/gpio/にある仮想ファイルへの書き込みはroot権限が必要なためsudo echo…という感じでsudoをつける必要(=スーパユーザ権限で実行する必要)がありました。これに対して、gpioはsudoをつけなくても実行できます。というのは、gpioコマンドはsuidが設定されているためです。suidの詳細な説明は省略しますが、suidが設定されている実行ファイルは一般ユーザとして実行しても、実際にはrootユーザで実行されます。(ちょっとややこしいですね)
gpioコマンドを使用してGPIOを制御するには最低限以下の使い方を確認してください。なお、gpioコマンドでGPIOピンを指定する場合、以前ご説明した2通りの方法があります。ひとつはピン名の番号、もうひとつはコネクタの番号です。デフォルトではコネクタの番号となっています。ピン名で指定する場合は -g オプションをつけます。前回のechoコマンドと同様、ピン名の番号で指定しますので、今後は-gオプションをつけます。
- GPIOピンのモード設定
gpio -g mode [GPIOピン名番号] [モード]というフォーマットになります。[モード]にはoutかinを指定することになります。 - GPIOピンの出力制御
gpio -g write [GPIOピン名番号] [値]というフォーマットになります。[値]には0か1を指定します。 - GPIOピンの入力制御
gpio -g read [GPIOピン名番号]というフォーマットになります。このコマンドを入力すると指定したGPIOピンの現在の値が表示されます。
それでは実際に試してみます。まずGPIO18ピンを出力モードに設定します。
pi@raspberrypi ~ $ gpio -g mode 18 out
次にGPIO18ピンをON(=1)にします。
pi@raspberrypi ~ $ gpio -g write 18 1
LEDが点灯しましたか?ここで現在のGPIO18ピンの値を読み取ってみます。
pi@raspberrypi ~ $ gpio -g read 18
1
というように1が表示されたと思います。
gpioコマンドを使うと長いコマンドを入力する必要がないので便利ですね。
WiringPiをC言語で使う
WiringPiはGPIO制御のためのC言語ライブラリですので、C言語でも動作させてみましょう。プログラムは、以前「MacでPICマイコン電子工作入門」で作成したものと同じ動作をするものを作成してみます。その動作ですが、1秒に1回LEDをピカッ、ピカッと光らせる、というものです。詳細は「MacでPICマイコン電子工作入門」は第16回〜第21回で説明しています。
ここで作成するプログラムは、1秒に1回LEDをピカッ、ピカッと10回光らせる処理とします。PICマイコンではじめに作成したプログラムは点滅を永遠繰り返すものでしたが、Raspberry Piの場合、コマンドの処理が終わらなくなってしまうので10秒間点滅とします。
このプログラムでは以下の関数を使用します。
- WiringPiの初期化
wiringPiSetupGpio(); 関数で初期化します。何か問題がある場合は-1が返ってきます。 - GPIOピンのモード設定
pinMode([GPIOピン番号], [モード]); というフォーマットになります。[モード]にはOUTPUTかINPUTを指定します。 - GPIOピンの出力制御
digitalWrite([GPIOピン名番号], [値]); というフォーマットになります。[値]には0か1を指定します。 - GPIOピンの入力制御
digitalRead([GPIOピン名番号]); というフォーマットになります。GPIOピンの現在の値が返り値となります。
なお、これらの関数は”wiringPi.h”ヘッダファイルに定義されていますので、インクルードを忘れないようにしましょう。以下は10秒間LEDを点滅させるプログラムです。この内容でファイル名をledtest.cとして保存します。作業ディレクトリはホームディレクトリの適当なところで構いません。
// Include header file
#include <wiringPi.h>
// Define GPIO18 number
#define GPIO18 18
// Main function
int main(void) {
int i;
// Initialize WiringPi
if(wiringPiSetupGpio() == -1) return 1;
// Set GPIO18 pin to output mode
pinMode(GPIO18, OUTPUT);
// Repeat LED blinking 10 times
for(i=0; i<10; i++){
digitalWrite(GPIO18, 0);
delay(950);
digitalWrite(GPIO18, 1);
delay(50);
}
// Turn off LED
digitalWrite(GPIO18, 0);
return 0;
}
保存できたらコンパイルします。コンパイルはccコマンドを使います。なおwiringPiライブラリをリンクする必要がありますので、-lオプション(「マイナスエル」です)でwiringPiライブラリを指定します。スペルミスに注意してください。
pi@raspberrypi ~ $ cc -o ledtest ledtest.c -lwiringPi
エラーがなければ作業ディレクトリにledtestという実行ファイルができていると思います。コンパイルした実行ファイルはpiユーザとして(一般ユーザ権限で)実行されますので、sudoをつけます。
pi@raspberrypi ~ $ sudo ./ledtest
うまく動作しましたか?うまく動作しない場合、もう一度プログラム内容を見直してみてください。どうしてもわからない場合は問い合わせページからお問い合わせいただければと思います。
もう今年も今日でおしまいですね。ホームコントローラの製作はあまり進みませんでしたが、来年こそはがんばろうと思います。来年もどうぞよろしくお願いします。皆様、よいお年をお迎えください!