在 Raspberry Pi 上开始使用 Perl

我们都可以自由选择要在 Raspberry Pi 上运行的程序。
483 位读者喜欢这篇文章。
How to configure Raspberry Pi as a microcontroller

Opensource.com

最近我在 SVPerl (硅谷 Perl) 谈论 Raspberry Pi 上的 Perl 时,有人问:“我听说 Raspberry Pi 应该使用 Python。是这样吗?” 我很高兴他提出了这个问题,因为这是一个常见的误解。 Raspberry Pi 可以运行任何语言。 Perl、Python 和其他语言都是 Raspbian Linux(该板的官方软件)的初始安装的一部分。

这个神话的起源很简单。 Raspberry Pi 的创建者,英国计算机科学教授 Eben Upton 讲过这样一个故事,“Pi”这个名字的意思是听起来像 Python,因为他喜欢这门语言。 他选择它作为他强调孩子们学习编码的方式。 但是他和他的团队制造了一台通用计算机。 Raspberry Pi 上的开源软件对我们没有任何限制。 我们都可以自由选择要运行的程序,并将每个 Raspberry Pi 都变成我们自己的。

我在 SVPerl 的演讲和本文的第二点是介绍我的 “PiFlash” 脚本。 它是用 Perl 编写的,但不需要任何 Perl 知识就可以自动化从 Linux 系统为 Raspberry Pi 刷写 SD 卡的任务。 它为初学者提供了安全性,因此他们不会在尝试刷写 SD 卡时意外擦除硬盘驱动器。 它为高级用户提供自动化和便利,包括我自己,这也是我编写它的原因。 Windows 和 Mac 已经存在类似的工具,但 Raspberry Pi 网站上的说明奇怪地没有为 Linux 用户提供自动化工具。 现在有一个了。

开源软件有着悠久的传统,新的项目开始是因为作者想要 “挠自己的痒处”,或者解决他们自己的问题。 这就是 Eric S. Raymond 在他 1997 年的论文和 1999 年的著作 “教堂与集市” 中描述的,它定义了开源软件开发方法。 我编写 PiFlash 是为了满足像我这样的 Linux 用户的需求。

可下载的系统镜像

设置 Raspberry Pi 时,您首先需要为其下载操作系统。 我们称之为 “系统镜像” 文件。 将其下载到您的台式机、笔记本电脑,甚至另一个 Raspberry Pi 后,您必须将其写入或 “刷写” 到 SD 卡。 这些细节已经在网上介绍过了。 手动操作可能有点棘手,因为将系统镜像放在整个 SD 卡上而不是分区上很重要。 系统镜像实际上将包含至少一个它自己的分区,因为 Raspberry Pi 的启动过程需要一个 FAT32 文件系统分区才能启动。 启动分区之后的其他分区可以是操作系统内核支持的任何文件系统类型。

在 Raspberry Pi 上的大多数情况下,我们运行的是带有 Linux 内核的发行版。 以下是您可以为 Raspberry Pi 下载的常见系统镜像列表(但没有任何东西可以阻止您从头开始构建自己的镜像)。

来自 Raspberry Pi 基金会的  “NOOBS”  系统是他们推荐给新用户的系统。 它代表 “New Out of the Box System(开箱即用系统)”。 显然,它的目的是听起来像术语 “noob”,是 “newbie(新手)” 的缩写。 NOOBS 启动一个基于 Raspbian 的 Linux 系统,该系统会显示一个菜单,您可以使用该菜单自动下载并在 Raspberry Pi 上安装其他几个系统镜像。

Raspbian Linux 是专门为 Raspberry Pi 定制的 Debian Linux。 它是 Raspberry Pi 的官方 Linux 发行版,由 Raspberry Pi 基金会维护。 几乎所有 Raspberry Pi 软件和驱动程序都从 Raspbian 开始,然后再转移到其他 Linux 发行版。 它可以在所有型号的 Raspberry Pi 上运行。 默认安装包括 Perl。

