前回組み立てたRaspberry PiのGPIO制御回路を実際に制御してみます。
制御方法概要
MacでPICマイコン電子工作入門でPICマイコンのGPIO制御方法を説明しました。PICマイコンでは予め定義されている変数(レジスタ)に数値を代入したり、数値を読み取ることによりGPIOピンの制御ができるようになっていました。
Raspberry PiではLinux系のOSが動作していて、そのOS上で制御しますので、PICマイコンのような内部レジスタを直接制御するという方法は取れません。Raspberry PiではSoCのレジスタを直接制御するのではなく、仮想ファイルシステムを読み書きして制御するようになっています。
例えばGPIO18であれば、
/sys/class/gpio/gpio18/value
という仮想ファイルに対して、0を書き込むとGPIO18ピンがOFFに、1を書き込むとGPIO18ピンがONになります。またこの仮想ファイルを読み取ることにより、現在のピンの状態(0か1か)がわかります。
このあとGPIOピンを制御する方法について順を追って説明します。
echoコマンド
GPIOピンを制御するには、GPIO18ピンであれば /sys/class/gpio/gpio18/value に値を書き込めばいいのですが、書き込みを行うにはechoコマンドを使用します。このechoコマンドについて簡単に説明しておきます。
いきなりですが、echoコマンドの基本的な使い方です。MacのターミナルアプリからRaspberry Piにsshで接続したら、以下のコマンドを入力してリターンキーを押します。
pi@raspberrypi ~ $ echo 'Hello'
すると、以下のように表示されます。
pi@raspberrypi ~ $ echo 'Hello'
Hello
このechoコマンドは指定したパラメータ(上の例では Hello という文字列)を表示する機能を持っています。なんともない機能のような気がしますが、このechoコマンドは他の機能と組み合わせるといろいろな応用ができます。そのひとつが「リダイレクト」という機能です。上の例では Hello という文字列をそのまま表示していましたが、この Hello という文字列を「リダイレクト(転送)」してファイルに出力することもできます。言葉で説明してもよくわからないと思いますので、具体的に試してみましょう。
pi@raspberrypi ~ $ echo 'Hello' > test.txt
このechoコマンドの意味は、Helloという文字列をtest.txtというファイル名のファイルにリダイレクトする(この場合はファイルに書き出す)ということになります。ポイントは「>」という不等号を使うことです。実際に Hello という文字がtest.txtファイルに書き出されているか確認してみましょう。
pi@raspberrypi ~ $ cat test.txt
Hello
もうおわかりだと思いますが、Raspberry PiのGPIO制御はこのechoコマンドを使ってパラメータを仮想ファイルに書き出すことになります。
制御の流れ
先ほどGPIO18のピンを制御するには、/sys/class/gpio/gpio18/valueに値を書き込めばいい、と説明しましたが、実は準備をしないとこの仮想ファイルは存在しません。実際にlsコマンドでみてみると、
pi@raspberrypi ~ $ ls /sys/class/gpio/
export gpiochip0 unexport
こんな結果になると思います。これから /sys/class/gpio/gpio18/ にある仮想ファイルをいじりたいのにありません。Raspberry PiのGPIOピンを制御するには以下の手順で制御することになります。
- GPIOピンを使うよ!って宣言する
例えばGPIO18ピンを使う場合、仮想ファイルの/sys/class/gpio/exportにGPIOの番号を書き込みます。これを行うことにより、/sys/class/gpio/ディレクトリにGPIO18ピン制御に必要な仮想ファイルが生成されます。具体的には次のセクションで詳しくみてみます。 - 使う宣言をしたGPIOピンが入力なのか出力なのか指定する
(1)で使う宣言したGPIOピンが入力なのか出力なのか指定します。 - GPIOを制御する
これでやっとGPIOの制御ができるようになります。GPIO18ピンであれば、/sys/class/gpio/gpio18/valueに0(ゼロ)か1(いち)を書き込みます。 - GPIOピンを使い終わったよ!って宣言する
GPIOピンの制御が終わったら使い終わったよ、って教えてあげます。
この手順を頭に入れていただいて次に実際にGPIOピンを制御してみます。
実際の制御
それでは、実際にGPIO18ピンに接続したLEDを点灯、消灯してみます。なお、/sys/class/ディレクトリのアクセスはroot権限が必要ですので、sudoコマンドを使用します。
まずGPIO18ピンを使うよ、って宣言します。この宣言は、仮想ファイルの/sys/class/gpio/exportにGPIO番号を書き込みます。
pi@raspberrypi ~ $ sudo echo 18 > /sys/class/gpio/export
これでGPIO18ピンを制御できる準備ができました。実際に先ほどの/sys/class/gpio/ディレクトリを見てみましょう。
pi@raspberrypi ~ $ ls /sys/class/gpio/
export gpio18 gpiochip0 unexport
という感じでgpio18ディレクトリが生成されています。ついでですので、この生成されたgpio18ディレクトリの中身もみておきましょう。
pi@raspberrypi ~ $ ls /sys/class/gpio/gpio18/
active_low direction edge power subsystem uevent value
この後ですが、このgpio18/directionに入力か出力かの書き込みをして、gpio18/valueに0か1を書き込んでLEDの点灯、消灯を行います。
ではGPIO18ピンを出力ピンとして設定します。
pi@raspberrypi ~ $ sudo echo out > /sys/class/gpio/gpio18/direction
これでいよいよLEDの点灯、消灯が制御できるようになりました。
まずは点灯させてみます。
pi@raspberrypi ~ $ sudo echo 1 > /sys/class/gpio/gpio18/value
LEDが点灯しましたでしょうか。うまく点灯しない場合は回路接続、入力したコマンドなどをもう一度確認してみてください。次にLEDを消灯してみます。
pi@raspberrypi ~ $ sudo echo 0 > /sys/class/gpio/gpio18/value
GPIO18ピンの制御が終わったら、最後に使わない宣言をします。
pi@raspberrypi ~ $ sudo echo 18 > /sys/class/gpio/unexport
もう一度、/sys/class/gpio/ディレクトリの中身を確認してみます。
pi@raspberrypi ~ $ ls /sys/class/gpio/
export gpiochip0 unexport
gpio18/ディレクトリがなくなっていますね。
このようにRaspberry Piでは仮想ファイルを使ってSoCのGPIOピンを制御することになります。
他の方法
で、今頃こんなことを言うのもなんですが、このechoコマンドいちいち入力するの面倒ですよね。もうちょっと簡単に制御できるWiringPiというツールがありますので、次回はその説明をしようと思います!