2016/08/14

Raspberry Piのことはじめ - 05 プログラム制御(出力)

前回は電源をつけたらLEDがつく、といったシンプルな回路を作ったが、その回路を利用してソフトウェアからLEDのON/OFFを制御してみる。
今回はコマンドとPythonでのプログラム制御を試してみる。

今回必要なもの


前回と同じ。前回の回路を流用するなら、新しく何かを用意する必要はない。
ただRaspbianにアクセスするので、リモートで接続する方法を思い出してね。



構成


今回の回路はこんな感じ。



前回の回路とほとんど変わらないが、ピン番号1(3.3V)のソケットをピン番号7に差し替えただけ。

Raspberry Pi構成情報

ピン番号7はGPIOのため、ソフトウェアで制御可能(GPIO番号は4)。これを制御する方法を幾つか紹介する。

差し替えたらRaspberry Piの電源を入れて、リモートで接続しよう。
主に使用するのはコマンドなので、CUI、GUIどちらでもいい。
LEDのは点灯していないはず。


コマンド制御


まずはコマンドで制御してみよう。
コマンドで制御するにしても幾つか方法があるので、1つづつ紹介する。

ファイル入出力を使ったインターフェイス


外部デバイスとOSが通信する場合、特定のメモリアドレスに書き込んだり読み込んだりすることで通信を実現するインターフェイスが多いが、WindowsやLinuxなどの汎用OSでは、特定のメモリアドレスに書き込むことができないようになっている場合がほとんど。そういう場合によく使用されるのが、特定のファイルにwriteすることで情報を送信したり、readすることで受信したりするインターフェイス。
(ドライバなどを書いたことがある人には、比較的おなじみかも)

RaspbianもLinuxなので、このインターフェイスが用意されている。


具体的には、「/sys/class/gpio/」内のファイルがインターフェイスとなる。
まず、ピンを使用できるようにするために、ファイル「/sys/class/gpio/export」にGPIO番号を書き込む。

コマンドでファイルに簡単に書き込む方法がある。

$ echo aaa > test.txt

と書けば、「text.txt」というファイルに「aaa」という文字を書き込むことができる。
「echo」コマンドは指定された文字列をプリント出力するだけのもので、記号「>」が左項の出力内容を右項のファイルに書き込むコマンド。
これを利用する。ピン番号7はGPIO 4なので

$ echo 4 > /sys/class/gpio/export

とコマンドを打つと、「/sys/class/gpio/gpio4」というディレクトリができ、この中に幾つかのファイルができる。
肝心の制御は、「/sys/class/gpio/gpiox/value」というファイルに1か0を書き込めばいいが、まずは
「/sys/class/gpio/gpiox/direction」ファイルに出力か入力のモードを指定する必要がある。

$ echo out > /sys/class/gpio/gpio4/direction

とすると、GPIO4は出力モードになる。入力モードのときには「in」と書き込む。

$ echo 1 > /sys/class/gpio/gpio4/value

とするとGPIO4から3.3Vの電圧が流れ、LEDが点灯するはず。

消したいときは

$ echo 0 > /sys/class/gpio/gpio4/value

と書き込むと消える。

終わったら、「/sys/class/gpio/unexport」ファイルにGPIO番号を書き込み、終了を通知する。

$ echo 4 > /sys/class/gpio/unexport

すると、「/sys/class/gpio/gpio4」ディレクトリが消えたはず。


これが一連の出力操作。勘のいい人なら気づくかもだが、これは別にコマンドに限った話じゃなく、ソフトウェアからファイル入出力APIを使用して同じようにGPIOを制御することができる。
ここまでやれば、もうこんなブログは必要ないぜ!というひとも結構いるんじゃないの?


gpioコマンドを使ったインターフェイス


現在のRaspbianにはすでにGPIO制御ツールが幾つか入っていて、上記のファイル入出力を使うよりコマンド一発でON/OFFを切り替えられるものもある。
その一つが、Wiring Piライブラリのgpioコマンドである。

