#GPIOとは
GPIOについては、馴染みまくっている人もいれば、あまり組み込み的なことをやってない人だと名前だけ知ってるけど……という人も多いと思われますので念の為説明します。
GPIO は General purpose input/output の略で、ジェネラルなパーパスでインプットやアウトプットが出来る端子です。ってまぁようするに目的が限定されていない、とにかく電圧上げ下げを出力したり入力したり出来る口ということです。出力だけならGPO 、入力だけなら GPI と限定した呼称をすることもあります。
上げ下げする電圧は一定値で、RaspberryPiの場合は 3.3V です。中間的な電圧を出力したり、検知したりということはできず、ON/OFFのデジタル入出力です。ただし、出力に関しては、擬似的に中間的な電圧を生成することを、ミリ秒単位で ON/OFF することで実現する PWM という手法が使えます。
電圧上げ下げの出力があれば、LEDを光らせたり、スイッチを入切したり、また上記の PWM を使えばサーボモーターを動かすということも出来ます。
#Raspberry Pi のGPIO
実際 RaspberryPi の GPIO はこんな感じで生えてます。
剣山風なのが GPIO の PIN
(http://www.orsx.net/blog/archives/4126 の画像をありがたく使用)
といってもすべてのピンが GPIO というわけではなく上記の図でGPIO XX となっているのがGPIO。その他 5V/3.3V は電源供給用、GNDは 基準の0V電圧で、GPIO PINを+とした時の-側としてつなぎます。
GPIO に番号がついていますが後ほどの操作でこの番号を使ってどのPINを使うか指定します。配置がカオスなので、上記のような図が必須です。
#FreeBSD で GPIO
で、FreeBSD で GPIO 操作ですが、ドライバを書いたりする必要はなくて、標準でコマンドがあります。その名も「gpioctl」。コマンドの詳細はお約束の man gpioctl に書いてあります。
GPIO 操作用のデバイスノードは /dev/gpioc0 です。gpioctl コマンドの -f オプションで指定しますが、gpioc0 しかないので、指定しなくてもデフォルトでこいつを使ってくれます。
現在の GPIO 各 PIN の状態は gpioctl の -l オプションで参照できます。
# gpioctl -l
pin 00: 0 pin 0<>
pin 01: 0 pin 1<>
pin 02: 1 pin 2<>
pin 03: 1 pin 3<>
pin 04: 1 pin 4
〜〜〜〜〜(中略)〜〜〜〜〜
pin 51: 1 pin 51<>
pin 52: 1 pin 52<>
pin 53: 1 pin 53<>
が入力、が出力、<>が無指定です。
では GPIO 18 に LED を繋いで光らせてみます。
GND(GPIO18の横使用) - 抵抗(1kΩ) - (-)LED(+) - GPIO18
としてつなぎました。下の写真が抵抗とLEDをブレッドボードに刺したものとRaspberryPi の GPIO18とGNDを繋いだ状態です。
光が見えづらいしケーブルがごちゃごちゃで失礼。つながってるのは二本の線だけです。
GPIO 18 を OUT に設定するには、
gpioctl -c 18 OUT
とします。
gpioctl -l で調べると、設定前は
pin 18: 0 pin 18
だったのが、
pin 18: 0 pin 18
となります。0というのは現在出力値が0ですよということです。LEDは消灯状態だと思います。
LEDを点灯させるには、これを 1 にすればいいわけです。1 にするには、
gpioctl 18 1
とします。これで LEDが点灯します。
再度消灯するには当然 0 にしてやればいいわけです。
gpioctl 18 0
これをスクリプトで繰り返せば、LEDチカチカも楽勝ですね。他の PIN にLEDをつなげば、複数チカチカさせてクリスマス気分、も夢ではないというわけです。
今回は出力でしたが、入力は gpioctl の -l で出てくる0/1の値で取得できます。センサーのデジタル入力の検知がこれでできます。
こんな感じで、簡単な GPIO 操作は FreeBSD 標準の gpioctl コマンドでプログラミング不要で取り扱えます。
#「LEDなんてねーけどGPIOを体感したい」という方は
代わりにRaspberryPiボード上のLEDをいじってみましょう。実は上記と同様の操作でRaspberryPi ボード上のLEDが操作できます。gpioctl -l のリストに
pin 35: 0 gpioled0
pin 47: 0 gpioled1
という PIN があるのですが、これがボード上のLED操作用の PIN です。つまり2つのLEDが操作できるわけです。
gpioctl 35 1
とか実行すればボードの端っこにある赤いLEDが点灯するので探してみてください。
みつけたら
gpioctl 35 0
で消灯するか確かめてみてください。