Konuyu Değerlendir
  • 0 Oy - 0 Ortalama
  • 1
  • 2
  • 3
  • 4
  • 5
ARDUİNO TABANLI JOYSTİCK İLE ROBOT KOL KONTROL ETME YÖNTEMİ
#1
ARDUİNO TABANLI JOYSTİCK İLE ROBOT KOL KONTROL ETME YÖNTEMİ

Projeye başlarken öncelik olarak robot kolun ölçülerini belirledim. Gerekli malzemelerin ölçülerine uygun tasarımımı ön planda tuttum (örn; servo motor). Ölçülen değerlere göre SolidWorks çizim programında robot kolumu tasarladım. Tasarlarken montajın sıralamasına kolaylığını ve montajı kolaylaştırabilir bir tasarım ortaya çıkardım. Tasarımda 5 servo motorlu robot kol ortaya çıkarmak istedim. 4 adet servo motor robot kolun hareket ettirecek şekilde oluştururken, diğer 1 tanesi de gripperın(robotun nesneleri tutma kısmı) açılıp kapanmasını sağlıyor.( 2 tanesi MG996R, diğer 3 tanesi SG90 model servo motordur.)
Robot kol projesinin SolidWorks çizimlerini indirmek için tıklayınız.
Robot kol projesinin STL uzantılı dosyasını(3D yazıcıdan baskısını alabilmek için gerekli dosyalar) indirmek içintıklayınız.
[img=465x0]http://i1.wp.com/mekatronizm.com/wp-content/uploads/2016/04/1-2.png?resize=465%2C457[/img]
[img=466x0]http://i0.wp.com/mekatronizm.com/wp-content/uploads/2016/04/2-3.png?resize=466%2C402[/img]
Tasarım aşaması bittikten sonra robot kolun parçalarını 3D printerdan baskısını . Bunun için yazıcının CURA adındaki programını kurdum ve SolidWorks programında çizdiğim parçaları STL formatında kaydettim. STL formatındaki parçaları Curada ayarlarını yaparak, baskısını aldım. Burada biraz sıkıntılar yaşadım. Çünkü yazıcı kalibrasyonu tam anlamı ile iyi değildi. Bir kaç deneme baskısı aldıktan sonra 3D yazıcının kalibrasyon ayarlarını tamamlamış oldum.
[img=731x0]http://i0.wp.com/mekatronizm.com/wp-content/uploads/2016/04/3-2.png?resize=860%2C459[/img]
Montaj yapılacak parçaların sırasına göre basmaya başladım.
[img=731x0]http://i1.wp.com/mekatronizm.com/wp-content/uploads/2016/04/4-3.png?resize=860%2C483[/img]
Kalibrasyonu yapılmamış haliyle aldığım baskıya örnek olarak aşağıdaki görsel gösterilebilir.
[img=427x0]http://i1.wp.com/mekatronizm.com/wp-content/uploads/2016/04/5-1-e1460148787164.png?resize=427%2C756[/img]
[img=671x0]http://i1.wp.com/mekatronizm.com/wp-content/uploads/2016/04/6-2.png?resize=671%2C504[/img]
Parçaların basımı bittikten sonra servoların Arduinodan yüksek akım çekebilme ihtimaline karşı LM2576 devresini delikli plakete lehimledim. Servo motorlarımın beslemesini buradan aldım.
[img=594x0]http://i1.wp.com/mekatronizm.com/wp-content/uploads/2016/04/7-3.png?resize=594%2C193[/img]
[img=656x0]http://i1.wp.com/mekatronizm.com/wp-content/uploads/2016/04/8-2.png?resize=656%2C609[/img]
Robot kolun mekanik parçalarını ve motorlarını uygun somun ve cıvata ile montajını yaptıktan sonra elektriksel olarak montajına geçtim. Bu kısımda arduino(uno), LM2576,  ve joystick’i kablolar yardımı ile montajını tamamladım. Aşağıda ayrıntılı olarak fitzing de yaptığım elektriksel bağlantı gösterilmektedir.
[img=454x0]http://i1.wp.com/mekatronizm.com/wp-content/uploads/2016/04/9-1-e1460148866649.png?resize=454%2C810[/img]
Fritzing Görseli

