事先声明,本文涉及到的所有代码都是我毕业设计的内容,请勿转载。
- 准备工作
Arduino IDE、Processing、8*8 WS2812B、Leap Motion
其中,Arduino需要安装Adafruit_NeoPixel.h,用来驱动WS2812B;Processing需要安装LeapForProcessing用于获取Leap Motion的手部信息;而Leap Motion需要从官网中获取SDK,我用到的SDK为最新版2.3.1. - Processing
为了能够与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的编码就完成了。
- Arduino
首先,我们需要进行一些简单的初始化、变量的创建、以及库函数的调用。
#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;
}
- 总结
写这篇文章是因为,我最开始做这个题目的时候网上相关的资料几乎没有,导致我不断的遇挫;希望我的这篇文章可以帮到需要的人