Arduino üzerindeki pinlerden belirli bir frekansta kare dalga almak, dalga süresini hesaplamak ya da kaydırmalı giriş çıkış (shift register) için kullanılan birtakım fonksiyonlar vardır.
Arduino gelişmiş giriş/çıkış fonksiyonları şunlardır;
Şimdi bu fonksiyonların nasıl kullanıldığını inceleyelim.
Tone fonksiyonu arduino dijital pini üzerinden belirtilen frekansta %50 duty cycle değerine sahip kare dalga üretmek için kullanılır. Yani tone() fonksiyonu ile dijital pin üzerinden istenen frekansa sahip pulse sinyali alınabilir. Eğer süre belirtilir ise, pulse çıkış belirtilen süre boyunca devam eder, eğer süre belirtilmez ise, noTone() fonksiyonuna ulaşılıncaya kadar denetleyicimiz pulse sinyal üretmeye devam eder. Bu fonksiyonumuz 3 adet parametre alır ancak geriye değer döndürmez.
tone() fonksiyonu (Mega dışındaki kartlar için) 3 ve 11 nolu pinlerdeki pwm çıkışını engeller!
tone() fonksiyonu ile en az 31 Hz değerinde pulse çıkış elde edilebilir!
Sözdizimi: tone(pin, frekans, süre);
Bu fonksiyonumuzda;
pin: pulse çıkış alacağımız dijital pin (gerekli)
frekans: alınacak pulse çıkışın frekansı (gerekli) – unsigned int (16 bit şaretsiz tamsayı)
süre: kaç milisaniye süreyle pulse çıkış üretileceği (isteğe bağlı) – unsigned long (32 bit işaretsiz tamsayı)
Örnek:
Arduino’muzun 4 numaralı dijital pininden 50 Hz değerinde pulse çıkış elde edelim.
1 2 |
tone(4, 50); // 4 nolu pinde 50Hz değerinde pulse çıkış oluştur tone(5, 50, 1000); // 5 nolu pinde 1000 milisaniye boyunca 50Hz değerinde pulse oluştur |
noTone fonksiyonumuz ise tone fonksiyonumuzla üretilen pulse sinyalini durdurmak için kullanılır. Pulse sinyalini durdurmak istediğimiz pin numarası parametre olarak noTone() fonksiyonuna gönderilmelidir. noTone fonksiyonu geriye herhangi bir değer döndürmez.
Sözdizimi: noTone(pin);
Örnek: 4 numaralı pinde 100Hz frekansta pulse çıkış oluşturalım ve pulse çıkışı durduralım.
1 2 |
tone(4, 100); // 4 nolu pinde 100Hz değerinde pulse çıkış oluştur noTone(4); // 4 numaralı pindeki pulse çıkışı durdur |
pulseIn fonksiyonu belitrilen bir pim üzerine uygulanan bir darbenin kaç mikrosaniye süre ile HIGH ya da LOW durumunda kaldığını belirlemek için kullanılır. Geriye unsigned long türünde mikrosaniye cinsinden değer döndürür. Örnek olarak HIGH parametresi almış ise, pin üzerine HIGH geldiğinde zamanlayıcıyı çalıştırır. Pulse değeri LOW olunca zamanlayıcıyı durdurur ve HIGH sinyalden LOW sinyale geçme süresini mikrosaniye cinsinden döndürür. Eğer timeout ile belirtilen süre içerisinde pulse sinyali konum değiştirmemiş ise geriye değer olarak 0 döndürür.
Bu fonksiyon 10 mikrosaniye ila 3 dakika arasındaki pulse darbe süreleri dışındaki değerlerde hatalı sonuç verebilir.
Sözdizimi: pulseIn(pin, deger, zamanAşımı);
pin: pulse okunacak olan arduino pini (gerekli)
deger: okunacak lojik seviye (HIGH ya da LOW) (gerekli)
zamanAşımı: darbenin başlamasını kaç mikrosaniye boyunca bekleneceğini belirten süre (isteğe bağlı)
Geriye dönüş değeri unsigned long (32 bit işaretsiz tamsayı) türünde mikrosaniye cinsinden darbe süresi.
Örnek:
1 2 3 4 5 6 7 8 9 10 11 |
unsigned long darbeSuresi; void setup() { Serial.begin(9600); pinMode(7, INPUT); } void loop() { darbeSuresi = pulseIn(7, HIGH); Serial.println(darbeSuresi); } |
pulseInLong() fonksiyonu uzun darbe sürelerinde daha doğru sonuç almak için pulseIn() fonksiyonuna alternatif olarak üretilen bir fonksiyondur. pulseInLong() fonksiyonu belitrilen bir pim üzerine uygulanan bir darbenin kaç mikrosaniye süre ile HIGH ya da LOW durumunda kaldığını belirlemek için kullanılır. Geriye unsigned long türünde mikrosaniye cinsinden değer döndürür. Örnek olarak HIGH parametresi almış ise, pin üzerine HIGH geldiğinde zamanlayıcıyı çalıştırır. Pulse değeri LOW olunca zamanlayıcıyı durdurur ve HIGH sinyalden LOW sinyale geçme süresini mikrosaniye cinsinden döndürür. Eğer timeout ile belirtilen süre içerisinde pulse sinyali konum değiştirmemiş ise geriye değer olarak 0 döndürür.
Sözdizimi: pulseInLong(pin, deger, zamanAşımı);
pin: pulse okunacak olan arduino pini (gerekli)
deger: okunacak lojik seviye (HIGH ya da LOW) (gerekli)
zamanAşımı: darbenin başlamasını kaç mikrosaniye boyunca bekleneceğini belirten süre (isteğe bağlı)
Geriye dönüş değeri unsigned long (32 bit işaretsiz tamsayı) türünde mikrosaniye cinsinden darbe süresi.
Örnek:
1 2 3 4 5 6 7 8 9 10 11 |
unsigned long darbeSuresi; void setup() { Serial.begin(9600); pinMode(7, INPUT); } void loop() { darbeSuresi = pulseInLong(7, HIGH); Serial.println(darbeSuresi); } |
shiftIn fonksiyonu bir çeşit shift register işlemi yapmamızı sağlayan fonksiyonumuzdur. Bu fonksiyonumuz her saat darbesinde En az anlamlı bitten en anlamlı bite doğru ya da en anlamlı bitten en az anlamlı bite doğru bir bit veri kaydırması yaparak data pininden gelen değeri okur ve kaydeder. Eğer saat darbesinin her bir periyotunda data pini HIGH ise veriyi HIGH olarark kaydeder ve birsonraki bite kayar, bir sonraki bitte saat darbesinin bir periyotunda data pini LOW ise, ilgili biti LOW konumuna kaydeder. Eğer bir Paralel – Seri shift register cihazdan veri alıyorsanız, alınan bu veriyi shiftIn fonksiyonu ile okuyabilirsiniz.
Bu bir yazılım uygulamasıdır; daha hızlı olan ancak yalnızca belirli pinlerde çalışan bir donanım uygulaması sağlayan SPI kütüphanesini ilerki derslerimizde ele alacağız.
Sözdizimi: shiftIn(colockPin, dataPin, okumaYonu);
colockPin : Senkronizasyon için clock sinyali çıkışı sağlayan pin
dataPin : Verilerin okunmasını sağlayan pin
okumaYonu : Verilerin hangi sıra ile okunması gerektiğini belirten pin (LSBFIRST – En az anlamlı bitten en anlamlı bite doğru, MSBFIRST – En anlamlı bitten en az anlamlı bite doğru)
Geriye dönüş değeri byte türünden veridir.
Örnek olarak girisOku fonksiyonu ile 1 saniye aralıklarla 74HC165 shift register entegresinden veri okuyup seri port ekranına bastıralım:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
const int dataPin = 2; // data pini const int clockPin = 3; // olock pini const int enable = 4; // okuma izni için enable pini const int load = 5; // 74HC165 pin durumlarını yükleme pini byte data; // 74HC165 entegresinden okunan veriyi bu değişkende tutacağız void setup(){ Serial.begin(9600); // Seri port haberleşme hızı pinMode(dataPin, INPUT); // dataPin giriş olacak pinMode(clockPin, OUTPUT); // clockPin çıkış olacak pinMode(enable, OUTPUT); // enable pini çıkış olacak pinMode(load, OUTPUT); // load pini çıkış olacak } void loop(){ Serial.println(girisOku(), BIN); // Shiftregisterdan alınan değeri binary formatta ekrana yaz delay(1000); // 1 saniye bekle } /* * Fonksiyonumuz parametre almayacak ancak * geriye byte türü değer döndürecek */ byte girisOku(){ // shift register okuma fonksiyonumuz digitalWrite(load, LOW); // yükleme pinini LOW konumuna getir delayMicroseconds(5); // 5 mikrosaniye bekle digitalWrite(load, HIGH); // yükleme pinini HIGH konumuna getir delayMicroseconds(5); // 5 mikrosaniye bekle digitalWrite(clockPin, HIGH); // colock pinini HIGH konumuna getir digitalWrite(enable, LOW); // Okuma izni için enable pinini LOW yap data = shiftIn(dataPin, clockPin, LSBFIRST); // Shiftregister değerini oku digitalWrite(enable, HIGH); // yükleme pinini low konumuna getir return data; } |
Devre Şeması:
Dipswitch anahtarlarının ON/OFF konumuna göre Seri Port ekran çıktımız aşağıdakine benzer şekilde olacaktır:
Bu fonksiyonumuz ise, shiftIn fonksiyonunun tersine, bir veriyi en anlamlı bitten en az anlamlı bite ya da en az anlamlı bitten, en anlamlı bite doğru çıkışa yazdırabileceğimiz fonksiyondur. Fonksiyonumuz her saat darbesinde verinin bir bitini çıkışa gönderir. Eğer verinin ilgili biti bir saat darbesi periyotunda HIGH ise çıkışa HIGH, aksi taktirde çıkışa LOW olarak gönderilir.
Bu bir yazılım uygulamasıdır; daha hızlı olan ancak yalnızca belirli pinlerde çalışan bir donanım uygulaması sağlayan SPI kütüphanesini ilerki derslerimizde ele alacağız.
Sözdizimi: shiftOut(dataPin, clockPin, yazmaYonu, veri);
dataPin : verinin gönderileceği pin (int)
clockPin : Gönderici ile Alıcı cihaz arasında senkronizasyon sağlayan saat darbesi
yazmaYonu : Verinin hangi sıra ile gönderileceği (MSBFIRST – En anlamlı bitten en az anlamlı bite doğru, LSBFIRST – En az anlamlı bitten en anlamlı bite doğru.
veri : Alıcı cihaza gönderilecek veri (byte)
Fonksiyonumuz geriye herhangi bir değer döndürmez.
Örnek olarak veriYaz fonksiyonu ile 74HC 595 Shiftregister entegresine 0 ile 255 arasındaki sayıları yazdıralım:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
const int enable = 2; // 74HC595 ile senkron çalışmak için clock pinimiz const int dataPin = 3; // 74HC595'e veri göndermek için data pinimiz const int clockPin = 4; // 74HC595'e veri yazma izni için enable pinimiz void setup() { pinMode(enable, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); } void loop() { for (byte i = 0; i < 256; i++) { // 0 ile 255 arasındaki değerleri veriYaz(i); // 74HC595 shiftregister entegresine gönder delay(500); // her döngüde 500 milisaniye bekle } } /* * Fonksiyonumuz byte türü parametre alacak ancak * geriye değer döndürmeyecek */ void veriYaz(byte veri){ // fonksiyona gönderilen veriyi al digitalWrite(enable, LOW); // shift register okuma pinini aktif et shiftOut(dataPin, clockPin, MSBFIRST, veri); // veriyi 74HC595 entegresine yaz digitalWrite(enable, HIGH); // yazma pinini pasif et } |
Aşağıdaki devreyi kurup çalıştırdığımızda, 0 ile 255 arasındaki değerleri shift register entegremizin çıkışından binary olarak aldığımızı görebilirsiniz