MG995R servo motor

Başlatan picpicpic, 06 Temmuz 2012, 11:25:28

picpicpic

Merhaba, elimde Towerpro marka mg995r servo var, hangi kablonun neye denk geldiğini zar zor buldum, 20msde bir sinyal gönderilmesi gerektiğini öğrencim, ama duty cycle'ının kaçla kaç arasında olduğunu henüz bulamadım, internette bu servoyla ilgili en ufak döküman yok, bu servoyu daha önce kulllanmış arkadaşlar paylaşabilirler mi acaba?

XX_CİHAN_XX

Birde aşağıdaki değerleri deneyin.
600uS   -90
1500uS  0
2400uS +90
Period -> 20mS
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

picpicpic

motor ne yaparsam yapayım 180 derece dönmüyor, keypadden sayı girilebilen bir devre yaptım kaç us olduğunu bulmak için en uç alt değeri görmek için 0, en üst değeri görmek içinde 3000 veriyorum, motor 145 derece civarı yapıyor en fazla, periyotun 20ms olup olmadığından da şüphelenmeye başladım, koskoca towerpro bitane datasheet koymamış nete, nasıl birşeydir bu anlamadım..

XX_CİHAN_XX

Isisin osilaskopu ile periyot ve duty cycle değerlerinin olması gerektiği gibi çıkıp çıkmadığına bakmanızı öneririm.
Çoğu zaman gerçekçi sonuçlar veriyor.
Hayırlı cumalar.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

muhittin_kaplan

#4
tam 180 dönmez.

mesaj birleştirme:: 06 Temmuz 2012, 14:49:09

bir buton koy. bu buton 1ms ile 3ms arasında duty yi arttırsın. ve frekansı 50-60 hz civarında tut. (20ms) RC lerde herbiri farklı çalışabiliyor.

muat

Bu model servo sanırım piyasada en fazla sahtesi bulunan modellerden biri. Benim elimde 3 farklı yerden alınmış versiyonları var, ve üçünün de torkları ve açıyı ayarlama kabiliyetleri farklı. Eğer elinizdeki dandik olanlardan biri ise, bu tip bir sorunla karşılaşmış olabilirsiniz. Ya da servonun içini açıp kapattıysanız, hareketi sınırlayıcı engellerden biri yanlış konuma gelmiş olabilir.

Kullandığım çoğu servoda tam 180 derece dönüş sağlayabiliyorum, hatta bunun için engeller arasındaki açı 200 dereceye yakın oluyor.

gareven

öncelikle merhaba arkadaşlar
bu model yani mg995 maksimum 120-130 derece arası dönüş yapabilen bir servo motor, çünkü bu model geniş çalışma alanı gerektiren yerlerde değil de yüksek tork gerektiren yerlerde kullanılıyor genellikle.

palse gelince 20 us diye biliyorum olmadıysa sırasıyla 18 us ve 16us değerlerini dene servonun hareketinden optimum bi şey bulabilirsin.

muhittin_kaplan

20us degil ms olacak
RC servolar 50-60hz lik peryottaki PWM ile çalışırlar (100 hz olanlarıda mevcut)

picpicpic

Arkadaşlar dediklerinizi dikkate alarak 3 tane deney yaptım,

TEST-1= dalga genişliği 1mikrosaniyeden 4000 mikrosaniyeye kadar artan sinyaller 20milisaniyede bir servoya gönderildi, 800us civarında hareketlenme başladı, 2200 us civarında hareket durdu, yapılan toplam açı 130-145 arası (ölçmedim, tahmini)

TEST-2= dalga genişliği 1mikrosaniyeden 4000 mikrosaniyeye kadar artan sinyaller 18milisaniyede bir servoya gönderildi, 800us civarında hareketlenme başladı, 2200 us civarında hareket durdu, yapılan toplam açı 130-145 arası

TEST-3= dalga genişliği 1mikrosaniyeden 4000 mikrosaniyeye kadar artan sinyaller 16milisaniyede bir servoya gönderildi, 800us civarında hareketlenme başladı, 2200 us civarında hareket durdu, yapılan toplam açı 130-145 arası

