back to top

#17 İki Eksen Robot Kol

Robot kollar endüstriyel alanda insan gücünün yerini almıştır. Bir insanın taşıyamayacağı ağırlık ve büyüklükteki yükleri taşıma ve döndürme işlerini fabrikalarda robot kollar üstlenmektedir. Milimetrenin binde biri hassasiyetinde konumlandırılabilmeleri de insan elinin sergileyebileceği hassasiyetin üzerindedir. Otomobil fabrikalarının üretim videolarını izlediğinde robot kolların ne kadar hayati bir öneme sahip olduğunu göreceksin. Robot denmesinin sebebi programlanarak sonsuz tekrarla aynı işi yapabilmelerinden kaynaklanmaktadır. Kol denmesinin sebebi ise bizim kollarımız gibi eklemli bir yapıya sahip olmasından kaynaklanmaktadır. Bir robot kolun kaç farklı doğrultuda dönme ve hareket etme kabiliyeti varsa o kadar eksenli olarak ifade edilmektedir. Robot kollar alüminyum ve çeşitli metalleri oyma ve şekil verme işlerinde de kullanılmaktadır. 7 eksenli CNC Router olarak geçen bu cihazlar bir heykeltraşın çamura şekil vermesi gibi metallere şekil verebilmektedirler.

Robot kollarda kullanılma amacına göre bir tür elektrik motoru olan step motor ve servo motorlar kullanılmaktadır. PicoBricks servo motorlarla projeler yapmanıza olanak sağlamaktadır.

Proje Detayları ve Algoritma

Kuruluma hazırlık amacıyla öncelikle servo motorları 0 dereceye ayarlamak için kodlarını yazıp yükleyeceğiz. LDR sensörünün üzerine bir cisim konulduğunda robot kol aşağı eğilecek ve açık olan kıskacını kapatacak. Kıskaç kapandıktan sonra robot kol tekrar yukarı kalkacak. Robot kolun her hareketinin sonucunda buzzer dan kısa bir bip sesi çıkacak. LDR sensörünün üzerine cisim yerleştirildiğinde RGB LED kırmızı renkte yanacak. Cisim robot kol tarafından tutulup havaya kaldırıldığında ise RGB LED yeşil renkte yanacak.

Servo motorun hareketleri çok hızlıdır. Hareketi yavaşlatmak için 30 milisaniye aralıklarla 2 şer derece toplamda 90 derece hareket ile servo motorları kodlayacağız. Kıskacın kapanması için bunu yapmayacağız.

Servonun tutma ve bırakma işlevini yerine getirebilmesi için buradaki bağlantıdan gerekli parçaları 3B yazıcıdan basıp montajlayın.

Projenin MicroBlocks ile Kodlanması

Microblocks u açıp Picobricks’e bağlan. Servo kütüphanesini ekle. Tutma motoru 21 nolu pine, eğilme motoru 22 nolu pine bağla. Robot kolun tutma ucunun servo değerini -90 a ayarla. Eğilme motorunun açısını 0 a ayarla. Aşağıdaki blokları hazırlayıp üzerine tıklayınca kodlar çalışacak ve servolar ayarladığın açıya dönecekler..

Servo motor hareketlerini ayrı bloklar halinde hazırlayacağız. Bunun için My Blocks kategorisinden up, down, open, close isimli dört command bloğu oluştur.

Yukarı ve aşağı kol hareketi için up ve down bloklarını 45 tekrarda 30’ar milisaniyede 2 şer derece dönecek şekilde kodlayın. Açı değerini değiştirebilmek için angleupdown isimli değişken oluşturun.down bloğunda -2 derece,  up bloğunda 2 derece değişim yapılacak.

Tutucu servoyu açık hale getirmek için açısını 90 kapalı hale getirmek için -60 olarak kodla. Tüm servo hareketlerinin sonuna Tone kütüphanesini ekleyerek dilediğin bir ses ekle. 100 ms çalması yeterlidir.

Picobricks başladığında tutucu servo açık konuma gelmeli, angleupdown değişkeni başlangıç değeri olan 90 olmalı ve robot kol yukarı bakacak şekilde 90 dereceye dönmeli. RGB LED sönmeli.

LDR sensörünün üzerine bir cisim geldiğini değeri 10 un altında düştüğünde anlarız. Sizde bu değer farklı olabilir. Bloğun üzerine tıklayarak kaç okuduğunu öğrenebilirsin. Önce RGB LED kırmızı renkte yanar. Cisimi tutup kaldırmak için tutma motoru açılır , aşağı hareket yapılır, tutma motoru kapatılır ve yukarı hareketi gerçekleşir. Son olarak RGB LED yeşil renkte yakılır. Her hareket arasına 500 ms bekleme koyarak hareketin daha rahat izlenmesini sağlayabilirsin.

Projenin kodlarına erişmek için tıkla.

Projenin Yapım Aşamaları

Projeyi hazırlamak için Pan-Tilt kitinin parçalarını hazırla. 3B yazıcıda basılmış parçaları, Atık karton parçaları , sıcak silikon yapıştırıcı ve makası da yanında bulundur.

  1. Öncelikle robot kolun sabit kolunu hazırlayacağız. D parçasının yuvarlak kısmına 8 cm yüksekliğinde kartondan silindir yapın. D parçasına yerleştirip silikon ile yapıştır.

2. C parçasına servo motor paketinden çıkan başlığı biraz kısaltarak yerleştir. Pan Tilt kitinden çıkan en küçük vidalar ile sabitle.

3. A ve C parçalarını sivri uçlu 2 adet vida ile birbirine sabitle..

