rgpio で GPIO にユーザ権限でアクセス

最終更新日

この記事は、Orange Pi 5(以下 OPi5)に lg library をインストールしてユーザー権限で GPIO にアクセスするためのメモです。
なんらかの理由で実行時に sudo をつけたくない/つけられない際に有効です。例えば、Orange Pi 5 の GPIO にアクセスできる Elecrton アプリを作りたいけど、OPi5 の GPIO にアクセスするには root 権限が必要なのに Electron はセキュリティ上の理由から root ユーザでの実行が禁止されている、などの場合です。

lg librarypigpio の作者様の別プロジェクトで、RPi 以外の SBC(シングルボードコンピュータ)向けの GPIO 操作ライブラリです。OPi シリーズでの動作報告がネット上に見つからないので記録としてここに置いておきます。メモなので余計な私見とか入っているかも

インストール

Download の指示に従い、Python のモジュールをインストールします。Armbian には Python2 が含まれていないので 2 用は省略。必要な場合は適宜追加してください。

sudo apt install swig python3-dev python3-setuptools

lg をインストールします。

wget http://abyz.me.uk/lg/lg.zip
unzip lg.zip
cd lg
make
sudo make install

rgpiod デーモンを起動

sudo rgpiod &

sudo 必須。停止するには sudo killall rgpiod を実行します。サービスとして登録する方法は後述。
これで準備完了です。

※デーモンが起動しない場合

最初 rgpiod が無言で即落ちしてしまい、OPi5 では動作しないのかと絶望しそうになったのですが、試しに入れてあった他のプログラムと待ち受けポートが被っただけでした。せめてエラーメッセージ出して… rgpiod のデフォルトポートは 8889 なので、他にこのポートを使用するプログラムがないか確認してください。

GPIO 番号について

lgpio/rgpio で利用できる OPi5 のピンレイアウトは次のようになります。

uGPIO gpio gpioDev physical physical gpioDev gpio uGPIO
3.3V 1 2 5V
47 15 1 3 4 5V
46 14 1 5 6 GND
54 22 1 7 8 4 3 131
GND 9 10 4 4 132
138 10 4 11 12 0 29 29
139 11 4 13 14 GND
28 28 0 15 16 1 27 59
3.3V 17 18 1 26 58
49 17 1 19 20 GND
48 16 1 21 22 2 28 92
50 18 1 23 24 1 20 52
GND 25 26 1 3 35

GPIO へのアクセスは、gpioDevと gpio の両方を指定して行いますが、gpio が同一で gpioDev が異なるピンがあって紛らわしいため、全チップを通した連番(uGPIO:ユニーク GPIO …筆者が勝手に命名。他では通用しないので悪しからず)を使用してもいいかもしれません。実際、公式の WiringOP で readall を実行して表示される GPIO 一覧(下図)ではこの数字が表示されます。uGPIO を 32 で割った商が gpioDev で余りが gpio です。

Lピカしてみる

以下は物理ピン11(gpioDev=4, gpio=10)の電圧を1秒間 high にする Python スクリプトです。

実行します。

python3 lpika.py

同様の C プログラムです。

コンパイルして実行します。

gcc -o lpika lpika.c -lrgpio
./lpika

Python, C 共に無事 sudo なしで動きました。

rgpiod をサービスに登録

/etc/systemd/system/rgpiod.service を作成

[Unit]
Description=rgpiod: Daemon to allow remote access to a SBC's GPIO. 

[Service]
ExecStart=/usr/local/bin/rgpiod
ExecStop=/usr/bin/killall rgpiod 

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable rgpiod.service
sudo systemctl start rgpiod.service

(追補)GPIO の出力電圧について

OPi5 の GPIO には、出力モードにしたとき 3.3V を出力するものと 1.8V を出力するものがあります。前述の「GPIO 番号について」の表で gpioDev が 4 のものが 3.3V 、それ以外は 1.8V となっています。理由はたとえ知っても詮無いことなので調べていません。抵抗内蔵型の LED を繋げた場合、1.8V のピンだと薄暗ァくなってしまうかもしれません。


コメント

Gravatar 対応