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

2 2.648

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.

2 Yorum

  1. Caglar

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

  2. Adnan

    Çok teşekkür ederim kardeşim