Arduino
OKUDUĞUNUZ KONU
El Hareketiyle Kontrol Edilen 5 Eksen Robot Kol
7

El Hareketiyle Kontrol Edilen 5 Eksen Robot Kol

Yazar : Sezgin Gül27 Haziran 2015

Bu projede el hareketimizle robot kol kontrolünden bahsedeceğim.Günümüzde robot kollar birçok alanda kullanılmakta.Özellikle hassasiyet gerektiren uygulamalar, tehlike arz eden mekanlarda sıkça kullanılmaktadır.Tabikide robot kolun kontrol edilmesinde birçok yöntem var.Fakat her yöntem aynı hassasiyeti göstermiyor.Bu proje de ivme ölçer kullanarak kontrol edeceğiz.

Peki neden ivmeölçer kullandık?

İvmeölçerlerden anlık veri alma hızı diğer sensörlere oranlı oldukça iyi.Sensörü hareket ettirdiğimizde eksen konumlarının değiştiğini görebiliriz.Aldığımız bu konumların değerlerini hareketi sağlamak için kullanacağız.

Malzemeler:

  1. Arduino (2 adet)
  2. 5 adet 9gr servo motor
  3. Adxl345 ivmeölçer(2adet)
  4. Potansiyometre
  5. Mekanik için mika veya pleksi
  6. Lipo pil (pil yeterli voltta olması gerekir aksi halde servolarda titreme ve istenmeyen hareketler gerçekleşir)

Projede herbir servo motor eklemlerin hareketini sağlar.İvmeölçerlerden gelen veriler arduinoda okunarak servoların minimum ve maksimum açılarına oranlanır ve servo motor hareketiyle eklemi hareket ettirir.İvme ölçerleri elimize sabitleyerek elimiz kontrolünde daha hassas kontrol edilmesi sağlanmıştır.Bağlantı şeması

robot-kol-sema

Projemizde iki ayrı arduino var ve 2 tane kod olması gerekiyor.İlk arduino için gereken kod , bu kod 2 tane servo motorun kontrolü içindir.

// ADXL345 ivmeölçer 2 Servo Motor kontrolü 
#include <Wire.h>
#include <Servo.h> 
Servo myservox; 
Servo myservoy; 
#define DEVICE (0x53) 
#define TO_READ (6) 
#define TRIGGER 16 
byte buff[TO_READ] ; 
int i;
 
void setup()
{
 pinMode(TRIGGER,OUTPUT);
 digitalWrite(TRIGGER,HIGH);
 Wire.begin(); 
 myservox.attach(9); 
 myservoy.attach(10); 
 myservox.write(90); 
 delay(25); 
 myservoy.write(90); 
 delay(25); 
 
 writeTo(DEVICE, 0x2D, 0); 
 writeTo(DEVICE, 0x2D, 16);
 writeTo(DEVICE, 0x2D, 8);
}
 
void loop()
{
 int regAddress = 0x32; 
 int x, y, z;
 digitalWrite(TRIGGER,LOW);
 delay(10);
 digitalWrite(TRIGGER,HIGH); 
 readFrom(DEVICE, regAddress, TO_READ, buff);
  
 x=0;
 y=0;
 z=0;
 for(i=1;i<=5;i++){
 x += (((int)buff[1]) << 8) | buff[0]; 
 y += (((int)buff[3])<< 8) | buff[2];
 z += (((int)buff[5]) << 8) | buff[4];
 delay(10);
 }
 x/=5;
 y/=5;
 z/=5;
 if(x<-255)x= -255; else if (x>255)x=255;
 if(y<-255)y= -255; else if (y>255)y=255;
 x=map(x, -255, 255, 0, 180); 
 y=map(y, -255, 255, 0, 180); 
 myservox.write(x); 
 delay(25); 
 myservoy.write(180-y); 
 delay(25); 
  
 delay(200);
}
 
void writeTo(int device, byte address, byte val) {
 Wire.beginTransmission(device); 
 Wire.write(address); 
 Wire.write(val); 
 Wire.endTransmission(); 
}
 