Anlayacağınız periyotun hiçbir etkisi olmadı motora, motorum hala 130-145 derece civarında dönüyor maksimum, bir arkadaşımız ben 180 derece çevirdim demiş, başka arkadaşımızda bu motorun maksimum 120-130 derece dönebileceğini söylemiş ki ben buna katılıyorum, elimde 2 tane aynı motordan var ikiside aynı şekilde çalışıyor, ama bu motor fiziksel olarak yani elimle çevirdiğimde 180 derece civarı dönebiliyor, koskoca bir motor üreticisi en ufak bir belge yayınlamazmı nasıl kullanılacağıyla ilgili, bu testlerden anladığım tek şey şu, ürünü araştırmadan almayacaksın ve parallax'tan şaşmayacaksın

XX_CİHAN_XX

#9
Aşağıdaki kodlarla 180 derece ile sonuç aldım. İsterseniz deneyebilirsiniz.
Denemelerimi %100 emin olmamakla birlikte aynı marka servo kullanarak yaptığımı hatırlıyorum.
Belki taklit yada başka bir ürün var elinizde tabi onu da bilemiyorum ama ben 180 dereceyi görmüştüm.
Aşağıdaki kodun tanımlama (define) kısmına baktığınızda B1 de buton, B4 te servo olduğu görülmekte.
Program ilk çalıştığında servo yu 0 pozisyonuna çekiyor.
Butona basınca tanımlama (define) kısmında ANGLE değeri kadar açıyla + ve - ye hareket ediyor sürekli.
Aşağıdaki programda ANGLE 90 girildiği için butona basınca Sevo +90, -90 şeklinde sürekli sağa sola hareket eder.
Bu açıyı ANGLE değerine 1 ile 90 arasında açı değeri girerek değiştirebilirsiniz.
Butona basınca program girdiğiniz ANGLE değeri kadar +, - hareketi yapacaktır
Servo çalıştıktan sonra butona tekrar basınca sıfır pozisyonuna geri alıp durduruyor.
Tekrar basınca aynı şekilde çalışmaya devam ediyor isterseniz bir deneyin.

#include <16F628A.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES PUT                      //Power Up Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES PROTECT                  //Code protected from reads

#use delay(int=4000000)

#define BT0     PIN_B1   
#define SERVO1  PIN_B4
//////
#define ANGLE   90       // 1 ile 90 arasında bir değer alacak !
//////
#define MIN     600     //-90 konumu
#define MID     1500    //0 konumu
#define MAX     2400    //+90 konumu

#define TURN_TIME ((ANGLE * 70) / 90)
#define STEPUP    ((MAX-MID)/90)
#define STEPDOWN  ((MID-MIN)/90)

#define MIN_VAL (MID - (STEPDOWN * ANGLE)) //-90 konumu
#define MAX_VAL (MID + (STEPUP * ANGLE)) //+90 konumu

#define MIN_DCH 65536 - MIN_VAL + 10        //DUTY CYCLE DEĞERİ (HIGH)
#define MIN_DCL 45536 + MIN_VAL + 90 
#define MID_DCH 65536 - MID + 10       //DUTY CYCLE DEĞERİ (HIGH)
#define MID_DCL 45536 + MID + 90
#define MAX_DCH 65536 - MAX_VAL + 10        //DUTY CYCLE DEĞERİ 
#define MAX_DCL 45536 + MAX_VAL + 90        //DUTY CYCLE DEĞERİ (LOW)

volatile int8 flag=0, yon=0, stat=0;
/*
yon=0 ise mid
yon=1 ise min
yon=2 ise max
*/
#int_TIMER1
void  TIMER1_isr(void) 
{
   if(stat==0)
   {
      output_low(SERVO1);   
      stat=1;
      switch(yon)
      {
         case 0: set_timer1(MID_DCL); break;
         case 1: set_timer1(MAX_DCL); break;
         case 2: set_timer1(MIN_DCL); break;  
         default: set_timer1(MAX_DCL); break;
      }
   }
   else
   {
      output_high(SERVO1);   
      stat=0;
      switch(yon)
      {
         case 0: set_timer1(MID_DCH); break;
         case 1: set_timer1(MAX_DCH); break;
         case 2: set_timer1(MIN_DCH); break;
         default: set_timer1(MAX_DCH); break;
      }
   }
}

void bt0_event (void)
{
      if(!input(BT0))
      {
         delay_ms(10);
         
         if(!input(BT0))
         {  
            while(!input(BT0));
            delay_ms(10);
            if(flag)
            {
               set_timer1(MID_DCH);
               stat=0;
               yon=0;
               flag=0;
               output_high(SERVO1);
            }   
            else
            {
               set_timer1(MAX_DCH);
               flag=1;
               stat=0;
               yon=1;   //min
               output_high(SERVO1);
            }
         }   
      }
}

