Öğrenme Fonksiyonuna Sahip Hareket Kopyalayan Robot Kol Yapımı

41 53.794
Bu projede öğrenme yoluyla hareket kopyalayan robot kol yapımından bahsedeceğim. Endüstride kullanılan robot kollar, her zaman aynı hareketleri yapmaya odaklıdır. Örneğin ürün bandından bir nesneyi alıp başka bir banda aktarımını yapan robot kollar sürekli aynı hareketi yapmaktadır. Bu hareketler önceden öğretilerek robot kola aktarılır. Burada da aynı mantıkla robot kola manuel olarak hareket yaptırıp bu hareketleri kaydedecek ve ardından kendi kendine yapacaktır. Normal bir robot kola kodda hareketlerin konumunu girmek ayrı bir zorluk gerektirir. Çünkü hareketin sonunda kolun nasıl hareket edeceğini ve hangi durumda olacağını kestirmek biraz zor. Burada yapılan işlem ise, hareket öğretirken eş zamanlı olarak hareketin nasıl olduğunu görüyoruz ve ona göre senaryo kurabiliyoruz.

kurulu halde satın al

veya

demonte halde SATIN AL

Malzemeler:

  1. Arduino
  2. 4 Adet Servo Motor
  3. 4 Adet 22K Potansiyometre
  4. 4.8v Batarya
  5. Buton
  6. Switch
  7. mekanik kit >>  MEKANİK AKSAMLAR

Mekanik sistem iki kısımda oluşuyor. Birincisi robot kolun kendisi ikincisi ise robot kola hareket öğreteceğimiz kumanda kol. Kumanda kolun ölçeği ile yani boyutları ile robot kolun boyutları aynı olmasında fayda var. Çünkü kumanda kolu hareket ettirirken robot kol da birebir aynı hareketi yaptırmak daha kolay ve hatasız olacaktır. Robot kolun eklem yerlerinde servo motorlar yer alırken, kumanda kolda ise eklem yerlerinde potansiyometreler yer alacaktır. Bir eklemdeki potansiyometre, robot koldaki aynı eklemdeki servo motoru kumanda edecektir.

Devre Şeması:

Kontrol devresi ve Robot Kol Montajı :

A0 Pine bağlı pot >> 1 numara >> D10 pine bağlı servo
A1 Pine bağlı pot >> 2 numara >> D11 pine bağlı servo
A2 Pine bağlı pot >> 3 numara >> D5 pine bağlı servo
A3 Pine bağlı pot >> 4 numara >> D3 pine bağlı servo

 Arduino Kodu:

#include <Servo.h>

Servo servo_0;
Servo servo_1;
Servo servo_2;
Servo servo_3;

int sensorPin0 = A0;
int sensorPin1 = A1;
int sensorPin2 = A2;
int sensorPin3 = A3;
int count0, arrayStep, arrayMax, countverz, Taster, stepsMax, steps, time = 1000, del = 1000, temp;
unsigned int verz = 0;

long previousMillis1 = 0;
long previousMillis2 = 0;
long previousMillis3 = 0;
long previousMillis4 = 0;
long previousMicros = 0;
unsigned long currentMillis = millis();
unsigned long currentMicros = micros();

// arrays
int Delay[7] = {0,0,1,3,15,60,300};
int SensVal[4];
float dif[4], ist[4], sol[4], dir[4];
int joint0[180];
int joint1[180];
int joint2[180];
int joint3[180];
int top = 179;
// status
boolean playmode = false, Step = false;

void setup()
{
pinMode(4, INPUT);
pinMode(6, INPUT);
pinMode(13, OUTPUT);
digitalWrite(13, HIGH);
servo_0.attach(3);
servo_1.attach(5);
servo_2.attach(10);
servo_3.attach(11);
Serial.begin(115200);
Serial.println("mini robot ready...");
//delay(1000);
digitalWrite(13, LOW);
}

void loop()
{
currentMillis = millis();
currentMicros = micros();

Button();

if(!playmode)
{
if(currentMillis - previousMillis1 > 25)
{
if (arrayStep < top)
{
previousMillis1 = currentMillis;
readPot();
mapping();
move_servo();

}
}
}

else if(playmode)
{
if (Step)
{
digitalWrite(13, HIGH);
if (arrayStep < arrayMax)
{
arrayStep += 1;
Read();
calculate();
Step = 0;
digitalWrite(13, LOW);
}
else
{
arrayStep = 0;
calc_pause();
countverz = 0;
while(countverz < verz)
{
countverz += 1;
calc_pause();
digitalWrite(13, HIGH); delay(25);
digitalWrite(13, LOW); delay(975);
}
}

}
else
{
if (currentMicros - previousMicros > time)
{ //
previousMicros = currentMicros;
play_servo();
}
}
}

while (digitalRead(4) == true)
{
digitalWrite(13, HIGH); delay(500);
digitalWrite(13, LOW); delay(500);
}


}

