Raspberry PiのGPIO制御の決定版 pigpio を試す

f:id:karaage:20171013220627j:plain:w640

Raspberry PiのGPIO制御

 はーい、みんなー。Raspberry PiでLチカしてるかい?Raspberry PiでのGPIO制御、いつもライブラリ何使うかで迷っていて、比較をまとめるくらい迷っていました。

 具体的には、RPi.GPIOかWiringPiで迷うことが多くて、pythonに特化して割り込みを使えるRPi.GPIO vs 精度の高いPWMを出力できる pythonでもCでも使えるWiringPiという感じでした。

 ところが、最近pigpioという素晴らしいライブラリの存在を知りました。きっかけは下記のブログのpigpioに関する記事。

Raspberry Pi用pigpio Library - その1:腰も砕けよ 膝も折れよ:So-net blog
Raspberry Pi用pigpio Library - その2:腰も砕けよ 膝も折れよ:So-net blog
Raspberry Pi用pigpio Library - その3:腰も砕けよ 膝も折れよ:So-net blog
Raspberry Pi用pigpio Library - その4:腰も砕けよ 膝も折れよ:So-net blog
Raspberry Pi用pigpio Library - その5:腰も砕けよ 膝も折れよ:So-net blog
Raspberry Pi用pigpio Library - その6:腰も砕けよ 膝も折れよ:So-net blog
Raspberry Pi用pigpio Library - その7:腰も砕けよ 膝も折れよ:So-net blog
Raspberry Pi用pigpio Library - その8:腰も砕けよ 膝も折れよ:So-net blog
Raspberry Pi用pigpio Library - その9:腰も砕けよ 膝も折れよ:So-net blog
Raspberry Pi用pigpio Library - その10:腰も砕けよ 膝も折れよ:So-net blog
10回の記事をまとめた神pdf

 10回に渡ってpigpioの仕様や奥深さを紹介していて必見です。もうこのリンク貼って終わってもよいのですが、下記記事は主にCで使うことを想定しているのと、内容がかなり高度でマニアック(10万人に1人くらいしか理解できないのじゃないかと思います、私もわからないところ多い)なので、ここでは、1万人に1人くらいがわかるようにpythonでの使い方を簡単に記載していきたいと思います。

 ちなみにpigpioを、Raspberry Piでよく使われるGPIO制御のライブラリであるところのRPi.GPIO・WiringPiと自分が気になるところをざっと比較すると以下のようになります。

項目 pigpio RPi.GPIO WiringPi
高精度PWM 32本 0本 2本
入力割り込み 有り 有り 無し
リモートからの制御 有り 無し 有り(+WebIOPi)
対応言語 python/C python python/C

 なんとRPi.GPIO・WiringPiの不満点を完全に解消しています。素晴らしい! 

pigpio使い方

 基本的には、以下サイトに書いてあるのですが、上のブログでも書かれているようにとっつき辛い上にサンプルも少なめで、基本上級者向けな匂いがします(私には)。

pigpio library

 そこで、ここではpythonでの簡単なサンプルの具体例を記載していきたいと思います。確認した環境は以下ですが、Raspberry Pi 2などでも問題なく動くと思います。

  • Raspberry Pi 3
  • Raspbian Jessie with PIXEL(2016/09/23 released)

 ここからはさらに宇宙語が続くので、興味ある方のみご覧下さい。

pigpioインストール

 Raspberry Pi + Raspbianは、以下の記事の通り初期セットアップされていることが前提となります。

 pigpioのインストールは以下です。

$ sudo apt-get update
$ sudo apt-get install pigpio

 ただ、私の環境だと既にインストールされていました。

pigpiodデーモン立ち上げ

 pigpioを使う場合は、必ず事前にpigpiodというデーモンを立ち上げる必要があります。ここがちょっと他のライブラリと違うところですね。ちょっと面倒くさく感じますが、以下の1行を実行するだけです。

$ sudo pigpiod

 実はこの仕組みのお陰で、GPIO制御するプログラムをsudo無しで起動できたり、リモートから制御できたりするようになっているので我慢我慢ですね。毎回実行するのが面倒臭かったら/etc/rc.localとかに書いて起動時に実行するようにしておけばよいと思います。Raspberry Piの自動起動に関して詳しく知りたい人は、下記記事を参照ください。

pigpioサンプル

 おまちかねのサンプルです。今回は、簡単な出力のサンプルと、知りたい人多そうな割り込み入力の使い方を紹介します。他にもPWMやらSPIやらI2Cやらも使えるらしいので、使いたい人は是非調べて使ってみてくださいね(人任せ)。もし私も今後使ったら追記していきます(多分)。あと、今回のサンプル、以前ためしたサンプルを元に書いていますが、完全に試せていません。もし動かなかったら…がんばってください!(無責任)。私も近いうちに確認してみる予定です。

GPIO出力サンプル

 下記内容をgpio_out.pyで保存

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

import pigpio

pi = pigpio.pi()
pi.set_mode(17, pigpio.OUTPUT)

pi.write(17,1)
print(pi.read(17))
$ python gpio_out.py

 で17pinのピンがHighになります。簡単ですね!事前に以下を実行しておくのを忘れないようにしてくださいね。

$ sudo pigpiod

GPIO入力割り込み

 入力割り込みは以下のように使います。下記内容をgpio_interrupt.pyで保存

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

import pigpio

pi = pigpio.pi()
pi.set_mode(17, pigpio.INPUT)
pi.set_pull_up_down(17, pigpio.PUD_UP)


def cb_interrupt(gpio, level, tick):
    print (gpio, level, tick)

cb = pi.callback(17, pigpio.FALLING_EDGE, cb_interrupt)

 python gpio_interrupt.pyを実行すると、17pinがおされるたびにピン番号と電圧値が表示されます。

 プルアップ抵抗つける代わりに、pi.set_pull_up_down(17, pigpio.PUD_UP)でRaspberry Piの内部プルアップを有効にしています。あとは、cb = pi.callback(17, pigpio.FALLING_EDGE, cb_interrupt) でコールバックを宣言しておけば、この例だと17pinのGPIOがGNDに接続されるたびに電圧の立ち下がりを検知してcb_interruptが呼ばれます。どうです?便利でしょ?

まとめ

 今回は、pigpioに関してまとめてみました。単純にLチカしたいだけなら、RPi.GPIOやWiringPiの方が手軽でよいと思いますが、少し高度なことをしたいときはpigpioを試すことを考えてみてもよいかもしれません。私は今後は、gpio制御には積極的にpigpioを使っていこうかなと思っています。

関連記事

 Raspberry Pi関係のまとめページです