ラズパイの仕組みがわかる「シェルからのハードウェア制御」入門。

0
1864
GPIO

シェルでハードを制御しながらラズパイを学ぶ

シェルはLXTerminalから呼び出されてOSの心臓部でもあるカーネルに指示を出すことで、コンピュータに様々な動作を行わせることができます。言い換えればシェルを通じてコマンドを送るスクリプトを組み上げれば機能をもった自動化するコンピュータを作ることもできます。当然GPIOポートもシェルから直接コントロールが可能であるため、これらシェルの基礎を学んでおくとラズベリーパイを自在にコントロールできるようになります。

今回は、ラズベリーパイの入門でよく出てくる「Lチカ(LEDをチカチカさせる)」をシェルを使って行ってみます。通常はPythonやScratchなどを使って行いますが、今回はシェルから直接GPIOをコントロールします。

GPIOポートを搭載したコンピュータRaspberryPi

ラズベリーパイはLinuxベースのOS「Raspbian(ラズビアン)」で動作します。他にも様々なOSやLinuxディストリビューションで動作させることができますが、Raspbianは特にRaspberry Piに特化したLinuxと言えます。ハードウェアの面で言えば「GPIO」ポートを搭載していて、ここから配線を行って電子回路を学んだり、アクチュエータなどを接続して製品のプロトタイプを作ったりと様々な事が可能です。

GPIO

RaspbianがどのようにGPIOを制御しているのか

Linux系のOSであるRaspbianは他のLinuxとほぼ同じようにハードウェアをコントロールしています。Raspberry PiにはEathernetコントローラーやUSB、WiFi、Bluetoothなど様々なハードウェアが搭載されていてGPIOもその一つです。

Linuxはファイルシステムと呼ばれる階層構造が構築されていて、この階層化された中に様々な機能のファイルが置かれています。

Linux file system

Linuxではハードウェアをコントロールするときに「仮想ファイル」というものを作成しそこに書き込まれた操作内容がデバイスへの動作となって表れる仕組みになっています。RaspbianもLinux系OSですのでシステムは同様です。

まずはRaspbianでgpioを制御する場合に仮想ファイルがどこに出来上がるかを確認します。

現在いるディレクトリから違うディレクトリに移動する

通常RaspbianではLXTerminalを起動すると「ホームディレクトリ」といわれる自分のユーザーネームのついたディレクトリに居ます。シェルからのコマンドを覚えながらシェルの基本操作を覚えていきましょう。

まずは、LXTerminalを起動します。

pwdと入力して「Enter」してみます。

$ pwd

すると現在は「/home/pi」というディレクトリに居ますという意味になります。この場所をホームディレクトリといい、/homeの下にpiとありますが、これがユーザー名となっています。そもそもコマンドラインの「$」マークの左側には、現在自分がいるディレクトリが表示されます。「~(チルダ)」となっているのは、ホームディレクトリですよと言う意味になっています。

gpioポートをコントロールする仮想ファイルは「/sys/class/gpio 」という場所に作成されます。この場所に移動してみましょう。

$ cd /sys/class/gpio

これでgpioフォルダに移動します。cdコマンドは指定したディレクトリに移動するというコマンドになります。

CDコマンド

ここでこのディレクトリの中にあるファイルを表示するコマンド「ls(エル・エス)」を入力してみます。

$ ls

RaspbianではシェルからGPIOを操作する場合、ここに格納されているexportに何番のGPIOポートを使うかを書き込みます。この書き込みが起こるとカーネルが操作用のデバイスファイルを生成するという仕組みになっています。

以下のコマンドでexportに対して17番を使う旨を書き込みます。

$ echo 17 > export

これで、「ls」コマンドを打ってファイルのリストを見るとgpio17というものが出来上がっているのがわかります。

これはディレクトリになっているため、この中にまだファイルがいくつか入っています。以下のコマンドでその中身が確認できます。

$ ls gpio17

ここで、現在GPIO17番は入力なのか出力なのか確認してみます。「more」というコマンドはファイルの中身を表示するというものです。ここでは、gpio17ディレクトリの中にあるdirectionというファイルに係れている内容を表示してみます。現在いる場所がgpioというフォルダなので、そこからgpio17の中のdirectionを指定します。

$ ls gpio17/direction

すると、「in」と表示されたかと思います。これは入力になっているという事です。

Lチカをやってみよう!

LEDを光らせるためにはGPIO17番から信号を出しますので、出力「out」に設定しなければなりません。先ほどやったechoコマンドを使ってこのファイルの内容を変更してみます。

$ echo out > gpio17/direction

これで出力になりました。先ほどと同様にmoreコマンドで確認してみましょう。

ここまでで設定は完了しましたので、実際にLEDをブレットボードなどに配線して、GPIO17番のポートに接続します。GPIOポートの配列は以下のコマンドで表示できます。

$gpio readall

gpio readall

GPIO17番に信号を出したい場合は「1」を流さない場合は「0」をgpio17ディレクトリの中にある「value」というファイルに設定します。先ほどと同様にechoコマンドで行います。

$ echo 1 > gpio17/value

これで、LEDが点灯します。同じコマンドで「0」を書き込むことでLEDが消灯します。

LEDを1秒おきに点滅させるためのプログラム

LEDを1秒おきにずっと点滅を繰り返すプログラムを実行させるためにはwhile構文を使います。whileは繰り返す処理を行う場合にプログラミング言語ではよく見かけるものです。以下のようにコマンドラインに打ち込むことでLEDが点灯を繰り返します。

$ while true ; do

> echo 1 ; sleep 1 ;echo 0 ; sleep ;

> done > gpio17/value

sleep 1 は1秒まつという意味になります。1にしたあとに1秒まって今度は0にして1秒まつを繰り返すという内容を valueファイルに書き込むという処理を行ったところ、カーネルはそのことをGPIO17番に実行させました。

このようにシェルからハードウェアを制御する場合、仮想ファイルに処理を書き込むことでGPIOがコントロールされていることがわかります。

ハードウェアの制御の基礎とシェルからの操作は様々なコマンドにより実現されます。今回はその最初の一歩をLEDをコントロールすることで体験してみました。