Paralel Robot Servo Motor Tahrikli Tasarımı – 7

Paralel Robot Servo Motor tahrik sisteminde model oyuncaklarda kullanılan düşük torklu servo motorlar kullanılmıştır. TowerPro SG5010 model kullanılmış olup tork değerleri=6v-11 kg.cm  hız=0.17s/60 derecedir. bu mekanizmanın yapılmasında ki amaç bilgisayar kontrolünün yapılması ve bunun için en kolay bilgisayar kontrollü motor olan servo motor seçilmiştir.

Ayrıca bu tahrikli delta robotta kıskaç mekanizması geliştirilip başarılı bir şekilde bilgisayar tarafından kontrol edilmiştir.

Mekanik Yapı

Kıskaç Mekanizması

Kıskaç mekanizması basit olarak crank-slider mekanizmasından esinlenip tasarlanmıştır. 3 adet kol yani slider couple ile birlikte 3 köşeli servo motorun shaftına bağlanarak oluşturulmuştur. Servo motor söndüğünde ona bağlı olan couplelar sayesinde kıskaç tutucularını iter veya çeker. Maksimum çalışma alanı çap 50mm minimum 4mm arasındadır. Diğer boyutlar teknik resimlerden elde edilebilir.

Paralel Robot Kıskaç Mekanizması
Paralel Robot Kıskaç Mekanizması

Kıskaç direk olarak tutucuya bağlanmıştır. Bilgisayar ile kontrolü delta robot programında fare ile kontrol kısmında farenin orta tuşu tekerleğine basılarak ve program kontrol bloğunda kıskaç aç kapa butonu ile kontrol edilebilir. Tutulacak olan malzemenin kaymaması için dvd-romlardan sökülen kauçuk papuçlar takılmıştır.

Servo motor tahrikli mekanizma diğer step motorlu mekanizmaya göre daha basit olup hız konusunda step motorlu mekanizmadan daha hızlıdır. Çünkü kollar servo motorun shaftına direk olarak bağlanmıştır. Tork ve hassasiyet karşılaştırmasında step motorun yanından bile geçemez. Bu sistemde diğeri gibi 3 kollu olduğundan sabit platform ve diğer bağlantılar aynıdır. Fakat bu sistemde zbl-05 ball jointler yerine kendi yaptığım el yapımı ball joint ler kullanılmıştır. Yapımında kullanılan malzemeler çok basit ama etkilidir. Toplu iğne ve kablo yüksüğü kullanılmıştır.

Toplu İğne ve Kablo Yüksüğü
Toplu İğne ve Kablo Yüksüğü

Yapımı şu şekildedir. Kablo yüksüğü yatay bi şekilde sıcak slikon ile uzuva sabitlenir. Toplu iğnenin top kısmı kablo yüksüğünün içinden geçirilir. Ardırdan geri çıkmaması için daha ufak bir kablo yüksüğü ile kapatılmadan önce bir miktar gress yağı sürülür. Toplu iğnenin iğne kısmı ise tutucuya sabitlenir. Bu şekilde 3 serbestlik derecesi elde etmiş oluruz.

Küresel Mafsal
Küresel Mafsal

Genel görünümü ile mekanizma aşağıdaki gibidir. Detaylar tenik resimlerde mevcuttur.

Paralel Robot servo Motor
Paralel Robot servo Motor
Elektronik Devre

Servo motor tahrikli delta robot mekanizmasında step motorlu mekanizmaya benzer yapıda picler kullanılmıştır. Ana pic olarak 16f877 şeçilmiştir. Bunun sebebi kinematik işlemleri bilgisayara yaptırıp sadece konumlandırmak için gerekli olan değerleri pic gönderdiğimiz için fazla bir hafızaya gerek yoktur. Bu yüzden ana pic olarak 18f4620 yerine 16f877 seçilmiştir. Bu elektronik devrenin bilgisayar ile bağlantısı olup ayrıca manual konumda potansiyometreler ile robotun kollarını hareket ettirmeyi sağlar. Yol verici entegre 74hct139 dur ana pic ten gönderilen servo motor kontrol datalarını sırasıyla 4 adet pic lere gödnerir. 3 pic 3 motor içindir. 4.ise kıskaçtaki servo motor içindir.

