Raspbian資料一覧

Raspberry Pi 3のGPIOを制御するpigpioライブラリ導入手順

2016/10/10更新

対応バージョン: Raspbian Jessie Lite - September 2016

Raspberry Pi 3のGPIOを制御するにはRPi.GPIOライブラリがよく使われるが、リモートからの制御も可能になるpigpioというライブラリもあるので導入手順を示す。

後半でRPi.GPIOライブラリを使ったコードとpigpioライブラリを使ったコードを比較する。

尚、リモートから接続する際のホストとしてUbuntu 16.04を使用するものとし、Raspberry Piとはネットワーク的に接続できる状態にあるものとする。

インストール

まずソースコード一式を入手してmake & make installする。これはRaspberry Pi、Ubuntu双方で実施する。

% wget abyz.co.uk/rpi/pigpio/pigpio.zip
% unzip pigpio.zip
% cd PIGPIO
% make
% sudo make install

以下のファイルがインストールされる。

/usr/local/lib/libpigpio.so
/usr/local/lib/libpigpiod_if.so
/usr/local/lib/libpigpiod_if2.so

/usr/local/lib/python2.7/dist-packages/pigpio-1.33.egg-info
/usr/local/lib/python2.7/dist-packages/pigpio.py
/usr/local/lib/python2.7/dist-packages/pigpio.pyc

/usr/local/bin/pig2vcd
/usr/local/bin/pigpiod
/usr/local/bin/pigs

/usr/local/include/pigpio.h
/usr/local/include/pigpiod_if.h
/usr/local/include/pigpiod_if2.h

/opt/pigpio/cgi/ (ディレクトリのみ)

サービス登録(systemd)

続いてサービスの登録を行い、pigpiodをデーモンとして動作させる。これはRaspberry Pi側のみで実施する。

サービス定義
% sudo vi /lib/systemd/system/pigpiod.service
[Unit]
Description=Gpio daemon

[Service]
ExecStart=/usr/local/bin/pigpiod
Type=forking

[Install]
WantedBy=multi-user.target
サービス有効化 & 起動
% sudo systemctl enable pigpiod

% sudo systemctl start pigpiod

% sudo systemctl status pigpiod
● pigpiod.service - Gpio daemon
   Loaded: loaded (/lib/systemd/system/pigpiod.service; enabled)
   Active: active (running) since 月 2016-10-10 14:28:07 JST; 6s ago
  Process: 1127 ExecStart=/usr/local/bin/pigpiod (code=exited, status=0/SUCCESS)
 Main PID: 1129 (pigpiod)
   CGroup: /system.slice/pigpiod.service
           └─1129 /usr/local/bin/pigpiod

10月 10 14:28:07 p1 systemd[1]: Started Gpio daemon.

サービスを起動すると8888番ポートが待受ポートとして使われているのが確認できる。

% ss -nat
State    Recv-Q Send-Q   Local Address:Port   Peer Address:Port 
:
LISTEN   0      100                  *:8888              *:*     
:

プログラミング

以下の資料にてLチカさせた時のコードをpippioライブラリを使って書き直してみる。

関連資料・記事

従来のRPi.GPIOライブラリ使用
#!/usr/bin/env python

import RPi.GPIO as GPIO
from time import sleep

PIN = 25

GPIO.setmode(GPIO.BCM)
GPIO.setup(PIN, GPIO.OUT)

try:
    while True:
        GPIO.output(PIN, GPIO.HIGH)
        sleep(0.5)
        GPIO.output(PIN, GPIO.LOW)
        sleep(0.5)

except KeyboardInterrupt:
    pass

GPIO.cleanup(PIN)
pigpioライブラリ使用(Raspberry Pi上で動かす場合)
#!/usr/bin/env python

import pigpio
from time import sleep

PIN = 25

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

try:
    while True:
        pi.write(PIN, 1)
        sleep(0.5)
        pi.write(PIN, 0)
        sleep(0.5)

except KeyboardInterrupt:
    pass

pi.set_mode(PIN, pigpio.INPUT)
pi.stop()
見て分かる通り、呼び出すメソッドが違うだけで書き方は同じ、違いは最初にpigpiodに接続する部分だけである。

Raspberry Pi上でローカル接続する場合とUbuntuからリモート接続する場合の引数が違うところに注意すればローカルでもリモートでも同じようにGPIOポートが操作できる。

ローカル接続
pi = pigpio.pi()
リモート接続
pi = pigpio.pi('<pigpiodが動作するホストのホスト名かIPアドレス>')

関連資料・記事

参考サイト