TOPに戻る

ラズパイ2023年10月更新 bookworm ⑨ ラズパイ5のGPIO

 ラズパイ5が日本国内で販売され始めたので入手しました。

環境

  • ハードウェア Raspberry Pi 5(4GBモデル)
  • OS Raspberry Pi OS (64ビット)、リリース日December 5th 2023
  • Windows10 22H2にて、ssh(OpenSSH_9.2p1 Debian-2+deb12u2, OpenSSL 3.0.11 19 Sep 2023)および、VNC Viewerを動作させている

GPIOのpythonライブラリ-WiringPi...使えなくなりました

 WiringPiのツールの一つであるgpio readallを実行します。

 $ gpio readall
bash: gpio: command not found

 調べると、ラズパイ3までは普通に利用できていました。ラズパイ4の時代、2019年に開発停止を表明しており、 Busterではインストールは可能で、Bullseyeからは、リポジトリからなくなってインストールができなくなったようです。

 代わりに利用できるようになったraspi-gpioも、ラズパイ5では使えなくなったようです。

$ raspi-gpio get
raspi-gpio is not supported on Pi 5 - use `pinctrl`

 現役は、pinctrlのようです。

$ pinctrl
 0: ip    pu | hi // ID_SD/GPIO0 = input
 1: ip    pu | hi // ID_SC/GPIO1 = input
 2: a3    pu | hi // PIN3/GPIO2 = SDA1
 3: a3    pu | hi // PIN5/GPIO3 = SCL1
 4: no    pu | -- // PIN7/GPIO4 = none
 5: no    pu | -- // PIN29/GPIO5 = none
 6: no    pu | -- // PIN31/GPIO6 = none
 7: op dh pu | hi // PIN26/GPIO7 = output
 8: op dh pu | hi // PIN24/GPIO8 = output
 9: a0    pn | lo // PIN21/GPIO9 = SPI0_MISO
