2 Haziran 2014 Pazartesi

Leap Motion Arduino Sevo Kontrol

Bu yazımızda Leap Motion ve arduino uno ile 4 adet servonun el hareketlerine simetrik olarak kontrol edilmesini inceleyeceğiz. Leap Motion üzerinde 2 adet IR kamera 3 adet kızılötesi led bulunmaktadır. Kızılötesi ledlerden yayılan kızılötesi sinyaller leap motion görüş alanı içerisinde bir cisimden yansıdığında bunlar kameralar vasıtası ile tespit edilmektedir. Yani sinyalin yansıma özelliğinden ve giden sinyal ile gelen sinyal arasındaki süre ölçülerek mesafenin tespit edilmesi yönteminden yararlanılmaktadır. Radar sistemlerine oldukça benzemekteler aslında (Şekil 1).


arduino leap motion servo
Şekil 1. Infrared Led Yansıma Prensibi


Leap motion sensörünü kullanmak için çeşitli platformlar, geliştirme ortamları mevcuttur. Ancak Arduino ile benzerliği açısından biz bu çalışmada Processing-Wiring dilini kullanacağız. 

Processing kurulumunu arduino ide kurulumu gibi basit bir şekilde bilgisayarınıza yaptıktan sonra, Projessing klasörü içerisindeki "lib" klasörüne LeapMotionP5 kütüphanesini kopyalıyorsunuz. Bu sayede Leap Motion kütüphanesi' ni Projessing' e yüklemiş olacaksınız. 

Leap Motion bilgisayara USB kablosu ile bağlanmaktadır. Servolar arduino kartına bağlı olduğu için Processing içerisinde arduino seri portunu tanıtmak gerekmektedir. Bu Processing içerisinde setup bloğu içerisine "new Serial(this, portName, 9600); " kodunu ekleyerek yapılmaktadır.

Arduino çıkış akımı kullanılan servoları besleyemeyeceği için, 5V ile çalışan servolara harici kaynaktan enerji sağlamalısınız. Bunu arduino ve servoları aynı pilden beslemek isterseniz 5V regulatör devresi kullanarak yapabilirsiniz. Ancak servolarınızın toplam çekeceği akım 1A üstünde ise farklı elemanlar kullanmanız gerekmektedir. Çünkü 7805 entegresi üzerinden maksimum 1A akım geçirebilmektedir.

Bu çalışmada arduino ile uzaktan haberleşme için Xbee modemleri kullanılmıştır. Siz direk arduino kartınızı bilgisayara bağlayarak da bu çalışmayı yapabilirsiniz. İleriki günlerde Xbee modemlerinin arduino ile nasıl kullanılacağı konusunda yazı paylaşacağım.

Çalışma videosu :  http://www.youtube.com/watch?v=ysL_c9gI2Os

Processing Kodu:

//Leap motion ve arduino ile servo kontrolü

import com.onformative.leap.LeapMotionP5; //Leap Motion kütüphanesi
import com.leapmotion.leap.Finger;
LeapMotionP5 leap;

int aci;
int deger;
float deger1;

import processing.serial.*;
Serial port;

public void setup() {

  size(720, 720, P3D);  //ekran boyutu
  noFill();
  stroke(255); //parmakların modellemesi beyaz olarak ekranda gösterilecek

  leap = new LeapMotionP5(this);  //leap motion usb portu

  println("Seri porta baglanti var:"); //leap motion bağlantısının durumunu ekrana yansıtır

  String portName = Serial.list()[0]; //arduino yada kablosuz modemin bağlı olduğu porta bağlanır
  port = new Serial(this, portName, 9600);
}

public void draw() {
  background(0);
  fill(255);
  for (Finger f : leap.getFingerList())
  {
    PVector position = leap.getTip(f);
 
    ellipse(position.x, position.y, 10, 10);
 
    deger1=map(position.x,250,400,0,180); //leap motion x ekseninde okunan değerler 0-180 arasına //maplenir

    deger=int(deger1); //float deger1 deskeni integer a donusturulur
    port.write(deger); //Seri porttan arduino ya gönderilen deger
    print("deger:  ");
    println(deger); //100-400 arasi

 
  }
}

  public void stop() {
  leap.stop();
}



Arduino Kodu:

#include<Servo.h>

Servo s;
Servo s1;
Servo s2;
Servo s3;

int deger=0;

void setup()
{
  Serial.begin(9600);
  s.attach(5);
  s1.attach(6);
  s2.attach(7);
  s3.attach(8);
}

void loop()
{
   if(Serial.available())
  {
 
    deger=Serial.read();
 
    s.write(deger);
    s1.write(deger);
    s2.write(deger);
    s3.write(deger);
 
  }


}