void calc_pause()
{
readPot();
temp = SensVal[3];
if (temp < 0) temp = 0;
temp = map(temp, 0, 680, 0 ,6);
verz = Delay[temp];

}

void readPot()
{
SensVal[0] = analogRead(sensorPin0); SensVal[0] += -10;
SensVal[1] = analogRead(sensorPin1); SensVal[1] += 280;
SensVal[2] = analogRead(sensorPin2); SensVal[2] += -50;
SensVal[3] = analogRead(sensorPin3);

}
void mapping()
{
ist[0] = map(SensVal[0], 150, 900, 600, 2400);
ist[1] = map(SensVal[1], 1000, 100, 550, 2400);
ist[2] = map(SensVal[2], 120, 860, 400, 2500);
ist[3] = map(SensVal[3], 1023, 0, 500, 2500);

}
void record()
{
joint0[arrayStep] = ist[0];
joint1[arrayStep] = ist[1];
joint2[arrayStep] = ist[2];
joint3[arrayStep] = ist[3];
}
void Read()
{
sol[0] = joint0[arrayStep];
sol[1] = joint1[arrayStep];
sol[2] = joint2[arrayStep];
sol[3] = joint3[arrayStep];
}
void move_servo()
{
servo_0.writeMicroseconds(ist[3]);
servo_1.writeMicroseconds(ist[2]);
servo_2.writeMicroseconds(ist[0]);
servo_3.writeMicroseconds(ist[1]);
}

void calculate()
{

dif[0] = abs(ist[0]-sol[0]);
dif[1] = abs(ist[1]-sol[1]);
dif[2] = abs(ist[2]-sol[2]);
dif[3] = abs(ist[3]-sol[3]);
stepsMax = max(dif[0],dif[1]);
stepsMax = max(stepsMax,dif[2]);
stepsMax = max(stepsMax,dif[3]);

if (stepsMax < 500)
del = 1200;
else
del = 600;
if (sol[0] < ist[0]) dir[0] = 0-dif[0]/stepsMax; else dir[0] = dif[0]/stepsMax;
if (sol[1] < ist[1]) dir[1] = 0-dif[1]/stepsMax; else dir[1] = dif[1]/stepsMax;
if (sol[2] < ist[2]) dir[2] = 0-dif[2]/stepsMax; else dir[2] = dif[2]/stepsMax;
if (sol[3] < ist[3]) dir[3] = 0-dif[3]/stepsMax; else dir[3] = dif[3]/stepsMax;

}
void play_servo()
{
steps += 1;
if (steps < stepsMax)
{

if(steps == 20) time = del*4;
else if(steps == 40) time = del*3;
else if(steps == 80) time = del*2;
else if(steps == 100) time = del-1;

if(steps == stepsMax-200) time = del*2;
else if(steps == stepsMax-80) time = del*3;
else if(steps == stepsMax-40) time = del*4;
else if(steps == stepsMax-20) time = del*5;

ist[0] += dir[0];
ist[1] += dir[1];
ist[2] += dir[2];
ist[3] += dir[3];

servo_0.writeMicroseconds(ist[3]);
servo_1.writeMicroseconds(ist[2]);
servo_2.writeMicroseconds(ist[0]);
servo_3.writeMicroseconds(ist[1]);
}
else
{
Step = 1;
steps = 0;
}
}

void data_out()
{
int i = 0;
while(i < arrayMax)
{
digitalWrite(13, HIGH);
i += 1;
Serial.print(joint0[i]); Serial.print(", ");
}
Serial.println("Joint0");
i = 0;
while(i < arrayMax)
{
digitalWrite(13, HIGH);
i += 1;
Serial.print(joint1[i]); Serial.print(", ");
}
Serial.println("Joint1");
i = 0;
while(i < arrayMax)
{
digitalWrite(13, HIGH);
i += 1;
Serial.print(joint2[i]); Serial.print(", ");
}
Serial.println("Joint2");
i = 0;
while(i < arrayMax)
{
digitalWrite(13, HIGH);
i += 1;
Serial.print(joint3[i]); Serial.print(", ");
}
Serial.println("Joint3");
}

