Merhaba arkadaşlar. Bugün sizlere arduinonun PWM çıkış verebilen bacaklarından nasıl analog çıkış aldığımızı anlatacağım. Bunu da buzzer kullanımı ve motor sürücü kullanımı ile örnekleyeceğim.
Öncelikle PWM in ne olduğunu anlatarak başlayalım. PWM in açılımı pulse width modulation(Sinyal Genişlik Modulasyonu)dur.
Arduino gibi mikrodenetleyiciler ya hep ya hiç mantığıyla çalışır. Yani pin değerleri ya 5 volttur yada 0 volttur. Fakat motor hızı ayarlama gibi 0-5V arasındaki voltaj değerleri olmadan analog veri ile çalışan elemanları kontrol edemezdik. Bu sorun PWM yöntemiyle çözülmüştür. Arduinonun pinlerine giden 5V gerilim çok hızlı şekilde belirli zaman aralıklarında kapatılıp açılarak voltajın daha düşük ölçülmesini sağlamıştır. Bu hızlı açıp kapama sırasında kapalı kaldığı süre uzatıldıkca 0 volta, kısaltıldıkça 5 volta daha yakın olur. Bu işlem çok hızlı şekilde yüksek frekansla yapıldığı için voltaj kesintisi olduğu fark edilmeden 0-5V arasında ortalama voltajlar elde edilir. Böylelikle digital sinyal ile analog sinyal taklit edilmiş olur. Bu sisteme PWM denilmektedir.
Arduinonun farklı modellerinde farklı bacakları PWM çıkış verebilmektedir. En çok kullandığımız nano, uno ve pro minide D3,D5,D6,D9;D10,D11 pinleri PWM çıkış verebilmektedir.Diğer moddeller için google görsellerde modeli aratıp datasheet(elemanların özelliklerini gösterek klavuz) ini görüntüleyebilrsiniz. PWM veren bacaklar datasheet üzerinde ~ sembolü ile gösterilmektedir. Arduinodan PWM çıkışı almak için analogWrite(pin numarası, analog değeri); kodunu kullanmaktayız. Arduino 8 bit pwm çıkışı vermektedir. Yani kodumuzda analog değeri kısmına 255 yazarsak 5 volt, 0 yazarsak 0 volt, 0-255 arasında bir değer yazarsak 0-5 volt arasında değerle doğru orantılı gerilim alırız.
Projelerimizde sık kullandığımız bir buzzerı analog çıkış ile kullanarak pekiştirelim. Buzzerlar doğru akımla çalışan ve pwm sinyali verdiğinde ses çıkaran proje elemanıdır. İçinde elektrik verince ileri, elektriği kesince geri hareket eden piezo disk bulunmaktadır. Bir batarya gibi sabit elektrik veren bir güç kaynağına bağladığınızda disk sadece bir defa ileri gidip o pozisyonda kalacak ve ses çıkarmayacaktır. Ses çıkarmak için kesikli elektrik gönderen yani PWM çıkış veren bir kaynağa bağlanmalıdır. Buzzerın + bacağını arduinomuzun PWM çıkış verebilen pinlerine eksi bacağını gnd hattına bağlayarak kullanabiliriz.
Örnek olarak arduinonun D3 numaralı pinine bağlayalım. Void setup kımında pinimizi çıkış olarak tanıyalım. Bunun için pinMode(3, OUTPUT); kodunu kullanıyoruz. Daha sonra üç numaralı pine 0-255 arasında bir değerle analog çıkış verelim. Eğer 255 verirsek kesintisiz elektrik vereceği için çalışmayacaktır. Biz örnek olarak 168 verelim. 0-255 arasında herhangi bir değer de verebilirsiniz. Buzzerı çalıştırmak için kodumuz
void setup()
{
pinMode(3, OUTPUT); // D3 pinini çıkış olarak tanımladık.
}
void loop()
{
analogWrite(3, 168); // D3 pinine analog 168 değeri yazdırdık.
}
Öncelikle PWM in ne olduğunu anlatarak başlayalım. PWM in açılımı pulse width modulation(Sinyal Genişlik Modulasyonu)dur.
Arduino gibi mikrodenetleyiciler ya hep ya hiç mantığıyla çalışır. Yani pin değerleri ya 5 volttur yada 0 volttur. Fakat motor hızı ayarlama gibi 0-5V arasındaki voltaj değerleri olmadan analog veri ile çalışan elemanları kontrol edemezdik. Bu sorun PWM yöntemiyle çözülmüştür. Arduinonun pinlerine giden 5V gerilim çok hızlı şekilde belirli zaman aralıklarında kapatılıp açılarak voltajın daha düşük ölçülmesini sağlamıştır. Bu hızlı açıp kapama sırasında kapalı kaldığı süre uzatıldıkca 0 volta, kısaltıldıkça 5 volta daha yakın olur. Bu işlem çok hızlı şekilde yüksek frekansla yapıldığı için voltaj kesintisi olduğu fark edilmeden 0-5V arasında ortalama voltajlar elde edilir. Böylelikle digital sinyal ile analog sinyal taklit edilmiş olur. Bu sisteme PWM denilmektedir.
Arduinonun farklı modellerinde farklı bacakları PWM çıkış verebilmektedir. En çok kullandığımız nano, uno ve pro minide D3,D5,D6,D9;D10,D11 pinleri PWM çıkış verebilmektedir.Diğer moddeller için google görsellerde modeli aratıp datasheet(elemanların özelliklerini gösterek klavuz) ini görüntüleyebilrsiniz. PWM veren bacaklar datasheet üzerinde ~ sembolü ile gösterilmektedir. Arduinodan PWM çıkışı almak için analogWrite(pin numarası, analog değeri); kodunu kullanmaktayız. Arduino 8 bit pwm çıkışı vermektedir. Yani kodumuzda analog değeri kısmına 255 yazarsak 5 volt, 0 yazarsak 0 volt, 0-255 arasında bir değer yazarsak 0-5 volt arasında değerle doğru orantılı gerilim alırız.
Projelerimizde sık kullandığımız bir buzzerı analog çıkış ile kullanarak pekiştirelim. Buzzerlar doğru akımla çalışan ve pwm sinyali verdiğinde ses çıkaran proje elemanıdır. İçinde elektrik verince ileri, elektriği kesince geri hareket eden piezo disk bulunmaktadır. Bir batarya gibi sabit elektrik veren bir güç kaynağına bağladığınızda disk sadece bir defa ileri gidip o pozisyonda kalacak ve ses çıkarmayacaktır. Ses çıkarmak için kesikli elektrik gönderen yani PWM çıkış veren bir kaynağa bağlanmalıdır. Buzzerın + bacağını arduinomuzun PWM çıkış verebilen pinlerine eksi bacağını gnd hattına bağlayarak kullanabiliriz.
Örnek olarak arduinonun D3 numaralı pinine bağlayalım. Void setup kımında pinimizi çıkış olarak tanıyalım. Bunun için pinMode(3, OUTPUT); kodunu kullanıyoruz. Daha sonra üç numaralı pine 0-255 arasında bir değerle analog çıkış verelim. Eğer 255 verirsek kesintisiz elektrik vereceği için çalışmayacaktır. Biz örnek olarak 168 verelim. 0-255 arasında herhangi bir değer de verebilirsiniz. Buzzerı çalıştırmak için kodumuz
void setup()
{
pinMode(3, OUTPUT); // D3 pinini çıkış olarak tanımladık.
}
void loop()
{
analogWrite(3, 168); // D3 pinine analog 168 değeri yazdırdık.
}
şeklinde olacaktır. Şimdide potansiyometreden aldığımız değerlere göre çalıştırmaya ne dersiniz. A0 pinine potansiyometre D3 pinine buzzer bağlayalım. Analog okuma 10 bit yani 0-1023 arası değer verirken, analog yazma 8 bit yani 0-255 arası değer yazabilir. Bu nedenle potansiyometreden gelen veriyi direkt buzzera yazdıramayız. Bu sorunu çözmek için daha önce bahsetmediğimiz map(1,2,3,4,5)komutunu kullanırız. Map komutu beş bileşenden oluşmaktadır. İlk bileşenine değişmesini istediğimiz değişkenin ismini , ikinci ve üçüncü bileşene değişkenin değiştirmek istediğiimiz aralığının maksimum ve minumum değerlerini, dört ve beşinci bileşene de hangi aralıktaki değerlere dönüşmesini istediğimizi yazarız. Yani iki ve üçe analog pottan gelen 0 ve 1023 sınırlarını, dört ve beşe anagolog çıkış alacağımız 0 ve 255 aralığını yazarız. Map komutuyla yazdığımız bu sınır değerler arasındaki tüm değerler hedef sınır aralığındaki değerlere orantılayarak dönüştürülür.Kolaylık olsun diye analog okunan veriyi x değişkenine yazdıralım. Daha sonra bu x değişkeninin sınır değerlerini map komutuyla değiştirip analog olarak yazdıralım. Potansiyometreyle buzzer sesini ayarlamak için kullanacağımız kod
int x; // x değişkeni tanımladık.
void setup()
{
pinMode(3, OUTPUT); // D3 pinini çıkış olarak tanımladık.
pinMode(A0, INPUT); //A0 pinini giriş olarak tanımladık.
}
void loop()
{
x=analogRead(A0); //x değişkeni A0 dan aldığı analog veriye eşit olsun dedik.
x=map(x,0,1023,0,255); //x değişkeninin aralığını değiştirdik.
analogWrite(3, x); //D3 pinine x değişkeninin değerlerini yazdırdık.
}
int x; // x değişkeni tanımladık.
void setup()
{
pinMode(3, OUTPUT); // D3 pinini çıkış olarak tanımladık.
pinMode(A0, INPUT); //A0 pinini giriş olarak tanımladık.
}
void loop()
{
x=analogRead(A0); //x değişkeni A0 dan aldığı analog veriye eşit olsun dedik.
x=map(x,0,1023,0,255); //x değişkeninin aralığını değiştirdik.
analogWrite(3, x); //D3 pinine x değişkeninin değerlerini yazdırdık.
}
şeklinde olacaktır.
Analog çıkış almayı öğrendikten sonra şimdi analog çıkışla motor sürmeyi ve bunun hızını ayarlamayı konuşalım. Motorlar arduinonun üzerinden geçebilecek maksimum 40 mA den çok daha fazla akım çekmektedir. Bu nedenle led gibi direkt olarak arduino ile motorları besleyemeyiz. Bu sorunu çözmek için motor sürücüler üretilmiştir. Harici bir güç kaynağı bu sürücülere bağlanır ve arduino tarafından motora aktarılacak enerji miktarı belirlenir. Bunu arduinonun elektrik musluğunu açıp kapamasına benzetebiliriz. Piyasada en çok L298N, L293B ve L293D motor sürücü entegreleri kullanılmaktadır. Ben en çok resimde gördüğünüz kullanımı kolaylaştırmak için kart haline getirilmiş L298N entegre modülünü kullanmaktayım. Bir entegre iki motor sürebilmektedir. Biz şimdilik tek motorla örnek yapalım. Harici güc kaynağımızı sürücü kartımızın resimde gösterilen VCC ve GND kısımlarına bağlıyoruz. Entegre enerjisini harici bir güç kaynağından aldığı için 5v ve üzeri kaynak kullanmaya özen gösterin. Ayrıca GND kısmından ikinci bir kablo ile arduinonun GND pinine bağlıyoruz. Unutmayın arduinoya bağladığımız her elemanın GND si arduinonun GND hattına bağlanmak zorundadır. Motorumuzu resimmdeki Motor A veya Motor B kısımlarından birine bağlıyoruz. Motorlarımızı PWM sinyal ile kontrol etmek için de arduinonun PWM çıkışlarını IN1,2,3,4 çıkışlarına bağlıyoruz. IN1 e PWM çıkış verildiğinde Motor A bir yöne, IN2 ye çıkış verildiğinde Motor A tersi yöne dönmektedir. IN3 ve IN4 de aynı şekilde Motor B nin yönü ve hızını ayarlamaktadır. Örnek olarak Motor A kısmına bir motor bağlayalım ve IN1 pinini D3 numaralı pine bağlayalım. Motorumuzu da yarım hızda çalışmak için 127 PWM verelim. Kodumuz
void setup()
{
pinMode(3, OUTPUT); // D3 pinini çıkış olarak tanımladık.
}
void loop()
{
analogWrite(3, 127); // D3 pinine analog 127 değeri yazdırdık.
}
void setup()
{
pinMode(3, OUTPUT); // D3 pinini çıkış olarak tanımladık.
}
void loop()
{
analogWrite(3, 127); // D3 pinine analog 127 değeri yazdırdık.
}
şeklinde olacaktır.
Motor hızımızı bir analog joystick ile kontrol etmeyi deneyelim. Analog joystickin X ekseni pinini arduinonun A0 pinine bağlayalım. Joystickle kontrol etmek için kodumuz buzzer potansiyometre örneğinde olduğu gibi
int x; // x değişkeni tanımladık.
void setup()
{
pinMode(3, OUTPUT); // D3 pinini çıkış olarak tanımladık.
pinMode(A0, INPUT); //A0 pinini giriş olarak tanımladık.
}
void loop()
x=analogRead(A0); //x değişkeni A0 dan aldığı analog veriye eşit olsun dedik.
x=map(x,0,1023,0,255); //x değişkeninin aralığını değiştirdik.
analogWrite(3, x); //D3 pinine x değişkeninin değerlerini yazdırdık.
}
Yazılarımı beğendiyseniz ve eleştirmek isterseniz yorumlarınızı bekliyorum. İlerleyen derslerde görüşmek üzere...void setup()
{
pinMode(3, OUTPUT); // D3 pinini çıkış olarak tanımladık.
pinMode(A0, INPUT); //A0 pinini giriş olarak tanımladık.
}
void loop()
x=analogRead(A0); //x değişkeni A0 dan aldığı analog veriye eşit olsun dedik.
x=map(x,0,1023,0,255); //x değişkeninin aralığını değiştirdik.
analogWrite(3, x); //D3 pinine x değişkeninin değerlerini yazdırdık.
}
şeklinde olacaktır.
COMMENTS