Ana besleme kablosu ve bilgisayar bağlantısı yapıldıktan sonra power butonu “on” konumuna getirirlir. Bütün durum ledlerinin hepsinin aynı anda yanıp söndüğü tespit edilir. Eğer yanmaz ise elektronik devre arızalıdır. Ardından power butonun yanındaki çalışma butonu run konumuna alınır. Stop konumunda robot durur iki kontrol şekline de kapalıdır. Daha sonra eğer bilgisayardan kontrol edilmek isteniyorsa “auto-manual” anahtarı auto konumuna alınır. Diğer durumda robot butonların üstündeki potansiyometreler sayesinde kollar bağımsız olarak hareket ettirilebilir. Auto konumunda robot hazır konumda bekler. Bilgisayardan gönderilen veri 4 byte uzunluğundadır. İlk üç byte robotun konumlandırmak için servo motor bilgilerini taşır dördüncü byte ise kıskaç servo motorunu bilgisini taşır. 4 byte lık bilgi ana pic tarafından alınır. 4.byte alındıktan sonra sırasıyla bir iki üç ve dördüncü byte diğer piclere gönderilir. Servo bilgilerini alan picler servo motorları istenilen konuma getirmek için gerekli olan pwn sinyalini üretir. Bu şekilde servo motorlar sürülmüş olur.

Elektronik devrede 5 adet 16f628 pic gözükmektedir. Bunun sebebi baskı deverede boşluk kalmış olması ve o boşluk beşinci pic ile doldurulmuştur. Bası deverede tasarımda önemlidir.

Piclerin seri haberleşme hızları 9600 baud ratedir. Bilgisayar programı yukarıda belirtilen C# programıdır. Programda robot geometri ve robotun sıfır posizyonundaki xyz değerlerinin doğru girilmesi hayati önem taşır.

Paralel Robot Servo Motor Elektronik Devresi
Paralel Robot Servo Motor Elektronik Devresi

Elektronik devre şemasını ve baskı devresini aşağıdaki bulabilirsiniz.

 

Paralel Robot Servo Motor Elektronik Devre Şeması
Paralel Robot Servo Motor Elektronik Devre Şeması
Paralel Robot Servo Motor Elektronik Baskı Devresi
Paralel Robot Servo Motor Elektronik Baskı Devresi
Ana Pic Programı
///////////////////////////////////////////////////////////////////////////////
////                    servo_motor_xyz_kontrol_verici.C                   ////
////                                                                       ////
////  Bu porgram pc den gönderilen 3 farklı açı değeri için hesaplanan     ////
////  3 farklı veriyi tek bir seferde alıp, 3 farklı pic sırayla gönderir. ////
////                                                                       ////
////                                                                       ////
////  Robot geometry:                                                      ////
////     e =      // end effector                                          ////
////     f =      // base                                                  ////
////     re =     // rod                                                   ////
////     rf =     // arm                                                   ////
////                                                                       ////
////  Kullanılan mikrokontrolor 16F877A(8K, 4MHz)                          ////
////                                                                       ////
////                                                                       ////
///////////////////////////////////////////////////////////////////////////////
////  YAZAN: Remzi ŞAHİNOĞLU                                               ////
////  TARİH: 09.07.2011                                                    ////
///////////////////////////////////////////////////////////////////////////////

#if defined(__PCM__)
#include <16F877A.h>
#device ADC=8    // dahili adc 8 bit olarak ayarlanmıstır
#fuses XT, NOWDT, NOPROTECT, NOLVP, NOBROWNOUT, NOPUT, NOWRT, NODEBUG, NOCPD
#use delay(clock=4000000)
#use rs232 (baud=9600, xmit=PIN_C6, rcv=PIN_c7, parity=N, stop=1)
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#endif

//#device PIC16F877

int i=0, degisim=0;
int servo_1_eski=0, servo_2_eski=0, servo_3_eski=0, servo_4_eski=0;
int servo_1=150, servo_2=150, servo_3=150, servo_4=150;            // servo orta konumda olması için başlangıçta

#int_rda
void serihaberlesme_kesmesi()                         // kesme geldiğinde buraya dallanılır
{
   disable_interrupts(int_rda);                       // rs232 kesmesi pasif
   output_high(PIN_D3);

   i += 1;                                            // sırasıyla servolar için pwm değerlerini al
   if(i==5){i=1;}
   if(i==1){servo_1 = getc();}  
   if(i==2){servo_2 = getc();}
   if(i==3){servo_3 = getc();}
   if(i==4)
   {
      servo_4 = getc();
      degisim = 1;                                    // 4 byte veriyi aldıgı zaman degisimi ac ve dataları gönder
   }
   
   output_low(PIN_D3);
   enable_interrupts(int_rda);                        // rs232 kesmesi aktif
}

