USB/LAN コネクタを下側にした基板上のコネクタ
BCM 名称 Pin Pin 名称 BCM BCM 名称 Pin Pin 名称 BCM 3.3V 1 2 5V 2 I2C SDA (8) 3 4 5V 3 I2C SCL (9) 5 6 GND 4 (GPIO 7) 7 8 (15) UART TxD 14 GND 9 10 (16)UART RxD 15 17 (GPIO 0) 11 12 (GPIO 1) 18 27 (GPIO 2) 13 14 GND 22 (GPIO 3) 15 16 (GPIO 4) 23 3.3V 17 18 (GPIO 5) 24 10 SPI MOSI (12) 19 20 GND 9 SPI MOSO (13) 21 22 (GPIO 6) 25 11 SPI SCLK (14) 23 24 (10) SPI CE0 8 GND 25 26 (11) SPI CE1 7 0 ID SD (30) 27 28 (31) ID SC 1 5 (GPIO 21) 29 30 GND 6 (GPIO 22) 31 32 (GPIO 26) 12 13 (GPIO 23) 33 34 GND 19 (GPIO 24) 35 36 (GPIO 27) 16 26 (GPIO 25) 37 38 (GPIO 28) 20 GND 39 40 (GPIO 29) 21
- ( ) → wPI ピン・アサイン (WiringPiライブラリ用)
- BCM → GPIO番号
- Pin → 実際のピンアサイン
GPIOを操作する「gpio」コマンドは「Wiring Pi」ライブラリを使用する。(通常は標準実装されている。)
$ gpio -vここでの出力に Type: Unknown が表示されている場合古いライブラリの可能性あり。
$ gpio readall +-----+-----+---------+------+---+---Pi 4B--+---+------+---------+-----+-----+ | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM | +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+ | | | 3.3v | | | 1 || 2 | | | 5v | | | | 2 | 8 | SDA.1 | IN | 1 | 3 || 4 | | | 5v | | | | 3 | 9 | SCL.1 | IN | 1 | 5 || 6 | | | 0v | | | | 4 | 7 | GPIO. 7 | IN | 1 | 7 || 8 | 1 | IN | TxD | 15 | 14 | | | | 0v | | | 9 || 10 | 1 | IN | RxD | 16 | 15 | | 17 | 0 | GPIO. 0 | IN | 0 | 11 || 12 | 0 | IN | GPIO. 1 | 1 | 18 | | 27 | 2 | GPIO. 2 | IN | 0 | 13 || 14 | | | 0v | | | | 22 | 3 | GPIO. 3 | IN | 0 | 15 || 16 | 0 | IN | GPIO. 4 | 4 | 23 | | | | 3.3v | | | 17 || 18 | 0 | IN | GPIO. 5 | 5 | 24 | | 10 | 12 | MOSI | IN | 0 | 19 || 20 | | | 0v | | | | 9 | 13 | MISO | IN | 0 | 21 || 22 | 0 | IN | GPIO. 6 | 6 | 25 | | 11 | 14 | SCLK | IN | 0 | 23 || 24 | 1 | IN | CE0 | 10 | 8 | | | | 0v | | | 25 || 26 | 1 | IN | CE1 | 11 | 7 | | 0 | 30 | SDA.0 | IN | 1 | 27 || 28 | 1 | IN | SCL.0 | 31 | 1 | | 5 | 21 | GPIO.21 | IN | 1 | 29 || 30 | | | 0v | | | | 6 | 22 | GPIO.22 | IN | 1 | 31 || 32 | 0 | IN | GPIO.26 | 26 | 12 | | 13 | 23 | GPIO.23 | IN | 0 | 33 || 34 | | | 0v | | | | 19 | 24 | GPIO.24 | IN | 0 | 35 || 36 | 0 | IN | GPIO.27 | 27 | 16 | | 26 | 25 | GPIO.25 | IN | 0 | 37 || 38 | 0 | IN | GPIO.28 | 28 | 20 | | | | 0v | | | 39 || 40 | 0 | IN | GPIO.29 | 29 | 21 | +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+ | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM | +-----+-----+---------+------+---+---Pi 4B--+---+------+---------+-----+-----+
$ gpio -g read 16
$ gpio -g mode 16 out
$ gpio -g write 16 1
RPI.GPIO は Python Software Foundation からリリースされている GPIO を制御するパッケージ。(Raspbian full にはインストール済、Raspbian lite にはインストールされていない。)
使用するには、Pythonのプログラムの先頭で import 宣言をする。$ import RPi.GPIO as GPIORPi.GPIO を呼び出す場合、RPi.GPIO.setup() というようにドット(.)で呼び出す。毎回 RPI.GPIO と書くのは長なるので、importする際に別名を付けることができる。別名は「as 別名」で指定。
$ import RPi.GPIO as GPIO以後、GPIO.setup() というように呼び出すことができる。
RPi.GPIO では、P1から始まるボード上の物理的なピン番号、もしくはチップから見たGPIOピンの番号(GPIO12など)のいずれかをチャンネルとして抽象化して扱う。チャンネルのモード指定は必須。
GPIO.setmode(GPIO.BOARD)
GPIO.setmode(GPIO.BCM)
mode = GPIO.getmode()
GPIO.setup([チャンネル], [GPIO.IN または GPIO.OUT])例:チャンネル18を出力モードに指定
GPIO.setup(18, GPIO.OUT)複数チャンネルをまとめて設定 チャンネル11/12を出力モードに指定する場合
chan_list = [11,12] GPIO.setup(chan_list, GPIO.OUT)
GPIO.output([チャンネル], [GPIO.LOW または GPIO.HIGH])例:チャンネル18をHIGHに指定する場合
GPIO.output(18, GPIO.HIGH)複数チャンネルをまとめて設定 チャンネル11/12をHIGHに指定する場合
chan_list = [11,12] GPIO.output(chan_list, GPIO.HIGH)チャンネル11をHIGH、12をLOWに指定する場合は
chan_list = [11,12] GPIO.output(chan_list, (GPIO.HIGH, GPIO.LOW))
pwm = GPIO.PWM([チャンネル], [周波数(Hz)])
pwm.start([デューティ比])例:ピン18に周波数1KHz、デューティ比50%でPWM出力する場合
pwm = GPIO.PWM(18, 1000) pwm.start(50)
pwm.ChangeFrequency([周波数(Hz)])
pwm.ChangeDutyCycle([デューティ比])
pwm.stop()
GPIO.input(ピン番号)戻り値はGPIO.HIGH(または1、True)かGPIO.LOW(または0、False)
if GPIO.input(22): # ピン22がHIGHの場合 else: # ピン22がLOWの場合
GPIO.setup(22, GPIO.IN, pull_up_down=GPIO.PUD_UP)各ピンの機能や初期状態については → RPi BCM2835 GPIOs - eLinux.org
電気信号が LOW から HIGH (立ち上がりエッジ) または HIGH から LOW (立ち下がりエッジ) の状態に変化する瞬間の状態変化をイベントとして通知する仕組みが用意されている。
GPIO.wait_for_edge([チャンネル], [検出したいエッジ])検出したいエッジの指定は以下の3種類
GPIO.RISING (立ち上がりエッジ) GPIO.FALLING (立ち下がりエッジ) GPIO.BOTH (立ち上がりまたは立ち下がりエッジ)例:チャンネル18の立ち上がりエッジ検出待ちをする場合
GPIO.wait_for_edge(18, GPIO.RISING)
GPIO.add_event_detect([チャンネル], [検出したいエッジ])イベント発生状態の取得
if GPIO.event_detected([チャンネル]): #エッジ検出イベント発生 else: #エッジ検出イベント未発生例:チャンネル18の立ち上がりエッジ検出イベントが発生していたかどうかを知りたい場合
GPIO.add_event_detect(18, GPIO.RISING) # 何らかの処理 if GPIO.event_detected(18) #エッジ検出イベント発生 else: #エッジ検出イベント未発生
GPIO.add_event_detect([チャンネル], [検出したいエッジ], callback=[コールバック関数名])
GPIO.add_event_detect([チャンネル], [検出したいエッジ], callback=[コールバック関数名], bouncetime=[バウンス時間(ミリ秒)])
GPIO.remove_event_detect([チャンネル])
GPIO.cleanup()GPIO.setup() の対になる関数なのでパラメータにチャンネル(またはチャンネルのリストかタプル)を指定すると、指定したチャンネルのみ終了できる。
GPIO.cleanup(22)
RPi.GPIOのプログラムを実行するとThis channel is already in useの警告がでる場合がある。これは以前 GPIO.setup() を実行してポートのセットアップをした後、クリアしていないときに発生する。
プログラムの最後に以下を必ず記述しておく。GPIO.cleanup()