如何将 Raspberry Pi 配置为微控制器

还没有人喜欢这个。
How to configure Raspberry Pi as a microcontroller

Opensource.com

由于 Raspberry Pi 体积小、功耗低,因此它在电子爱好者和教育工作者中都非常受欢迎。 因此,它与“创客”场景相关联,有时 Arduino(和 Arduino 风格的嵌入式微控制器)和 Pi 之间的界限变得模糊。

事实是,Raspberry Pi 和 Arduino 是非常不同的设备,即使它们经常在同一个工作台上看到。 对于某些项目,Arduino 更有意义,但对于其他项目,Pi 实际上可能是更好的选择(例如,如果您要触发复杂的 Multimedia 事件)。 但是,如果您希望 Pi 可以直接替代 Arduino,您会感到惊讶。 我在不同的工艺项目中使用过 Arduino 和 Pi,有时是因为其中一个明显比另一个更好,有时只是因为我手头有一个而没有另一个。 如果您习惯了 Arduino(或者如果您只是阅读了很多关于它的信息,并且不清楚它与 Pi 有何不同),那么这是我在让 Pi 更像嵌入式微控制器而不是迷你 PC 时发现的额外步骤。

GPIO

人们了解 Arduino 的第一件事是,除非您有东西可以连接到它,否则它不是很有用; 您需要输入传感器和输出设备,否则您正在对没有东西可以控制的微控制器进行编程。 Pi 则完全相反; 它所做的很多事情都可以完全基于软件,因此连接外置电子设备的趋势不太常见。 但并非必须如此。

Raspberry Pi 有许多 GPIO 引脚(确切数量取决于型号),可以检测输入或发送输出信号。 与 Arduino 不同,所有这些引脚都是数字 IO,这意味着它们知道两种状态:开和关。 大多数 Arduino 板也有模拟引脚,可以检测状态的程度,其实际应用是能够连接温度传感器、光传感器或用于任意输入的电位器。

只要您可以处理二进制输入和输出,Pi 的 GPIO 引脚就非常有用。 但与 Arduino 不同,通过软件访问这些引脚并不是默认的。 要与 GPIO 引脚通信,您必须安装 GPIO 库。 有两个开发库可供选择

RPi.GPIO Python

RPi.GPIO 是一个 Python 库,可让您从 GPIO 引脚读取数据并输出到 GPIO 引脚。 就 Arduino 用户可能期望的那样而言,这是一个相当高级的界面,因此没有 SPI 或串行功能。 但对于简单的项目,它效果很好。 您可以打开和关闭 LED,激活电机等等。

WiringPi C

WiringPi 是一个用 C 编写的 GPIO 访问库。它的语法和总体设计对于任何使用过 Arduino 系统的人来说都会感到熟悉,并且作为一个底层库,它甚至包含允许您使用外部板(例如 Arduino 或类似设备)作为模拟输入的模块。

原始 WiringPi 项目的贡献者已经编写了 Python、Ruby、Perl、Java 等的包装器。

实时性能

与 Arduino 不同,使用 GPIO 库不提供实时性能。 Python 库具有 Python 的开销,它需要定期在后台执行内存管理任务,即使 WiringPi 也受到 Linux 内核的调度决策的影响。 在实践中,除非您正在构建一个至关重要地依赖实时性能的设备,否则这可能实际上并不重要。 在准备一个基于 Pi 的多媒体项目时,我确实做了一些测试,试图使用安全限制来提高性能,但它们都失败了(我从来没有重新编译内核,所以这没有帮助)。 最终,我发现该项目(一个受不可预测的输入影响并且确实需要一些瞬时响应的音乐界面)从未错过任何一个节拍,但您的结果可能会因您的项目而异。

启动时启动

由于 Arduino 是一个嵌入式系统,因此您刷入其芯片的程序始终在运行。 您打开 Arduino 的电源,您的程序就会运行,不断循环,直到断电为止。 Pi 不会这样做。 当您打开 Pi 的电源时,它会加载一个 OS,然后耐心等待您登录或执行某些操作。

如果您需要嵌入式行为,则需要基本上告诉 Pi 在启动时自动启动应用程序。 更好的是,您可以剥离您不需要的进程,以便启动时间更快。 您不必这样做(您可以简单地将 Pi 的桌面设置为自动登录,然后设置一个启动应用程序),但是如果您将 Pi 视为伪嵌入式设备并且不需要桌面,那么为什么要使用资源来运行一个桌面呢? 并且为什么要引入这个作为变量,因为在演示您的酷炫新机器人(或者您正在构建的任何东西)方面,任何可能出错的事情都将出错?

要使 Pi 的行为类似于嵌入式 OS,首先要剥离您不需要的服务。 这些服务是什么取决于您的项目。 如果您的项目不需要网络,则禁用网络服务。 如果您的项目不需要图形界面,请从您的系统中删除 X11 包。 浏览启动时正在运行的服务,并尽可能多地禁用它们。

您还希望 Pi 自动登录。 您如何实现这一点取决于您运行的 Pi 发行版。

没有 Systemd