$ gpio -v

と打ち込むと、バージョン情報が表示されるはず。Raspbianにデフォルトで入っている。

gpioコマンドでは対象ピンの指定に

  • Wiring Piライブラリ特有のピン番号
  • GPIO番号(オプション -g)
  • 通常のピン番号・物理番号(オプション -1)

が使用できる。各番号は、下記のコマンドで確認できる。

$ gpio readall

と打ち込むと、各ピンの情報と現在のモードや状態が表示される。
「Physical」が物理番号、「BCM」がGPIO番号、「wPi」がWiring Pi番号といったところ。


今回はGPIO番号で指定するため、オプションの-gで指定する。
まずはモード指定から。

$ gpio -g mode 4 out

次に、GPIO4をONにする。

$ gpio -g write 4 1

するとLEDがつく。簡単簡単。
消すときは

$ gpio -g write 4 0

このコマンドは特に終了処理がない。便利だね。


プログラム制御


今後プロダクトを作ることを考えている人は、ぜひプログラムでGPIOを制御したいのではないだろうか。
そのような要望に応えて、各言語にはこれを制御するためのライブラリが用意されている。

今回は簡単に実装・実行できるPythonで制御する。
なんでPythonやねん、といった声もあるかもだけど、海外では人気なんすよ。
いろいろなソフトウェア分野を渡り歩いている自分は、特定の言語に特定の感想はあまり持たないようにしているが、書き方が独特な言語は、ちょっとイラッとするのはわかる。
まあ、Raspbianにデフォルトで入ってるし、sleepとかしやすいし、今回はこれで。


Pythonコード実装・実行


Pythonはすでに入っているので、すぐに実行できる。

Pythonは
$ python example.py
とすると「example.py」が実行されるインタープリタ言語。
ネストをインデントで表現するちょっと変わったやつで、行の終わりが改行やインデントで判断されるため、よくある「;」で行を終わらせることもない。

今回は

  • 実行したらすぐにGPIO4をONにする。
  • 1秒点灯した後に、GPIO4をOFFにする。
  • 1秒消灯した後に、GPIO4をまたONにする。
  • 1秒点灯した後に、またGPIO4をOFFにして終了。

といったものを実装する。
そのコードを下記に示す。

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(4, GPIO.OUT)

GPIO.output(4, 1)
time.sleep(1)
GPIO.output(4, 0)
time.sleep(1)
GPIO.output(4, 1)
time.sleep(1)
GPIO.output(4, 0)

GPIO.cleanup()

これより内容を簡単に説明していく。

まずimportはライブラリを組み込む命令。
import RPi.GPIO as GPIO
と書くと、通常ではRPi.GPIOライブラリ内の関数を使用する場合
RPi.GPIO.setmode(RPi.GPIO.BCM)
と書かなければいけないところを、
GPIO.setmode(GPIO.BCM)
と短縮して書くことができる。エイリアスというやつですな。
sleep関数を使用するため、timeライブラリもimportしておく。


次はピンの指定モードを設定する。
GPIO.setmode(GPIO.BCM)
BCMとはGPIO番号で指定するよ、ということ。
今までGPIO番号といってきたが、仕様的にはBCM番号と呼ぶ。

次はピンの入出力を指定する。
GPIO.setup(4, GPIO.OUT)
GPIO4を出力モードに指定しますよ、ということ。

ここまでで設定完了。


ピンのON/OFFの切り替えはoutput関数で行う。
GPIO.output(4, 1)
とするとONになるし
GPIO.output(4, 0)
とするとOFFになる。

スリープは
time.sleep(1)
と書く。これで1秒待つ。


最後に
GPIO.cleanup()
と終了処理を行う。


これを実行してみよう。今回は「example.py」という名前でプログラムを保存した。
$ python example.py
とコマンドを打つと、上で規定した動作が行われるはず。


今回はGPIO制御を、出力中心に行った。
次回は入力中心に書きたい。

0 件のコメント:

コメントを投稿