Two Axis Robot Arm¶
Giriş¶
Bu projede, PicoBricks ile iki eksenli robot kol yapımını öğreneceğiz.
Proje Detayları ve Algoritması¶
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.
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.
Bağlantı Diyagramı¶
Picobricks modüllerini herhangi bir kablo bağlantısı olmadan programlayabilir ve çalıştırabilirsiniz. Modülleri karttan ayırarak kullanacaksanız modül bağlantılarını verilen konektör kablolar ile yapmalısınız.
Projenin MicroPython 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 motors pins
servo1.freq(50)
servo2.freq(50)
buzzer.freq(440)
#define frequencies of servo motors and buzzer
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLACK = (0, 0, 0) # RGB color settings
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
Tüyo
Eğer kodunuzun adını main.py olarak kaydederseniz, kodunuz her BOOT
yaptığınızda çalışacaktır.
Projenin Arduino C Kodu¶
#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
// define required libraries
#include <Servo.h>
Servo myservo1;
Servo myservo2;
int angleupdown;
void setup() {
pinMode(20,OUTPUT);
pinMode(27,INPUT);
// define input and output pins
pixels.begin();
pixels.clear();
myservo1.attach(21);
myservo2.attach(22); // define servo motor pins
Open();
angleupdown=180;
myservo2.write(angleupdown);
}
void loop() {
if(analogRead(27)>150){
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);
pixels.setPixelColor(0, pixels.Color(0, 0, 0));
pixels.show();
Open();
angleupdown=180;
myservo2.write(angleupdown);
// If the LDR data is greater than the specified limit, the buzzer will sound, the RGB will turn red and servo motors will work
// The RGB will turn green when the movement is complete
}
}
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);
}
}
Projenin MicroBlocks Kodu¶
Not
MicroBlocks ile kodlama yapmak için yukarıdaki görseli MicroBlocks Run sekmesine sürükleyip bırakmanız yeterlidir.