arduino ile servo motor kontrolü etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Bu yazımızda servo motoru arduino üzerinden sürme projesinden bahsedeceğiz.
Servo motorlarının üzerinde 1 adet power,1 adet ground ve 1 adette kontrol ya da sinyal ucu olmak üzere toplamda 3 adet pin bulunmaktadır.
Yandaki resimde tipik bir servo motor görülmektedir.Peki servo motor nasıl çalışır ?
Servo motorlar sinyal uçlarına gönderilen pulse ile çalışırlar ve bu pulse ile servo motorun 0 ile 180 derece arasında açıda dönmesini sağlar.Arduino tarafından gönderilecek olan pulse her 20 mili saniyede bir tekrarlanmalıdır aksi halde step motorumuz başlangıç değerine geri dönecektir.
Servo motoru 1ms ile 2ms pulse değerlerimizle 0-180 derece aralığında kontrol etmeye çalışacağız ve bunun içinde arduino servo motor kontrol kütüphanesini kullanacağız.
Arduino Servo motor kütüphanesi nasıl çalışır ? (<Servo.h>)
Servo kütüphanesini bir derleyici ile açtığınızda karşınıza kütüphane içerisinde tanımlı fonksiyonlar çıkacaktır ki bu fonksiyonları arduino ide içerisinde kullanacağız.İsterseni gelin bu fonksiyonlara bir göz atalım :
Servo : arduino ide içerisinde servo ile değişken tanımlayarak bir servo motor objesi oluşturmaya yarar.
attach(): bu fonksiyon servo motorumuzun bağlı olduğu pine servo motor kontrolünü bağlamamızı sağlayacak.
write(): tanımladığımız servo motora istediğimiz açı değerini göndermemizi sağlayacak olan fonksiyonumuz.
writeMicroseconds(): Servo motorumuza göndereceğimiz pulse değerimizin sıklığını ayarlayacak olan fonksiyonumuz.
read(): En son gönderilen açı değerini bize döndürecek olan fonksiyonumuz.
readMicroseconds():Servo motora gönderilen pulse değerinin sıklığını bize geri döndüren fonksiyonumuz.
attached(): Yukarıda belirtmiş olduğumuz attach fonksiyonun işlevini yerine getirmesi sonucu true ya da servo motorun yazılımsal olarak bağlı olmadığı durumda ise false döndüren fonksiyonumuz.
detach(): Yazılımsal olarak servo motoru programımızdan çıkaran yani attach foknsiyonu ile servo motoru bağladığımız pini yazılımsal olarak boşa çıkaran fonksiyonumuz.
Gelelim kodlarımıza :
#include<Servo.h>// servo kütüphanemizi ekledik
Servo motor;// motor adında bir servo objesi oluşturduk
int poz=0;//motorumuzun pozisyonunu içerisinde tutacağımız değişkenimiz.
void setup()
{
motor.attach(9);// servo motorumuzu 9 numaralı pwm pini üzerinden kontrol edeceğimizi belirttik
}
void loop()
{
for(poz=0;poz<180;poz++)//motorumuzun açısını sıfırdan başlatarak for içerisinde 180e kadar arttıracağız
{
motor.write(poz);//servo motora açısını gönderiyoruz.
delay(15);//15ms gecikme gönderiyoruz
}
for(poz=180;poz>0;poz--)//motorumuzun açısından 180 dereceden 0 dereceye indiriyoruz
{
motor.write(poz);// motorumuza açısını gönderiyoruz
delay(15);//15 ms bir gecikme gönderiyoruz
}
}
Programı çalıştırdığınızda servo motorun önce 0 dan 180 dereceye, sonrasında ise 180 dereceden 0 dereceye doğru hareket ettiğini göreceksiniz.
Servo motorlarının üzerinde 1 adet power,1 adet ground ve 1 adette kontrol ya da sinyal ucu olmak üzere toplamda 3 adet pin bulunmaktadır.
Yandaki resimde tipik bir servo motor görülmektedir.Peki servo motor nasıl çalışır ?
Servo motorlar sinyal uçlarına gönderilen pulse ile çalışırlar ve bu pulse ile servo motorun 0 ile 180 derece arasında açıda dönmesini sağlar.Arduino tarafından gönderilecek olan pulse her 20 mili saniyede bir tekrarlanmalıdır aksi halde step motorumuz başlangıç değerine geri dönecektir.
Servo motoru 1ms ile 2ms pulse değerlerimizle 0-180 derece aralığında kontrol etmeye çalışacağız ve bunun içinde arduino servo motor kontrol kütüphanesini kullanacağız.
Servo kütüphanesini bir derleyici ile açtığınızda karşınıza kütüphane içerisinde tanımlı fonksiyonlar çıkacaktır ki bu fonksiyonları arduino ide içerisinde kullanacağız.İsterseni gelin bu fonksiyonlara bir göz atalım :
Servo : arduino ide içerisinde servo ile değişken tanımlayarak bir servo motor objesi oluşturmaya yarar.
attach(): bu fonksiyon servo motorumuzun bağlı olduğu pine servo motor kontrolünü bağlamamızı sağlayacak.
write(): tanımladığımız servo motora istediğimiz açı değerini göndermemizi sağlayacak olan fonksiyonumuz.
writeMicroseconds(): Servo motorumuza göndereceğimiz pulse değerimizin sıklığını ayarlayacak olan fonksiyonumuz.
read(): En son gönderilen açı değerini bize döndürecek olan fonksiyonumuz.
readMicroseconds():Servo motora gönderilen pulse değerinin sıklığını bize geri döndüren fonksiyonumuz.
attached(): Yukarıda belirtmiş olduğumuz attach fonksiyonun işlevini yerine getirmesi sonucu true ya da servo motorun yazılımsal olarak bağlı olmadığı durumda ise false döndüren fonksiyonumuz.
detach(): Yazılımsal olarak servo motoru programımızdan çıkaran yani attach foknsiyonu ile servo motoru bağladığımız pini yazılımsal olarak boşa çıkaran fonksiyonumuz.
Gelelim kodlarımıza :
#include<Servo.h>// servo kütüphanemizi ekledik
Servo motor;// motor adında bir servo objesi oluşturduk
int poz=0;//motorumuzun pozisyonunu içerisinde tutacağımız değişkenimiz.
void setup()
{
motor.attach(9);// servo motorumuzu 9 numaralı pwm pini üzerinden kontrol edeceğimizi belirttik
}
void loop()
{
for(poz=0;poz<180;poz++)//motorumuzun açısını sıfırdan başlatarak for içerisinde 180e kadar arttıracağız
{
motor.write(poz);//servo motora açısını gönderiyoruz.
delay(15);//15ms gecikme gönderiyoruz
}
for(poz=180;poz>0;poz--)//motorumuzun açısından 180 dereceden 0 dereceye indiriyoruz
{
motor.write(poz);// motorumuza açısını gönderiyoruz
delay(15);//15 ms bir gecikme gönderiyoruz
}
}
Programı çalıştırdığınızda servo motorun önce 0 dan 180 dereceye, sonrasında ise 180 dereceden 0 dereceye doğru hareket ettiğini göreceksiniz.
Görünüşte oldukça basit ancak kullanışlı bir sistemden bahsedeceğiz.
Aduino ile oluşturulmuş olan bir otopark sistemi.Sistemde giriş ve çıkışa izin veren bir adet servo motora bağlanılmış kol bulunuyor.Yine sistemde araçların giriş çıkışının sağlanması ve giriş çıkış kolunun kontrolü açısından giriş ve çıkışlarda butonlar bulunmakta.Otoparkta kaç adet araçlık yer olduğunu belirtmek açısından da 7segment display kullanılmış.
Gelelim kodlama kısmına
Sistemde birkaç değişiklik yapılabilir.
Örneğin giiş çıkış butonları yerine yaklaşım sensörleri kullanılabilir.Yine otomobilin bariyer altında olup olmadığı kontrol edilmelidir.Aracın üstüne bariyerin kapanmasını istemeyiz nihayetinde :)
Gelelim kodlama kısmına
#include <Servo.h> Servo myservo; // servo motor tanımlanmıs #define ServoM 12 //servo motor kontrol pini #define Bright 11 #define Exit 9 //çıkış butonu tanımlanmış #define In 8 //Giriş butonu tanımlanmış #define BarLow 177 //Bariyerin en düşük pozisyonu ayarlanmış #define BarUp 95 //Bariyerin en yüksek pozisyonu ayarlanmış #define CAPACITY 8 //Otopark kapasitesi belirlenmiş #define INTEN 80 //7segment display bacakları tanımlanmış #define segA 0 #define segB 1 #define segC 2 #define segD 3 #define segE 4 #define segF 5 #define segG 6 //0-9 arasındaki rakamların 7 segmente gönderilmesi için bir dizi tanımlanmış byte segments[10] = { B00111111, // 0 B00000110, // 1 B01011011, // 2 B01001111, // 3 B01100110, // 4 B01101101, // 5 B01111101, // 6 B00000111, // 7 B01111111, // 8 B01101111 // 9 }; void setup(){ myservo.attach(ServoM);// tanımlanan servo kontrol pini ile
servo değişkeni birleşt pinMode(Exit, INPUT); // çıkış butonu pini input olarak ayarlandı pinMode(In, INPUT); // Giriş butonu input olarak ayarlandı digitalWrite(Exit, HIGH);// pull up direnci ile kullanılacak digitalWrite(In, HIGH); // pull up direnci ile kullanılacak pinMode(segA,OUTPUT); //her bir 7segment display bacagına gidecek
pin output oldu pinMode(segB,OUTPUT); pinMode(segC,OUTPUT); pinMode(segD,OUTPUT); pinMode(segE,OUTPUT); pinMode(segF,OUTPUT); pinMode(segG,OUTPUT); pinMode(Bright,OUTPUT); analogWrite(Bright,255*INTEN/100);//parlaklık ayarı yapıldı myservo.write(BarLow);//servo motor bariyerin en dusuk pozisyonuna
kadar hareket etti // delay(1000); } int Available= 9;// Otoparktaki boş alan bilgisi integer
olarak ayarlandı //================================================================ void loop(){ Display(Available); // otoparktaki boş alan sayısı diplaye yazdırıldı if(digitalRead(In)==0)//giriş butonuna basıldımı { if(Available != 0){//otoparkta boş alan var mı ? Available--;// boş alan var ise boş alan sayısını 1 azalt myservo.write(BarUp);//bariyeri aç delay(3000);//3 sn gecikme myservo.write(BarLow);//bariyeri kapat } } if(digitalRead(Exit)==0)// çıkış butonuna basıldı mı? { if(Available != CAPACITY){//boş alan sayısı toplam kapasiteye eşit mi? Available++;//değilse boş alan sayısını 1 arttır myservo.write(BarUp);//bariyeri kaldır delay(3000);//3 sn bekle myservo.write(BarLow);// bariyeri kapat } } } void Display(int number){// 7segment displaye deger yazdırma fonksiyonumuz byte segs = ~segments[number];//"~" ortak anot için kullanıldı digitalWrite(segA, bitRead(segs, 0) ); digitalWrite(segB, bitRead(segs, 1) ); digitalWrite(segC, bitRead(segs, 2) ); digitalWrite(segD, bitRead(segs, 3) ); digitalWrite(segE, bitRead(segs, 4) ); digitalWrite(segF, bitRead(segs, 5) ); digitalWrite(segG, bitRead(segs, 6) ); }
Sistemde birkaç değişiklik yapılabilir.
Örneğin giiş çıkış butonları yerine yaklaşım sensörleri kullanılabilir.Yine otomobilin bariyer altında olup olmadığı kontrol edilmelidir.Aracın üstüne bariyerin kapanmasını istemeyiz nihayetinde :)