ソースに絡まるエスカルゴ

貧弱プログラマの外部記憶装置です。

【Raspberry Pi/python】Raspberry Pi 4のGPIOのINPUTについて

rikoubou.hatenablog.com

 前回はRaspberry Pi 4のGPIOでのLチカ(OUTPUT)をやったので、今回はGPIOの値を読み取るINPUTについての記事です。

 では、始めます。


1:プルアップ/プルダウンの設定とREAD
 Raspberry Pi 4のGPIOでは内部的にプルアップ/プルダウンの設定ができます。

 プルダウン/プルアップについての詳しい説明は以下のページ様を参照してください。

 プルアップ/プルダウンは、簡単に言うと「タクトスイッチなどの部品を単に繋いだだけではHIGH/LOWがタクトスイッチに連動しないので、ちゃんと連動させるようにするためのもの」という感じです。

 Raspberry PiのGPIOをpythonで制御する場合、このプルアップ/プルダウンの設定は以下のようにします。

# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO

SWITCH_PIN = 27 # ピン番号

GPIO.setmode(GPIO.BCM)
GPIO.setup(SWITCH_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)   # プルアップの場合
GPIO.setup(SWITCH_PIN, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) # プルダウンの場合

result = GPIO.input(SWITCH_PIN) # ピンの値を読み取る(HIGH or LOWの1 or 0)

 GPIO.setupのところの引数「pull_up_down」の値を「GPIO.PUD_UP」にするとプルアップ、「GPIO.PUD_DOWN」にするとプルダウンになります。

 GPIO.input(ピン番号)でそのピンのHIGH、LOWの値を読み取ります。


・2021/05/26:追記
 公式ページのドキュメントの中で以下のような記述がありました。

Pins GPIO2 and GPIO3 have fixed pull-up resistors,
but for other pins this can be configured in software.

 これは「GPIO2とGPIO3はプルアップで固定されているためソフトウェアでのプルダウンはできない」ということなので、GPIO2とGPIO3を使う場合は注意してください。


2:サンプル
 プルアップ/プルダウン、READのやり方がわかったので軽くサンプルを動かしてみます。

 今回は以下のようにプルダウンで回路を組みます(公式ドキュメントより引用して加工)。
f:id:rikoubou:20200916165132p:plain

 LEDは前回と同じで、今回はタクトスイッチを追加しています。タクトスイッチの一方を3.3V(Raspberry PiのGPIO一番左上)に、もう一方をGPIO27(Raspberry PiのGPIO左列上から7番目)に繋ぎます。

 ちなみにプルアップを使用したい場合は、タクトスイッチの3.3Vに繋いでいる側をGNDに繋ぎます。

 その状態で以下のプログラムを実行します。

・gpio_read_test.py

# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time

LED_PIN    = 17 # LEDピン番号(BCMの番号)
SWITCH_PIN = 27 # タクトスイッチのピン番号(BCM番号)

def main():
    setup_gpio() # GPIOの準備

    try:
        # 1秒ごとに点灯/消灯を繰り返す
        while(True):
            print("pin status:", read_pin(SWITCH_PIN))
            print("LED ON")
            GPIO.output(LED_PIN, GPIO.HIGH)
            time.sleep(1)

            print("pin status:", read_pin(SWITCH_PIN))
            print("LED OFF")
            GPIO.output(LED_PIN, GPIO.LOW)
            time.sleep(1)

    except KeyboardInterrupt:
        # Ctrl+Cで終了した場合、GPIO設定をクリア
        GPIO.cleanup()

# GPIOを扱う準備
def setup_gpio():
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(LED_PIN, GPIO.OUT)
    # GPIO.setup(SWITCH_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) # プルアップ
    GPIO.setup(SWITCH_PIN, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) # プルダウン

# ピンの状態を読む
def read_pin(pin_number):
    return GPIO.input(pin_number)

if __name__ == '__main__':
    main()

 実行すると、以下のようにLEDのON/OFFに加えてPINの状態も表示されます。タクトスイッチを押した状態だと1、離した状態だと0と表示されます。

$ python3 gpio_read_test.py
pin status: 0
LED ON
pin status: 0
LED OFF
pin status: 0
LED ON
pin status: 1
LED OFF
pin status: 1
LED ON
pin status: 1
LED OFF
pin status: 1
LED ON
pin status: 0
LED OFF
pin status: 0
LED ON
pin status: 0
LED OFF
pin status: 0
LED ON

^C

 プルアップの場合はタクトスイッチの押した時と離した時のピンの状態が反転します。


 以上がRaspberry Pi 4のGPIOのINPUTについてです。

 Raspberry Piというよりもプルアップ/プルダウンについての記事になってしまった感じですが、物理的なプルアップ/プルダウンを組み込まなくても内部的に設定できるので、知っていれば回路側を少し簡素化できそうですね。


・参考資料