Rock Pi S评测

在撰写这类文章时,不可避免地会与树莓派系列进行比较。这是无法避免的,也是出于很好的原因。第一代树莓派引领了一大批单板计算机(SBC),其中之一就是来自Seeed Studio的Rock Pi S,这是一款新板。

为了完全公开,Rock Pi S是由Seeed Studio提供的,以供本次评测。具体来说,是具有512MB RAM和4Gb内置闪存的型号。

Rock Pi S与树莓派Zero系列在同一细分市场中竞争,尤其是内置WiFi的Zero W。它的外形不同;Zero的形状像一支棒棒糖,而Rock Pi S更接近于方形。Rock还配备USB-C电源接口、以太网插孔和USB-A端口。根据项目需求,它可能比Zero便宜,因为你不需要购买micro-USB到USB-A适配器来连接大多数其他设备。

你仍然需要一个micro SD卡。虽然Rock有内置闪存版本,但容量较小,不适合启动操作系统。请注意,内置闪存的容量以吉比特(giga bits)为单位。4Gb版本实际上是512兆字节(mega bytes)。所以请获取一张SD卡。

这让我们提出了一个问题:哪种SD卡。有些人会自动选择10类或UHS-I卡,因为那些卡在性能上是最高的。问题是,SD卡的传统类别评级只能告诉你顺序读/写性能。这对相机来说很好,但运行操作系统意味着大量的随机读取。测试通常显示,一个好的4类卡比许多10类卡要好。

如今,我们不必担心这个问题,因为SD卡协会提出了应用性能类别 A1和A2。这些设定了每秒的最小随机I/O操作次数,这正是我们所需要的。所以选择一张A1卡,你会对结果感到满意。

Rock的亮点是一个四核ARM处理器。虽然它不可能创造任何比特币挖矿记录,但我发现多核处理器对硬件项目很有用。在单个核心处理器上运行Linux时,你的程序可能会被其他事情中断。这意味着一个仅运行在16MHz的Arduino程序可能比1GHz的树莓派运行得更好。四核处理器可以缓解这个问题,因为次要程序有三个其他核心可以工作。

The Rock Pi S

Rock通过USB-C端口供电。我发现将其连接到笔记本电脑的USB端口提供了足够的电力来启动。这也很有用,因为你可以使用adb shell连接到Rock的操作系统。“ADB”是Android调试桥,虽然Rock支持运行Android,但我使用了Ubuntu Bionic镜像。是的,adb仍然与Ubuntu兼容。这对于无头安装来说很棒,因为首次启动时没有网络可用。

由于它运行的是Ubuntu,所以我们从一开始就有perl

$ perl -v:

This is perl 5, version 26, subversion 1 (v5.26.1) built for aarch64-linux-gnu-thread-multi
(with 67 registered patches, see perl -V for more detail)
...

你不会拥有的,是RPi::WiringPi的等价物来控制GPIO(“通用输入/输出”)。GPIO是硬件编程的最基本构建块。我们不是控制输出电压以使某些事情发生,例如LED闪烁,就是获取输入以查看是否发生了某些事情,例如按下开关。这很简单,但非常有用。许多硬件项目都归结为检查某物是否打开,或者打开某物。

我们缺少的是在Rock Pi S上执行该功能的库。没关系,因为它是Linux系统,Linux提供了简单的sysfs接口来访问GPIO引脚。只要该板上有GPIO驱动程序,您就可以控制这些引脚。

Rock Pi有两个引脚,其中一个标有颜色编码,包含您在大多数项目中想要工作的主要引脚。请注意,根据您获得的板子的版本,引脚布局可能有一些变化。版本应打印在板上(我收到的是V12板),所以请确保您查看的是您板子的正确引脚布局。请参阅GPIO引脚文档

需要记住的一点是,引脚被指定为3.3V输入。这意味着您不希望向其提供5V。提供5V可能会导致故障,甚至可能完全损坏板子。

