Robot kollar, endüstriyel alanda insan gücünün yerini aldı. Birçok fabrikada kullanılan robot kollar, insanların taşıyamayacağı ağırlık ve büyüklükteki nesneleri taşıma veya döndürme görevini üstleniyor. Bu kollar, milimetrenin binde biri hassasiyet ile konumlanma becerisi ile insan bedeninin sergileyebileceği hassasiyetin oldukça üzerindedir. Birçoğumuz otomobil fabrikalarındaki üretim videolarına denk gelmişizdir. Bu videolardan anladığımız üzere robot kolların endüstriyel alanlarda ne kadar hayati önem taşıdığını görürüz. Robot kolların kaç farklı yöne dönebileceği veya hareket edebileceği eksenlerle ifade edilir. Robot kollar aynı zamanda alüminyum veya benzeri metallerin oyulmasında da kullanılır. Örneğin 7 eksenli CNC Router cihazlar, adeta bir heykeltıraşın çamura şekil vermesi gibi metallere şekiller verebilir.
Robot kolların amaçlarına bağlı olarak servo veya step motorlar kullanılabilir. Bu projemizde servo motorlar kullanacağız.
Detaylar ve Algoritma
Bir nesne LDR sensör ile algılandığında RGB LED kırmızı renge dönecek ve robot kol aşağıdaki işlemleri gerçekleştirecek.
- Tutucuyu aç.
- Aşağı yönde hareket et.
- Tutucuyu kapat.
- Yukarı yönde hareket et.
Robot kol hareketini tamamladığında RGB LED yeşil renge dönecek.
Bu hareketler baz alındığında servo motorların ilk hareketleri şu şekilde olmalıdır.
- Servo 1 Kontrol Tutucu: Kapalı pozisyonda olmalı.
- Yukarı/Aşağı Hareketi Kontrol Eden Servo 2: Hareket yukarı yönde olmalı.
4 farklı hareket kontrolü mantığı gerekli:
- Yukarı: 2 derecelik aralıklarla 90 derecelik bir hareket
- Aşağı: -2 derecelik aralıklarla 90 derecelik bir hareket
- Açık: Tutucuyu 90 derecede konumlandırma
- Kapalı: Tutucuyu -60 derecede konumlandırma
Tüm bu hareketler esnasında sesli ve görüntülü bir geri bildirim IDE üzerinden hataların giderilmesi amacıyla gönderilecektir.
Servo motor hareketleri oldukça hızlıdır. Bu yüzden yavaşlatmak için hareketlerin 2’şer derece ve 30’ar milisaniye aralıklarında olmasını sağladık.
Bu proje için 3D baskılar alınması gerekmektedir. Gerekli parçalara buradan ulaşabilirsiniz.
Bileşenler
1x PicoBricks
2x Servo Motor
4x Kolay Bağlantı Kabloları
Jumper Kablolar
Devre Şeması
Projenin Yapım Aşamaları
Projeyi hazırlamak için pan-tilt parçalarını hazırlayın. 3D baskılarınızı, karton parçalarınızı, silikonunuzu ve makasınızı hazırlayın.
1)İlk olarak robot kolumuzun sabit kısmını hazırlayacağız. D parçasının yuvarlak kısmı için 8 cm yüksekliğindeki silindir karton parçası hazırlayın. Daha sonra D parçası ile birleştirin ve silikon ile yapıştırın.
2)Servo motor paketinden çıkan başlık parçasını biraz kısaltarak C parçasının üstüne yerleştirin. Pan-Tilt kitinin içerisinde bulunan en küçük vidalarla sabitleyin.
3)A ve C parçalarını sivri uçlu vidalarla birbirine sabitleyin.
4)Servo motoru C parçasına sabitleyin. Daha sonra B parçasıyla birleştirin ve vidalar kullanarak sabitleyin.
5)Tutucu için 3D yazıcıdan aldığınız dişli baskısının ortasından, servo motor kafalarından birini kesip yerleştirin. Daha sonra bu parçayı servo motor ile birleştirin.
6) 3D baskı olan lineer dişliyi ve kolu kuvvetli bir yapıştırıcıyla birbirine sabitleyin.
7) Servo motoru 3D baskı olan tutucu ile birleştirin ve sabitleyin. Servo dişlisini lineer dişli ile birleştirirken tamamen açık olduğundan emin olun.
8) Tutucu servo sistemini B parçası ile yapıştırarak birleştirin.
9) 3. Adımda hazırladığınız parçayı 1. Adımda hazırladığınız silindir kartonun üzerinden geçirip silikon kullanarak sabitleyin.
10) Motor sürücü jumper kablolarını servo motor pinlerine takın. Tutucu servo motoru GPIO21’e ve tilt servo motorunu GPIO22 pinine bağlayın.
11)Motor sürücüyü, buzzer’ı ve RGB LED’i bir platform üzerine yerleştirin. Robot kolu diğer parçaları yerleştirdiğiniz konumlara göre yerleştirin. 3D kalem yazıcı ile projenizi istediğiniz gibi kişiselleştirebilirsiniz.
12)PicoBricks’i, üzerinde bulunan güç girişinden USB ile veya jak girişinden 3 adet kalem kalem pil ile besleyerek robot kolu kontrol edebilirsiniz.
MicroBlocks Kodları
MicroPython Kodları
Robot Kol Kodu:
from machine import Pin, PWM, ADC
from utime import sleep
from picobricks import WS2812
# Define libraries
ws = WS2812(6, brightness=0.3)
ldr = ADC(27)
buzzer = PWM(Pin(20, Pin.OUT))
servo1 = PWM(Pin(21))
servo2 = PWM(Pin(22))
# Define LDR, buzzer, and servo motor pins
servo1.freq(50)
servo2.freq(50)
buzzer.freq(440)
# Define frequencies of servo motors and buzzer
# RGB color settings
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLACK = (0, 0, 0)
angleupdown = 4770
angleupdown2 = 8200
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)
# Servo2 goes up at specified intervals
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)
# Servo2 goes down at specified intervals
def open():
global angleupdown2
for i in range(45):
angleupdown2 += 500
servo1.duty_u16(angleupdown2)
sleep(0.03)
buzzer.duty_u16(2000)
sleep(0.1)
buzzer.duty_u16(0)
# Servo1 works for opening the clamps
def close():
global angleupdown2
for i in range(45):
angleupdown2 -= 500
servo1.duty_u16(angleupdown2)
sleep(0.03)
buzzer.duty_u16(2000)
sleep(0.1)
buzzer.duty_u16(0)
# Servo1 works for closing the clamps
open()
servo2.duty_u16(angleupdown)
ws.pixels_fill(BLACK)
ws.pixels_show()
while True:
if ldr.read_u16() > 20000:
ws.pixels_fill(RED)
ws.pixels_show()
sleep(1)
buzzer.duty_u16(2000)
sleep(1)
buzzer.duty_u16(0)
open()
sleep(0.5)
down()
sleep(0.5)
close()
sleep(0.5)
up()
ws.pixels_fill(GREEN)
ws.pixels_show()
sleep(0.5)
# According to the data received from LDR, RGB LED lights red and green and servo motors move
Robot Kol Servo Motor Kodu:
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
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 // Time (in milliseconds) to pause between pixels
#include <Servo.h>
Servo myservo1;
Servo myservo2;
int angleupdown;
void setup() {
pinMode(20, OUTPUT);
pinMode(27, INPUT); // define input and output pins
pixels.begin(); // Initialize the NeoPixel library.
pixels.clear(); // Initialize all pixels to 'off'
myservo1.attach(21);
myservo2.attach(22); // Attach the servos.
Open();
angleupdown = 180;
myservo2.write(angleupdown);
}
void loop() {
if (analogRead(27) > 150) {
pixels.setPixelColor(0, pixels.Color(255, 0, 0)); // Red color.
pixels.show();
delay(1000);
tone(20, 700); // Sound the buzzer
delay(1000);
noTone(20); // Stop the buzzer
Open();
delay(500);
Down();
delay(500);
Close();
delay(500);
Up();
pixels.setPixelColor(0, pixels.Color(0, 255, 0)); // Green color.
pixels.show();
delay(500);
// Clear the color after a delay.
pixels.setPixelColor(0, pixels.Color(0, 0, 0)); // Off
pixels.show();
delay(500);
Open();
angleupdown = 180;
myservo2.write(angleupdown); // Reset the servo position
}
}
void Open() {
myservo1.write(180); // Servo opens
}
void Close() {
myservo1.write(30); // Servo closes
}
void Up() {
for (int i = 0; i < 45; i++) {
angleupdown += 2;
myservo2.write(angleupdown); // Move servo up
delay(30);
}
}
void Down() {
for (int i = 0; i < 45; i++) {
angleupdown -= 2;
myservo2.write(angleupdown); // Move servo down
delay(30);
}
}