Raspberry Pi 3でpigpioを使用してpython言語のプログラムを作成します。pigpioは、µsオーダーで、レベル変化の検出ができ、PWM制御、サーボモータの制御、高時間分解能でのGPIO制御を可能とします。また,ネット越しにGPIO制御も可能です。

pigpioのインストール

次の手順でソースコードからmake & make installします。

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

pigpioをデーモンとして動作させる

サービスの登録を行い、pigpioをデーモンとして動作させます。

次のようにサービスを定義します。

$ sudo vi /lib/systemd/system/pigpiod.service
[Unit]
Description=Daemon required to control GPIO pins via pigpio
[Service]
ExecStart=/usr/bin/pigpiod -l
ExecStop=/bin/systemctl kill pigpiod
Type=forking
[Install]
WantedBy=multi-user.target

次のようにpigpioのサービスを有効化します。

$ sudo systemctl enable pigpiod
Synchronizing state for pigpiod.service with sysvinit using update-rc.d...
Executing /usr/sbin/update-rc.d pigpiod defaults
Executing /usr/sbin/update-rc.d pigpiod enable
$ sudo systemctl start pigpiod
$ sudo systemctl status pigpiod
● pigpiod.service - Daemon required to control GPIO pins via pigpio
   Loaded: loaded (/lib/systemd/system/pigpiod.service; enabled)
   Active: active (running) since 火 2017-03-07 10:09:11 JST; 1 day 18h ago
 Main PID: 462 (pigpiod)
   CGroup: /system.slice/pigpiod.service
           mq462 /usr/bin/pigpiod -l

 3月 07 10:09:11 raspberrypi systemd[1]: Started Daemon required to control....
 3月 09 04:33:17 raspberrypi systemd[1]: Started Daemon required to control....
Hint: Some lines were ellipsized, use -l to show in full.

pigpioのサービスを起動すると、次のコマンドでデーモンとしての起動していることが確認できます。

$ service --status-all
     ...
[ + ]  pigpiod
     ...

また次のコマンドで、8888番ポートが待受ポートとして使われているのが確認できます。

$  ss -nat
State      Recv-Q Send-Q        Local Address:Port          Peer Address:Port
                ...
LISTEN     0      100                     ::1:8888                    :::*
最近のRaspberianでは、pigpioが利用できるようです。raspi-cofigを用いて、「9 Advanced Options」から入り、「AB GPIO Server」を選択すれば、pigpioが利用できます。

Raspberry Pi 3への接続

タクトスイッチとLEDをRaspberry Pi 3に次のように接続します。実際の配線については「bcm2835 ライブラリによるスイッチ入力とLEDの点滅」を参照してください。

  • タクトスイッチ:GPIO14
  • LED:GPIO15

実際に、Raspberry Pi 3に接続した画像を次に示します。

Raspberry Pi 3への接続

pigpioを使用したプログラムの作成

pigpioを使用したプログラムをPython言語で作成します。

作成したプログラムでは、LEDが点灯/消灯を繰り返します。タクトスイッチが押されると、タクトスイッチが接続されているGPIO番号「14」が端末に出力され、LEDが消灯します。以降タクトスイッチが押される毎に、LEDの輝度が増していきます。

#!/usr/bin/env python

import pigpio
from time import sleep

# -----------
callcnt = 0
PIN = 15
FREQ = 50
RANGE = 100

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


def cb_interrupt(gpio, level, tick):
    global callcnt
    print (gpio, level, tick)
    callcnt += 1
    pi.set_PWM_frequency(PIN, FREQ)
    pi.set_PWM_range(PIN, RANGE)
    pi.set_PWM_dutycycle(PIN, callcnt*1)

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

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)
        if callcnt != 0:
            while True:
                sleep(0.5)

except KeyboardInterrupt:
    pass

pi.set_mode(PIN, pigpio.INPUT)
pi.stop()

プログラムを実行すると次の内容が表示されます。()内の表示は、タクトスイッチが押される毎に表示されます。

$ python pigpiodemo.py
(14, 0, 4105638951L)
(14, 0, 4119385191L)
(14, 0, 756827449)