10: a0    pn | lo // PIN19/GPIO10 = SPI0_MOSI
11: a0    pn | lo // PIN23/GPIO11 = SPI0_SCLK
12: no    pd | -- // PIN32/GPIO12 = none
13: no    pd | -- // PIN33/GPIO13 = none
14: no    pd | -- // PIN8/GPIO14 = none
15: no    pd | -- // PIN10/GPIO15 = none
16: no    pd | -- // PIN36/GPIO16 = none
17: no    pd | -- // PIN11/GPIO17 = none
18: no    pd | -- // PIN12/GPIO18 = none
19: no    pd | -- // PIN35/GPIO19 = none
20: no    pd | -- // PIN38/GPIO20 = none
21: no    pd | -- // PIN40/GPIO21 = none
22: no    pd | -- // PIN15/GPIO22 = none
23: no    pd | -- // PIN16/GPIO23 = none
24: no    pd | -- // PIN18/GPIO24 = none
25: no    pd | -- // PIN22/GPIO25 = none
26: no    pd | -- // PIN37/GPIO26 = none
27: no    pd | -- // PIN13/GPIO27 = none
28: ip    pd | lo // PCIE_RP1_WAKE/GPIO28 = input
29: no    pu | hi // FAN_TACH/GPIO29 = none
30: no    pu | -- // HOST_SDA/GPIO30 = none
31: no    pu | -- // HOST_SCL/GPIO31 = none
32: op dh pd | hi // ETH_RST_N/GPIO32 = output
33: no    pd | lo // GPIO33 = none
34: op dl pd | lo // CD0_IO0_MICCLK/GPIO34 = output
35: no    pd | lo // CD0_IO0_MICDAT0/GPIO35 = none
36: no    pd | lo // RP1_PCIE_CLKREQ_N/GPIO36 = none
37: no    pd | lo // GPIO37 = none
38: ip    pd | hi // CD0_SDA/GPIO38 = input
39: ip    pd | hi // CD0_SCL/GPIO39 = input
40: ip    pd | hi // CD1_SDA/GPIO40 = input
41: ip    pd | hi // CD1_SCL/GPIO41 = input
42: a2    pd | hi // USB_VBUS_EN/GPIO42 = VBUS_EN1
43: a2    pu | hi // USB_OC_N/GPIO43 = VBUS_OC1
44: op dh pd | hi // RP1_STAT_LED/GPIO44 = output
45: a0    pd | hi // FAN_PWM/GPIO45 = PWM1_CHAN3
46: op dl pd | lo // CD1_IO0_MICCLK/GPIO46 = output
47: no    pd | lo // 2712_WAKE/GPIO47 = none
48: no    pd | lo // CD1_IO1_MICDAT1/GPIO48 = none
49: op dh pd | hi // EN_MAX_USB_CUR/GPIO49 = output
50: no    pd | -- // GPIO50 = none
51: no    pd | -- // GPIO51 = none
52: no    pu | -- // GPIO52 = none
53: no    pu | hi // GPIO53 = none
100: ip    pd | lo // GPIO0 = input
101: op dh pu | hi // 2712_BOOT_CS_N/GPIO1 = output
102: a6    pn | hi // 2712_BOOT_MISO/GPIO2 = VC_SPI0_MISO
103: a5    pn | hi // 2712_BOOT_MOSI/GPIO3 = VC_SPI0_MOSI
104: a6    pn | lo // 2712_BOOT_SCLK/GPIO4 = VC_SPI0_SCLK
105: ip    pd | lo // GPIO5 = input
106: ip    pd | lo // GPIO6 = input
107: ip    pd | lo // GPIO7 = input
108: ip    pd | lo // GPIO8 = input
109: ip    pd | lo // GPIO9 = input
110: ip    pd | lo // GPIO10 = input
111: ip    pd | lo // GPIO11 = input
112: ip    pd | lo // GPIO12 = input
113: ip    pd | lo // GPIO13 = input
114: a1    pd | lo // PCIE_SDA/GPIO14 = SPI_S_MOSI_OR_BSC_S_SDA
115: a1    pd | lo // PCIE_SCL/GPIO15 = SPI_S_SCK_OR_BSC_S_SCL
116: ip    pd | lo // GPIO16 = input
117: ip    pd | lo // GPIO17 = input
118: ip    pd | lo // GPIO18 = input
119: ip    pd | lo // GPIO19 = input
120: ip    pu | hi // PWR_GPIO/GPIO20 = input
121: ip    pd | lo // 2712_G21_FS/GPIO21 = input
122: ip    pd | lo // GPIO22 = input
123: ip    pd | lo // GPIO23 = input
124: a3    pn | lo // BT_RTS/GPIO24 = UART_RTS_0
125: a4    pu | lo // BT_CTS/GPIO25 = UART_CTS_0
126: a4    pn | hi // BT_TXD/GPIO26 = UART_TXD_0
127: a4    pu | hi // BT_RXD/GPIO27 = UART_RXD_0
128: op dh pd | hi // WL_ON/GPIO28 = output
129: op dh pd | hi // BT_ON/GPIO29 = output
130: a4    pn | lo // WIFI_SDIO_CLK/GPIO30 = SD2_CLK
131: a4    pu | hi // WIFI_SDIO_CMD/GPIO31 = SD2_CMD
132: a4    pd | hi // WIFI_SDIO_D0/GPIO32 = SD2_DAT0
133: a3    pu | hi // WIFI_SDIO_D1/GPIO33 = SD2_DAT1
134: a4    pn | hi // WIFI_SDIO_D2/GPIO34 = SD2_DAT2
135: a3    pn | hi // WIFI_SDIO_D3/GPIO35 = SD2_DAT3
200: ip    pd | hi // RP1_SDA/AON_GPIO0 = input
201: ip    pd | hi // RP1_SCL/AON_GPIO1 = input
202: op dh pd | hi // RP1_RUN/AON_GPIO2 = output
203: op dl pd | lo // SD_IOVDD_SEL/AON_GPIO3 = output
204: op dl pd | lo // SD_PWR_ON/AON_GPIO4 = output
205: a6    pu | hi // SD_CDET_N/AON_GPIO5 = SD_CARD_PRES_G
206: ip    pd | hi // SD_FLG_N/AON_GPIO6 = input
207: ip    pd | lo // AON_GPIO7 = input
208: ip    pd | lo // 2712_WAKE/AON_GPIO8 = input
209: op dh pd | hi // 2712_STAT_LED/AON_GPIO9 = output
210: ip    pd | lo // AON_GPIO10 = input
211: ip    pd | lo // AON_GPIO11 = input
212: ip    pd | lo // PMIC_INT/AON_GPIO12 = input
213: a3    pu | hi // UART_TX_FS/AON_GPIO13 = VC_TXD0
214: a3    pu | hi // UART_RX_FS/AON_GPIO14 = VC_RXD0
215: ip    pd | lo // AON_GPIO15 = input
216: ip    pu | hi // AON_GPIO16 = input
232: a1    -- | hi // HDMI0_SCL/AON_SGPIO0 = HDMI_TX0_BSC_SCL
233: a1    -- | hi // HDMI0_SDA/AON_SGPIO1 = HDMI_TX0_BSC_SDA
234: a1    -- | hi // HDMI1_SCL/AON_SGPIO2 = HDMI_TX1_BSC_SCL
235: a1    -- | hi // HDMI1_SDA/AON_SGPIO3 = HDMI_TX1_BSC_SDA
236: a2    -- | hi // PMIC_SCL/AON_SGPIO4 = BSC_M2_SCL
237: a2    -- | hi // PMIC_SDA/AON_SGPIO5 = BSC_M2_SDA

 ソースはこちらにあります。

 シンプルに、GPIOの状態を表示します。

$ pinctrl -p

1: 3v3
 2: 5v
 3: a3    pu | hi // GPIO2 = SDA1
 4: 5v
 5: a3    pu | hi // GPIO3 = SCL1
 6: gnd
 7: no    pu | -- // GPIO4 = none
 8: no    pd | -- // GPIO14 = none
 9: gnd