Kod:
#include <Servo.h> //servo kütüphanesini koda dahil etme
Servo servoo2; //2. servo nun hareket edebilmesi için gerekli kod
Servo servoo0; //griperdaki servonun hareket edebilmesi için gerekli kod
int gripperbuton = 2; //griperi hareket ettiren jotstick butonunun bağlanacağı adc pini
int gripper = 8; //griperdaki servoyu kontrol edecek pals çıkış pini
int servo1 = 9; //servo1 i kontrol edecek pals çıkış pini
int servo2 = 10; //servo2 i kontrol edecek pals çıkış pini
int servo3 = 11; //servo3 i kontrol edecek pals çıkış pini
int servo4 = 12; //servo4 i kontrol edecek pals çıkış pini
int i,a; //gerekli değer atamalarının yapılacığı yardımcı değişkenler

long val0,val1,val2,val3,val4; //gerekli değer atamalarının yapılacığı yardımcı değişkenler
int X0,X00,X1=90,X11,X2=90,X22,X3=75,X33,X4=80,X44; //gerekli değer atamalarının yapılacığı yardımcı değişkenler

void setup(){
Serial.begin(9600); //değerleri serial monitörde görmek için gerekli komut
pinMode(gripperbuton,INPUT); //gripperin hareket etmesi için gerekli butonu INPUT olarak tanımladık.
digitalWrite(gripperbuton,HIGH); // gripperin hareket etmesi için gerekli butonun girişini 1 liyoruz.
pinMode(A1,INPUT); //servo1 in hareket etmesi için joystick1 in X bacağını A1 pinine takarak INPUT olarak tanımlıyoruz.(9)
pinMode(A2,INPUT); //servo2 nin hareket etmesi için joystick1 in Y bacağını A2 pinine takarak INPUT olarak tanımlıyoruz.(10)
pinMode(A3,INPUT); //servo3 ün hareket etmesi için joystick2 in X bacağını A3 pinine takarak INPUT olarak tanımlıyoruz.(11)
pinMode(A4,INPUT); //servo4 ün hareket etmesi için joystick2 in Y bacağını A4 pinine takarak INPUT olarak tanımlıyoruz.(12)
pinMode(servo1,OUTPUT); //servo1 i çıkış olarak tanımlıyoruz.
pinMode(servo2,OUTPUT); //servo2 i çıkış olarak tanımlıyoruz.
pinMode(servo3,OUTPUT); //servo3 i çıkış olarak tanımlıyoruz.
pinMode(servo4,OUTPUT); //servo4 i çıkış olarak tanımlıyoruz.
pinMode(gripper,OUTPUT); //gripperdaki servoyu çıkış olarak tanımlıyoruz.
servoo2.attach(servo2); //servoo2 nesnesine hangi pinden pals çıkışı alınacağı belirtiliyor.
servoo0.attach(gripper); //servoo0 nesnesine hangi pinden pals çıkışı alınacağı belirtiliyor.
}

