如何使用 Fedora IoT 點亮 LED 燈

2018-12-25 00:24:00

如果你喜歡 Fedora、容器,而且有一塊樹莓派,那麼這三者結合操控 LED 會怎麼樣?本文介紹的是 Fedora IoT,將展示如何在樹莓派上安裝預覽映象。還將學習如何與 GPIO 互動以點亮 LED。

什麼是 Fedora IoT?

Fedora IoT 是當前 Fedora 專案的目標之一,計劃成為一個完整的 Fedora 版本。Fedora IoT 將是一個在 ARM(目前僅限 aarch64)裝置上(例如樹莓派),以及 x86_64 架構上執行的系統。

Fedora IoT 基於 OSTree 開發,就像 Fedora Silverblue 和以往的 Atomic Host

下載和安裝 Fedora IoT

官方 Fedora IoT 映象將和 Fedora 29 一起發布。但是在此期間你可以下載 基於 Fedora 28 的映象 來進行這個實驗。(LCTT 譯註:截止至本譯文發布,Fedora 29 已經發布了,但是 IoT 版本並未隨同發布,或許會在 Fedora 30 一同發布?)

你有兩種方法來安裝這個系統:要麼使用 dd 命令燒錄 SD 卡,或者使用 fedora-arm-installer 工具。Fedora 的 Wiki 裡面提供了為 IoT 設定物理裝置 的更多資訊。另外,你可能需要調整第三個分割區的大小。

把 SD 卡插入到裝置後,你需要建立一個使用者來完成安裝。這個步驟需要序列連線或一個 HDMI 顯示器和鍵盤來與裝置進行互動。

當系統安裝完成後,下一步就是要設定網路連線。使用你剛才建立的使用者登入系統,可以使用下列方式之一完成網路連線設定:

  • 如果你需要手動設定你的網路,可能需要執行類似如下命令,需要保證設定正確的網路地址:

    $ nmcli connection add con-name cable ipv4.addresses \192.168.0.10/24 ipv4.gateway 192.168.0.1 \connection.autoconnect true ipv4.dns "8.8.8.8,1.1.1.1" \type ethernet ifname eth0 ipv4.method manual
  • 如果你網路上執行著 DHCP 服務,可能需要類似如下命令:

    $ nmcli con add type ethernet con-name cable ifname eth0

Fedora 中的 GPIO 介面

許多關於 Linux 上 GPIO 的教學都關注傳統的 GPIO sysfis 介面。這個介面已經不推薦使用了,並且上游 Linux 核心社群由於安全和其他問題的緣故打算完全刪除它。

Fedora 已經不將這個傳統的介面編譯到核心了,因此在系統上沒有 /sys/class/gpio 這個檔案。此教學使用一個上游核心提供的一個新的字元裝置 /dev/gpiochipN 。這是目前和 GPIO 互動的方式。

為了和這個新裝置進行互動,你需要使用一個庫和一系列命令列介面的工具。常用的命令列工具比如說 echocat 在此裝置上無法正常工作。

你可以通過安裝 libgpiod-utils 包來安裝命令列介面工具。python3-libgpiod 包提供了相應的 Python 庫。

使用 Podman 來建立一個容器

Podman 是一個容器執行環境,其命令列介面類似於 Docker。Podman 的一大優勢是它不會在後台執行任何守護行程。這對於資源有限的裝置尤其有用。Podman 還允許您使用 systemd 單元檔案啟動容器化服務。此外,它還有許多其他功能。

我們使用如下兩步來建立一個容器:

  1. 建立包含所需包的分層映象。
  2. 使用分層映象建立一個新容器。

首先建立一個 Dockerfile 檔案,內容如下。這些內容告訴 Podman 基於可使用的最新 Fedora 映象來構建我們的分層映象。然後就是更新系統和安裝一些軟體包:

FROM fedora:latestRUN  dnf -y updateRUN  dnf -y install libgpiod-utils python3-libgpiod

