本项目所用的 TS-7680 开发板搭载 MMA8451 三轴加速度计芯片,Linux 支持该芯片通过轮询驱动。不幸的是,这种轮询架构严重限制了采样率。在实践中,它每秒产生20-30个样本,即使在最高的轮询速率下,与芯片能够达到的800 Hz的原始速率相比也是如此。使用像泰诺系统公司设计的定制驱动器可以实现更高的采样率。但是,对于我们的目的,低采样率就足够了。
TS-7680 上的默认磁盘区目前并未编译 MMA8451 芯片支持。虽然版本将载入日后,但该内核必须先编译并安装于主板上 TS-7680 使用手册中的说明。
注意:加速度计是威廉希尔官方网站 板选项。如果您的开发板上没有加速度计,您仍然可以运行此演示。但是,您需要从 中删除或注释掉以下行:ts7680-demo-server.js
.API(“mma8451”)
如果您的内核不支持加速计,则这样做尤其重要,因为缺少某些文件将导致服务器终止。
设置加速度计
加速度计可以通过/特殊文件访问。每次读取此文件都将返回整数个事件,因此无需设置某种状态机来处理部分数据返回。但是,每个加速度计示例通常由至少 4 个事件组成:一个事件用于加速度计的每个轴,另一个表示数据已完成。
在实现中只有三个函数。第一个要查看的变量被分配给变量,该变量在包首次初始化时被调用。该函数将从检查选项开始。如果有字符串选项,则该选项将用作终结点,而不是默认终结点:
接下来,我们向日志发送一条消息,指示已输入服务。虽然日志记录框架已经记录了调用方的 IP 地址和 URL,但这是指示请求路由正确的附加信息。
之后,需要初始化加速度计。可以通过将 值 写入 sys 文件系统中的相应文件来启用加速度计:1
轮询周期应设置为 10 毫秒。这是我们可用于此内核的最小值。
比例因子应设置为 +/-2 gs,或最多 2 gs (19.62 m/s^2),方法是写入值 。如果需要更高的加速度范围,但以较低的分辨率为代价,则可以将其设置为更高的值,例如+/-4 gs(通过写入)或+/-8 gs(通过写入)。
最后,调用快速应用,通过调用函数来响应来自终结点的 GET 请求。将参数附加到提供的基本终结点 – express 会将提供的名称转换为传递给我们的服务函数的请求对象中“param”对象中的键:
现在将调用该函数来处理以“”开头的任何URL或选项中传递的任何端点上对加速度计数据的HTTP请求。将接受此字符串之后的 URL 中的任何其他字符,从而允许传递参数。处理程序的函数原型看起来与其他快速处理程序类似,采用请求对象 () 和响应对象 ()。
处理加速度计数据的 HTTP 请求
在函数中要做的第一件事是将参数解释为一个数字 - 这是加速度计将被采样的毫秒数。健全性检查此值,允许任何正时间最多一小时。在实践中,这么长的采样时间可能没有用,但我们必须在某个地方画线:
此时,我们致力于将加速计值发送到客户端,因此请继续写出 HTTP 标头。
我们将发送纯文本,每行一个样本,其中逗号分隔时间值(自 Epoch 以来的毫秒数),x、y 和 z 轴值作为原始加速度计报告的整数。要开始采样,需要调用该函数,该函数采用回调函数,每当收到样本时,它将向该函数传递时间,x,y和z值。将这些值直接写入响应数据:listen
这存储了变量中的返回值。返回值是一个包含名为 的函数的对象,当调用该函数时将终止采样过程。调用 setTimeout 以客户端指定的毫秒数接收回调,并在收到时调用 stop 函数,然后结束对客户端的响应:
现在进入函数,其中发生了流式传输数据并将其转换为示例的实际工作。
流式处理和采样加速度计数据
首先,声明一些局部变量:
该变量将保存事件文件的文件描述符。、 、 和 变量将保存每个样本的分量,直到它们准备好发送给调用方。该变量保存输入流的当前状态(每个样本作为多个事件发送,并且此变量将跟踪何时收到整个样本)。最后,该变量将保存返回值,该值将是一个包含停止采样过程的函数的对象。fdxyztstateret
首先打开事件设备文件。完成此操作后,加速度计将开始采集样本。
每当采集样本时,都会收到多个事件。Node.js将负责在数据可用时自动读取数据,因此请设置回调以接受此数据并对其进行处理:
该参数将是包含从文件中读取的数据的缓冲区。首先要做的是从块中读取事件。每个事件的长度为 16 个字节。在 C 中,事件的结构如下所示:chunk
来自事件设备的数据将始终以 16 字节的倍数提供,因此不需要特殊的逻辑来处理部分事件。下面是处理事件数据块的代码:
while 循环让我们一直阅读,只要至少剩下一个数据块。索引变量 用于跟踪接下来要处理的块中的偏移量。Buffer 函数,用于从缓冲区中的指定偏移量以小字节序格式读取 16 位和 32 位整数。
读取事件后,前进索引。然后检查事件是否为3,表示存在示例元素;如果是,请查看代码以确定它是示例的 x、y 或 z 轴部分。type
请注意,时间在每个事件中都是冗余的,并且对于同一示例的所有部分应该相同,因此可以直接使用来自事件的值。当收到事件 0, 0 时,这表示示例已完成。但是,您可以使用该变量来跟踪已记录的样本的哪些部分,并且仅当已收到所有部分时才发送样本。通常,只有在样本中间开始读取事件(实际上确实发生)时,才会遗漏样本的某些部分。typecodestate
最后,在设置函数以处理从内核流式传输的样本后,使用该函数设置返回值对象,这会关闭文件描述符以停止流式处理。
在下一期中,我们将介绍如何实现对模数转换器 (ADC) 的支持。
审核编辑:郭婷
全部0条评论
快来发表一下你的评论吧 !