Advertisement

基于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;
      }
  1. 总结

撰写这篇文章源于最初解决这个问题的时候,在网路上相关信息极为匮乏的情况下屡遭挫折;我希望我的文章能够帮助到真正需要 assistance 的人。

全部评论 (0)

还没有任何评论哟~