加速Perl

自从任天堂Wii运动控制器的推出以来,加速度计的普及率大幅提高。它们也常见于汽车和智能手机中。直到最近,Perl还没有出现在直接与加速度计接口有意义的地方。有了树莓派和其他SoC(系统芯片)设备,现在是时候纠正这个疏忽了。

市场上有很多加速度计,它们大致分为四种接口类型:模拟、SPI、I2C和串行。模拟读取非常简单,任何具有模数转换器的设备都可以读取,但同时也容易受到电噪声的影响。SPI和I2C是最常见的类型。

可以将加速度计与陀螺仪结合使用,以产生比单独使用任何一个更精确的读数。这就是Wii运动加力器为任天堂所做的工作。存在组合它们数据的算法,手动编写可能很棘手。幸运的是,有一种称为“惯性测量单元”(IMU)的设备,它会为您组合数据,并提供类似直接加速度计的接口。不幸的是,这些设备通常要贵得多。

如您从高中物理课程中所记得的,地球以约9.81 m/s2的加速度吸引着我们。放在平坦桌面上的加速度计将测量指向地球中心的加速度(更准确地说,是其重心)。在读取时请记住这一点。

加速度计通常具有几个可配置的测量范围。如果您将设备设置为读取±2g(即,2 * 9.81 m/s2),并且它以16位整数的形式返回数据,那么它将给出整个16位范围内的读数。如果您将其设置为±10g,则它仍然会在整个16位范围内给出读数。这意味着较高的设置会丢失精度。

因此,请确保将测量范围设置为略高于您预期的值。在赛道上行驶的跑车在任意方向上很难达到2g。大多数过山车最大为约4g,可能为6g。战斗机可以超过10g,这是人类在可维持期间的能力极限。请注意,任何这些情况中的瞬时加速度都可能极高;跑车撞击砖墙时很容易超过10g。

每个芯片都定义了自己的接口协议。这意味着需要为每个芯片编写新的接口驱动程序,而且很不幸,针对单个设备的CPAN模块并不多。一个存在的是Device::LSM303DLHC

所讨论的LSM303DLHC芯片还包含一个磁力计,并且可以从Adafruit Industries的 breakout板上获得。

Device::LSM303DLHC使用Linux下通过/dev/i2c-*访问I2C设备的方式。在树莓派上,GPIO引脚上的I2C引脚可在/dev/i2c-1处使用。Device::LSM303DLHC将此芯片的两个功能分为两个对象。您首先使用I2C路径初始化主对象,获取加速度计对象,并启用它

my $dev = Device::LSM303DLHC->new({
    I2CBusDevicePath => '/dev/i2c-1',
});
my $accel = $dev->Accelerometer;
$accel->enable;

$accel对象为我们提供了返回不同单位的加速度矢量的便捷方法。使用getAccelerationVectorInG(),我们获得g评级,而使用getAccelerationVecotrInMSS()则给出m/s2,以及其他一些内容。我喜欢使用g评级

while(1) {
    my $acc_angle = $accel->getAccelerationVectorInG;
    say "Accel: $$acc_angle{x}, $$acc_angle{y}, $$acc_angle{z}";
}

这将反复将加速度矢量输出到STDOUT

Accel: -0.0234375, -0.0078125, -0.9453125
Accel: -0.0234375, -0.0078125, -0.9453125
Accel: -0.015625, -0.01171875, -0.9453125
Accel: -0.015625, -0.01171875, -0.9453125
Accel: -0.015625, -0.00390625, -0.9453125
Accel: -0.015625, -0.00390625, -0.9453125

将 LSM303 芯片的平坦面放在桌子上,你应该看到 Z 输出大约为 1g,或者如果你把它倒置,可能是 -1g。其他输出应该约为零。拿起它并翻转,你应该看到 Z 输出指向零,而 X 和 Y 输出将 1g 矢量加到地球中心(加上或减去你手的摇晃)。

加速度计是你一旦开始使用它们,就会发现成千上万有趣事情的东西之一。所以去享受乐趣吧!


本文最初发布在 PerlTricks.com

标签

蒂姆·默里

蒂姆·默里是一位 Perl 程序员和硬件专家。他是事实上的标准 Perl 飞行库 UAV::Pilot 的创造者。他经常在 博客 上写关于 Perl 和硬件黑客的内容。

浏览他们的文章

反馈

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