三轴加速度计MMA8451和TS-7680开发板的应用

描述

  本项目所用的 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) 的支持。

  审核编辑:郭婷

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分