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()