- Katılım
- 17 Eyl 2013
- Mesajlar
- 9,148
- Tepkime puanı
- 23,841
- Yaş
- 62
- 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.
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)
{
}
}
}