립모션 이용 아두이노 LED제어 leapmotion + arduino

만들어보았는데요 재미있네요^^;
립모션 이용 손가락 개수에따라 LED 켜지는걸 만들어보았습니다.
립모션 가격도 착하고 활용도높은것같아서 마음에 들어요.
하지만 느낌점이 하나있다면 아직까진. 센싱기술이 사람의 욕망을 채워줄정도는 아니라는것또한^^ 느끼게되네요
다음엔 근육으로 움짐임 센싱하는것도 있던데 그것도 도전해봐야겠습니다.
* 소스올려놓았습니다. jar 풀면있어요^^(LeapToSerialSender.java 요놈이메인)
※ 궁굼한것이 있으면 메일주세요 visualkhh@gmail.com
package khh.io.motion.leap;
import java.io.IOException;
import javax.comm.SerialPortEvent;
import javax.comm.SerialPortEventListener;
import khh.communication.serial.SerialCommunication;
import khh.communication.serial.SerialParameters;
import com.leapmotion.leap.Controller;
import com.leapmotion.leap.Finger;
import com.leapmotion.leap.FingerList;
import com.leapmotion.leap.Frame;
import com.leapmotion.leap.Gesture;
import com.leapmotion.leap.Hand;
import com.leapmotion.leap.Listener;
import com.leapmotion.leap.Pointable;
import com.leapmotion.leap.PointableList;
import com.leapmotion.leap.Vector;
public class LeapToSerialSenderListener extends Listener implements SerialPortEventListener{
SerialCommunication sc;
public LeapToSerialSenderListener() {
sc = new SerialCommunication();
SerialParameters params = new SerialParameters();
params.setPortName("COM4");
sc.setSerialParameters(params);
try{
sc.addEventListener(this);
sc.openConnection();
}catch(Exception e){
e.printStackTrace();
}
}
public void onInit(Controller controller) {
System.out.println("Initialized");
}
public void onConnect(Controller controller) {
System.out.println("Connected");
controller.enableGesture(Gesture.Type.TYPE_SWIPE);
controller.enableGesture(Gesture.Type.TYPE_CIRCLE);
controller.enableGesture(Gesture.Type.TYPE_SCREEN_TAP);
controller.enableGesture(Gesture.Type.TYPE_KEY_TAP);
}
public void onDisconnect(Controller controller) {
System.out.println("Disconnected");
}
public void onFrame(Controller controller) {
System.out.print(".");
Frame frame = controller.frame();
float left = frame.pointables().leftmost().tipPosition().getX();
float right = frame.pointables().rightmost().tipPosition().getX();
float front = frame.pointables().frontmost().tipPosition().getZ();
float back = backmost(frame.pointables()).tipPosition().getZ();
float top = topmost(frame.pointables()).tipPosition().getY();
float bottom = bottommost(frame.pointables()).tipPosition().getY();
int i=0;
if (!frame.hands().isEmpty()) {
Hand hand = frame.hands().get(0);
FingerList fingers = hand.fingers();
if (!fingers.isEmpty()) {
// Calculate the hand's average finger tip position
Vector avgPos = Vector.zero();
for (Finger finger : fingers) {
avgPos = avgPos.plus(finger.tipPosition());
}
avgPos = avgPos.divide(fingers.count());
System.out.println("Hand has " + fingers.count()
+ " fingers, average finger tip position: " + avgPos);
i = fingers.count();
}
}
try {
sc.getBufferedwriter().write(i);
sc.getBufferedwriter().flush();
} catch (IOException e) {
e.printStackTrace();
}
}
Pointable backmost(PointableList pointables)
{
if(pointables.count() == 0) return Pointable.invalid();
Pointable backmost = pointables.get(0);
for( int p = 1; p < pointables.count(); p++ )
{
if(pointables.get(p).tipPosition().getZ() > backmost.tipPosition().getZ())
backmost = pointables.get(p);
}
return backmost;
}
Pointable topmost(PointableList pointables)
{
if(pointables.count() == 0) return Pointable.invalid();
Pointable topmost = pointables.get(0);
for( int p = 1; p < pointables.count(); p++ )
{
if(pointables.get(p).tipPosition().getY() > topmost.tipPosition().getY())
topmost = pointables.get(p);
}
return topmost;
}
Pointable bottommost(PointableList pointables)
{
if(pointables.count() == 0) return Pointable.invalid();
Pointable bottommost = pointables.get(0);
for( int p = 1; p < pointables.count(); p++ )
{
if(pointables.get(p).tipPosition().getY() < bottommost.tipPosition().getY())
bottommost = pointables.get(p);
}
return bottommost;
}
@Override
public void serialEvent(SerialPortEvent arg0) {
// TODO Auto-generated method stub
}
}
package khh.io.motion.leap;
import java.io.IOException;
import com.leapmotion.leap.Controller;
public class LeapToSerialSender {
public static void main(String[] args) {
LeapToSerialSenderListener listener = new LeapToSerialSenderListener();
Controller controller = new Controller(listener);
// Keep this process running until Enter is pressed
System.out.println("Press Enter to quit...");
try {
System.in.read();
} catch (IOException e) {
}
//The controller must be disposed of before the listener
controller = null;
}
}
-----아두이노 소스
// digital pin 2 has a pushbutton attached to it. Give it a name:
//int pushButton = 2;
int selected_led = 0;
int led_1 = 6;
int led_2 = 7;
int led_3 = 8;
int led_4 = 9;
int led_5 = 10;
boolean sw = true;
int incomingByte = 0;
// the setup routine runs once when you press reset:
void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
// pinMode(pushButton, INPUT);
pinMode(led_1, OUTPUT);
pinMode(led_2, OUTPUT);
pinMode(led_3, OUTPUT);
pinMode(led_4, OUTPUT);
pinMode(led_5, OUTPUT);
digitalWrite(led_1, LOW);
digitalWrite(led_2, LOW);
digitalWrite(led_3, LOW);
digitalWrite(led_4, LOW);
digitalWrite(led_5, LOW);
}
// the loop routine runs over and over again forever:
void loop() {
incomingByte = Serial.read();
if(incomingByte==0x0){//1
digitalWrite(led_1, LOW);
digitalWrite(led_2, LOW);
digitalWrite(led_3, LOW);
digitalWrite(led_4, LOW);
digitalWrite(led_5, LOW);
}else if(incomingByte==0x1){//1
digitalWrite(led_1, HIGH);
digitalWrite(led_2, LOW);
digitalWrite(led_3, LOW);
digitalWrite(led_4, LOW);
digitalWrite(led_5, LOW);
}else if(incomingByte==0x2){//2
digitalWrite(led_1, HIGH);
digitalWrite(led_2, HIGH);
digitalWrite(led_3, LOW);
digitalWrite(led_4, LOW);
digitalWrite(led_5, LOW);
}else if(incomingByte==0x03){ //3
digitalWrite(led_1, HIGH);
digitalWrite(led_2, HIGH);
digitalWrite(led_3, HIGH);
digitalWrite(led_4, LOW);
digitalWrite(led_5, LOW);
}else if(incomingByte==0x04){ //4
digitalWrite(led_1, HIGH);
digitalWrite(led_2, HIGH);
digitalWrite(led_3, HIGH);
digitalWrite(led_4, HIGH);
digitalWrite(led_5, LOW);
}else if(incomingByte==0x05){ //5
digitalWrite(led_1, HIGH);
digitalWrite(led_2, HIGH);
digitalWrite(led_3, HIGH);
digitalWrite(led_4, HIGH);
digitalWrite(led_5, HIGH);
}
}