042_rpi_pigpio - kotaproj/study_zenpan GitHub Wiki

pigpioモジュールを使う

https://qiita.com/yuuri23/items/597fd1a40c63627e59c2 https://www.indoorcorgielec.com/resources/raspberry-pi/python-gpio/

pigpioをインストール

sudo apt install pigpio

pigpioサービスの起動/登録

pigpioを使う場合は、Pythonプログラムを実行する前に、サービスを実行しておく必要があります。以下のコマンドを実行します。

sudo service pigpiod start

Raspberry Pi起動時にpigpiodを自動で立ち上げたい場合は以下を実行します。

sudo systemctl enable pigpiod.service

使い方例

GPIO - OUTPUT

import pigpio
import time

# LEDのピン設定
PIN_LED = 16

def main():
    # 初期化
    pi = pigpio.pi()
    pin = PIN_LED
    pi.set_mode(pin, pigpio.OUTPUT)

    # Lチカ
    try:
        for logic in [1, 0] * 5:
            pi.write(pin, logic)
            time.sleep(0.5)
    except KeyboardInterrupt:
        print("stop")

    # 片づけ
    pi.set_mode(pin, pigpio.INPUT)
    pi.stop()
    return

if __name__ == "__main__":
    main()

GPIO - INPUT

import pigpio
import time

# SWのピン設定
# REDスイッチ	5(29)
PIN_SW = 5

def main():
    # 初期化
    pi = pigpio.pi()
    pin = PIN_SW
    pi.set_mode(pin, pigpio.INPUT)
    pi.set_pull_up_down(pin, pigpio.PUD_UP)

    # スイッチ
    try:
        print("")
        for _ in range(20):
            print("pin - jouhou", pi.read(pin))
            time.sleep(0.5)
    except KeyboardInterrupt:
        print("stop")

    # 片づけ
    pi.set_mode(pin, pigpio.INPUT)
    pi.stop()
    return

if __name__ == "__main__":
    main()

GPIO - 割り込み

import pigpio
import time
from icecream import ic

# SWのピン設定
# REDスイッチ	5(29)
# GREENスイッチ	6(31)
# BLUEスイッチ	13(33)
PIN_SW = 6

def callback_func(gpio, level, tick):
    ic()
    ic(gpio, level, tick)
    return

def main():
    # 初期化
    pi = pigpio.pi()
    pin = PIN_SW
    pi.set_mode(pin, pigpio.INPUT)

    # callbak関数の登録
    # =>トリガー - from pigpio.py
    #    EITHER_EDGE
    #    FALLING_EDGE
    #    RISING_EDGE
    cb = pi.callback(pin, pigpio.EITHER_EDGE, callback_func)

    # スイッチ
    try:
        print("")
        for _ in range(100):
            time.sleep(0.5)
    except KeyboardInterrupt:
        print("stop")

    # 片づけ
    pi.set_mode(pin, pigpio.INPUT)
    pi.stop()
    return

if __name__ == "__main__":
    main()

アプリケーション例

超音波センサー

# one shot measurement only
#
import pigpio
import time

HC_SR04_trig = 22
HC_SR04_echo = 27

pi = pigpio.pi()
pi.set_mode(HC_SR04_trig, pigpio.OUTPUT)
pi.set_mode(HC_SR04_echo, pigpio.INPUT)

t_rise = 0
t_fall = 0


def cbf(gpio, level, tick):  # call back function for pulse detect _/~~\__
    global t_rise, t_fall

    if (level == 1):  # right after the rising edge
        t_rise = tick
    else:            # right after the falling edge
        t_fall = tick
        if (t_fall >= t_rise):  # if wrapped 32bit value,
            timepassed = t_fall - t_rise
        else:
            timepassed = t_fall + (0xffffffff + 1 - t_rise)

        # meter to cm, microseconds to seconds, divide by 2
        d = 340 * 100 * timepassed / 1000000 / 2
        print('{"tick":%10d, "time_us": %6d, "distance_cm": %.2f}' % (
            tick, timepassed, d))


cb = pi.callback(HC_SR04_echo, pigpio.EITHER_EDGE, cbf)
pi.gpio_trigger(HC_SR04_trig, 10, 1)  # Trig (10μs pulse)
# time.sleep(0.1)  # wait for echo signal for 100msec (enough..., I believe...)
time.sleep(1.0)  # wait for echo signal for 100msec (enough..., I believe...)

pi.stop()