WiringPi

RaspberryPiでPythonを使ってGPIOの入出力を行う場合、GPIOモジュールをimportすれば手軽に使うことができるのだが、GIPOモジュールが実際にアクセスする /dev/mem デバイスはルート権限でしか開くことができない。

そのため、GPIOモジュールをimportするプログラムはルート権限で実行しないと、以下のようなエラーが出てしまう。

RPi.GPIO.SetupException: No access to /dev/mem.  Try running as root!

その場合はpythonを起動する時にsudoを付けて実行すれば良いのだが、CGIとしてPythonスクリプトを実行しようと思った場合は、ちょっと困ったことになる。CGIとして実行されるスクリプトは、デフォルトではルート権限にならないのだ。

ルート権限としてCGIを実行する方法はいくつかあるが、それを試す前にルート権限無しでGPIOを使用する方法を探してみると、WiringPiモジュールが見つかった。

apt-getではインストールできないようなので、Raspberry Piの作業用フォルダに移動してから、このページに従って以下のようにインストールする

$ sudo apt-get install python-dev
$ git clone https://github.com/WiringPi/WiringPi-Python.git
$ cd WiringPi-Python
$ git submodule update –init
$ sudo python setup.py install

インストールにはpython-setuptoolsが必要なので、最後のインストールでエラーが出た場合は以下のようにpython-setuptoolsを入れてから再度実行

$ sudo apt-get install python-setuptools

これでルート権限無しでGPIOが使えるはずなのだが、サイトのサンプルを参考にして作った以下のプログラムを実行しても、LEDが全く点滅しない。

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

import wiringpi
import time

if __name__ == '__main__':
    io = wiringpi.GPIO(wiringpi.GPIO.WPI_MODE_SYS)
    io.pinMode(23,io.OUTPUT)
    io.digitalWrite(23,io.HIGH)
    while True:
        io.digitalWrite(23,io.LOW)  # on
        time.sleep(1)
        io.digitalWrite(23,io.HIGH) # off
        time.sleep(1)

LEDはGPIO4に470Ωの電流制限抵抗を介して、以下のように接続してある。GPIOのピン番号はちょっと分かり難くて、GPIO4は実際にはピンヘッダの16番になる。
しかもWiringPiはBCMチップの番号でアクセスするので、プログラム上は23番になってしまう。このへんはもう少しなんとかして欲しかった。

gpioled

プログラムが動かなかった理由は単純で、 WiringPiはルート権限無しでGPIOを使用する場合は事前にツールを使ってポートの設定を行っておかなければならなかったのだ。WiringPiと一緒にインストールされているgpioコマンドを使って、端末から以下のように設定する

$ gpio export 23 out
$ gpio exports
GPIO Pins exported:
23: out  0  none

この設定を行ってからプログラムを再度実行すると、今度はLEDの点滅が始まる。
いちいちポートの設定を行わないと使えないのは不便なので、WiringPiでは初期化の時に

wiringpi.GPIO(wiringpi.GPIO.WPI_MODE_SYS)

ではなく

wiringpi.GPIO(wiringpi.GPIO.WPI_MODE_GPIO)

と指定する事でexportを行わなくてもGPIOを使用できるようになる。ただし、この場合は内部的にGPIOモジュールと同じ事を行っているらしく、ルート権限が必要になってしまう。

つまり、wiringpi.GPIO.WPI_MODE_SYS で初期化した場合はルート権限が不要だが、プログラムの実行前に設定が必要になる。wiringpi.GPIO.WPI_MODE_GPIO で初期化した場合は実行前の設定は不要だが、ルート権限が必要になる。

という事のようだ。ちょっとややこしいので、このあたりも将来的に整理される事を期待したい。

広告

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中