Öğrenme Fonksiyonuna Sahip Hareket Kopyalayan Robot Kol Yapımı
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.
veya
Malzemeler:
-
Arduino
-
4 Adet Servo Motor
-
4 Adet 22K Potansiyometre
-
4.8v Batarya
-
Buton
-
Switch
-
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
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
butonun karışık olduğuna bakmayın pull up direnç koyulmuş google dan bakınız.
Iyi günler servolar birbirinden etkileniyor ben birini hareket ettirirken digerindede az bi hareket oluyo sebebi nedir aceba ?
merhabalar titreşim yapmasının nedeni yetersiz güçten dolayı projeyi pil vb ile beslemeniz gerekiyor
hareket kaydı yapılamıyor motorlardaki titremede ve hareketleri sürekli yapabilmede stabilizasyon problemi var yardımcı olabilir misiniz sebebi ne olabilir
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?
ellerine sağlık abi güzel olmuş ama
bunun mblocklu kodunu atarmısın abi proje yetiştimem gerek
şu kodu anlatan bi video çeksen çok makbule geçerdi
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
Maket kol lla robot kol arasındaki bağlantı yı söyler misiniz hocam
Hocam benim anlamadığım kendi yaptığımız öğretici kolla öğrenen kol arasındaki bağlantı
Acaba butonun boş kalan bacağı ne olacak.
tahtaların boyutları nedir çizimleri varsa ulaşabilir miyiz
kumanda koldaki potansiyometrelerin duruşunu anlayamadık kısaca bahsedebilir misiniz
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?
hocam merhaba. Kumanda kolu kullanmadan da projeyi yapabilir miyiz?
robot kolun ahşap kısımların ölçüleri ne kadar söyler misiniz?
kol robotununun ahşap kısımların ölçüleri ne kadar söylermisiniz acillllllllllll tarmısınkkkkkk
kol robotun ahşap ölçüleri nekadar
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.
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?
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
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?
ıyı gunler robotık kolun maalıyetı ne kadar ogrenebılırmıyım.
Merhaba ben aldım direnç.com dan kargoyla birlikte 110 tl verdim
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
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.
Hocam servo sayısını arttırmak için nasıl bir yol izliyebiliriz
kol robotununun ahşap kısımların ölçüleri ne kadar söylermisiniz
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.
potansiyometlerden çıkan siyah kablo gnd uçtur.hepsini arduinoda gnd pinine takın.
Hocam merhabalar burdaki servo sayısını arttırmak için nasıl bir yol izlemeliyiz
kola ait detaylı bi şemanız var mı ?
servp motorlaın modeli fark ediyor mu ?
Slm sezgin gul bey size nasıl ulasabilirim bana mailimedönüş yaparmısınız tsk
kolaygelsin resimde direnç var malzemelerde dirençten bahsetmemşiniz acaba direncin gücü ne kadar?
22k direnç kullanabilirsin
Merhabalar iyi günler bu işler de biraz yeniyim yardımcı olursanız çok sevinirim acaba bu projede kullanılan direnç kaç ohm ?
22k
Bunun aynısını step motorlar için yapabilirmiyiz?
Çok teşekkür ederim kardeşim