6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Raspberry Pi 5 におけるGPIO操作は `pinctrl` を使う (raspi-gpio後継コマンド)

Last updated at Posted at 2024-06-03

Raspberry Pi のGPIO操作には pinctrlを使いましょうという話です。

確認環境: Raspberry Pi 5 (8GB) + bookworm

Raspberry Pi 5 では、raspi-gpio コマンドがサポート外となった

Raspberry Pi 5 でGPIO操作コマンド raspi-gpio を実行すると、以下のように「pinctrl を使え」と指示されます。

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

pinctrl の出力

以下のようになります。

$ pinctrl
 0: ip    pu | hi // ID_SDA/GPIO0 = input
 1: ip    pu | hi // ID_SCL/GPIO1 = input
 2: no    pu | -- // GPIO2 = none
 3: no    pu | -- // GPIO3 = none
 4: no    pu | -- // GPIO4 = none
《省略》

pinctrl help を見てみると、コマンド形態は raspi-gpio と似ています。が、出力は前述の通り、かなり異なります。

ヘッダピンとして出ている40ピンに限定しての表示は -p を使います。

$ pinctrl -p
 1: 3v3
 2: 5v
 3: no    pu | -- // GPIO2 = none
 4: 5v
 5: no    pu | -- // GPIO3 = none
 6: gnd
 7: no    pu | -- // GPIO4 = none
 《省略》

ピンに割り当てられている機能を確認するには funcs サブコマンドを使います。

$ sudo pinctrl funcs 14-15
14, GPIO14, PWM0_CHAN2, DPI_D10, CTS4, SDA3, TXD0, SYS_RIO014, PROC_RIO014, PIO14, SPI5_SIO0
15, GPIO15, PWM0_CHAN3, DPI_D11, RTS4, SCL3, RXD0, SYS_RIO015, PROC_RIO015, PIO15, SPI5_SCLK

pinctrl の使い方と出力の読み方

GPIO の読み取り

準備: ピンをINPUTに設定
$ pinctrl -e set 10 ip pd
#=> 10: ip    pd | lo // GPIO10 = input
  • -eset サブコマンドの実行結果を表示(echo)してくれます。確認に便利です。
読み取り
# GPIO10 が Low だった場合
$ pinctrl get 10
#=> 10: ip    pd | lo // GPIO10 = input

# GPIO が High だった場合
$ pinctrl get 10
#=> 10: ip    pd | hi // GPIO10 = input
  • | の左側がピンの設定状態です。ipはinput、pdはpull-down状態になります。詳しくは pinctrl help を見てください。
  • | の右側の lo もしくは hi がピンの状態です。lo = Low(gpioコマンドなら0)、hi = High(gpioコマンドなら1)です。
ピンの解放
$ pinctrl -e set 10 no
#=> 10: no    pd | -- // GPIO10 = none

GPIO の出力

準備は不要です。Output設定と同時に出力値を設定できます。

# GPIO10 を Low にする
pinctrl -e set 10 op dl
#=> 10: op dl pd | lo // GPIO10 = output

# GPIO10 を High にする
pinctrl -e set 10 op dh
#=> 10: op dh pd | hi // GPIO10 = output

pinctrl get の出力を gpio コマンドと同様にする

awk コマンドを組み合わせれば、lo=0 hi=1 と読み替えが可能です。

$ awk --version
#=> GNU Awk 5.2.1, API 3.2, PMA Avon 8-g1, (GNU MPFR 4.2.1, GNU MP 6.3.0)
pinctrl get 10 | awk 'match($0, /\| (.+) \/\//, a){print (a[1]=="hi" ? 1 : 0)}'
  • match で |// という文字間の文字をキャプチャ
  • キャプチャした文字をが hi だったら 1 、そうでなければ 0 を返す(三項演算子を利用)
実行例
$ pinctrl set 10 op pu # pull-up に設定
$ pinctrl get 10 | awk 'match($0, /\| (.+) \/\//, a){print (a[1]=="hi" ? 1 : 0)}'
#=> 1
$ pinctrl set 10 op pd # pull-down に設定
$ pinctrl get 10 | awk 'match($0, /\| (.+) \/\//, a){print (a[1]=="hi" ? 1 : 0)}'
#=> 0

あとがき

Wiring Piが無くなって、raspi-gpioコマンドを使いましょうのエントリーで

まあ Raspberry Pi のなかのひと(Serge-san)がメンテしてるので、長いこと使えるんじゃないでしょうか。

とかドヤってしまったが、使えなくなってしまったとは。見通しが甘かった、正直スマン。

EoT

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?