void main()
{
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_CCP1(CCP_OFF);
   setup_CCP2(CCP_OFF);
   
   enable_interrupts(GLOBAL);                         // tüm kesmeler aktif
   enable_interrupts(int_rda);                        // rs232 kesmesi pasif
   disable_interrupts(int_rb);                        // rb0 kesmesi pasif
   
   setup_adc_ports(ALL_ANALOG);                       // tüm analog pinleri açık
   setup_adc(ADC_CLOCK_DIV_8);                        // analog okuma frekansı fosc/8
   
   set_tris_a(0b00001111);                            // ilk 4 bit giriş diğerleri çıkış
   set_tris_b(0b00000000);                            // b portu çıkış
   set_tris_c(0b10000000);                            // RX giriş diğerleri çıkış
   set_tris_d(0b11110000);                            // SON 4 bit giriş diğerleri çıkış
   set_tris_e(0b00000000);                            // e portu çıkış
    
   output_a(0x00);   
   output_b(0x00);
   output_c(0x00);
   output_d(0x00);
      
   output_b(0xFf);                                    //tüm ledler aktif
   delay_ms(1000);
   output_b(0x00);
   delay_ms(100);
   output_high(PIN_B1);
   delay_ms(500);
   output_low(PIN_B1);
   delay_ms(500);
   output_high(PIN_B1);
   delay_ms(500);
   output_low(PIN_B1);
   delay_ms(500);
   output_high(PIN_B1);
   
   while(TRUE)
   {
      output_high(PIN_B1);
      //******************** Run çalışma butonuna basıldı ********************//
      if(input(PIN_D4)==0)
      {      
         output_low(PIN_B4);                             // stop led pasif
         output_high(PIN_B3);                            // ready led aktif
         delay_ms(100);
         
         //******************* Robot "MANUAL" durumunda **********************//
         if(input(PIN_D5)==0)
         {
            disable_interrupts(int_rda);                 // rs232 kesmesi pasif
            output_high(PIN_B7);                         // Manual ledi aktif
            output_low(PIN_B6);                          // Auto ledi pasif
            output_low(PIN_B3);                          // ready led pasif
            
            //********************** SERVO-1 *********************************//
            set_adc_channel(0);                          // ADC kanalı AN0 i seç
            delay_us(20);
            servo_1 = read_adc();                        // AN0 deki değeri oku         
            if(servo_1 != servo_1_eski)                  // Okunan değer bir önceki okunan değerden farklı ise datayı gönder
            {
               output_high(PIN_B2);                      // busy led aktif
               servo_1_eski = servo_1;                   // yeni bilgi artık eski bilgi oldu          
               output_high(PIN_C4);                      // U1 nolu pice göndermek için demuşu ayarla - 01
               output_low(PIN_C5);
               delay_us(100);
               putc(servo_1);                            // AN0 deb okunan değeri gönder
               output_low(PIN_B2);                       // busy led pasif
            }
            delay_ms(100);
            //********************** SERVO-2 *********************************//
            set_adc_channel(1);
            delay_us(20);
            servo_2 = read_adc();         
            if(servo_2 != servo_2_eski)
            {
               output_high(PIN_B2);                      // busy led aktif
               servo_2_eski = servo_2;           
               output_low(PIN_C4);                       // U2 nolu pice göndermek için demuşu ayarla - 10
               output_high(PIN_C5);
               delay_us(100);
               putc(servo_2);
               output_low(PIN_B2);                       // busy led pasif
            }
            delay_ms(100);
            //********************** SERVO-3 *********************************//
            set_adc_channel(2);
            delay_us(20);
            servo_3 = read_adc();      
            if(servo_3 != servo_3_eski)
            {
               output_high(PIN_B2);                      // busy led aktif
               servo_3_eski = servo_3;           
               output_high(PIN_C4);                      // U3 nolu pice göndermek için demuşu ayarla - 11
               output_high(PIN_C5);
               delay_us(100);
               putc(servo_3);
               output_low(PIN_B2);                       // busy led pasif
            }
            delay_ms(100);
            //********************** SERVO-4 *********************************//
            set_adc_channel(3);
            delay_us(20);
            servo_4 = read_adc();      
            if(servo_4 != servo_4_eski)
            {
               output_high(PIN_B2);                     // busy led aktif
               servo_4_eski = servo_4;           
               output_low(PIN_C4);                      // U0 nolu pice göndermek için demuşu ayarla - 00
               output_low(PIN_C5);
               delay_us(100);
               putc(servo_4);
               output_low(PIN_B2);                       // busy led pasif
            }
            delay_ms(100);
            //******************** SERVO-CLAW ********************************//
            if(input(PIN_D7)==0)
            {
               output_high(PIN_C3);                      // kıskacı ac
               delay_ms(5);
            }
            else
            {
               output_low(PIN_C3);                       // kıskacı kapa
               delay_ms(5);
            }
            delay_ms(100);
            //********************* LIGHT ON OFF *****************************//
            if(input(PIN_D6)==0)
            {
               output_high(PIN_B5);                      // aydınlatma ledini ac
            }
            else
            {
               output_low(PIN_B5);                       // aydınlatma ledini kapa
            }
            output_high(PIN_B3);                         // ready led pasif
         }
         else
         {
         //******************** Robot "AUTO" durumunda ***********************//
            enable_interrupts(int_rda);                  // RS232 kesmesi aktif
            output_low(PIN_B7);                          // MANUAL Ledi pasif
            output_high(PIN_B6);                         // AUTO ledi aktif
            
            if(degisim == 1)                             // Değişim olduğunda sürücü piclere dataları gönder
            {
               output_high(PIN_B2);                      // busy led aktif
               output_low(PIN_B3);                       // ready led pasif
               degisim = 0;
               output_low(PIN_B7);                       // Manual ledi pasif
               
               output_high(PIN_C4);                      // U1 nolu pice göndermek için demuxu ayarla
               output_low(PIN_C5);
               delay_us(100);
               putc(servo_1);                            // AN5 deb okunan değeri gönder
               delay_us(1000);
               
               output_low(PIN_C4);                       // U1 nolu pice göndermek için demuşu ayarla
               output_high(PIN_C5);
               delay_us(100);
               putc(servo_2);                            // AN5 deb okunan değeri gönder
               delay_us(1000);
               
               output_high(PIN_C4);                      // U1 nolu pice göndermek için demuşu ayarla
               output_high(PIN_C5);
               delay_us(100);
               putc(servo_3);                            // AN5 deb okunan değeri gönder
               delay_us(1000);
               
               if(servo_4 == 150)                        // değer 0X96 ise 
               {output_low(PIN_C3);}                     // kıskacı ac         
               else
               {output_high(PIN_C3);}                    // kıskacı kapat
               
               output_low(PIN_B2);                       // busy led pasif
               output_high(PIN_B3);                      // ready led aktif
            }
         }     
      }
      else//******************* STOP butonuna basıldı ************************//
      {       
         output_b(0x00);                                 // tüm led pasif
         output_high(PIN_B4);                            // stop led aktif
         delay_ms(100);
      }
   }
}

