AML-S905X-CC の Armbian 22.02 にて GPIO を制御する

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

AML-S905X-CC (Le Potato) の Armbian で GPIO を操作する内容となっています。

前回、Ubuntu での GPIO 操作を断念しておりますが、おそらく同じような方法で制御可能だと思います。

いずれ時間ができたら Ubuntu でも試してみます。

はじめに

AML-S905X-CC への Armbian につきましては、Le Potato から CLI 版をダウンロードしてインストールしました。

詳細は、Armbian クイックスタートガイドを参照してください。

基本的には、OS イメージをダウンロードして解凍後、イメージファイルを MicroSD へ焼いて MicroSD からブートする流れです。

一点、注意事項としまして

Ubuntu では、OS 起動後に eMMC を装着してツールから OS をフラッシュすることが簡単にできたのですが

Armbian では、OS 起動後に eMMC を装着してもデバイスを認識できません(方法がわかりません)
σ( ̄^ ̄) エッヘン。

おそらく U-Boot なるものでブートが変更できそうなのですが・・・

なので eMMC を使用するには、あらかじめフォーマットされている状態が前提となります。(今はw)

eMMC に OS のブートローダーがあると優先的に読み込まれるので注意が必要となります。

基本設定は、Armbian-config から設定できます。

現状、MicroSD から起動してます。

GPIO の環境構築

Armbian のインストールおよび OS 基本設定が終わりましたら、GPIO のインターフェース、ライブラリ等をインストールします。

$ sudo apt install gpiod libgpiod-dev libgpiod2 python3-libgpiod python3-pigpio

gpiod/stable,now 1.6.2-1 arm64 [installed]
  Tools for interacting with Linux GPIO character device - binary

libgpiod-dev/stable,now 1.6.2-1 arm64 [installed]
  C library for interacting with Linux GPIO device - static libraries and headers

libgpiod-doc/stable,stable 1.6.2-1 all
  C library for interacting with Linux GPIO device - library documentation

libgpiod2/stable,now 1.6.2-1 arm64 [installed]
  C library for interacting with Linux GPIO device - shared libraries

python3-libgpiod/stable,now 1.6.2-1 arm64 [installed]
  Python bindings for libgpiod (Python 3)

python3-pigpio/stable,stable,now 1.78-1 all [installed]
  Python module which talks to the pigpio daemon (Python 3)

Raspberry pi 用ライブラリ以外の GPIO(Python)関連をインストールしています。

※libgpiod-doc は、お好みで

GPIO ピン番号の関連確認

ここが肝心要または、ハマりどころw です。

AML-S905X-CC(Le Potato)の公式ドキュメントでは、Headers Reference としてシートが公開されています。

Headers Reference では、物理的にコネクタのピンの位置と何の役割(予約)かわかるのですが、Linux では、sysfs から GPIO を操作するとのこと。

Linux:sysfs ⇔ GPIO インターフェース・ライブラリ ⇔ GPIO デバイス ⇔ Soc:CPU (S905X) GPIO チップ ⇔ GPIO ピン(コネクタ)

との流れ?になるそうです。

なので GPIO デバイスと GPIO ピン(pin)を番号で指定するのですが、このピン番号がややこしいw

GPIO は、GPIO 番号と GPIO 名、ピン番号があります。

GPIO 番号と GPIO 名は、先ほどの Headers Reference シートでわかるのですが対応するピン番号がわかりません。

そこで Linux カーネル内部のデバッグに関する情報を参照するためのファイルから調べることができます。

※他に簡単に調べる方法がありましたらご教授願います。計算式も見たような気が・・・

$ sudo cat /sys/kernel/debug/gpio