4. Servo motoru C parçasına içten tak. Ardından B parçasınına servo motoru yerleştirip vidala.

5. Tutucu için 3B yazıcıda bastığın dişli parçasını ortasına servo motor başlıklarından birini keserek dişlinin içine yerleştir. Ardından servo motora vidala.

6. 3B yazıcıda basılmış Lineer dişli ile tutma kolunu birbirine güçlü yapıştırıcı ile yapıştır.

7. Servoyu 3B baskı tutucuya yerleştirip sabitle. İster sıcak silikon ile istersen vidalayarak bunu yapabilirsin. Lineer dişliye servo dişlisini yerleştirirken tam açık halde olmasına dikkat et.

8. Tutma servosu sistemini B parçasına silikon ile yapıştır.

9. 3. adımda hazırladığın parçayı ilk adımda kartondan hazırladığın silindirin üstünden geçirip silikon ile sabitle.

10. Motor sürünün jumperlarını Servo pinlerine tak. Tutucu servonun kablosunu GPIO21’e eğilme servosunun kablosunu GPIO22 ye tak.

11. Motor sürücü, buzzer, LDR ve RGB LED modülünü bir platforma yerleştirip robot kolu uygun şekilde platforma yerleştir. 3B Kalem yazıcı ile projeni dilediğin gibi özelleştirebilirsin.

12. Picobricks’i USB ile ya da 3’lü kalem pil ile Picoboard’da bulunan power jak’ından beslersen Robot kolu çalıştırabilirsin.

Proje Önerisi

2 eksen robot kol projesine HC05 modülü ekleyerek mobil uygulama ile cep telefonundan kontrol ederek geliştirebilirsin.

Projenin MicroPython Kodları

Servo motorları kalibre eden kodlar:
from machine import Pin, PWM
servo1=PWM(Pin(21))
servo2=PWM(Pin(22))

servo1.freq(50)
servo2.freq(50)

servo1.duty_u16(8200) # 180 degree
servo2.duty_u16(4770) # 90 degree 

Projenin kodları:
from machine import Pin, PWM, ADC
from utime import sleep
from ws2812 import NeoPixel

neo = NeoPixel(6, n=1, brightness=0.3, autowrite=False)
ldr=ADC(27)
buzzer=PWM(Pin(20, Pin.OUT))
servo1=PWM(Pin(21))
servo2=PWM(Pin(22))

servo1.freq(50)
servo2.freq(50)
buzzer.freq(440)

RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLACK = (0, 0, 0)
angleupdown=4770


def up():
    global angleupdown
    for i in range (45):
        angleupdown +=76 
        servo2.duty_u16(angleupdown)
        sleep(0.03)
    buzzer.duty_u16(2000)
    sleep(0.1)
    buzzer.duty_u16(0)

def down():
    global angleupdown
    for i in range (45):
        angleupdown -=76
        servo2.duty_u16(angleupdown)
        sleep(0.03)
    buzzer.duty_u16(2000)
    sleep(0.1)
    buzzer.duty_u16(0)

def oppen():
    servo1.duty_u16(8200) #180 degree
    buzzer.duty_u16(2000)
    sleep(0.1)
    buzzer.duty_u16(0)
    
def close():
    servo1.duty_u16(2490) #30 degree
    buzzer.duty_u16(2000)
    sleep(0.1)
    buzzer.duty_u16(0)
    
oppen()
servo2.duty_u16(angleupdown)
neo.fill(BLACK)
neo.show()
while True:
    if ldr.read_u16()>40000:
        neo.fill(RED)
        neo.show()
        sleep(1)
        buzzer.duty_u16(2000)
        sleep(1)
        buzzer.duty_u16(0)
        oppen()
        sleep(0.5)
        down()
        sleep(0.5)
        close()
        sleep(0.5)
        up()
        neo.fill(GREEN)
        neo.show()
        sleep(0.5)

Projenin Arduino C Kodları

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
#define PIN        6 
#define NUMPIXELS 1
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
#define DELAYVAL 500

#include <Servo.h>
Servo myservo1;
Servo myservo2;

int angleupdown;

void setup() {

  pinMode(20,OUTPUT);
  pinMode(27,INPUT);
  
  pixels.begin();
  pixels.clear(); 

  myservo1.attach(21);
  myservo2.attach(22);
  

}

void loop() {

  Open();
  angleupdown=180;
  myservo2.write(angleupdown);
  pixels.setPixelColor(0, pixels.Color(0, 0, 0));
  pixels.show();

  if(analogRead(27)>500){

    pixels.setPixelColor(0, pixels.Color(255, 0, 0));
    pixels.show();
    delay(1000);
    tone(20,700);
    delay(1000);
    noTone(20);

    Open();
    delay(500);
    Down();
    delay(500);
    Close();
    delay(500);
    Up();
    pixels.setPixelColor(0, pixels.Color(0, 255, 0));
    pixels.show();
    delay(10000);  
  }
}

void Open(){
  myservo1.write(180);
}

void Close(){
  myservo1.write(30);
}

void Up(){
 
  for (int i=0;i<45;i++){
    
    angleupdown = angleupdown+2;
    myservo2.write(angleupdown);
    delay(30);
    }
}

void Down(){
 
  for (int i=0;i<45;i++){
    
    angleupdown = angleupdown-2;
    myservo2.write(angleupdown);
    delay(30);
    }
}



Önceki İçerik
Sonraki İçerik

Son Çıkan Yazılar

CEVAP VER

Lütfen yorumunuzu giriniz!
Lütfen isminizi buraya giriniz