這樣你就完成了映象的生成前的設定工作,這個映象基於最新的 Fedora,而且包含了和 GPIO 互動的軟體包。

現在你就可以執行如下命令來構建你的基本映象了:

$ sudo podman build --tag fedora:gpiobase -f ./Dockerfile

你已經成功建立了你的自定義映象。這樣以後你就可以不用每次都重新搭建環境了,而是基於你建立的映象來完成工作。

使用 Podman 完成工作

為了確認當前的映象是否就緒,可以執行如下命令:

$ sudo podman imagesREPOSITORY                 TAG        IMAGE ID       CREATED          SIZElocalhost/fedora           gpiobase   67a2b2b93b4b   10 minutes ago  488MBdocker.io/library/fedora   latest     c18042d7fac6   2 days ago     300MB

現在,啟動容器並進行一些實際的實驗。容器通常是隔離的,無法存取主機系統,包括 GPIO 介面。因此需要在啟動容器時將其掛載在容器內。可以使用以下命令中的 -device 選項來解決:

$ sudo podman run -it --name gpioexperiment --device=/dev/gpiochip0 localhost/fedora:gpiobase /bin/bash

執行之後就進入了正在執行的容器中。在繼續之前,這裡有一些容器命令。輸入 exit 或者按下 Ctrl+D 來退出容器。

顯示所有存在的容器可以執行如下命令,這包括當前沒有執行的,比如你剛剛建立的那個:

$ sudo podman container ls -aCONTAINER ID   IMAGE             COMMAND     CREATED          STATUS                              PORTS   NAMES64e661d5d4e8   localhost/fedora:gpiobase   /bin/bash 37 seconds ago Exited (0) Less than a second ago           gpioexperiment

使用如下命令建立一個新的容器:

$ sudo podman run -it --name newexperiment --device=/dev/gpiochip0 localhost/fedora:gpiobase /bin/bash

如果想刪除容器可以使用如下命令:

$ sudo podman rm newexperiment

點亮 LED 燈

現在可以使用已建立的容器。如果已經從容器退出,請使用以下命令再次啟動它:

$ sudo podman start -ia gpioexperiment

如前所述,可以使用 Fedora 中 libgpiod-utils 包提供的命令列工具。要列出可用的 GPIO 晶片可以使用如下命令:

$ gpiodetectgpiochip0 [pinctrl-bcm2835] (54 lines)

要獲取特定晶片的連線列表,請執行:

$ gpioinfo gpiochip0

請注意,物理引腳數與前一個命令所列印的連線數之間沒有相關性。重要的是 BCM 編號,如 pinout.xyz 所示。建議不要使用沒有相應 BCM 編號的連線。

現在,將 LED 連線到物理引腳 40,也就是 BCM 21。請記住:LED 的短腿(負極,稱為陰極)必須連線到帶有 330 歐姆電阻的樹莓派的 GND 引腳, 並且長腿(陽極)到物理引腳 40。

執行以下命令點亮 LED,按下 Ctrl + C 關閉:

$ gpioset --mode=wait gpiochip0 21=1

要點亮一段時間,請新增 -b(在後台執行)和 -s NUM(多少秒)引數,如下所示。 例如,要點亮 LED 5 秒鐘,執行如下命令:

$ gpioset -b -s 5 --mode=time gpiochip0 21=1

另一個有用的命令是 gpioget。 它可以獲得引腳的狀態(高或低),可用於檢測按鈕和開關。

總結

你也可以使用 Python 操控 LED —— 這裡有一些例子。 也可以在容器內使用 i2c 裝置。 此外,Podman 與此 Fedora 版本並不嚴格相關。你可以在任何現有的 Fedora 版本上安裝它,或者在 Fedora 中使用兩個基於 OSTree 的新系統進行嘗試:Fedora SilverblueFedora CoreOS