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
-
-e
はset
サブコマンドの実行結果を表示(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