基于Leap Motion的智能灯光控制系统
发布时间
阅读量:
阅读量
事先声明,本文涉及到的所有代码都是我毕业设计的内容,请勿转载。
为了实现WS2812B模块的控制功能,在Arduino IDE中需配置Adafruit NeoPixel.h头文件。在此过程中,请确保正确导入并编译相关代码以支持其功能实现。在Processing环境中需部署LeapForProcessing库以捕获Leap Motion的人体交互数据。对于Leap Motion设备的开发支持,请通过官网下载相应的SDK版本(如本项目使用的是最新版本V2.3.1)。
为了实现与Arduino的通信需求,在程序设计阶段我们需要使用预定义的代码块或工具包(命名不明确的问题仍需进一步确认)。
import processing.serial.*;
import de.voidplus.leapmotion.*;
除此之外,我们需要定义其对应的变量名称:
Serial port;
LeapMotion leap;
接下来,进行一些简单的初始化设置:
void setup()
{
port = new Serial(this,"COM3",9600);
//这里是设置端口的地方,可以是蓝牙也可以是arduino的端口
leap = new LeapMotion(this);
}
为了能够不断地获取手部信息或者手指信息,我们需要用到for循环:
for(Hand hand : leap.getHands())
{
for(Finger finger : leap.getFingers())
{
//...
}
}
当然,我们需要调用函数创建我们的手指类型的变量,比如:
Finger fingerThumb = hand.getThumb();
Finger fingerIndex = hand.getIndexFinger();
Finger fingerMiddle = hand.getMiddleFinger();
Finger fingerRing = hand.getRingFinger();
Finger fingerPink = hand.getPinkyFinger();
因为我需要用手做出不同的数字进而控制灯光,所以,我用到了`isExtended()`函数来判断单个拇指是否伸出,比如:
(fingerIndex.isExtended() == true)
最后,我们需要发送数据给Arduino,使之产生相应结果:
port.write("a");
到这里,Processing的编码就完成了。
首先,我们需完成基本设置,并对变量进行定义以及相关函数的操作。
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h> //16兆赫Adafruit饰品所需
#endif
// Arduino上的哪个插脚与NeoPixels相连?
#define PIN 6
// Arduino上有多少个LED?
#define NUMPIXELS 64
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
#define DELAYVAL 30 //像素之间暂停的时间(毫秒)
然后,需要设置串口通信的波特率:
void setup()
{
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
clock_prescale_set(clock_div_1);
#endif
Serial.begin(9600); //比特率设置为一致方可通信
pixels.begin();
pixels.setBrightness(brightness);
}
并接收Processing发过来的数据:
getStr = Serial.read();
最后,我们通过**if语句**的判断方式 使之产生对应的输出。
需要注意的是,Leap Motion每秒能检测200帧的数据,意味着你哪怕将手放在leap的感应区,它会通过processing发送许多的数据,如果你在arduino的输出程序加入了延时,回答之实时性非常差,这个时候,可以通过while循环的方式解决,如下:
while(getStr != getStr1)
{
//...
getStr1 = getStr;
}
- 总结
撰写这篇文章源于最初解决这个问题的时候,在网路上相关信息极为匮乏的情况下屡遭挫折;我希望我的文章能够帮助到真正需要 assistance 的人。
全部评论 (0)
还没有任何评论哟~
