rgpio で GPIO にユーザ権限でアクセス
この記事は、Orange Pi 5(以下 OPi5)に lg library をインストールしてユーザー権限で GPIO にアクセスするためのメモです。
なんらかの理由で実行時に sudo をつけたくない/つけられない際に有効です。例えば、Orange Pi 5 の GPIO にアクセスできる Elecrton アプリを作りたいけど、OPi5 の GPIO にアクセスするには root 権限が必要なのに Electron はセキュリティ上の理由から root ユーザでの実行が禁止されている、などの場合です。
lg library は pigpio の作者様の別プロジェクトで、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 |
physical:物理ピン番号
gpioDev:GPIO チップデバイス番号
gpio:チップ内オフセット
uGPIO:全チップを通した連番での GPIO 番号(uGPIO = gpioDev*32 + gpio)
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 対応