前回の 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 で探す
回路図も勉強中でして・・・まだ書けないので簡単な取付配線図で説明します。
先ほどの 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