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

34 23.756

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.

Projeyi Satın Al

Malzemeler:

  1. Arduino

  2. 4 Adet Servo Motor

  3. 4 Adet 22K Potansiyometre

  4. 4.8v Batarya

  5. Buton

  6. Switch

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ı:

Potansiyometrelerin ve Servoların Kontrol Ettiği Eklemler:

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

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.

  1. semih

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

  2. ali

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

  3. 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

  4. Doğukan tercan

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

  5. Doğukan tercan

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

  6. Ozan

    Acaba butonun boş kalan bacağı ne olacak.

  7. zehraa

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

  8. umay

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

  9. 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?

  10. muhammed taştan

    hocam merhaba. Kumanda kolu kullanmadan da projeyi yapabilir miyiz?

  11. Mehmet

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

  12. doğan

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

  13. doğan

    kol robotun ahşap ölçüleri nekadar

  14. 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.

  15. 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

  16. 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

  17. 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.

  18. Emre

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

  19. Ertan

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

  20. Ertan

    servp motorlaın modeli fark ediyor mu ?

  21. Elif

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

  22. atılay

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

    1. Sezgin GÜL

      22k direnç kullanabilirsin

  23. 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

  24. Caglar

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

  25. Adnan

    Çok teşekkür ederim kardeşim