🧷

ラズパイ5のlibgpiodでGPIO制御(Lチカ)する

2024/02/18に公開

libgpiodでGPIO制御

ラズパイでは、今まで(ラズパイ4まで)pigpioという便利なライブラリを使ってGPIO制御をしていました。
https://karaage.hatenadiary.jp/entry/2017/02/10/073000

ただ、ラズパイ5ではハードウェアの構成が大きく変わり、pigpioは動きません。今後も動くようになるか分からない状況のようです。

現状のラズパイのGPIO制御の推奨ライブラリ主要なライブラリの1つは、LinuxでのGPIO制御に標準的に使われているlibgpiodのようなので、libgpiodを使ったGPIO制御を試してみました。

ラズパイ5の基本的なセットアップなどは以下記事参照ください。

https://zenn.dev/karaage0703/articles/8fe578dba4857a

libgpiodのラズパイのピン番号との対応

最初に分からなかったのが、ピンの対応です。以下コマンドで調べることができます。

$ gpioinfo

ずらずらーと出てきますが、ラズパイの場合重要なのはgpiochip4という部分です。

gpiochip4 - 54 lines:
	line   0:      "ID_SD"       unused   input  active-high 
	line   1:      "ID_SC"       unused   input  active-high 
	line   2:       "PIN3"       unused   input  active-high 
	line   3:       "PIN5"       unused   input  active-high 
	line   4:       "PIN7"       unused   input  active-high 
	line   5:      "PIN29"       unused   input  active-high 
	line   6:      "PIN31"       unused   input  active-high 
	line   7:      "PIN26"       unused   input  active-high 
	line   8:      "PIN24"       unused   input  active-high 
	line   9:      "PIN21"       unused   input  active-high 
	line  10:      "PIN19"       unused   input  active-high 
	line  11:      "PIN23"       unused   input  active-high 
	line  12:      "PIN32"       unused   input  active-high 
	line  13:      "PIN33"       unused   input  active-high 
	line  14:       "PIN8"       unused   input  active-high 
	line  15:      "PIN10"       unused   input  active-high 
	line  16:      "PIN36"       unused   input  active-high 
	line  17:      "PIN11"       unused   input  active-high 
	line  18:      "PIN12"       unused   input  active-high 
	line  19:      "PIN35"       unused   input  active-high 
	line  20:      "PIN38"       unused   input  active-high 
	line  21:      "PIN40"       unused   input  active-high 
	line  22:      "PIN15"       unused   input  active-high 
	line  23:      "PIN16"       unused   input  active-high 
	line  24:      "PIN18"       unused   input  active-high 
	line  25:      "PIN22"       unused   input  active-high 
	line  26:      "PIN37"       unused   input  active-high 
	line  27:      "PIN13"       unused   input  active-high 
	lin![](https://storage.googleapis.com/zenn-user-upload/72841b128ac0-20240218.jpg)e  28: "PCIE_RP1_WAKE" unused input active-high 
	line  29:   "FAN_TACH"       unused   input  active-high 
	line  30:   "HOST_SDA"       unused   input  active-high 
	line  31:   "HOST_SCL"       unused   input  active-high 
	line  32:  "ETH_RST_N"  "phy-reset"  output   active-low [used]
	line  33:          "-"       unused   input  active-high 
	line  34: "CD0_IO0_MICCLK" "cam0_reg" output active-high [used]
	line  35: "CD0_IO0_MICDAT0" unused input active-high 
	line  36: "RP1_PCIE_CLKREQ_N" unused input active-high 
	line  37:          "-"       unused   input  active-high 
	line  38:    "CD0_SDA"       unused   input  active-high 
	line  39:    "CD0_SCL"       unused   input  active-high 
	line  40:    "CD1_SDA"       unused   input  active-high 
	line  41:    "CD1_SCL"       unused   input  active-high 
	line  42: "USB_VBUS_EN" unused output active-high 
	line  43:   "USB_OC_N"       unused   input  active-high 
	line  44: "RP1_STAT_LED" "PWR" output active-low [used]
	line  45:    "FAN_PWM"       unused  output  active-high 
	line  46: "CD1_IO0_MICCLK" "cam1_reg" output active-high [used]
	line  47:  "2712_WAKE"       unused   input  active-high 
	line  48: "CD1_IO1_MICDAT1" unused input active-high 
	line  49: "EN_MAX_USB_CUR" unused output active-high 
	line  50:          "-"       unused   input  active-high 
	line  51:          "-"       unused   input  active-high 
	line  52:          "-"       unused   input  active-high 
	line  53:          "-"       unused   input  active-high

ここで"PINXX"がラズパイのピン番号を示しています。ピン番号は以下で確認しましょう。

https://pinout.xyz/

ここで、例えばline17: "PIN11"は40pinの11番目(GPIO 17)に対応します。

libgpioでGPIO制御(Lチカ)

上記でlibgpioでの名称とラズパイのピン番号の対応が分かりました。

今回はGPIO17(11pin)を使用するので、以下のようなプログラムを使用します。特にライブラリなどのインストールの必要はありませんでした。

import gpiod
import time


PIN_NO = 17
chip = gpiod.Chip('gpiochip4', gpiod.Chip.OPEN_BY_NAME)
line = chip.get_line(PIN_NO)
line.request(consumer="LED", type=gpiod.LINE_REQ_DIR_OUT)

try:
    while True:
        line.set_value(1)
        time.sleep(1)
        line.set_value(0)
        time.sleep(1)
finally:
    line.release()

回路は、以下のバスの降車ボタンを使ったLチカ回路です。

https://karaage.hatenadiary.jp/entry/2024/02/15/073000

回路図は以下のようになります。

トランジスタは2SC3419です。文字が書かれている方からみて、左からE(エミッタ)、C(コレクタ)、B(ベース)です。エクボと覚えましょう。

回路を知らないと少し難しく見えるかもしれませんが、要はGPIO17がHigh(1)になったらLEDが光って、Low(0)になったらLEDが消灯するというだけの回路です。

プログラムを実行すると以下のようにLチカできました。

https://twitter.com/karaage0703/status/1758897567327551873

まとめ

ラズパイ5でGPIO制御(Lチカ)しました。

ピン番号の対応がよくわからず時間かかりました。そんな初歩的なところでつまづくの自分くらいでしょうか?しかし、pigpioが使えないのは残念ですね。

参考リンク

https://lloydrochester.com/post/hardware/libgpiod-intro-rpi/

https://adafruit-playground.com/u/MakerMelissa/pages/comparing-libgpiod-and-gpiozero-speeds-on-the-raspberry-pi-5

https://qiita.com/devemin/items/8a39a65ced4440e6be3b

https://www.tomshardware.com/how-to/control-raspberry-pi-5-gpio-with-python-3

https://lab.seeed.co.jp/entry/2024/04/20/120000

Discussion