Ubuntu Linux(以及社区版 Ubuntu MATE)将 Raspberry Pi 作为其 ARM (Advanced RISC Machines) 处理器支持的平台之一。[RISC (精简指令集计算机) 架构] Ubuntu 是 Debian Linux 的一个商业支持的开源变体,因此它的软件以 DEB 软件包的形式提供。 包括 Perl。 它仅适用于带有 32 位 ARM7 和 64 位 ARM8 处理器的 Raspberry Pi 2 和 3 型号。 Raspberry Pi 1 和 Zero 的 ARM6 处理器从未受到 Ubuntu 构建过程的支持。

Fedora Linux 从 Fedora 25 开始支持 Raspberry Pi 2 和 3。 Fedora 是与 Red Hat 相关的开源项目。 Fedora 作为商业 RHEL(Red Hat Enterprise Linux)添加商业软件包和支持的基础,因此它的软件以 RPM(Red Hat Package Manager)软件包的形式提供,就像所有 Red Hat 兼容的 Linux 发行版一样。 和其他的发行版一样,它也包括 Perl。

RISC OS 是专为 ARM 处理器制作的单用户操作系统。 如果您想尝试比 Linux 更紧凑的小型桌面(由于功能较少),这是一个不错的选择。 Perl 可以在 RISC OS 上运行。

RaspBSD 是 FreeBSD 的 Raspberry Pi 发行版。 它是一个基于 Unix 的系统,但不是 Linux。 作为一个开源 Unix,形式服从功能,它与 Linux 有许多相似之处,包括操作系统环境由一组类似的开源软件包组成,包括 Perl。

OSMC(开源媒体中心)和 LibreElec 是电视娱乐中心系统。 它们都基于在 Linux 内核上运行的 Kodi 娱乐中心。 这是一个非常紧凑和专业的 Linux 系统,所以不要期望在它上面找到 Perl。

微软 Windows IoT Core 是一个新的进入者,它仅在 Raspberry Pi 3 上运行。 您需要 Microsoft 开发人员访问权限才能下载它,因此作为 Linux 极客,这阻止了我查看它。 我的 PiFlash 脚本不支持它,但如果您正在寻找它,它就在那里。

PiFlash 脚本

如果您查看 Raspberry Pi 的 SD 卡刷写说明,您会看到从 Windows 或 Mac 执行此操作的说明包括下载一个工具来写入 SD 卡。 但是对于 Linux 系统,它是一组手动操作的说明。 我已经手动执行此过程很多次了,这触发了我的软件开发人员的直觉来自动化该过程,这就是 PiFlash 脚本的由来。 这很棘手,因为 Linux 系统可以通过多种方式进行设置,但它们都基于 Linux 内核。

我一直认为手动操作的最大潜在错误之一是意外擦除错误的设备,而不是 SD 卡,并销毁我想要保留的硬盘驱动器上的数据。 在我在 SVPerl 的演讲中,我很惊讶地发现听众中有人犯了那个错误(并且不害怕承认)。 因此,PiFlash 脚本的用途之一,通过拒绝擦除非 SD 卡的设备来为新用户提供安全性,比我预期的更为必要。 PiFlash 还会拒绝覆盖包含已挂载文件系统的设备。

对于包括我在内的有经验的用户,PiFlash 脚本提供了自动化的便利。 下载系统镜像后,我不必解压缩它或从 zip 存档中提取系统镜像。 PiFlash 将从它所在的任何格式中提取它,并直接刷写 SD 卡。

我将 PiFlash 及其说明 发布在 GitHub 上。

它是一个具有以下用法的命令行工具

piflash [--verbose] input-file output-device

piflash [--verbose] --SDsearch

input-file 参数是系统镜像文件,无论您从 Raspberry Pi 软件分发站点下载了什么。 output-device 参数是要写入的 SD 卡的块设备的路径。

或者,使用 --SDsearch 来打印系统上 SD 卡的设备名称列表。

可选的 --verbose 参数对于打印出程序的所有状态数据非常有用,以防您需要寻求帮助、提交错误报告或自行解决问题。 这就是我用来开发它的。

