Servo altprogramı

Sumer Yamaner

Moderator
Katılım
17 Eyl 2013
Mesajlar
8,781
Tepkime puanı
23,161
Yaş
61
Konum
İstanbul
Web sitesi
www.sumeryamaner.com
İlgi Alanı
Uçak
Arduino'da standart kütüphanelerin içinde servo library var ve temel servo kontrolünü kolayca yapmamızı sağlıyor. Ancak ben bu kütüphanenin ayrıntılı dokümantasyonuna ulaşamadım. Örneğin servoya gereken darbeyi gönderdikten sonra ne oluyor? Standart analog ve bazı digital servolar ancak 20 mili saniye aralıklı darbeleri işleyebiliyor. Daha hızlı darbeler gelirse servo sapıtıyor. Yeni nesil digital servolar ise daha hızlı veri akışını tolere edebiliyor. Peki servo kütüphanesi bunu dikkate alıyor mu acaba? Bilmiyorum.
O nedenle herhangi bir programda kullanılabilecek bir servo çıkış altprogramı yazdım ve test ettim.
Altprogram üç parametre alıyor. İlki pin numarası. Yani hangi pine servo sinyali iletileceği bilgisi. İkincisi darbe süresi. Bunun 800 - 2200 mikro saniye arasında olması gerekiyor. Üçüncü parametre bir flag. 0 ya da 1 olabiliyor. Eğer sıfır ise altprogram servo darbesini gönderip hemen geri dönüyor. Flag 1 ise servo darbesinden sonra tüm işlemin süresi 20 mili saniye olana kadar bekleyip geri dönüyor.
Kendime göre oldukça kullanışlı oldu. :)

Kod:
void servoout(int pinnumber, int duration, int flag)   // Bu subroutine'de pinnumber ile belirlenen digital çıkışa duration kadar mikrosaniye HIGH pulse veriliyor.
                                                       // Eğer flag 1 ise 20 milisaniyelik frame beklenildikten sonra geri dönülüyor. Flag 0 ise hemen geri dönülüyor.
{
  unsigned long timer;
  unsigned long frame;

  constrain(duration, 800, 2200);
  timer = micros();
  frame = timer;
  digitalWrite(pinnumber, LOW);
  digitalWrite(pinnumber, HIGH);
  while((micros() - timer) < duration)
  {
  }
  digitalWrite(pinnumber, LOW);
  if(flag = 1)
  {
    while((micros() - frame) < 20000)
    {
    }
  }

}
 
Bu da bir potansiyometre ile hızı ayarlanan ve servoyu sürekli bir uçtan diğer uca çeviren test programı.

Kod:
int servopin = 2; // Servo 2 No'lu digital çıkışta
int servosignal = 1500;
int yon = 1;

int potin = 1; // Sweep hız ayarı için potansiyometre 1 No'lu analog girişte
int stepp = 10; // Sweep hızı parametresi

void setup()
{
  Serial.begin(9600);
  pinMode(servopin, OUTPUT);
}


void loop()
{
  stepp = analogRead(potin);
  stepp = stepp / 15;
  stepp = stepp + 10; // Hız ayar potansiyometresi 10 - 110 arası değer verecek
  servoout(servopin, servosignal, 1);
  servosignal = servosignal + (yon * stepp);
  if(servosignal > 2000)
  {
    servosignal = 2000;
    yon = -1;
  }
  if(servosignal < 1000)
  {
    servosignal = 1000;
    yon = 1;
  }
}


void servoout(int pinnumber, int duration, int flag)   // Bu subroutine'de pinnumber ile belirlenen digital çıkışa duration kadar mikrosaniye HIGH pulse veriliyor.
                                                       // Eğer flag 1 ise 20 milisaniyelik frame beklenildikten sonra geri dönülüyor. Flag 0 ise hemen geri dönülüyor.
{
  unsigned long timer;
  unsigned long frame;

  constrain(duration, 800, 2200);
  timer = micros();
  frame = timer;
  digitalWrite(pinnumber, LOW);
  digitalWrite(pinnumber, HIGH);
  while((micros() - timer) < duration)
  {
  }
  digitalWrite(pinnumber, LOW);
  if(flag = 1)
  {
    while((micros() - frame) < 20000)
    {
    }
  }

}
 
Servo altprogramı

Abi rica etsem imzani su sekilde revize edebilir misin artik :thumbup: :bravo:

Rudder ve DIY Lobisi Baskani
 
Servo altprogramı

Mehmet Kucuksari' Alıntı:
Abi rica etsem imzani su sekilde revize edebilir misin artik :thumbup: :bravo:

Rudder ve DIY Lobisi Baskani

Tamam söz. Şu retract devresini pratikte kullanılır hale getirip uçağa takınca hatırlat değiştireceğim. Şu an henüz çömezim.
 
Servo altprogramı

Sümer Yamaner' Alıntı:
Tamam söz. Şu retract devresini pratikte kullanılır hale getirip uçağa takınca hatırlat değiştireceğim. Şu an henüz çömezim.
Tamam Abi hatirlatirim %p
 
Servo altprogramı

Servo kütüphanesi 50 Hz ile çalışıyor. Bu da zaten hiç bir esc'nin ve servonun huysuzlanmayacağı(aslında farklı bir protokol konuşan futabanın sbus servolarını saymazsak), hatta çoğu alıcının çıkış pinlerinin varsayılan çalışma frekansı olan genel bir değer. Ayrıca servo kütüphanesi, interrupt'ları kullandığı için, arduino tarafında yoğun işlem gücü gereken bir rutin çalışıyor olsa bile PWM sinyalinin doğruluğu garanti edilebiliyor.

https://code.google.com/p/arduino/source/browse/trunk/libraries/Servo/Servo.h?r=1088
Kod:
#define MIN_PULSE_WIDTH       544     // the shortest pulse sent to a servo  
#define MAX_PULSE_WIDTH      2400     // the longest pulse sent to a servo
#define DEFAULT_PULSE_WIDTH  1500     // default pulse width when servo is attached
#define REFRESH_INTERVAL    20000     // minumim time to refresh servos in microseconds

Yukarıdakiler de bu kütüphanedeki varsayılan kabul değerleri.
 
Servo altprogramı

Offff okuyacak çok şey çıktı. :)
Bir şeyi merak ediyorum. Oldu da ana programda interruptları disable ettim. O zaman ne olur?
 
Servo altprogramı

İlgili interruptları kullanan fonksiyonlar çalışmaz

Mesala servo kütüphanesi devrede iken, 5. ve 6. pinlerden PWM çıktıs(analogWrite) alamazsınız.

Düzeltme: 9. ve 10. pinlermiş.
 
Servo altprogramı

Şimdilik çok derine inmeden var olan kütüphaneleri kullanmak en iyisi anlaşılan. İleride kafam basarsa daha net anlarım diye umuyorum. Bir yandan da kendi çabamla sıfırdan bir şeyler yaparak öğrenmeye devam tabii. :)
Örneğin bu servoout işlevini yazmamdaki temel amaç, parametrelerle çağrılan altprogramlar için bir temel oluşturmasıydı.