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.
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.
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.
Genel görünümü ile mekanizma aşağıdaki gibidir. Detaylar tenik resimlerde mevcuttur.
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.
Elektronik devre şemasını ve baskı devresini aşağıdaki bulabilirsiniz.
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.
0 yorum