ARM – Not8: RC Servo

Yayınlandı: 03 Haziran 2016 / ARM STM32F4DISCOVERY Programlama...
Etiketler:, , , , , , ,

9 Bu yazıda hobiciler tarafından çok kullanılan RC servo motorların STM32F103C8 mikrodenetleyici ile kontrol edilmesini inceleyeceğiz. RC servo motorlar piyasada pek çok marka ve model altında bulunmaktadır. RC servo motorun içerisinde bir adet mikrodenetleyici bulunuyor ve bu mikrodenetleyici gelen sinyalleri değerlendirip motoru döndürüyor. Motorun ne kadar döndüğü bilgisini ise mile bağlı bir potansiyometrenin sağladığı geribesleme ile alıyor.  Ben de elime geçen Tower Pro SG90 isimli iki adet servo motoru kontrol etmek istedim. Bu motor 9g ağırlığında 1.8 kgf/cm güce sahip ve 0.1s/60 derece hıza sahip.  4.8~5V besleme ile çalışıyor.

RC Servo motorlarda 3 uç bulunmakta. Bu uçlar + besleme, gnd  ve  sinyal uçları.  Sinyal ucundan 20ms’lik periyodlara sahip sinyaller gönderiliyor.

AdsızSinyaller yukarıdaki datasheet’ten alınan şekilden de görüleceği üzere 20 ms’lik periyot içerisinde 1-2ms’lik darbeler üreterek gönderiliyor. eğer darbe genişliği 1ms ise servo mili 0 derece, 1.5ms ise 90 derece, 2ms ise 180 derece dönüyor. Ara değerlerde ise darbe genişliğine orantılı olarak  dönüyor.  Fakat evdeki hesap çarşıya uymuyor bu tip çin malı servolarda genelde. Yaptığım ölçümlere göre servo motor 750us ile 2.7ms arasındaki darbe genişliklerinde 0-180 derece arasında dönüş yapıyor.

Kodları daha önce incelediğim STM32F103C8 mini kart üzerinde gerçekleştirdim. Servo motorları Android telefon üzerinden app inventor kullanarak gerçekleştirdiğim uygulama ile kontrol ettim. Telefon ve STM32F103c8 arasındaki bağlantıyı tahmin ettiğiniz gibi HC-06 bluetooth modül ile sağladım. Bu kodlarda gerekli düzenlemeleri yaparak kontrol edilebilecek servo motor sayısı arttırılabilir.

Kodlar:

</p>

<pre>char oku[6],j=0;
unsigned int i=0;
unsigned int deger=0,deger2=0,binler,yuzler,onlar,birler;
///////////////////////////////////////////////////////////////////////////////
void InitTimer2(){//10us timer2 kesmesi
  RCC_APB1ENR.TIM2EN = 1;
  TIM2_CR1.CEN = 0;
  TIM2_PSC = 0;
  TIM2_ARR = 719;
  NVIC_IntEnable(IVT_INT_TIM2);
  TIM2_DIER.UIE = 1;
  TIM2_CR1.CEN = 1;
}
///////////////////////////////////////////////////////////////////////////////
void main() {
UART1_Init(9600); //PA10 pini RX ucu olarak kullanılacak.
USART1_CR1.B5=1; //RXNEIE Bitini 1 yaparak receive kesmesine izin ver.
NVIC_IntEnable(IVT_INT_USART1);
GPIO_Digital_Output(&GPIOB_BASE, _GPIO_PINMASK_9|_GPIO_PINMASK_10);
GPIOB_ODR.B9=0;
GPIOB_ODR.B10=0;
InitTimer2();
while(1)
{
   if(i>deger)GPIOB_ODR.B9=0; else GPIOB_ODR.B9=1;
   if(i>deger2)GPIOB_ODR.B10=0; else GPIOB_ODR.B10=1;
}
}
///////////////////////////////////////////////////////////////////////////////
void Timer2_interrupt() iv IVT_INT_TIM2 {
  TIM2_SR.UIF = 0;
  i++;
  if(i>200)
             {
              i=0;
             }

}
///////////////////////////////////////////////////////////////////////////////
void UartKesmesi() iv IVT_INT_USART1 ics ICS_AUTO {
if(UART1_Data_Ready())
                       {
                        oku[j]=USART1_DR;
                        if(oku[0]=='a' || oku[0]=='b')
                                        {
                                         j++;
                                         if(j==5)
                                                 {
                                                  j=0;
                                                  binler=(oku[1]-48)*1000;
                                                  yuzler=(oku[2]-48)*100;
                                                  onlar=(oku[3]-48)*10;
                                                  birler=(oku[4]-48);
                                                  if(oku[0]=='a') deger=binler+yuzler+onlar+birler;
                                                  if(oku[0]=='b') deger2=binler+yuzler+onlar+birler;
                                                 }
                                        }
                       }
}

Kodlara ve apk dosyasına buradan ulaşabilirsiniz.

yorum
  1. Emre dedi ki:

    Merhaba timerlari ve interruptlari neden kullandiniz acaba?

    • mikrodunya dedi ki:

      Timer ve uaet rx kesmelerini kullandi.. rc servolarin 20ms puls ihitiyaclarini karsilamak icin timer ve twlefondan kontrol saglamak icin uart kesmesi kullandim.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s