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






4.82/5 (5投票s)
这是一篇关于使用英特尔 Edison 检测向上、向下、向右和向左手势,并通过 Mqtt 发送的短文。
引言
加速度计是测量正确加速度的设备。正确加速度并非任何移动物体的 3 坐标轴值(速度变化率)。加速度计将测量由于地球引力产生的加速度,直接指向 g=9.81m/s2。加速度计在科学和工业中有各种应用。灵敏的加速度计用于飞机和导弹的导航系统。它还可以测量旋转物体的振动。
在这项工作中,我使用加速度计来查找任何移动物体的向上、向下、向左和向右手势。为了在英特尔 Edison 板上实现它,我使用了 MMA7660 3 轴数字加速度计 Grooove 连接器。您需要将该设备连接到英特尔 Edison 板的 Grove 连接器的 I2C 端口。
以下是英特尔 Edison 板 Grove 连接器上的硬件(数字加速度计)连接
使用代码
它为 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 通道发布。因此,您可以将此项目用作基于手势的物联网项目的手势识别工具。