Burdaki pic programı 3 koldaki servo motorları kontrol etmek için ve kıskacta bulunan kıskacı açma kapama için kullanılan servoyu süren pic lerin programıdır. Üsteki pic programı ana pic olan 16f877 nin bilgisayardan aldığı 4 bytelık datayı ki bunların üç tanesi kollar bir tanesi kıskaç için, bu pic’lere göndermesinden ibarettir.

///////////////////////////////////////////////////////////////////////////////
////                    servo_motor_xyz_kontrol_alici.C                    ////
////                                                                       ////
////  Bu porgram ana mikrokontrolden gönderilen veriyi alıp ilgili         ////
////  servo motor için pwm sinyalini hesaplayıp üretmesini sağlar.         ////
////                                                                       ////
////  Robot geometry:                                                      ////
////     e = ;     // end effector                                         ////
////     f = ;     // base                                                 ////
////     re = ;    // rod                                                  ////
////     rf = ;    // arm                                                  ////
////                                                                       ////
////  Kullanılan mikrokontrolor 16F628A(2K, 20MHz)                         ////
////                                                                       ////
////  Servo Motor bağlantıları: PORTA,PIN_A0                               ////
////  DATA IN: PORTB,ALL                                                   ////
////                                                                       ////
////  duty    konum (derece)  bilgi(pc)                                    ////
////  ----    -----           -----                                        ////
////  1000us  -90             100                                          ////
////  1500us  0               150                                          ////
////  2000us  +90             200                                          ////
////                                                                       ////
///////////////////////////////////////////////////////////////////////////////
////  YAZAN: Remzi ŞAHİNOĞLU                                               ////
////  TARİH: 28.06.2011                                                    ////
///////////////////////////////////////////////////////////////////////////////

#if defined(__PCM__)
#include <16F628A.h>
#use delay(clock=20000000)
#fuses HS, MCLR, PUT, NOWDT, NOLVP, NOBROWNOUT, NOPROTECT
#use rs232 (baud=9600, xmit=PIN_B2, rcv=PIN_B1, parity=N, stop=1)
#endif

