AML-S905X-CC の Ubuntu 18.04 にて Python3 から GPIO を制御する – 準備編

タイトルの通り、やってみたら色々とハマったので備忘録です。

はじめに言い訳または、弁解です

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

コメントを残す 0

Your email address will not be published.