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

16 6.279

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.

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 beğenebilirsin

Cevap bırakın

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

16 Yorum

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

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

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

  4. Emre

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

  5. Ertan

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

  6. Ertan

    servp motorlaın modeli fark ediyor mu ?

  7. Elif

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

  8. atılay

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

    1. Sezgin GÜL

      22k direnç kullanabilirsin

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

  10. Caglar

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

  11. Adnan

    Çok teşekkür ederim kardeşim