void main()
{
   port_b_pullups(TRUE);
   setup_comparator(NC_NC_NC_NC);
   output_low(SERVO1);
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
   set_timer1(MID_DCH);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);
   output_high(SERVO1);
   unsigned int8 k;
start:
   while(TRUE)
   {
      for(k=0; k<TURN_TIME; k++)
      {
         if(!input(BT0))
         {
            bt0_event();
            goto start;
         }
         delay_ms(10);
      }
      
      if(yon)
      {
         yon++;
         if(yon==3)
            yon=1;
      }

   }
}
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

picpicpic

Alıntı yapılan: XX_CİHAN_XX - 08 Temmuz 2012, 17:01:27
Aşağıdaki kodlarla 180 derece ile sonuç aldım. İsterseniz deneyebilirsiniz.
Denemelerimi %100 emin olmamakla birlikte aynı marka servo kullanarak yaptığımı hatırlıyorum.
Belki taklit yada başka bir ürün var elinizde tabi onu da bilemiyorum ama ben 180 dereceyi görmüştüm.
Aşağıdaki kodun tanımlama (define) kısmına baktığınızda B1 de buton, B4 te servo olduğu görülmekte.
Program ilk çalıştığında servo yu 0 pozisyonuna çekiyor.
Butona basınca tanımlama (define) kısmında ANGLE değeri kadar açıyla + ve - ye hareket ediyor sürekli.
Aşağıdaki programda ANGLE 90 girildiği için butona basınca Sevo +90, -90 şeklinde sürekli sağa sola hareket eder.
Bu açıyı ANGLE değerine 1 ile 90 arasında açı değeri girerek değiştirebilirsiniz.
Butona basınca program girdiğiniz ANGLE değeri kadar +, - hareketi yapacaktır
Servo çalıştıktan sonra butona tekrar basınca sıfır pozisyonuna geri alıp durduruyor.
Tekrar basınca aynı şekilde çalışmaya devam ediyor isterseniz bir deneyin.

#include <16F628A.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES PUT                      //Power Up Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES PROTECT                  //Code protected from reads

#use delay(int=4000000)

#define BT0     PIN_B1   
#define SERVO1  PIN_B4
//////
#define ANGLE   90       // 1 ile 90 arasında bir değer alacak !
//////
#define MIN     600     //-90 konumu
#define MID     1500    //0 konumu
#define MAX     2400    //+90 konumu

#define TURN_TIME ((ANGLE * 70) / 90)
#define STEPUP    ((MAX-MID)/90)
#define STEPDOWN  ((MID-MIN)/90)

#define MIN_VAL (MID - (STEPDOWN * ANGLE)) //-90 konumu
#define MAX_VAL (MID + (STEPUP * ANGLE)) //+90 konumu

#define MIN_DCH 65536 - MIN_VAL + 10        //DUTY CYCLE DEĞERİ (HIGH)
#define MIN_DCL 45536 + MIN_VAL + 90 
#define MID_DCH 65536 - MID + 10       //DUTY CYCLE DEĞERİ (HIGH)
#define MID_DCL 45536 + MID + 90
#define MAX_DCH 65536 - MAX_VAL + 10        //DUTY CYCLE DEĞERİ 
#define MAX_DCL 45536 + MAX_VAL + 90        //DUTY CYCLE DEĞERİ (LOW)

volatile int8 flag=0, yon=0, stat=0;
/*
yon=0 ise mid
yon=1 ise min
yon=2 ise max
*/
#int_TIMER1
void  TIMER1_isr(void) 
{
   if(stat==0)
   {
      output_low(SERVO1);   
      stat=1;
      switch(yon)
      {
         case 0: set_timer1(MID_DCL); break;
         case 1: set_timer1(MAX_DCL); break;
         case 2: set_timer1(MIN_DCL); break;  
         default: set_timer1(MAX_DCL); break;
      }
   }
   else
   {
      output_high(SERVO1);   
      stat=0;
      switch(yon)
      {
         case 0: set_timer1(MID_DCH); break;
         case 1: set_timer1(MAX_DCH); break;
         case 2: set_timer1(MIN_DCH); break;
         default: set_timer1(MAX_DCH); break;
      }
   }
}

