Armadilloフォーラム

Pythonでlibgpiodを使用してGPIO制御を行うとPermissionErrorが発生する

s1_ogura

2024年7月18日 12時04分

前提環境:
Armadillo-IoT ゲートウェイ A6E +Di8+Ai4
アプリケーション:CUI アプリケーション
使用言語:Python
コンテナbaseOS:alpine
インストール済みのパッケージ:python3、libgpiod、py3-libgpiod

コンテナ内からGPIO制御を行おうとしています。
libgpiod及び、libgpiodのPythonバインディングパッケージであるpy3-libgpiodを使用して実現しようと考えています。
また、コンテナはrootユーザーで動作しており、app.confにてadd_args --privilegedとし管理者権限を渡しています。
最終的に、DI1の値取得、DO1の出力、VOUTの出力を行いたいと考えています。

検証のため、以下の操作を行いました。
接点入力DI1(ピン番号:4 ピン名:DI1 GPIOチップ:gpiochip5 GPIO番号:0)の値を取得する以下のソースコードを実行したところ、次のようなエラーが発生し取得できない状況です。
何かご存じでしたらご教授いただきたいです。よろしくお願いいたします。

ソースコード
import gpiod

if __name__ == '__main__':
chip = gpiod.Chip('gpiochip5')
line = chip.get_line(4)
result = line.get_value()
print(result)

エラー内容
Traceback (most recent call last):
File "/vol_app/src/gpio_test.py", line 8, in
result = line.get_value()
^^^^^^^^^^^^^^^^
PermissionError: [Errno 1] Operation not permitted

コメント

at_reika.yamazaki

2024年7月18日 13時11分

お世話になっております。山崎です。
>line = chip.get_line(4)
こちら 0 を指定した場合はどうなるでしょうか?

以上、どうぞよろしくお願いいたします。

山崎様

ソースコードを以下のように変更して実施した結果です。
4を指定していた際と変わらない結果となります。
よろしくお願いいたします。

ソースコード
import gpiod

if __name__ == '__main__':
chip = gpiod.Chip('gpiochip5')
line = chip.get_line(0)
result = line.get_value()
print(result)

エラー内容
Traceback (most recent call last):
File "/vol_app/src/gpio_test.py", line 8, in
result = line.get_value()
^^^^^^^^^^^^^^^^
PermissionError: [Errno 1] Operation not permitted

> お世話になっております。山崎です。
> >line = chip.get_line(4)
> こちら 0 を指定した場合はどうなるでしょうか?
>
> 以上、どうぞよろしくお願いいたします。

at_reika.yamazaki

2024年7月18日 13時37分

お世話になっております。山崎です。
すみません。追加でご確認お願いしたいのですが、コンテナの設定ファイルに /dev/gpiochip5 を渡す設定が記述されているでしょうか?
設定ファイルに以下のように記述すると、コンテナ内からアクセスが可能です。

add_devices /dev/gpiochip5

不足している場合は追記してご確認ください。

以上、どうぞよろしくお願いいたします。

山崎様

記載が漏れており申し訳ございません。
これまでの実行は、app.configにadd_devices /dev/gpiochip5との記載をしている状態で実行しております。

> お世話になっております。山崎です。
> すみません。追加でご確認お願いしたいのですが、コンテナの設定ファイルに /dev/gpiochip5 を渡す設定が記述されているでしょうか?
> 設定ファイルに以下のように記述すると、コンテナ内からアクセスが可能です。
>

> add_devices /dev/gpiochip5
> 

> 不足している場合は追記してご確認ください。
>
> 以上、どうぞよろしくお願いいたします。

at_reika.yamazaki

2024年7月18日 16時56分

お世話になっております。山崎です。
コンテナの設定ファイルには /dev/gpiochip5 を渡しているということで了解です。
また。貼っていただいたコードを動かしたところ、こちらでも同様のエラーが確認できました。

line に 入力の設定を追加するように修正したところ、エラーなく動作しました。
以下に動作確認に使用したコードを載せます。
こちらで問題ないかご確認いただけますと幸いです。

import gpiod
 
chip = gpiod.Chip('gpiochip5')
# 4 ではなく 0 を指定
line = chip.get_line(0)
#以下の行を追加
line.request(consumer='foobar', type=gpiod.LINE_REQ_DIR_IN)
result = line.get_value()
print(result)

表示された値は gpioget で取得した値と同じになることを確認しています。
参考までに、gpioget コマンドは以下になります。

gpioget gpiochip5 0

以上、どうぞよろしくお願いいたします。

山崎様

ご教示いただきました通り
line.request(consumer='foobar', type=gpiod.LINE_REQ_DIR_IN)
の行を追加して実施したところ、エラーなく動作することを確認いたしました。
大変助かりました。ご対応いただきありがとうございました。

> お世話になっております。山崎です。
> コンテナの設定ファイルには /dev/gpiochip5 を渡しているということで了解です。
> また。貼っていただいたコードを動かしたところ、こちらでも同様のエラーが確認できました。
>
> line に 入力の設定を追加するように修正したところ、エラーなく動作しました。
> 以下に動作確認に使用したコードを載せます。
> こちらで問題ないかご確認いただけますと幸いです。
>

> import gpiod
> 
> chip = gpiod.Chip('gpiochip5')
> # 4 ではなく 0 を指定
> line = chip.get_line(0)
> #以下の行を追加
> line.request(consumer='foobar', type=gpiod.LINE_REQ_DIR_IN)
> result = line.get_value()
> print(result)
> 

>
> 表示された値は gpioget で取得した値と同じになることを確認しています。
> 参考までに、gpioget コマンドは以下になります。
>

> gpioget gpiochip5 0
> 

>
> 以上、どうぞよろしくお願いいたします。