タイトルの通り、やってみたら色々とハマったので備忘録です。
はじめに言い訳または、弁解です
Raspberry pi は、技術情報も多いしラズパイ専用のライブラリも用意されているのであまり困りません。たぶん・・・
Libre Computer Project の AML-S905X-CC の Ubuntu 18.04 cui にて Python3 から GPIO を制御となると情報が少なくなります。
おそらく、python3-gpiod を選択して制御するのが最短だと思われるのですが道のりは、険しいです。草
追記:
現時点(2022-04-17)では、AML-S905X-CC で python3 から GPIO を RPi.GPIO なみに操作できるライブラリは、見つかりません。C 言語の libgpiod での基本操作ができるのは、確認済です。GO 言語で duty とかソフト PWM とかできるのかな?調べてみます。(T_T)
C言語で組め!と突っ込まれそうですが・・・基本、Web屋なので Python なれといいますか・・・
ハイ、勉強不足です m(_ _)m 勉強しながら進めます。Pythonで、草
同じく初心者の方には、ところどころ参考になるかも?
知らんけど
Ubuntu 側の準備
まずは、Ubuntu 18.04 に対応している gpio の インターフェースとライブラリを探します。
$ sudo apt search libgpiod Sorting... Done Full Text Search... Done gpiod/bionic,now 1.0-1 arm64 [installed] Tools for interacting with Linux GPIO character device - binary libgpiod-dev/bionic 1.0-1 arm64 C library for interacting with Linux GPIO device - static libraries and headers libgpiod-doc/bionic 1.0-1 all C library for interacting with Linux GPIO device - library documentation libgpiod1/bionic,now 1.0-1 arm64 [installed,automatic] C library for interacting with Linux GPIO device - shared libraries
とのことで libgpiod1 libgpiod-dev libgpiod-doc をインストールします。
$ sudo apt install libgpiod1 libgpiod-dev libgpiod-doc Reading package lists... Done Building dependency tree Reading state information... Done libgpiod1 is already the newest version (1.0-1). libgpiod1 set to manually installed. The following NEW packages will be installed: libgpiod-dev libgpiod-doc 0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. Need to get 122 kB of archives. After this operation, 826 kB of additional disk space will be used. Do you want to continue? [Y/n] Get:1 http://ports.ubuntu.com bionic/universe arm64 libgpiod-dev arm64 1.0-1 [19.9 kB] Get:2 http://ports.ubuntu.com bionic/universe arm64 libgpiod-doc all 1.0-1 [102 kB] Fetched 122 kB in 2s (64.1 kB/s) Selecting previously unselected package libgpiod-dev. (Reading database ... 85058 files and directories currently installed.) Preparing to unpack .../libgpiod-dev_1.0-1_arm64.deb ... Unpacking libgpiod-dev (1.0-1) ... Selecting previously unselected package libgpiod-doc. Preparing to unpack .../libgpiod-doc_1.0-1_all.deb ... Unpacking libgpiod-doc (1.0-1) ... Setting up libgpiod-dev (1.0-1) ... Setting up libgpiod-doc (1.0-1) ...
こちらは、Linux の GPIO ツールということで gpiod をインストールします。
$ sudo apt install gpiod
Python3 側の準備
Python3 の ライブラリ gpiod を pip でインストールします。
$ python3 -m pip install -U --user pip gpiod Collecting pip Cache entry deserialization failed, entry ignored Downloading https://files.pythonhosted.org/packages/4d/16/0a14ca596f30316efd412a60bdfac02a7259bf8673d4d917dc60b9a21812/pip-22.0.4-py3-none-any.whl (2.1MB) 100% |????????????????????????????????| 2.1MB 158kB/s Collecting gpiod Downloading https://files.pythonhosted.org/packages/c9/71/3c0d6a3744a80624324f9572b2b224fc7225fd050cef5df4440b238bcd1e/gpiod-1.5.3.tar.gz Complete output from command python setup.py egg_info: Traceback (most recent call last): File "<string>", line 1, in <module> File "/usr/lib/python3/dist-packages/setuptools/__init__.py", line 12, in <module> import setuptools.version File "/usr/lib/python3/dist-packages/setuptools/version.py", line 1, in <module> import pkg_resources ModuleNotFoundError: No module named 'pkg_resources' ---------------------------------------- Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-zxaqwf27/gpiod/
‘pkg_resources’ モジュールが見つからない!と怒られたので調べると setuptools をインストールせよとのこと
$ sudo pip install setuptools --upgrade The directory '/home/libre/.cache/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag. The directory '/home/libre/.cache/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag. Collecting setuptools Downloading https://files.pythonhosted.org/packages/3b/02/8d4d27b1cacaac2d129a27d17a22d92a2a5eedcb7817d4ed8ab0d4daf5c4/setuptools-60.9.3-py3-none-any.whl (1.1MB) 100% |????????????????????????????????| 1.1MB 304kB/s Installing collected packages: setuptools Found existing installation: setuptools 39.0.1 Not uninstalling setuptools at /usr/lib/python3/dist-packages, outside environment /usr Successfully installed setuptools-60.9.3
最新版に更新されたようです。
再度、Python の ライブラリ gpiod を pip でインストールします。
$ python3 -m pip install -U --user pip gpiod Collecting pip Using cached https://files.pythonhosted.org/packages/4d/16/0a14ca596f30316efd412a60bdfac02a7259bf8673d4d917dc60b9a21812/pip-22.0.4-py3-none-any.whl Collecting gpiod Using cached https://files.pythonhosted.org/packages/c9/71/3c0d6a3744a80624324f9572b2b224fc7225fd050cef5df4440b238bcd1e/gpiod-1.5.3.tar.gz Building wheels for collected packages: gpiod Running setup.py bdist_wheel for gpiod ... done Stored in directory: /home/libre/.cache/pip/wheels/27/0c/98/489c5c315f475286cf1df1b7041d57c0ad7f098438a6207e9c Successfully built gpiod Installing collected packages: pip, gpiod Successfully installed gpiod-1.5.3 pip-22.0.4
アクセス権の問題
確認のため gpiodetect コマンドで gpio chip の一覧を表示してみる
$ sudo gpiodetect gpiochip0 [aobus-banks] (11 lines) gpiochip1 [periphs-banks] (100 lines)
スーパーユーザー権限にて gpiodetect を叩くと chip の情報が表示される。
一般ユーザーで gpiodetect を叩くとアクセス権が無いと怒られる。
$ gpiodetect gpiodetect: unable to access GPIO chips: Permission denied
これでは、Python からも一般ユーザー権限にて gpiod を介してアクセスすることができない。
ユーザーに gpio へのアクセス権を付与
デバイスのパーミッションを変える方法は、危険です。
調べてみるとシステムに GPIO 用のグループを作成します。
アクセス権のルールを作り GPIO 用グループへ実行するユーザーを登録するとのこと。
$ sudo usermod -G gpio user $ sudo vi /etc/udev/rules.d/60-gpio.rules # libgpiod を介した gpio ポートアクセスの udev ルール SUBSYSTEM=="gpio", KERNEL=="gpiochip[013]", GROUP="gpio", MODE="0660"
ルールファイルを作成したらシステムへ反映させるため、再起動(reboot)します。
Oops!!! 理解しないで書くとこうなる m(_ _)m
AML-S905X-CC での udev のルールは、おそらく下記になる。
SUBSYSTEM==”gpio”, KERNEL==”gpiochip[01]”, GROUP=”gpio”, MODE=”0660″
gpio connector <-> gpio(s905x) <-> gpio device <-> gpio ライブラリ <-> sysfs
再起動後、先ほどの一般ユーザー(ここでは、user)でログインします。
gpio へアクセスできるか確認します。
$ gpiodetect gpiochip0 [aobus-banks] (11 lines) gpiochip1 [periphs-banks] (100 lines)
GPIO の40ピンに何も挿していない状態です。
gpio の詳細も確認してみます。
$ gpioinfo gpiochip0 - 11 lines: line 0: unnamed unused input active-high line 1: unnamed unused input active-high line 2: unnamed "librecomputer:blue:cpu" output active-high [used] line 3: unnamed "VCC_CARD" output active-high [used] line 4: unnamed unused input active-high line 5: unnamed unused input active-high line 6: unnamed unused input active-high line 7: unnamed unused input active-high line 8: unnamed unused input active-high line 9: unnamed unused input active-high line 10: unnamed unused input active-high gpiochip1 - 100 lines: line 0: unnamed unused input active-high line 1: unnamed unused input active-high line 2: unnamed unused input active-high line 3: unnamed unused input active-high line 4: unnamed unused input active-high line 5: unnamed unused input active-high line 6: unnamed unused input active-high line 7: unnamed unused input active-high line 8: unnamed unused input active-high line 9: unnamed unused input active-high line 10: unnamed unused input active-high line 11: unnamed unused input active-high line 12: unnamed unused input active-high line 13: unnamed unused input active-high line 14: unnamed unused input active-high line 15: unnamed unused input active-high line 16: unnamed unused input active-high line 17: unnamed unused input active-high line 18: unnamed unused input active-high line 19: unnamed "HDMI_5V" output active-high [used] line 20: unnamed unused input active-high line 21: unnamed unused input active-high line 22: unnamed unused input active-high line 23: unnamed unused input active-high line 24: unnamed unused input active-high line 25: unnamed unused input active-high line 26: unnamed unused input active-high line 27: unnamed unused input active-high line 28: unnamed unused input active-high line 29: unnamed unused input active-high line 30: unnamed unused input active-high line 31: unnamed unused input active-high line 32: unnamed unused input active-high line 33: unnamed unused input active-high line 34: unnamed unused input active-high line 35: unnamed "reset" output active-low [used] line 36: unnamed unused input active-high line 37: unnamed unused input active-high line 38: unnamed unused input active-high line 39: unnamed unused input active-high line 40: unnamed unused input active-high line 41: unnamed unused input active-high line 42: unnamed unused input active-high line 43: unnamed unused input active-high line 44: unnamed unused input active-high line 45: unnamed unused input active-high line 46: unnamed unused input active-high line 47: unnamed unused input active-high line 48: unnamed "cd" input active-high [used] line 49: unnamed unused input active-high line 50: unnamed unused input active-high line 51: unnamed unused input active-high line 52: unnamed unused input active-high line 53: unnamed unused input active-high line 54: unnamed unused input active-high line 55: unnamed unused input active-high line 56: unnamed unused input active-high line 57: unnamed unused input active-high line 58: unnamed unused input active-high line 59: unnamed unused input active-high line 60: unnamed unused input active-high line 61: unnamed unused input active-high line 62: unnamed unused input active-high line 63: unnamed unused input active-high line 64: unnamed unused input active-high line 65: unnamed unused input active-high line 66: unnamed unused input active-high line 67: unnamed unused input active-high line 68: unnamed unused input active-high line 69: unnamed unused input active-high line 70: unnamed unused input active-high line 71: unnamed unused input active-high line 72: unnamed unused input active-high line 73: unnamed "librecomputer:green:disk" output active-high [used] line 74: unnamed unused input active-high line 75: unnamed unused input active-high line 76: unnamed unused input active-high line 77: unnamed unused input active-high line 78: unnamed unused input active-high line 79: unnamed unused input active-high line 80: unnamed unused input active-high line 81: unnamed unused input active-high line 82: unnamed unused input active-high line 83: unnamed unused input active-high line 84: unnamed unused input active-high line 85: unnamed unused input active-high line 86: unnamed unused input active-high line 87: unnamed unused input active-high line 88: unnamed unused input active-high line 89: unnamed unused input active-high line 90: unnamed unused input active-high line 91: unnamed unused input active-high line 92: unnamed unused input active-high line 93: unnamed unused input active-high line 94: unnamed unused input active-high line 95: unnamed unused input active-high line 96: unnamed unused input active-high line 97: unnamed unused input active-high line 98: unnamed unused input active-high line 99: unnamed unused input active-high
グループに登録した一般ユーザーからもアクセスできるようになりました。
※私は、この時点で GPIO 名?が表示(認識)されてないことに気づきませんでした。
Python から確認する
$ python3 Python 3.8.0 (default, Dec 9 2021, 17:53:27) >>> import gpiod ~ ヘルプが大事 ~ >>> help(gpiod) >>> help(gpiod.chip) >>> help(gpiod.line) >>> help(gpiod.chip.open) >>> chip.open("/dev/gpiochip1") >>> print(chip.label) periphs-banks >>> print(chip.name) gpiochip1 >>>
一応、Python からも参照できているのですが
なんとなく不安が・・・というか不満というか、使えないというか・・・たぶん・・・
今日は、ここまでw
追記:
再度、使い勝手の良いライブラリを探していたところ
python-periphery なるものを発見しました!
GPIO 以外にも LED、PWM、I2C なども対応しているようなので次回、試してみます。
python-periphery が Python ライブラリとしては、正解だと思う。
それではマタ
Was this helpful?
0 / 0