void bt0_event (void)
{
      if(!input(BT0))
      {
         delay_ms(10);
         
         if(!input(BT0))
         {  
            while(!input(BT0));
            delay_ms(10);
            if(flag)
            {
               set_timer1(MID_DCH);
               stat=0;
               yon=0;
               flag=0;
               output_high(SERVO1);
            }   
            else
            {
               set_timer1(MAX_DCH);
               flag=1;
               stat=0;
               yon=1;   //min
               output_high(SERVO1);
            }
         }   
      }
}

void main()
{
   port_b_pullups(TRUE);
   setup_comparator(NC_NC_NC_NC);
   output_low(SERVO1);
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
   set_timer1(MID_DCH);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);
   output_high(SERVO1);
   unsigned int8 k;
start:
   while(TRUE)
   {
      for(k=0; k<TURN_TIME; k++)
      {
         if(!input(BT0))
         {
            bt0_event();
            goto start;
         }
         delay_ms(10);
      }
      
      if(yon)
      {
         yon++;
         if(yon==3)
            yon=1;
      }

   }
}



Hocam C bilmiyorum da programınızı tercüme edebilirmisiniz, sorduğum soru 0-90-180 derecelerinde hangi periyotta kaç us sinyal gönderdiğiniz? Teşekkürler

XX_CİHAN_XX

Periyot değeri olarak 20mS kullandım.
0 90 180 değerleri ise sırasıyla; 600uS, 1500uS ve 2400uS dir.
Ben tam olarak bu değerleri osilaskop ile teyit ederek verdim bir sorun yaşamadım.

Ek olarak belki bir faydası olur diye söyleyeyim servo beslemesi ve PIC beslemesi tek bir kaynaktan veriliyordu.
Bu durumda 2200uF civarı bir kapasite atmak gerekti. 1000uF gibi bir kapasite varken tam 180 derece hareket verdirdiğimde PICin resetlenmesine sebep oluyordu. Tabi ben sürekli servoyu bir sağa, bir sola döndürüyordum araba sileceği gibi. Yüksek akım çekmesinde bununda etkisi olur muhakkak.
Sizde böyle bir reset durumu olmayabilir ama yinede bilgi olsun diye söylemek istedim.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

picpicpic

Alıntı yapılan: XX_CİHAN_XX - 09 Temmuz 2012, 00:00:20
Periyot değeri olarak 20mS kullandım.
0 90 180 değerleri ise sırasıyla; 600uS, 1500uS ve 2400uS dir.
Ben tam olarak bu değerleri osilaskop ile teyit ederek verdim bir sorun yaşamadım.

Ek olarak belki bir faydası olur diye söyleyeyim servo beslemesi ve PIC beslemesi tek bir kaynaktan veriliyordu.
Bu durumda 2200uF civarı bir kapasite atmak gerekti. 1000uF gibi bir kapasite varken tam 180 derece hareket verdirdiğimde PICin resetlenmesine sebep oluyordu. Tabi ben sürekli servoyu bir sağa, bir sola döndürüyordum araba sileceği gibi. Yüksek akım çekmesinde bununda etkisi olur muhakkak.
Sizde böyle bir reset durumu olmayabilir ama yinede bilgi olsun diye söylemek istedim.

Herhangi bir resetlenme sorunum yok ama dediğim gibi 20ms periyotta 1den 4000us'ye kadar bütün dalga genişliklerini denedim ama 180 derece dönmüyor, belki benimki sahtedir diycem ama robitshop'tan aldım hiç sanmıyorum sahte olacağını, belki de sizinki "MG995R" değildir, çünkü 20msde bir 0dan 4000us'ye sürekli artan duty değerlerini verdim ve maksimum 130 derece civarı dönüyor, yazılımımda herhangi bir sorun olmasına ihtimal vermiyorum zaten çok basit bir program, garanti olsun diye duty değerlerini lcd ekrana da yansıttım, 800 civarı harakete başlıyor 2200 civarı bitiriyor, toplamda 130 derece falan yapıyor, 4 5 gün oldu hala internette maksimum açısıyla ilgili bir bilgi bulamadım, kendi sitesinde zaten hiçbirşey yok, forumları da karıştırdım kimse bilmiyor, sır gibi bir motor anlayacağınız, birdaha herhangi bir tower hobby ürünü kullanmayacağım, sizinde kullanmanızı tavsiye etmem.

XX_CİHAN_XX

Evet internette bende bir bilgi bulamamıştım deneme yaparak sonuca varmıştım. Sizde aynı şeyi yaptığınıza göre muhtemelen benim kullandığım servo daha farklıydı. Fakat markanın aynı olduğuna eminim model numaraları farklı olabilir belki.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.