Quick2Wire(2)

前回インストールしたQuick2WireはGPIOのピンに対する入出力と、I2Cによるデバイスとの通信機能を持つので、まずはGPIOの機能について試してみる。

Pythonでプログラムを組んで入出力を行う事はもちろんできるが、Raspberry Piのコンソールから仮想デバイスに対してリダイレクトするだけでも同じことが行える。GPIOピンヘッダの11番ピンがBCMチップのGPIO17で、Quick2WireではPin0(ゼロ)として扱われているので、ここに適当なLEDと抵抗が外付けされているものとする。
ちなみにQuick2WireのGPIO番号とピンヘッダとBCMチップのGPIO番号は以下のように対応している(Raspberry Piのリビジョンがv2の場合)

GPIO 0 1 2 3 4 5 6 7
Header 11 12 13 15 16 18 22 7
BCM 17 18 27 22 23 24 25 4

この状態でコンソールから以下のコマンドを実行する

$ gpio-admin export 17

これで /sys/devices/virtual/gpio/ にgpio17というデバイスが作成されるので、あとはこのデバイスに対してIn/Outの設定と値の入出力を行えば良い。

$ echo out > /sys/devices/virtual/gpio/gpio17/direction
$ echo 1 > /sys/devices/virtual/gpio/gpio17/value

これで接続されているLEDが光るはずだ。
出力されている値はcatコマンドで確認できる。

$ cat /sys/devices/virtual/gpio/gpio17/value
1

使い終わったら以下のようにunexportしておく

$ gpio-admin unexport 17

この一連の仮想デバイスに対する操作は、実はRaspberry Piの基本機能でも可能である。Quick2Wireを使用しなくても、以下のようにすれば同じことができる。

$ echo 17 > /sys/class/gpio/export
$ echo out > /sys/class/gpio/gpio17/direction
$ echo 1 > /sys/class/gpio/gpio17/value
$ echo 0 > /sys/class/gpio/gpio17/value
$ echo 17 > /sys/class/gpio/unexport

以前のRaspbianでは管理者権限が無いとこの操作は行えなかったのだが、現在のバージョンではgpioグループに所属していれば一般ユーザでもGPIOの操作が可能になっている。デフォルトのユーザであるpiは既にgpioグループに所属しているのでそのままで使用できるが、新たに作成したユーザの場合は以下のコマンドでgpioグループに所属させる必要がある。

$ sudo adduser $USER gpio

ユーザをグループに所属させるには usermod コマンドを使用する方法もあるが、元々所属していたグループ情報が失われてしまう危険性があるので、使用しないほうが無難。

PythonでQuick2Wireを使用してGPIOの操作を行う場合は、quick2wire.gpioモジュールをインポートしてその中のPinsオブジェクトを使用すると簡単に入出力が行える。GPIO0(11番ピン)に接続されたLEDを点滅させるプログラムは、以下のようになる。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from quick2wire.gpio import pins, Out
from time import sleep

if __name__ == '__main__':
    try:
        with pins.pin(0, direction=Out) as led:
            while True:
                led.value = 1 - led.value
                sleep(1)
    except KeyboardInterrupt:
        print('\nbreak')

pinオブジェクトの生成時にはIn/Out以外にもプルアップの設定や、信号の変化による割り込みの設定も行える。細かく説明すると長くなるので、入力変化によるイベントのサンプルだけ書いておく。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import select
from quick2wire.gpio import pins, In, Out, Rising, Falling, Both

if __name__ == '__main__':
    led = pins.pin(0, direction=Out)
    btn = pins.pin(7, direction=In, interrupt=Both)
    with led,btn:
        epoll = select.epoll()
        epoll.register(btn, select.EPOLLIN|select.EPOLLET)
        try:
            while True:
                events = epoll.poll()
                for fileno,event in events:
                    if fileno == btn.fileno():
                        led.value = btn.value
        except KeyboardInterrupt:
            print('\nbreak')

GPIO0(11番ピン)にLED、GPIO7(7番ピン)にスイッチが接続されているものとして、スイッチのH/L変化によるイベントでLEDの状態を変化させている。
このサンプルのような単純な処理ではあまりメリットは無いが、selectを使うと複数のI/O処理を登録しておいてイベントで一括処理する事が可能になるので、複雑なプログラムになってくると必要とされる場面もあるかと思う。

Quick2WireのI2C機能については次回に。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中