gpiochip1: GPIOs 401-500, parent: platform/c8834000.bus:pinctrl@4b0, periphs-banks:
 gpio-401 (                    )
 gpio-402 (                    )
 gpio-403 (                    )
 gpio-404 (                    )
 gpio-405 (                    )
 gpio-406 (                    )
 gpio-407 (                    )
 gpio-408 (                    )
 gpio-409 (                    )
 gpio-410 (                    )
 gpio-411 (                    )
 gpio-412 (                    )
 gpio-413 (                    )
 gpio-414 (                    )
 gpio-415 (Eth Link LED        )
 gpio-416 (Eth Activity LED    )
 gpio-417 (HDMI HPD            )
 gpio-418 (HDMI SDA            )
 gpio-419 (HDMI SCL            )
 gpio-420 (HDMI_5V_EN          |regulator-hdmi-5v   ) out lo
 gpio-421 (9J1 Header Pin2     )
 gpio-422 (Analog Audio Mute   |enable              ) out lo
 gpio-423 (2J3 Header Pin6     )
 gpio-424 (2J3 Header Pin5     )
 gpio-425 (2J3 Header Pin4     )
 gpio-426 (2J3 Header Pin3     )
 gpio-427 (eMMC D0             )
 gpio-428 (eMMC D1             )
 gpio-429 (eMMC D2             )
 gpio-430 (eMMC D3             )
 gpio-431 (eMMC D4             )
 gpio-432 (eMMC D5             )
 gpio-433 (eMMC D6             )
 gpio-434 (eMMC D7             )
 gpio-435 (eMMC Clk            )
 gpio-436 (eMMC Reset          |reset               ) out lo ACTIVE LOW
 gpio-437 (eMMC CMD            )
 gpio-438 (ALT BOOT MODE       )
 gpio-439 (                    )
 gpio-440 (                    )
 gpio-441 (                    )
 gpio-442 (eMMC Data Strobe    )
 gpio-443 (SDCard D1           )
 gpio-444 (SDCard D0           )
 gpio-445 (SDCard CLK          )
 gpio-446 (SDCard CMD          )
 gpio-447 (SDCard D3           )
 gpio-448 (SDCard D2           )
 gpio-449 (SDCard Det          |cd                  ) in  lo ACTIVE LOW
 gpio-450 (                    )
 gpio-451 (                    )
 gpio-452 (                    )
 gpio-453 (                    )
 gpio-454 (                    )
 gpio-455 (                    )
 gpio-456 (                    )
 gpio-457 (                    )
 gpio-458 (                    )
 gpio-459 (                    )
 gpio-460 (                    )
 gpio-461 (                    )
 gpio-462 (                    )
 gpio-463 (                    )
 gpio-464 (                    )
 gpio-465 (                    )
 gpio-466 (                    )
 gpio-467 (                    )
 gpio-468 (                    )
 gpio-469 (                    )
 gpio-470 (                    )
 gpio-471 (                    )
 gpio-472 (                    )
 gpio-473 (                    )
 gpio-474 (Green LED           |librecomputer:system) out hi
 gpio-475 (VCCK Enable         )
 gpio-476 (7J1 Header Pin27    )
 gpio-477 (7J1 Header Pin28    )
 gpio-478 (VCCK Regulator      )
 gpio-479 (VDDEE Regulator     )
 gpio-480 (7J1 Header Pin22    )
 gpio-481 (7J1 Header Pin26    )
 gpio-482 (7J1 Header Pin36    )
 gpio-483 (7J1 Header Pin38    )
 gpio-484 (7J1 Header Pin40    )
 gpio-485 (7J1 Header Pin37    )
 gpio-486 (7J1 Header Pin33    )
 gpio-487 (7J1 Header Pin35    )
 gpio-488 (7J1 Header Pin19    )
 gpio-489 (7J1 Header Pin21    )
 gpio-490 (7J1 Header Pin24    )
 gpio-491 (7J1 Header Pin23    |onewire@1           ) out hi
 gpio-492 (7J1 Header Pin8     |onewire@0           ) out hi
 gpio-493 (7J1 Header Pin10    )
 gpio-494 (7J1 Header Pin16    )
 gpio-495 (7J1 Header Pin18    )
 gpio-496 (7J1 Header Pin32    )
 gpio-497 (7J1 Header Pin29    )
 gpio-498 (7J1 Header Pin31    )
 gpio-499 (7J1 Header Pin7     )
 gpio-500 (                    )
gpiochip0: GPIOs 501-511, parent: platform/c8100000.bus:pinctrl@14, aobus-banks:
 gpio-501 (UART TX             )
 gpio-502 (UART RX             )
 gpio-503 (Blue LED            |librecomputer:blue  ) out lo
 gpio-504 (SDCard Voltage Switc|VCC_CARD            ) out lo
 gpio-505 (7J1 Header Pin5     )
 gpio-506 (7J1 Header Pin3     )
 gpio-507 (7J1 Header Pin12    )
 gpio-508 (IR In               )
 gpio-509 (9J3 Switch HDMI CEC/)
 gpio-510 (7J1 Header Pin13    )
 gpio-511 (7J1 Header Pin15    )

この gpio-XXX にある後ろの 3桁の番号がピン番号となります。

例:gpio-506 (7J1 Header Pin3) の 506 番が、 Headers Reference シート Pin 3 番の GPIOAO_5 に該当します。

後ほどルール作りで使用するので chip番号?を調べます。

$ sudo gpiodetect

gpiochip0 [aobus-banks] (11 lines)
gpiochip1 [periphs-banks] (100 lines)

gpiochip の後ろの番号です。(ここでは、0 と 1)

gpio グループとルールの作成

root の権限で、このピン番号をデバイス登録すれば、すぐに使用できるのですが、その前に

後ほど、一般ユーザーから使えるように gpio グループ(グループ名は、てきとうです)を作成して権限、ルールを作成して環境を整えます。

