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
コメント
s1_ogura
山崎様
ソースコードを以下のように変更して実施した結果です。
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
s1_ogura
山崎様
記載が漏れており申し訳ございません。
これまでの実行は、app.configにadd_devices /dev/gpiochip5との記載をしている状態で実行しております。
> お世話になっております。山崎です。
> すみません。追加でご確認お願いしたいのですが、コンテナの設定ファイルに /dev/gpiochip5 を渡す設定が記述されているでしょうか?
> 設定ファイルに以下のように記述すると、コンテナ内からアクセスが可能です。
>
> add_devices /dev/gpiochip5 >
> 不足している場合は追記してご確認ください。
>
> 以上、どうぞよろしくお願いいたします。
at_reika.yamazaki
お世話になっております。山崎です。
コンテナの設定ファイルには /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
以上、どうぞよろしくお願いいたします。
s1_ogura
山崎様
ご教示いただきました通り
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 >
>
> 以上、どうぞよろしくお願いいたします。
at_reika.yamazaki
2024年7月18日 13時11分
お世話になっております。山崎です。
>line = chip.get_line(4)
こちら 0 を指定した場合はどうなるでしょうか?
以上、どうぞよろしくお願いいたします。