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

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回に渡って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の不満点を完全に解消しています。素晴らしいです!またWiringPiは2020年現在、開発停止のステータスに入っているので、あまり選ばない方が良いかもしれません。

WiringPi Library To Be Deprecated | Hackaday

pigpio使い方

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

 そこで、ここでは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が呼ばれます。どうです?便利でしょ?

追記:Raspberry Pi 5に関して

 気になるRaspberry Pi 5の対応ですが、中身の構成が大幅に変わっているのでpigpioは使えないようです。対応もされるかよくわからない状況のようです。残念ですね。

まとめ

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

関連記事

変更履歴

  • 2024/02/14 Raspberry Pi 5に関して追記
  • 2020/02/28 情報追記、全体的に修正
  • 2019/05/31 リンク修正