ラズパイ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 port = 26 while True: |
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 led = LED(26) while True: |
問題なくLチカが動作します。
本Webでは、連載「gpiozeroライブラリ入門」を、2020年11月15日から行っています。