$ sudo su -
# addgroup gpio
Adding group `gpio' (GID 1001) ...
Done.
# usermod -aG gpio user

この gpio グループに対してデバイス管理ツール(udev rules)を作成します。

sudo vi /etc/udev/rules.d/60-gpio-group.rules

# gpiochip は、0 と 1 (chip番号?)という意味です。
SUBSYSTEM=="gpio", KERNEL=="gpiochip[01]", GROUP="gpio", MODE="0660"
# Group gpio chown オーナー、グループの変更
SUBSYSTEM=="gpio", PROGRAM="/usr/bin/bash -c '/usr/bin/chown -R root:gpio /sys/class/gpio/gpio*/*'"
# Group gpio chmod ユーザー、グループへ読み取り、書き込み権限を追加
SUBSYSTEM=="gpio", PROGRAM="/usr/bin/bash -c '/usr/bin/chmod -R ug+rw /sys/class/gpio*/*'"

PATH のワイルドカード(*)の書き方がポイントです。
ルールができましたら OS へ反映するため AML-S905X-CC (Le Potato) を再起動します。

GPIO デバイスの設定

先ほど調べた ピン番号で GPIO デバイスを設定します。

$ echo 506 | sudo tee /sys/class/gpio/export

tee コマンドで export へ登録します。

作成されたか確認する

$ ls -l /sys/class/gpio/

total 0
-rw-rw---- 1 root root 4096 Mar 17 13:41 export
lrwxrwxrwx 1 root root    0 Mar 17 13:41 gpio506 -> ../../devices/platform/soc/c8100000.bus/c8100000.bus:pinctrl@14/gpiochip0/gpio/gpio506
lrwxrwxrwx 1 root root    0 Jan  1  1970 gpiochip401 -> ../../devices/platform/soc/c8834000.bus/c8834000.bus:pinctrl@4b0/gpio/gpiochip401
lrwxrwxrwx 1 root root    0 Jan  1  1970 gpiochip501 -> ../../devices/platform/soc/c8100000.bus/c8100000.bus:pinctrl@14/gpio/gpiochip501
-rw-rw---- 1 root root 4096 Mar 17 13:41 unexport

$ ls -l /sys/class/gpio/gpio506/

total 0
-rw-rw-r-- 1 root gpio 4096 Mar 17 13:41 active_low
lrwxrwxrwx 1 root gpio    0 Mar 17 13:41 device -> ../../../gpiochip0
-rw-rw-r-- 1 root gpio 4096 Mar 17 13:41 direction
-rw-rw-r-- 1 root gpio 4096 Mar 17 13:41 edge
drwxrwxr-x 2 root gpio    0 Mar 17 13:41 power
lrwxrwxrwx 1 root gpio    0 Mar 17 13:41 subsystem -> ../../../../../../../../class/gpio
-rw-rw-r-- 1 root gpio 4096 Mar 17 13:41 uevent
-rw-rw-r-- 1 root gpio 4096 Mar 17 13:41 value

グループもパーミッションも OK ですね

GPIO の制御

最後にコマンドから簡単な GPIO 制御でテストします。

今回は、ARCELI Mosfet IRF520 モジュールを使って LED 点灯確認を行います。

他のブランドからも同じような Mosfet IRF520 モジュールが多数、出ていますのでお好みやLED照明に対応する規格で選択してください。

ARCELI MOSFET IRF520 モジュール

Amazon で探す

楽天市場 で探す

回路図も勉強中でして・・・まだ書けないので簡単な取付配線図で説明します。

LEDライトバースイッチ取付配線図
先ほどの Headers Reference シート Pin 3 番の GPIOAO_5 へ ON/OFF の信号を送ります。

LED 照明の電源は、基盤と別に12Vアダプターから引いてます。

LED の配線とアダプターからの配線を IRF520 モジュールへ接続します。

モジュールの SIG と GPIOAO_5 をジャンパー線でつなぎます。

モジュールの GND と基盤のピンの GND へつなぎます。

配線が正しいのかわかりません。m(_ _)m

それと抵抗器は、たぶん MOSFES モジュールに着いている?気がするので直結してます。

この辺、ツッコミ、ご教授いただけるとありがたいです。

それでは、制御のテストです。

LED 照明が点灯、消灯すれば成功です。

# まず、ピンのタイプの初期値は、入力用(in)になっているので出力用(out)に変更します。
$ echo out > /sys/class/gpio/gpio506/direction

# ピンの初期値は、0 です。
$ cat /sys/class/gpio/gpio506/value
0

# LED は、まだ点灯していない状態なので ON(1) にします。
$ echo 1 > /sys/class/gpio/gpio506/value

# LED は、点灯されましたか? おめでとうございます!
# 私は、はじめての制御で LED が点灯した時に凄く感動しました。!(^^)!

# LED を OFF(0)消灯してみます。
$ echo 0 > /sys/class/gpio/gpio506/value

# GPIO の使用後、開放(unexport)します。
$ echo 506 | sudo tee /sys/class/gpio/unexport

テストは、完了です。

お疲れさまでした。m(_ _)m

Was this helpful?

0 / 0

コメントを残す 0

Your email address will not be published.