タイトルの通り、やってみたら色々とハマったので備忘録です。
はじめに言い訳または、弁解です
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 ライブラリとしては、正解だと思う。
それではマタ
#AML-S905X-CC #GPIO #Libre Computer #pip #python #Ubuntu