void readFrom(int device, byte address, int num, byte buff[]) {
 Wire.beginTransmission(device); 
 Wire.write(address); 
 Wire.endTransmission();
 
 Wire.beginTransmission(device); 
 Wire.requestFrom(device, num); 
 
 int i = 0;
 while(Wire.available()) 
 { 
 buff[i] = Wire.read(); 
 i++;
 }
 Wire.endTransmission(); 
}

İkinci arduino için gereken kod , bu kod ise 3 tane servo motorun kontrolü içindir.Toplamda tane servo motorumuz mevcut yani robotumuz 5 eksenli.

// ADXL345 ivmeölçer 3 Servo Motor kontrolü 
#include <Wire.h>
#include <Servo.h> 
Servo myservox; 
Servo myservoy;
Servo myservoz; 
#define DEVICE (0x53) 
#define TO_READ (6) 
#define TRIGGER 16 
byte buff[TO_READ] ; 
int i;
 
void setup()
{
 pinMode(TRIGGER,OUTPUT);
 digitalWrite(TRIGGER,HIGH);
 Wire.begin(); 
 myservox.attach(9); 
 myservoy.attach(10); 
 myservoy.attach(11); 
 myservox.write(90); 
 delay(25); 
 myservoy.write(90); 
 delay(25); 
myservoz.write(90); 
 delay(25); 
 writeTo(DEVICE, 0x2D, 0); 
 writeTo(DEVICE, 0x2D, 16);
 writeTo(DEVICE, 0x2D, 8);
}
 
void loop()
{
 int regAddress = 0x32; 
 int x, y, z;
 digitalWrite(TRIGGER,LOW);
 delay(10);
 digitalWrite(TRIGGER,HIGH); 
 readFrom(DEVICE, regAddress, TO_READ, buff);
  
 x=0;
 y=0;
 z=0;
 for(i=1;i<=5;i++){
 x += (((int)buff[1]) << 8) | buff[0]; 
 y += (((int)buff[3])<< 8) | buff[2];
 z += (((int)buff[5]) << 8) | buff[4];
 delay(10);
 }
 x/=5;
 y/=5;
 z/=5;
 if(x<-255)x= -255; else if (x>255)x=255;
 if(y<-255)y= -255; else if (y>255)y=255;
 if(z<-255)z= -255; else if (z>255)z=255;
 x=map(x, -255, 255, 0, 180); 
 y=map(y, -255, 255, 0, 180);
 z=map(z, -255, 255, 0, 180); 
 myservox.write(x); 
 delay(25); 
 myservoy.write(180-y); 
 delay(25); 
 myservoz.write(180-z); 
 delay(25); 
 delay(200);
}
 
 
void writeTo(int device, byte address, byte val) {
 Wire.beginTransmission(device); 
 Wire.write(address); 
 Wire.write(val); 
 Wire.endTransmission(); 
}
 
 
void readFrom(int device, byte address, int num, byte buff[]) {
 Wire.beginTransmission(device); 
 Wire.write(address); 
 Wire.endTransmission();
 
 Wire.beginTransmission(device); 
 Wire.requestFrom(device, num); 
 
 int i = 0;
 while(Wire.available()) 
 { 
 buff[i] = Wire.read(); 
 i++;
 }
 Wire.endTransmission(); 
}
SİZCE NASIL OLMUŞ?
Beğendim
87%
İlginç
7%
Eh İşte
0%
Anlamadım
7%
Kötü
0%
Berbat
0%
YAZAR HAKKINDA
Sezgin Gül
Atatürk Üniversitesi Makine Mühendisliği bölümünde lisans eğitimi almaktayım.Bölümüme paralel olarak robotik sistemler üzerine projeler geliştirmekteyim. Disiplinli ve düzenli çalışmayı severim.Sürekli yeni şeyler öğrenmeye hevesli, kendi alanımdaki konularda uzman, kendi kendime öğrenebilen, aktif çalışmayı seven, dinamik bir kişiliğim vardır.Ayrıca takım çalışmasına yatkın, değişime açık, yaratıcı, yenilikçi, çalışkan ve kararlı biriyimdir.
7 YORUMLAR

YORUM YAP