void loop(){
int buttonState = digitalRead(gripperbuton); //2 pininde takılı olan joystiğin butonunu digital olarak okuma komutu ve buttonState değişkenine atıyoruz.
Serial.println(buttonState); //buttonState değişkenlerindeki değerleri Serial Monitöre yazdırma komutu


if (buttonState == 1) //eğer buttona basılı ise;
{ servoo0.write(110); //servonun 110 deresine git. yani griper servosu olduğu için griperi aç
}
else{servoo0.write(40); } //eğer buton basılı değil ise servonun 40 derecesine git. yani griperi kapa


servoaci1(X1); //servo1 in açı değeri başlangıçda 90 giriliyor.program döndükçe belirlenen değere göre açı değeri girilmiş oluyor.
servoaci3(X3); //servo3 in açı değeri başlangıçda 90 giriliyor.program döndükçe belirlenen değere göre açı değeri girilmiş oluyor.
servoaci4(X4); //servo4 in açı değeri başlangıçda 90 giriliyor.program döndükçe belirlenen değere göre açı değeri girilmiş oluyor.

val1 = analogRead(A1); //joystick1 in Xinden den gelen analog değeri okuyoruz.
if(val1<400) //eğer okuduğumuz değer 400ünden küçük ise;
{if(X1>10) X1=X1-10; //eğer X1 değerimizde 10dan büyük ise X1 açı değerimizi 10ar 10ar azalt
servoaci1(X1); //servo1 in açı değerine X1 i yaz.
}
if(val1>600) //eğer okuduğumuz değer 600ünden büyük ise;
{if(X1<170) X1=X1+10; //eğer X1 değerimizde 170dan küçük ise X1 açı değerimizi 10ar 10ar artır.
servoaci1(X1); //servo1 in açı değerine X1 i yaz.
}

val2 = analogRead(A2); //joystick1 in Y sinden gelen analog değeri okuyoruz.
if(val2<400) //eğer okuduğumuz değer 400ünden küçük ise;
{if(X2>5) X2=X2-5; //eğer X2 değerimizde 5den büyük ise X2 açı değerimizi 5 er 5 er azalt
servoo2.write(X2); //servo2 ye açı değerini yaz
X22=(X2*10)+700; //servonun açı değerlerini belirlemek için yapmış olduğumuz işlemler
digitalWrite(10, HIGH); //servo2nin bacağını 1 ledik.
delayMicroseconds(X22); //X22 değeri kadar micro saniyebekle
digitalWrite(10, LOW); //servo2nin bacağını 0 ladik.
delayMicroseconds(20000-X22); //20000-X22 değeri kadar micro saniye bekledik.yani burada servoyu döndürmek için gerekli pals değerlerini girmiş olduk.
delay(10); //10 milisaniye bekledik.
}
if(val2>600) //eğer okuduğumuz değer 600ünden büyük ise;
{if(X2<175) X2=X2+5; //eğer X2 değerimizde 175den küçük ise X2 açı değerimizi 5 er 5 er artır.
servoo2.write(X2); //servo2 ye açı değerini yaz
X22=(X2*10)+700; //servonun açı değerlerini belirlemek için yapmış olduğumuz işlemler
digitalWrite(10, HIGH); //servo2nin bacağını 1 ledik.
delayMicroseconds(X22); //X22 değeri kadar micro saniyebekle
digitalWrite(10, LOW); //servo2nin bacağını 0 ladik.
delayMicroseconds(20000-X22); //20000-X22 değeri kadar micro saniye bekledik.yani burada servoyu döndürmek için gerekli pals değerlerini girmiş olduk.
delay(10); //10 milisaniye bekledik.
}

val3 = analogRead(A3); //joystick2 nin Xinden den gelen analog değeri okuyoruz.
if(val3<400) //eğer okuduğumuz değer 400ünden küçük ise;
{if(X3>10) X3=X3-10; //eğer X3 değerimizde 10dan büyük ise X3 açı değerimizi 10ar 10ar azalt
servoaci3(X3); //servo3 ün açı değerine X3 e yaz.

}
if(val3>600) //eğer okuduğumuz değer 600ünden büyük ise;
{if(X3<170) X3=X3+10; //eğer X3 değerimizde 170dan küçük ise X3 açı değerimizi 10ar 10ar artır.
servoaci3(X3); //servo1 in açı değerine X3 i yaz.
}


val4 = analogRead(A4); //joystick2 nin Y sinden den gelen analog değeri okuyoruz.
if(val4<400) //eğer okuduğumuz değer 400ünden küçük ise;
{if(X4>5) X4=X4-5; //eğer X4 değerimizde 5 den büyük ise X4 açı değerimizi 5er 5 er azalt
servoaci4(X4); //servo3 ün açı değerine X3 e yaz.
}
if(val4>600) //eğer okuduğumuz değer 600ünden büyük ise;
{if(X4<175) X4=X4+10; //eğer X4 değerimizde 175 den küçük ise X4 açı değerimizi 5 er 5 er artır.
servoaci4(X4); //servo1 in açı değerine X3 i yaz.
}
}

