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).
Ş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);
}
}