Pi 的大多数现代发行版都使用 Systemd 进行 init 进程(启动进程),但也有一些不使用。 要在不使用 Systemd 的系统上激活自动登录,请编辑(使用 sudo 权限)/etc/inittab 文件并更改此行

1:2345:respawn:/sbin/getty 38400 tty1

到这行

1:2345:respawn:/sbin/getty --autologin your-username-here 38400 tty1

your-username-here 替换为您要自动登录的用户的用户名。 您的 Pi 可能默认情况下随 pi 一起提供,但您可能创建了一个新用户; 如果您不确定,请使用 whoami 查找您的用户名。

进行更改后,重新启动以确保它有效。 Pi 应该启动到 shell 提示符(而不是登录提示符)。

要在成功启动后立即运行您的应用程序,请将您的应用程序作为命令添加到文件 /etc/rc.local 中,在最后一行上方(应该读取 exit 0)。 例如,这是我的示例项目的最后两行

$ sudo tail -n /etc/rc.local
/usr/local/bin/robotnix/robotnix.py
exit 0

确保 rc.local 是可执行的,并且您要启动的应用程序是可执行的

$ sudo chmod a+x /etc/rc.local
$ sudo chmod a+x /usr/local/bin/robotnix/robotnix.py

再次重新启动以测试您的应用程序是否在成功自动登录后启动。

CentOS、Pidora 和其他系统上的 Systemd

在使用 Systemd 的发行版(例如 CentOS)上,该过程类似,但在不同的配置文件集中进行。

对于自动登录过程,请编辑文件 >/usr/lib/systemd/system/getty@.service 并注释掉此行

ExecStart=-/sbin/agetty --noclear %I 38400

并将其替换为此变体

## old line ## ExecStart=-/sbin/agetty --noclear %I 38400
## new command
ExecStart=/sbin/agetty --autologin your-username-here --noclear %I 38400

此 Systemd 文件生成该进程,这与使用 inittab 的传统 UNIX 方法不同。

重新启动您的 Pi 以测试自动登录。

假设自动登录按预期工作(Pi 应该启动到 shell 提示符,而不是登录提示符),下一步是为您的应用程序创建一个自动启动规则。 整个互联网都建议在 rc.local 中放置一个命令应该有效(因为理论上,Systemd 会向后兼容地执行 rc.local),但我在这方面取得了不同的成功。 我在使用自定义 Systemd 规则方面取得了巨大成功。

要编写 Systemd 规则,请使用 sudo 权限创建一个名为 /etc/systemd/system/robotnix.service 的文件(您可以随意命名;我使用 robotnix 是因为这是我为本文生成的示例项目的名称)。

文件内容

[Unit]
Description=Robot Script Startup

[Service]
Type=idle
ExecStart=/usr/local/bin/robotnix/robotnix.py

[Install]
WantedBy=multi-user.target

现在启用该服务以便在启动时发生

$ sudo systemctl enable robotnix.service

再次重新启动 Pi 以确保您的应用程序正在自动启动。

Pi 还是 Arduino?

它们都很小,它们都很强大,并且它们都用于电子爱好项目,但 Raspberry Pi 不是 Arduino。 但是,Pi 在紧急情况下可以很好地扮演这个角色。 也就是说,如果您还没有尝试过 Arduino 并且对它感到好奇,请不要害怕尝试。 它们都是您工具包中的好工具。 使用本文中的技巧,您可以将 Pi 用作未来 Arduino 项目的试验台,或者您可以在一个设备中获得两全其美的效果。

无论您最终在下一个硬件项目中使用什么,都要保持开放性和趣味性。

Seth Kenlon
Seth Kenlon 是一个 UNIX 极客、自由文化倡导者、独立多媒体艺术家以及 D&D 爱好者。他曾在电影和计算行业工作,而且常常是同时进行。

4 条评论

太酷了!我从来没听说过这个,但它看起来像一个非常不错的用于 Pi 的小型 GPL 操作系统。太棒了;我迫不及待地想尝试一下,即使我在 Pi 中实际上并不需要实时的精度...目前来说。我通常在启动时将我的 payload 应用程序作为 systemd 服务运行在 Pi 上,并删除大多数明显不必要的服务(dhcp、avahi、plymouth,以及其他一些,我想),这基本上对我有效,而且我还能获得 Linux 的熟悉性带来的好处。

但我肯定会为了好玩而尝试一下 ChibiOS,因为它看起来真的很酷,而且我想我最终会需要它的。再次感谢 ardweebno 的提示!

回复 作者:ardweebno (未验证)

你提到了 Arduino,但忘了提到 ESP8266,它是一个 80Mhz 的微控制器,包含用于 IoT 的 WiFi 芯片组,可以作为互联网客户端通信,也可以作为一个 nano 服务器!比 Arduino 还小,带有板载内存存储,可以用 C、LUA、BASIC 编程,非常便宜,只需 3 美元,可以进入睡眠或深度睡眠,可以进行 OTA 更新。

很高兴知道!谢谢。令人兴奋的是有这么多的选择。

回复 作者:Dodutils (未验证)

© . All rights reserved.