65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 3 轴数字加速度计在 Intel Edison 中进行 IoT 手势识别

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.82/5 (5投票s)

2016年8月7日

CPOL

3分钟阅读

viewsIcon

13056

这是一篇关于使用英特尔 Edison 检测向上、向下、向右和向左手势,并通过 Mqtt 发送的短文。

引言

加速度计是测量正确加速度的设备。正确加速度并非任何移动物体的 3 坐标轴值(速度变化率)。加速度计将测量由于地球引力产生的加速度,直接指向 g=9.81m/s2。加速度计在科学和工业中有各种应用。灵敏的加速度计用于飞机和导弹的导航系统。它还可以测量旋转物体的振动。

在这项工作中,我使用加速度计来查找任何移动物体的向上、向下、向左和向右手势。为了在英特尔 Edison 板上实现它,我使用了 MMA7660 3 轴数字加速度计 Grooove 连接器。您需要将该设备连接到英特尔 Edison 板的 Grove 连接器的 I2C 端口。

以下是英特尔 Edison 板 Grove 连接器上的硬件(数字加速度计)连接

                        图:带英特尔 Edison 板的加速度计

 

使用代码

它为 x、y 和 z 轴的不同手势生成不同的加速度值。通过这些值,您可以识别手势。这些值不是恒定的,但大多数情况下对于一个手势(例如左手势)它会生成相同的值,例如 x=0 y=1 z=1。我使用 javascript (node.js) 来实现上述概念。这是以下代码。

var mqtt=require('mqtt');
var client  = mqtt.connect('mqtt://iot.eclipse.org');
var topic='rupam/edison/gesture';

var digitalAccelerometer = require('jsupm_mma7660');

var myDigitalAccelerometer = new digitalAccelerometer.MMA7660(

 digitalAccelerometer.MMA7660_I2C_BUS,

digitalAccelerometer.MMA7660_DEFAULT_I2C_ADDR);

myDigitalAccelerometer.setModeStandby();

myDigitalAccelerometer.setSampleRate(digitalAccelerometer.MMA7660.AUTOSLEEP_64);

myDigitalAccelerometer.setModeActive();

var ax, ay, az;

ax = digitalAccelerometer.new_floatp();

ay = digitalAccelerometer.new_floatp();

az = digitalAccelerometer.new_floatp();

var outputStr;

var myInterval = setInterval(function()

{

myDigitalAccelerometer.getAcceleration(ax, ay, az);

outputStr = "Acceleration: x = "

+ roundNum(digitalAccelerometer.floatp_value(ax), 6)

+ " y = " + roundNum(digitalAccelerometer.floatp_value(ay), 6)

+ " z = " + roundNum(digitalAccelerometer.floatp_value(az), 6);

console.log(outputStr);

if(x==1 && y==0 && z==1)
{

console.log(“Up…………….”);
client.publish(topic, 'UP');
}

if(x==1 && y==0 && z==0)
{
console.log(“down…………...”);
client.publish(topic, 'DOWN');
}
if(x==0 && y==0 && z==1)
{
console.log(“Straight……………..”);
client.publish(topic, 'STRAIGHT');

}
if(x==0 && y==1 && z==1)
{
console.log(“left……………...”);
client.publish(topic, 'LEFT');
}
if(x==1 && y==1 && z==1)
{
console.log(“right………….”);
client.publish(topic, 'RIGHT');
}

},500);

//to display the acceleration upto a certain decimal places

function roundNum(num, decimalPlaces)

{

var extraNum = (1 / (Math.pow(10, decimalPlaces) * 1000));

return (Math.round((num + extraNum)

* (Math.pow(10, decimalPlaces))) / Math.pow(10, decimalPlaces));

}

代码基于片段 这里。

在上面的代码中,使用了用于 MMA7660 I2C 3 轴数字加速度计的 UPM 模块。模块名称是 jsupm_mma7660,用于 3 轴数字加速度计。在 I2C 总线 0 上实例化一个 MMA7660,并使用 setModeStandby() 方法将设备置于待机模式,以便我们可以写入寄存器。启用每秒 64 个采样,并使用 setModeActive() 方法将设备置于活动模式。我声明了一个函数 setInterval 来获取 x 轴、y 轴和 z 轴的正确加速度。这些值用于识别手势。

以下是输出

这是直线位置

                  图:直线位置

该位置在终端上识别如下

为了识别向上的手势,硬件位置将放置如下

                                     图:向上手势位置
此手势在终端上被识别为向上,如代码中指定,如下所示
 
                                       图:向上手势识别
为了识别向下的手势,硬件位置将放置如下
 
      图:向下手势位置
 
 
此手势在终端上被识别为向下,如代码中指定,如下所示
                     图:向下手势识别
为了识别向左的手势,硬件位置将放置如下
 
                  图:向左手势位置
                
 
 
此手势在终端上被识别为向左,如代码中指定,如下所示
 
                                            图:向左手势识别

为了识别向右的手势,硬件位置将放置如下

                        图:向右手势位置

此手势在终端上被识别为向右,如代码中指定,如下所示

                            图:向右手势识别

 

结论

加速度计库可与英特尔 Edison 一起使用。但是,当我们想在我们的某些文章中使用该库进行手势识别时,我们遇到了障碍,因为没有这样的教程指导如何识别自定义手势。因此,我使用了原始手势值,对其进行研究和分析,最终使用英特尔 Edison 和 Grove 加速度计构建了一个手势识别系统。一旦设置检测到手势,它就会通过 mqtt 通道发布。因此,您可以将此项目用作基于手势的物联网项目的手势识别工具。

 
 
 
 
 
© . All rights reserved.