你喜欢跑步吗 Fedora,容器,并有树莓派? 将这三个一起使用来玩 LED 怎么样? 本文介绍 Fedora IoT 并向您展示如何在 Raspberry Pi 上安装预览图像。 您还将学习如何与 GPIO 交互以点亮 LED。
什么是 Fedora 物联网?
Fedora 物联网是当前的一种 Fedora 项目目标,有计划成为一个完整的 Fedora 版。 结果将是一个在 ARM(目前仅 aarch64)设备(如 Raspberry Pi)以及 x86_64 架构上运行的系统。
Fedora IoT 基于 OSTree,例如 Fedora 银蓝 和前者 原子主机.
下载并安装 Fedora 物联网
官方 Fedora 物联网图像与 Fedora 29 发布。 但是,与此同时,您可以下载一个 Fedora 基于 28 的图像 对于这个实验。
安装系统有两种选择:使用 dd 命令刷新 SD 卡,或使用 fedora-arm-installer 工具。 这 Fedora Wiki 提供了更多关于 设置物理设备 物联网。 另外,请记住您可能需要调整第三个分区的大小。
将 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
GPIO接口在 Fedora
许多关于 Linux 上 GPIO 的教程都关注传统的 GPIO sysfis 接口。 此接口已弃用,上游 Linux 内核社区出于安全和其他问题,计划将其完全删除。
这 Fedora 内核已经在没有这个遗留接口的情况下编译,所以系统上没有 /sys/class/gpio。 本教程使用上游内核提供的新字符设备 /dev/gpiochipN。 这是当前与 GPIO 交互的方式。
要与这个新设备交互,您需要使用一个库和一组命令行界面工具。 echo 或 cat 等常用命令行工具不适用于此设备。
您可以通过安装 libgpiod-utils 包来安装 CLI 工具。 python3-libgpiod 包提供了相应的 Python 库。
使用 Podman 创建容器
波德曼 是一个容器运行时,具有类似于 Docker 的命令行界面。 Podman 的一大优势是它不会在后台运行任何守护进程。 这对于资源有限的设备特别有用。 Podman 还允许您使用 systemd 单元文件启动容器化服务。 此外,它还有许多附加功能。
我们将在这两个步骤中创建一个容器:
- 创建包含所需包的分层图像。
- 从我们的图像开始创建一个新容器。
首先,创建一个包含以下内容的文件 Dockerfile。 这告诉 podman 根据最新的 Fedora 注册表中可用的图像。 然后它更新系统内部并安装一些包:
FROM fedora:latest RUN dnf -y update RUN dnf -y install libgpiod-utils python3-libgpiod
您已经创建了基于最新版本的容器镜像的构建配方 Fedora 带有更新,以及与 GPIO 交互的软件包。
现在,运行以下命令来构建您的基础映像:
$ sudo podman build --tag fedora:gpiobase -f ./Dockerfile
您刚刚创建了包含所有位的自定义图像。 您可以根据需要多次使用此基本容器映像,而无需在每次运行时都安装包。
与 Podman 合作
要验证映像是否存在,请运行以下命令:
$ sudo podman images REPOSITORY TAG IMAGE ID CREATED SIZE localhost/fedora gpiobase 67a2b2b93b4b 10 minutes ago 488MB docker.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 -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 64e661d5d4e8 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
如前所述,您可以使用 libgpiod-utils 包提供的 CLI 工具 Fedora. 要列出可用的 GPIO 芯片,请运行:
$ gpiodetect gpiochip0 [pinctrl-bcm2835] (54 lines)
要获取特定芯片公开的行列表,请运行:
$ gpioinfo gpiochip0
请注意,物理引脚的数量与上一个命令打印的行数之间没有相关性。 重要的是 BCM 编号,如上所示 引脚排列.xyz. 不建议使用没有相应 BCM 编号的线路。
现在,将 LED 连接到物理引脚 40,即 BCM 21。请记住:LED 的较短腿(负腿,称为阴极)必须使用 330 欧姆电阻连接到 Raspberry Pi 的 GND 引脚,长腿(阳极)连接到物理引脚 40。
要打开 LED,请运行以下命令。 它会一直亮着,直到你按下 Ctrl+C:
$ gpioset --mode=wait gpiochip0 21=1
点亮一定时间,添加-b(后台运行)和-s NUM(多少秒)参数,如下图。 为了 example点亮 LED 5 秒,运行:
$ gpioset -b -s 5 --mode=time gpiochip0 21=1
另一个有用的命令是 gpioget。 它获取引脚的状态(高或低),可用于检测按钮和开关。
结论
你也可以使用 Python 来玩 LED — 这里有一些例子. 您也可以使用容器内的 i2c 设备。 此外,Podman 与此不严格相关 Fedora 版。 您可以将其安装在任何现有的 Fedora 版,或者在两个新的基于 OSTree 的系统上试用 Fedora: Fedora 银蓝 和 Fedora 核心操作系统.