10: no    pd | -- // GPIO15 = none
11: no    pd | -- // GPIO17 = none
12: no    pd | -- // GPIO18 = none
13: no    pd | -- // GPIO27 = none
14: gnd
15: no    pd | -- // GPIO22 = none
16: no    pd | -- // GPIO23 = none
17: 3v3
18: no    pd | -- // GPIO24 = none
19: a0    pn | lo // GPIO10 = SPI0_MOSI
20: gnd
21: a0    pn | lo // GPIO9 = SPI0_MISO
22: no    pd | -- // GPIO25 = none
23: a0    pn | lo // GPIO11 = SPI0_SCLK
24: op dh pu | hi // GPIO8 = output
25: gnd
26: op dh pu | hi // GPIO7 = output
27: ip    pu | hi // GPIO0 = input
28: ip    pu | hi // GPIO1 = input
29: no    pu | -- // GPIO5 = none
30: gnd
31: no    pu | -- // GPIO6 = none
32: no    pd | -- // GPIO12 = none
33: no    pd | -- // GPIO13 = none
34: gnd
35: no    pd | -- // GPIO19 = none
36: no    pd | -- // GPIO16 = none
37: no    pd | -- // GPIO26 = none
38: no    pd | -- // GPIO20 = none
39: gnd
40: no    pd | -- // GPIO21 = none


 

 GPIO26とGND間にLED+抵抗をつなぎました。

 出力に設定して、"H"レベルにすると、LEDが点灯しました。

$ pinctrl set 26 op dh

 "L"レベルにすると、LEDが消灯しました。

$ pinctrl set 26 op dl

GPIOのpythonライブラリ-RPi.GPIO...使えなくなりました

$ pip list | grep RPi
RPi.GPIO                           0.7.1a4

 インストールされています。しかし、調べると、ラズパイ5では動作しないようです。ラズパイ4では利用できるから、残っているのかもしれません。

  Raspberry Pi 5 - gpiod vs RPi.GPIO

  How to Control the Raspberry Pi 5 GPIO with Python 3

  LEDの点灯と消灯を繰り返すプログラムです。

import RPi.GPIO as GPIO
import time

port = 26
GPIO.setmode(GPIO.BCM)
GPIO.setup(port, GPIO.OUT)

while True:
    GPIO.output(port,GPIO.HIGH)
    time.sleep(1)
    GPIO.output(port,GPIO.LOW)
    time.sleep(1)
    
GPIO.cleanup()

 led2.pyという名前で保存し、実行すると、エラーが出ます。

$ python led2.py
Traceback (most recent call last):
  File "/home/yoshi/led2.py", line 6, in <module>
    GPIO.setup(port, GPIO.OUT)
RuntimeError: Cannot determine SOC peripheral base address

「Cannot determine SOC peripheral base address」は、訳すと「SOC ペリフェラル ベース アドレスを決定できません」です。

 回避策は、rpi-lgpioライブラリをインストールするようです。

$ pip install --break-system-packages rpi-lgpio
Defaulting to user installation because normal site-packages is not writeable
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting rpi-lgpio
  WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ProtocolError('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))': /simple/rpi-lgpio/rpi_lgpio-0.4-py3-none-any.whl
  Using cached https://www.piwheels.org/simple/rpi-lgpio/rpi_lgpio-0.4-py3-none-any.whl (11 kB)
Installing collected packages: rpi-lgpio
Successfully installed rpi-lgpio-0.4

 再度Lチカを実行すると、動作しました。

$ python led2.py

 RPi.GPIOは、継続したサポートが得られないという話が散見されます。真偽のほどはわかりません。新規にGPIOのアクセスするプログラムには使わないほうがよいようです。

GPIOのpythonライブラリ-pigpio...使えなくなりました

$ pip list | grep pigpio                             
pigpio                             1.78

 pigpioは、割り込み処理などの記述が行えるGPIOアクセス・ライブラリです。インストールされていることはわかりましたが、ラズパイ5では使えなくなったようです。

  pigpio will not run on a Pi 5 #589

GPIOのpythonライブラリ-gpiozero...推奨されています

 ドキュメントの GPIO in Python では、Using the GPIO Zero library makes it easy to control GPIO devices with Python と書かれています。gpiozeroライブラリは比較的新しく、初期バージョンはRelease 0.2.0 (2015-09-21)です。執筆時点では、Release 2.0.1 (2024-02-15)が最新です。ひとつ前のRelease 2.0 (2023-09-12)で、ラズパイ5のサポートが追加されています。

$ pip list | grep gpiozero
gpiozero                           2.0

 サンプル・プログラムです。

from gpiozero import LED
from time import sleep

led = LED(26)

while True:
    led.on()
    sleep(1)
    led.off()
    sleep(1)

 問題なくLチカが動作します。

 本Webでは、連載「gpiozeroライブラリ入門」を、2020年11月15日から行っています。

-