void Button()
{
if (digitalRead(6) == false)
{
delay(20);
if (digitalRead(6) == true)
{
if (Taster == 0)
{
Taster = 1;
previousMillis3 = currentMillis;

}
else if ((Taster == 1) && (currentMillis - previousMillis3 < 250))
{
Taster = 2;

}

}
}

if ((Taster == 1) && (currentMillis - previousMillis3 > 1000))
{
arrayStep += 1;
arrayMax = arrayStep;
record();
Taster = 0;
playmode = false;
Serial.print("Record Step: "); Serial.println(arrayStep);
digitalWrite(13, HIGH);
delay(100);
digitalWrite(13, LOW);
}
else if (Taster == 2)
{
arrayStep = 0;
playmode = true;
Taster = 0;
Step = 1;
Serial.println("playmode ");
data_out();
delay(250);
digitalWrite(13, LOW);
}
if (currentMillis - previousMillis3 > 2000)
{
Taster = 0;

}
}
Kodu buradan indirebilirsiniz >> Arduino Robot Kol
Android Telefon Kontrollü Versiyonunu incele >> Yeni versiyon robot kol

Sistemin Çalıştırılması ve Hareketi Öğretme:

Bütün sistemi kurduktan sonra sisteme eneji verin. Kumanda kolu hareket ettirdiğinizde aynı anda robot kol da hareket edip, hareketlerin birebir aynısını yapacaktır. Peki robot kola bir senaryoyu nasıl öğreteceğiz ? Bunu şu şekilde yapacağız. Robot kolun hangi konumda başlamasını istiyorsanız o konuma getirin. Daha sonra sistemde bulunan butona bir kez basın . Ardından robot kolu bir sonraki konuma getirin ve tekrar butona basın . Bu şekilde robot kolun hareketlerini periyodik olarak butona basıp kaydedilmesini sağlayın. Senaryo kısmını bitirdikten sonra bu öğrettiğiniz hareketleri tekrarlamasını isteyeceğiz. Bunun için de yine aynı butona bu kez ard arda iki kez basıyoruz. Bu sayede robot kol öğrettiğiniz hareketlerin aynısını tekrarlayarak yapacaktır. Sistemde bulunan switch anahtarla da robot kolu duraklatabilir ve tekrar aynı konumundan başlatabilirsiniz.

Kaynak : Let’s Make Robot

Bunlar da İlgini Çekebilir
Cevap bırakın

E-posta hesabınız yayımlanmayacak.

This site uses Akismet to reduce spam. Learn how your comment data is processed.