使用该脚本的此示例将 Raspbian 镜像(仍在其 zip 存档中)写入位于 /dev/mmcblk0 的 SD 卡

piflash 2016-11-25-raspbian-jessie.img.zip /dev/mmcblk0

如果您指定了 /dev/mmcblk0p1(SD 卡上的第一个分区),它将识别出分区不是正确的位置,并拒绝写入它。

一个棘手的方面是识别在各种 Linux 系统上哪些设备是 SD 卡。mmcblk0 的例子来自我笔记本电脑上基于 PCI 的 SD 卡接口。如果我使用 USB SD 卡接口,它将是 /dev/sdb,这更难与许多系统上存在的硬盘驱动器区分开来。但是,只有少数 Linux 块驱动程序支持 SD 卡。PiFlash 会检查这两种情况下的块设备的参数。如果所有其他方法都失败了,它将接受可写、可移动且具有适合 SD 卡的物理扇区计数的 USB 驱动器。

我认为这涵盖了大多数情况。但是,如果您有我没有见过的其他 SD 卡接口怎么办?我想听到你的来信。请包含 --verbose --SDsearch 输出,以便我可以看到它尝试时系统上存在的环境。理想情况下,如果 PiFlash 脚本得到广泛使用,我们应该围绕维护它建立一个开源社区,为尽可能多的 Raspberry Pi 用户服务。

用于 Raspberry Pi 的 CPAN 模块

CPAN 是 Comprehensive Perl Archive Network(综合 Perl 档案网络),一个全球性的下载镜像网络,其中包含大量的 Perl 模块。它们全部都是开源的。多年来,CPAN 上大量的模块一直是 Perl 的巨大优势。对于成千上万的任务,无需重新发明轮子,您可以直接使用别人已经发布的代码,然后在您有了新的东西后提交您自己的代码。

由于 Raspberry Pi 是一个完整的 Linux 系统,因此大多数 CPAN 模块都可以在其上正常运行,但我将重点介绍一些专门用于 Raspberry Pi 硬件的模块。这些通常用于嵌入式系统项目,如测量、控制或机器人技术。您可以通过其 GPIO(通用输入/输出)引脚将 Raspberry Pi 连接到外部电子设备。

专门用于访问 Raspberry Pi 的 GPIO 引脚的模块包括 Device::SMBus, Device::I2C, Rpi::PIGPIO, Rpi::SPI, Rpi::WiringPi, Device::WebIO::RaspberryPiDevice::PiGlow. 具有 Raspberry Pi 支持的其他嵌入式系统的模块包括 UAV::Pilot::Wumpus::Server::Backend::RaspberryPiI2C, RPi::DHT11 (温度/湿度), RPi::HCSR04 (超声波), App::RPi::EnvUI (植物生长灯),  RPi::DigiPot::MCP4XXXX (电位器), RPi::ADC::ADS (A/D 转换), Device::PaPiRusDevice::BCM2835::Timer (板载定时器芯片)。

示例

以下是一些您可以使用 Perl 在 Raspberry Pi 上执行的操作示例。

示例 1:使用 PiFlash 刷写 OSMC 并播放视频

在此示例中,您将练习设置和运行使用 OSMC(开源媒体中心)的 Raspberry Pi。

  • 转到 RaspberryPi.Org。在下载区域,获取 OSMC 的最新版本。
  • 将空白 SD 卡插入您的 Linux 桌面或笔记本电脑。Raspberry Pi 1 使用全尺寸 SD 卡。其他所有设备都使用 microSD 卡,可能需要一个通用的适配器来插入它。
  • 在插入 SD 卡前后检查“cat /proc/partitions”,以查看系统为其分配的设备名称。它可能是 /dev/mmcblk0/dev/sdb 之类的东西。在看起来像这样的命令中,替换您正确的系统映像文件和输出设备

           piflash OSMC_TGT_rbp2_20170210.img.gz /dev/mmcblk0

  • 弹出 SD 卡。将其放入 Raspberry Pi 中,并将其连接到 HDMI 监视器启动。
  • 在 OSMC 设置时,获取一个 USB 存储棒,并将一些视频放入其中。为了演示的目的,我建议使用“youtube-dl”程序下载两个视频。运行“youtube-dl OHF2xDrq8dY”(彭博社关于英国科技(包括 Raspberry Pi)的“Hello World”一集)和“youtube-dl nAvZMgXbE9c”(CNet 的前 5 名 Raspberry Pi 项目)。将它们移动到 USB 存储棒,然后卸载并移除它。
  • 将 USB 存储棒插入 OSMC Raspberry Pi。按照“视频”菜单进入外部设备。
  • 当您可以在 Raspberry Pi 上播放视频时,您已经完成了练习。玩得开心。