//#device PIC16F628

long bilgi=0;
long doluluk=1500, bosluk=18500, periyod=20000;       // servo orta konumda olması için başlangıçta

#int_rda
void serihaberlesme_kesmesi()                         // kesme geldiğinde buraya dallanılır
{
   disable_interrupts(int_rda);                       // rs232 kesmesi pasif
   output_high(PIN_A0);

   bilgi=getc();                                      // 60 ile 200 arasında olmalı, 8 bitlik bi değer
   doluluk = bilgi * 10;                              // 600 us ile 2000 us arasında olmalı
   bosluk = periyod - doluluk;                        // bosluk süresini hesapla

   output_low(PIN_A0);
   enable_interrupts(int_rda);                        // rs232 kesmesi aktif
}

void main()
{
   setup_timer_1(T1_DISABLED);                        // T1 zamanlayıcını kapat
   setup_timer_2(T2_DISABLED,0,1);                    // T2 zamanlayıcını kapat
   setup_CCP1(CCP_OFF);                               // compare modu devre dışı
   
   output_low(PIN_A0);                                // kesme durum ledi
   
   enable_interrupts(GLOBAL);                         // tüm kesmeler aktif
   enable_interrupts(int_rda);                        // rs232 kesmesi aktif
   
   while(TRUE)
   {
      output_high(PIN_A1);                            // PWM çıkış PORTB nin 3. bitinden (RB3)
      delay_us(doluluk);
      output_low(PIN_A1);
      delay_us(bosluk);
   }
}

Kıskaç servosu için gerekli pic programı aşağıdadır.

///////////////////////////////////////////////////////////////////////////////
////                    servo_motor_xyz_kontrol_alici.C                    ////
////                                                                       ////
////  Bu porgram ana mikrokontrolden gönderilen veriyi alıp ilgili         ////
////  servo motor için pwm sinyalini hesaplayıp üretmesini sağlar.         ////
////                                                                       ////
////  Robot geometry:                                                      ////
////     e = ;     // end effector                                         ////
////     f = ;     // base                                                 ////
////     re = ;    // rod                                                  ////
////     rf = ;    // arm                                                  ////
////                                                                       ////
////  Kullanılan mikrokontrolor 16F628A(2K, 20MHz)                         ////
////                                                                       ////
////  Servo Motor bağlantıları: PORTA,PIN_A0                               ////
////  DATA IN: PORTB,ALL                                                   ////
////                                                                       ////
////  duty    konum (derece)  bilgi(pc)                                    ////
////  ----    -----           -----                                        ////
////  1000us  -90             100                                          ////
////  1500us  0               150                                          ////
////  2000us  +90             200                                          ////
////                                                                       ////
///////////////////////////////////////////////////////////////////////////////
////  YAZAN: Remzi ŞAHİNOĞLU                                               ////
////  TARİH: 28.06.2011                                                    ////
///////////////////////////////////////////////////////////////////////////////

#if defined(__PCM__)
#include <16F628A.h>
#use delay(clock=4000000)
#fuses XT, MCLR, PUT, NOWDT, NOLVP, NOBROWNOUT, NOPROTECT
#endif

//#device PIC16F628

void main()
{
   setup_timer_1(T1_DISABLED);                        // T1 zamanlayıcını kapat
   setup_timer_2(T2_DISABLED,0,1);                    // T2 zamanlayıcını kapat
   setup_CCP1(CCP_OFF);                               // compare modu devre dışı
   
   set_tris_a(0b00100000);
   set_tris_b(0b00000010);
   
   output_low(PIN_A0);                                // kesme durum ledi
   
   while(TRUE)
   {
      if(input(PIN_B1)==0)                            // B0 SIFIR İSE KISKACI KAPAT
      {
         output_high(PIN_A0);
         
         output_high(PIN_A1);                         // PWM çıkış PORTA nin 1. bitinden (RA1)
         delay_us(2200);
         output_low(PIN_A1);
         delay_us(17800);
      }
      else                                            // B0 BİR İSE KISKACI AC
      {
         output_low(PIN_A0);
         
         output_high(PIN_A1);                         // PWM çıkış PORTA nin 1. bitinden (RA1)
         delay_us(1200);
         output_low(PIN_A1);
         delay_us(18800);
      }
   }
}
Paralel Robot Servo Motor Tahrikli Uygulama Videosu

Bir sonraki yazımızda DC Redüktörlü Motor Tahrikli olarak kontrol etmeyi deneyeceğiz.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.

This site uses Akismet to reduce spam. Learn how your comment data is processed.