41 Yorum
  1. irfan

    tinkercad üzerinde yaptım normal çalışıyor fakat öğrettiğim şeyi similasyonu kapatıp açtığımda yapıyor öğretiğim şeyi tekrarlamıyor sebebi nedir

  2. emre

    butonun karışık olduğuna bakmayın pull up direnç koyulmuş google dan bakınız.

  3. Ahmet

    Iyi günler servolar birbirinden etkileniyor ben birini hareket ettirirken digerindede az bi hareket oluyo sebebi nedir aceba ?

  4. f

    merhabalar titreşim yapmasının nedeni yetersiz güçten dolayı projeyi pil vb ile beslemeniz gerekiyor

  5. ahmet

    hareket kaydı yapılamıyor motorlardaki titremede ve hareketleri sürekli yapabilmede stabilizasyon problemi var yardımcı olabilir misiniz sebebi ne olabilir

  6. fatih

    Abi devreyi çalıştırdım ama servolar sırayla değil aynı anda çalışıyor. Sence devrede mi hata yapmışımdır yoksa kodla çözülebilir mi?

  7. semih

    ellerine sağlık abi güzel olmuş ama
    bunun mblocklu kodunu atarmısın abi proje yetiştimem gerek

  8. ali

    şu kodu anlatan bi video çeksen çok makbule geçerdi

  9. Yusuf

    Bu projeyi yapmak istiyorum bana daha ayrıntılı bilgi gönderir misiniz pdf olarak bilgi gönderebilecek siniz daha iyi olur ve parça temini için sizinle iletişimde kalmak istiyorum

  10. Doğukan tercan

    Maket kol lla robot kol arasındaki bağlantı yı söyler misiniz hocam

  11. Doğukan tercan

    Hocam benim anlamadığım kendi yaptığımız öğretici kolla öğrenen kol arasındaki bağlantı

  12. Ozan

    Acaba butonun boş kalan bacağı ne olacak.

  13. zehraa

    tahtaların boyutları nedir çizimleri varsa ulaşabilir miyiz

  14. umay

    kumanda koldaki potansiyometrelerin duruşunu anlayamadık kısaca bahsedebilir misiniz

  15. MEHMET

    Herşey tamam fakat kayıt yaptıktan sonra 1 kez döngüyü tekrarlıyor. Döngünün diğer tekrarları arasında yaklaşık 15 saniye var. Ard arda oynatmıyor. Sebebi nedir sizce nasıl bu sorun giderilebilir?

  16. muhammed taştan

    hocam merhaba. Kumanda kolu kullanmadan da projeyi yapabilir miyiz?

  17. Mehmet

    robot kolun ahşap kısımların ölçüleri ne kadar söyler misiniz?

  18. doğan

    kol robotununun ahşap kısımların ölçüleri ne kadar söylermisiniz acillllllllllll tarmısınkkkkkk

  19. doğan

    kol robotun ahşap ölçüleri nekadar

  20. Mehmet

    Aynı devreyi 10 k pot.lar ile kurmamız mümkün mü? Bu şekilde kurarsak başka değişkenler ne olur? Bir de o swichin aynını nerden bulabiliriz. pin sayısı 3 gibi duruyor. Özel olarak da iletişime geçerseniz öğrencilerim adına minnettar olurum.

  21. ahmet

    merhabalar devreyi şemada verdiğiniz gibi tasarladım fakat direnc yerine 1k kullandım.Gerilimide şemadaki gibi baglayıp 5 volt verdim.robot hareketleri ögrenmede hiç bir problem yaşamıyo ama butona çift tıklayınca servo motorlar harekeleri geri yapmada cok zorlanıyo ve tıkanıyo napmam gerek?

    1. mevlüt aydın

      hocam yaptığın sistemdeki devreyi atar mısın bende yapmak istiyorum ancak bu swich olayını anlamadım ne tür swich kullanmamız lazım

    2. Nazmi

      Robot hareketleri ögrenmede hiç bir problem yaşamıyo ama butona çift tıklayınca servo motorlar hareketleri geri yapmada çok zorlanıyor ve tıkanıyo ne yapmam gerek?

  22. onur ucar

    ıyı gunler robotık kolun maalıyetı ne kadar ogrenebılırmıyım.

    1. ahmet

      Merhaba ben aldım direnç.com dan kargoyla birlikte 110 tl verdim

  23. Tekin

    Selam hocam eline koluna saglik aynisini yaptim ama bir problemim var hareketlerini kontrol edemiyorjm kendi kafasjna gore sinyal aliyor gibi davraniyor. Ardunio enerjisini pc den verdigim icin olabilirmi yada kablolar mi ince geliyor birde buton konusunu cok anlayamadim eksi ve arti ayni anda geliyo tek cikis var yardimci olabilirmisin tesekkurler

    1. Sezgin GÜL

      servo motorları ayrı pille besleyin. arduinoyu pc den besleyebilirsiniz. butonun temas etmeyen bacaklarını bağlamış olmanız gerekir. butona bastığınızda devreyi tamamlar ve durumu algılar.

      1. Yunus emre

        Hocam servo sayısını arttırmak için nasıl bir yol izliyebiliriz

      2. doğan

        kol robotununun ahşap kısımların ölçüleri ne kadar söylermisiniz

      3. Metehan

        Devre şemasında potansiyometrelerden çıkan siyah kablolar resimde teke düşmüş. Gerçekte nasıldır. Ayrıntılı şema paylaşabilir misiniz.
        Şimdiden teşekkür ederim.

        1. Sezgin GÜL

          potansiyometlerden çıkan siyah kablo gnd uçtur.hepsini arduinoda gnd pinine takın.

  24. Emre

    Hocam merhabalar burdaki servo sayısını arttırmak için nasıl bir yol izlemeliyiz

  25. Ertan

    kola ait detaylı bi şemanız var mı ?

  26. Ertan

    servp motorlaın modeli fark ediyor mu ?

  27. Elif

    Slm sezgin gul bey size nasıl ulasabilirim bana mailimedönüş yaparmısınız tsk

  28. atılay

    kolaygelsin resimde direnç var malzemelerde dirençten bahsetmemşiniz acaba direncin gücü ne kadar?

    1. Sezgin GÜL

      22k direnç kullanabilirsin

  29. Ahmet

    Merhabalar iyi günler bu işler de biraz yeniyim yardımcı olursanız çok sevinirim acaba bu projede kullanılan direnç kaç ohm ?

    1. Sezgin GÜL

      22k

  30. Caglar

    Bunun aynısını step motorlar için yapabilirmiyiz?

  31. Adnan

    Çok teşekkür ederim kardeşim