要访问引脚,我们可以使用Linux sysfs接口。您会在顶部看到一个巨大的弃用警告。新方法是使用gpio-cdev,它需要一些ioctl()调用。由于这更难处理——它需要从内核头文件中导入一些常量,而不是直接访问文件——我们目前仍然坚持使用sysfs接口。尽管如此,如果有人愿意制作一个CPAN模块来提供这些内核符号(以及可能还有I2C和SPI的符号),我会欢迎。

以下是我们需要做的

  • 通过将引脚号写入/sys/class/gpio/export来使引脚可访问
  • 通过将“in”写入/sys/class/gpioN/direction将引脚设置为输入引脚(其中N是引脚号)
  • /sys/class/gpioN/value读取当前值
  • 由于上拉电阻是激活的,未连接的引脚将输出1,而将其连接到地时将给出0

您可以从地线引脚连接一根线到选定的引脚,输出值应从1变为0。

您可能想知道为什么这是反向的;您不是希望当有东西连接时看到1吗?原因是上拉电阻。如果一个引脚未连接,它将倾向于“浮动”,从周围的电子设备中获取干扰。这会导致得到随机的0和1。如果您相反地连接一个连接到高电压的电阻,您在引脚上会持续得到1。然后,如果将那个引脚连接到地,它将看到0。我们只需记住,整个系统与我们通常期望的相反——断开连接时为1,连接时为0。

完整的程序在文章的末尾。export_pinset_input函数都接受一个引脚号,并请求内核将其导出以供使用或设置为输入(分别)。read_pin函数接受一个引脚并返回其当前值(1或0)。write_pin函数只是其他函数的文件I/O辅助函数。

在最下面是包装所有这些内容的代码。我们导出从命令行传入的引脚,将其设置为输入,然后在一个循环中读取引脚。通过输出“\r”,在终端中覆盖之前打印的值,而不是有一个长字符串的值。由于我们使用的是Time::HiRes版本的sleep,我们可以使用浮点秒来减慢输出速度,而不会太慢。

我已经期待这样的板子一段时间了,它集成了多核处理器、网络、全尺寸USB插孔,并且以低于20美元的价格运行Linux。这可能是新宠。

#!perl
use v5.26;
use warnings;
use Time::HiRes 'sleep';

use constant BASE_PATH => '/sys/class/gpio';
use constant SLEEP_TIME => 0.1;


my $GPIO = shift or usage();
$GPIO =~ /\A\d+\z/ or usage();



sub set_input
{
    my ($pin) = @_;
    return write_pin( '/gpio' . $pin . '/direction', "in" );
}

sub export_pin
{
    my ($pin) = @_;
    return write_pin( '/export', $pin );
}

sub read_pin
{
    my ($pin) = @_;
    my $full_path = BASE_PATH . '/gpio' . $pin . '/value';
    open( my $in, '<', $full_path )
        or die "Can't read from $full_path: $!\n";
    
    my $data = '';
    while( my $line = <$in> ) {
        $data .= $line;
    }

    close( $in );
    return $data;
}

sub write_pin
{
    my ($path, $data) = @_;
    my $full_path = BASE_PATH . $path;
    open( my $out, '>', $full_path )
        or die "Can't write to $full_path: $!\n";
    print $out "$data";
    close $out;
    return;
}

sub usage
{
    die "Usage: rockpi_gpio.pl <pin number>\n";
}


export_pin( $GPIO );
set_input( $GPIO );
$| = 1; # Autoflush output
while( 1 ) {
    my $in = read_pin( $GPIO );
    chomp $in;
    print "$in\r";
    sleep SLEEP_TIME;
}

标签

蒂姆·默里

蒂姆·默里是一位Perl程序员和硬件专家。他是UAV::Pilot的创造者,该库是事实上的Perl无人机库标准。他经常博客关于Perl和硬件黑客技术。

浏览他们的文章

反馈

这篇文章有什么问题吗?通过在GitHub上打开一个issue或pull request来帮助我们。