由于 Raspberry Pi 树莓派 体积小、功耗低,因此在电子爱好者和教育工作者中都非常受欢迎。因此,它与“创客”圈子联系在一起,有时 Arduino(以及 Arduino 风格的嵌入式微控制器)和树莓派之间的界限变得模糊。
事实上,Raspberry Pi 和 Arduino 是非常不同的设备,即使它们经常在同一个工作台上看到。对于某些项目,Arduino 非常有意义,但对于其他项目,树莓派实际上可能是更好的选择(例如,如果您要触发复杂的多媒体事件)。但是,如果您期望树莓派成为 Arduino 的直接替代品,您会感到惊讶的。我曾在不同的手工项目中同时使用过 Arduino 和树莓派,有时是因为一个明显比另一个是正确的选择,有时仅仅是因为我手头有一个而不是另一个。如果您习惯了 Arduino(或者如果您只是阅读了很多关于它的内容,但不清楚它与树莓派有何不同),那么以下是我发现的使树莓派更像嵌入式微控制器而不是迷你 PC 的额外步骤。
GPIO
人们首先了解 Arduino 的事情之一是,除非您有东西连接到它,否则它不是很有用;您需要输入传感器和输出设备,否则您就是在编程一个没有任何东西可以控制的微控制器。树莓派则截然相反;它所做的很多事情都可以完全基于软件,因此连接外部电子设备的趋势不太常见。但这并非必须如此。
Raspberry Pi 有许多 GPIO 引脚(确切数量取决于型号),可以检测输入或发送输出信号。与 Arduino 不同,所有这些引脚都是数字 IO,这意味着它们知道两种状态:开和关。大多数 Arduino 板也有模拟引脚,可以检测程度状态,其实际应用是能够连接温度传感器、光传感器或用于任意输入的电位器等。
只要您可以使用二进制输入和输出,树莓派的 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 的开销,Python 需要定期在后台执行内存管理任务,即使是 WiringPi 也受 Linux 内核调度决策的约束。在实践中,除非您正在构建一个至关重要地依赖于实时性能的设备,否则这可能实际上并不重要。在为一个基于树莓派的多媒体项目做准备时,我确实做了一些测试,试图通过安全限制来提高性能,但它们都失败了(我从未深入到重新编译内核,所以这没有帮助)。最终我发现,该项目——一个受不可预测的输入影响并且确实需要某种瞬时响应的音乐界面——从未错过任何节拍,但您的结果可能会因您的项目而异。
启动时启动
由于 Arduino 是一个嵌入式系统,您刷入其芯片的程序始终在运行。您打开 Arduino 的电源,您的程序就会运行,不断循环,直到断电为止。树莓派不是这样。当您为树莓派供电时,它会加载一个操作系统,然后耐心地等待您登录或执行某些操作。
如果您需要嵌入式行为,您需要基本上告诉树莓派在启动时自动启动应用程序。更好的是,您可以剥离您不需要的进程,以便启动时间更快。您不必以这种方式执行此操作(您可以只将树莓派的桌面设置为自动登录,然后设置一个启动应用程序),但是如果您将树莓派视为伪嵌入式设备并且不需要桌面,为什么要使用资源来运行桌面呢?为什么要引入一个变量,要知道,在演示您的酷炫新机器人(或您正在构建的任何东西)方面,任何可能出错的事情都会出错?
要使树莓派表现得像嵌入式操作系统一样,首先要剥离您不需要的服务。这些服务是什么取决于您的项目。如果您的项目不需要网络,则禁用网络服务。如果您的项目不需要图形界面,请从您的系统中删除 X11 软件包。查看启动时运行的服务,并尽可能多地禁用。
您还需要树莓派自动登录。如何实现这一点取决于您正在运行的树莓派发行版。
不使用 Systemd
大多数现代树莓派发行版都使用 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 作为默认用户,但您可能创建了一个新用户;如果您不确定,请使用 whoami 查找您的用户名。
在您进行更改后,重新启动以确保它有效。树莓派应启动到 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 方法不同。
重新启动您的树莓派以测试自动登录。
假设自动登录按预期工作(树莓派应启动到 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
再次重新启动树莓派,以确保您的应用程序正在自动启动。
树莓派还是 Arduino?
它们都很小巧、功能强大,并且都被用于电子爱好项目,但 Raspberry Pi 不是 Arduino。但是,树莓派可以在紧急情况下很好地扮演这个角色。也就是说,如果您还没有尝试过 Arduino 并且对此感到好奇,请不要害怕尝试。它们都是您工具包中的好工具。使用本文中的技巧,您可以将树莓派用作未来 Arduino 项目的试验台,或者您可以将两者的优点集于一身。
无论您最终在下一个硬件项目中使用什么,都保持开源,并保持乐趣。
4 条评论