示例 2:一个从目录播放随机视频的脚本

此示例使用一个脚本来随机播放 Raspberry Pi 上目录中的视频。根据视频及其安装位置,这可能是一个信息亭显示器。我编写它来在使用室内锻炼设备时显示视频。

  • 设置一个 Raspberry Pi 以启动 Raspbian Linux。将其连接到 HDMI 监视器。
  • 从 GitHub 下载我的 "do-video" 脚本,并将其放在 Raspberry Pi 上。
  • 按照页面上的安装说明进行操作。主要的事情是安装 omxplayer 软件包,它使用 Raspberry Pi 的硬件视频加速平滑地播放视频。
  • 将一些视频放入主目录下的名为 Videos 的目录中。
  • 运行“do-video”,视频应该开始播放。

示例 3:读取 GPS 数据的脚本

此示例更高级且是可选的,但它展示了 Perl 如何从外部设备读取数据。在我之前示例中 GitHub 上的“Perl on Pi”页面上,还有一个 gps-read.pl 脚本。它通过串口从 GPS 读取 NMEA(美国国家海洋电子协会)数据。该页面上有说明,包括我从 AdaFruit Industries 购买的用于构建它的零件,但可以使用任何输出 NMEA 数据的 GPS。

通过这些任务,我已经证明了您确实可以在 Raspberry Pi 上使用 Perl 以及任何其他语言。希望你喜欢它。

User profile image.
自小学以来,伊恩对计算和飞行都有着并行的兴趣。他在 Linux 出现之前就在 Unix 上进行编码,并在内核发布 6 个月后开始使用 Linux。他拥有计算机科学硕士学位,并且是 CSSLP(认证安全软件生命周期专业人员)。另一方面,他是一名飞行员和一名认证的飞行教员。

3 条评论

感谢这篇文章。我想真正的问题在于,在年轻的编程社区、教育部门、行业等中普遍存在一种风气,倾向于使用 python 和 go 和 rust 等新语言进行编码。我们这些喜欢 Perl 的多功能性而无需开销的老家伙们人数较少,但很高兴仍然支持这种优秀的语言在 pi 等设备上使用。

谢谢。让我试着鼓励你一下。我在硅谷的 Perl 社区的经验表明,各个年龄段的人仍然选择学习 Perl,无论是出于专业原因还是个人原因。现在每个人都人数较少,因为没有占多数的编程语言。不要听负面消息,因为现在泼脏水太容易了 - 但没有人占据制高点。编程语言就像工具箱中的工具一样,无论如何,拥有多个工具是有用的。因此,宽容是一件好事,就像生活中的许多事情一样。对于任何给定的语言,最重要的是它具有持续的开发和一个对您有用的特性/库集。Perl 具有持续的开发和一个活跃的开源社区,该社区仍然是其他人模仿的典范。由于 Larry Wall 作为语言学家的背景,由于 Perl 在“做一件事有不止一种方法”的理念下组装特性,因此存在一种特定的风格和陡峭的学习曲线。但是,结果似乎能创造奇迹的能力仍然说明了问题。享受吧!

回复 通过 Connie (未验证)

感谢这篇文章,但我想知道是否有使用 perl 的 pi 相机视频通过 wifi 流式传输的示例,以及是否有 Pi 相机的库

知识共享许可协议本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.