void servoaci1(int aci1) //servo1 için gerekli açı değerlerini belirlediğimiz alt programımız
{

X11=(aci1*9)+700; //servonun açı değerlerini belirlemek için yapmış olduğumuz işlemler
digitalWrite(9, HIGH); //servo1nin bacağını 1 ledik.
delayMicroseconds(X11); //X11 değeri kadar micro saniyebekle
digitalWrite(9, LOW); //servo1 in bacağını 0 ladik.
delayMicroseconds(20000-X11); //20000-X11 değeri kadar micro saniye bekledik.yani burada servoyu döndürmek için gerekli pals değerlerini girmiş olduk.
//bu değerin 20000 olması digital servo kullandığımızdan dolayıdır.
delay(10); //10 milisaniye bekledik.
}

void servoaci3(int aci3) //servo3 için gerekli açı değerlerini belirlediğimiz alt programımız
{ X33=(aci3*9)+700; //servonun açı değerlerini belirlemek için yapmış olduğumuz işlemler
digitalWrite(11, HIGH); //servo1nin bacağını 1 ledik.
delayMicroseconds(X33); //X33 değeri kadar micro saniyebekle
digitalWrite(11, LOW); //servo1 in bacağını 0 ladik.
delayMicroseconds(8000-X33); //8000-X33 değeri kadar micro saniye bekledik.yani burada servoyu döndürmek için gerekli pals değerlerini girmiş olduk.
//bu değerin 8000 olması digital servo kullandığımızdan dolayıdır.
delay(10); //10 milisaniye bekledik.
}

void servoaci4(int aci4) //servo4 için gerekli açı değerlerini belirlediğimiz alt programımız
{ X44=(aci4*9)+700; //servonun açı değerlerini belirlemek için yapmış olduğumuz işlemler
digitalWrite(12, HIGH); //servo4 ün bacağını 1 ledik.
delayMicroseconds(X44); //X33 değeri kadar micro saniyebekle
digitalWrite(12, LOW); //servo4 ün bacağını 0 ladik.
delayMicroseconds(8000-X44); //8000-X44 değeri kadar micro saniye bekledik.yani burada servoyu döndürmek için gerekli pals değerlerini girmiş olduk.
//bu değerin 8000 olması digital servo kullandığımızdan dolayıdır.
delay(10); //10 milisaniye bekledik.
}






Proje Sahibi : Hüseyin Tan
Bul
Alıntı


Benzer Konular...
Konu: Yazar Cevaplar: Gösterim: Son Mesaj
  ARDUİNO VE MATLAB İLE MPU6050 KULLANIMI VE YÖNTEMLER Ken 0 206 19-05-2016, Saat: 09:57
Son Mesaj: Ken
  MIT APP INVERTOR & ARDUİNO İLE LED KONTROL ETME YÖNTEMİ Ken 0 124 19-05-2016, Saat: 09:55
Son Mesaj: Ken
  MIT APP INVERTOR VE ARDUİNO İLE SERVO MOTOR KONTROL ETME YÖNTEMİ Ken 0 128 19-05-2016, Saat: 09:53
Son Mesaj: Ken
  ARDUİNO İLE NOKİA 5110(PCD8544) GRAFİK LCD KULLANIMI VE GEREKLİ YÖNTEMLER Ken 0 195 19-05-2016, Saat: 09:52
Son Mesaj: Ken
  ARDUİNO KONTROLLÜ ÇİM SULAMA SİSTEMİ PROJESİ VE YÖNTEMLER Ken 0 142 19-05-2016, Saat: 09:51
Son Mesaj: Ken

Foruma Git:


Bu konuyu görüntüleyen kullanıcı(lar): 1 Ziyaretçi
loading...