Robot Programlama – Arduino Tümleşik Geliştirme Ortamının “Fonksiyon” Yapısı

11. Arduino Tümleşik Geliştirme Ortamının “Fonksiyon” Yapısı

Dijital Giriş Çıkışlar

pinMode()

Belirtilen pinin giriş (INPUT) yada çıkış (OUTPUT) olacağının tanımlandığı komuttur. A0, A1 vb. olarak adlandırılan Analog giriş pinleri dijital pimler olarak kullanılabilir. Aşağıdaki yazım şekillerinin hepsi kullanılabilir.

pinMode kullanım örneği

digitalWrite()

Belirtilen pinin aktif (HIGH) yada pasif (LOW) olacağının tanımlandığı komuttur. A0, A1 vb. olarak adlandırılan Analog giriş pinleri dijital pimler olarak kullanılabilir. Aşağıdaki örnek ve yazım şekillerinin hepsi kullanılabilir.

digitalWrite kullanım örneği

digitalRead()

Belirtilen bir dijital pinden, aktif (HIGH) yada pasif (LOW) değerini okur. A0, A1 vb. olarak adlandırılan Analog giriş pinleri dijital pimler olarak kullanılabilir. Aşağıdaki örneği hazırlayınız.

digitalRead kullanım örneği

Analog Giriş Çıkışlar

analogReference()

Analog giriş için kullanılan referans voltajını (yani giriş aralığının üstü olarak kullanılan değeri) konfigüre etmek için kullanılır. Seçenekler şunlardır:



DEFAULT: Arduino bordlarında çalışma voltajına göre varsayılan 5 volt ya da 3,3 volt olarak belirlenmiştir.

INTERNAL: Atmega168 ya da Atmega 328’de 1,1 volt, ATmega8’de 2,56 volt geçerlidir. Mega katlar hariçtir.

INTERNAL1V1: Sadece Arduino Mega 1,1 volt olarak belirlenmiştir.

INTERNAL2V56: Sadece Arduino Mega 5,56 volt olarak belirlenmiştir.

EXTERNAL: Kartın üzerinde bulunan AREF pin (sadece 0 5V) referans olarak kullanılabilir.

analogRead()

Belirtilen analog pinden değer okumak için kullanılır. Okuma işlemi analog bir girişi dijitale çevirerek yapılmaktadır. Bu 0 ile 5 volt arasındaki giriş voltajının yorumlanarak 0 ile 1023 arasında tam sayısal değere dönüştürülmesi anlamına gelmektedir. Yani 0 ile 5 volt aralığında olan değişken sinyalin belirli bir sayısal değer olarak karşılıklandırılmasıdır. Yandaki örnekte orta ucu analog pine (A1) takılmış bir potansiyometrenin çevrilmesi sonucu elde edilen değer seri ekrandan okunmaktadır.

analogRead kullanım örneği

analogWrite() -PWM

Bir pine bir analog değer (PWM) yazar. Bir LED’i farklı parlaklıklarda aydınlatmak veya çeşitli hızlarda bir motoru sürmek için kullanılabilir. Belirtilen görev döngüsünda kararlı bir kare dalga oluşturulur. Çoğu pim üzerindeki PWM sinyalinin frekansı yaklaşık 490 Hz’dir. Uno ve benzeri kartlarda 5 ve 6 numaralı pinlerin frekansı ise yaklaşık 980 Hz’dir. Aşağıdaki örnekte orta ucu analog pine (A1) takılmış bir potansiyometrenin çevrilmesi ile 5 numaralı pine takılmış bir LED’in parlaklığı kontrol edilmektedir.

Arduino Uno’da bu komut 3, 5, 6, 9, 10. pinler için kullanılabilir.

Arduino Mega’da 11, 2-13 ve 44-46. pinler için kullanılabilir.

Arduino Due 2 den 13. pine kadar kullanılabilir.

analogWrite PWM kullanım örneği

analogReadResolution() ve analogWriteResolution()

AnalogReadResolution() ve analogWriteResolution() Arduino Due ve Zero için Analog API’nin bir uzantısıdır. AnalogRead() tarafından döndürülen değerin boyutunu (bit olarak) ayarlar. AVR tabanlı kartlarda geriye dönük uyumluluk için varsayılan olarak 10 bit (0-1023 arasındaki değerlerler döndürür). AnalogWriteResolution(), analogWrite() işlevinin çözünürlüğünü ayarlar. AVR tabanlı kartlarla geriye dönük uyumluluk için varsayılan 8 bit’dir (0-255 arasındaki değerler). Arduino Due ve Zero 12bit çözünürlüğünde oldukları için 0 ile 4095 arasında çözünürlük sağlamaktadır.

Gelişmiş Giriş Çıkışlar

tone()

Kare dalga üretilmesine olanak sağlar. İstenilen pin istenilen frekansa ayarlanabilmektedir. Verilen sinyal %50 görev döngüsüne sahiptir. Görev döngüsü 1 periyot boyunca HIGH ve LOW kalma süresidir. Zil sesleri çalmak için pin bir piezo ziline veya başka bir hoparlöre bağlanabilir.Bir seferde yalnızca bir ton üretilebilir. Farklı bir pinde zaten bir ton çalıyorsa, tone() çağrısının etkisi olmayacaktır. Yandaki örneği uygulayınız.

noTone()

tone() ile üretilen kare dalgayı sonlandırmaya yarar. Hiçbir ton üretilmediğinde hiçbir etkisi olmaz.

tone ve no tone kullanım örneği

shiftOut()



Arduino UNO kartında 13 adet dijital giriş/çıkış pini bulunmaktadır. Bu pinlerin hepsinin veya daha fazlasının çıkış pini olarak kullanılmasını gerektiren uygulamalarda (veya çok az çıkış pini kullanmak istenen durumlarda) yetersiz çıkış pini sayısı sorununu ortaya çıkmaktadır. Bu sorunu çözmek için Shift Register entegreleri kullanılmaktadır. Bu entegrelerin kullanımı ile Arduino UNO’daki 3 adet dijital çıkış pininden 8 adet dijital çıkış üretilebilmektedir. Daha fazla Shift Register entegeresi kullanılarak 3 adet çıkıştan onlarca çıkış elde edilebilmektedir. shiftOut() komutunun görevi bu entegreyi kontrol ederek az sayıda dijital çıkış pini ile çok sayıda verinin kontrol edilmesini sağlanmaktadır. Bu komutla 8 bitlik veri tek bir seri giriş pininden girilmekte ve işlem sonucunda seri olarak girilen bu veriler paralel çıkışlardan alınmaktadır. Kullanım şekli aşağıda verilmiştir.

shiftOut kullanım örneği

shiftOut(dataPin, clockPin, bitOrder, value) şeklinde yazılır.

dataPin: Data pinini belirler.

clockPin: Clock pinini belirler.

bitOrder: Bitleri kaydırmak için hangi sıra ile başlanacağını belirler (MSBFIRST: En büyük bitten başlanacağını, LSBFIRST: En küçük bitten başlanacağını belirler).

Value: Kaydırılacak olan verilerdir (bayt).

shiftIn()

Arduino UNO kartında 13 adet dijital giriş/çıkış pini bulunmaktadır. Bu pinlerin hepsinin veya daha fazlasının giriş pini olarak kullanılmasını gerektiren uygulamalarda (veya çok az giriş pini kullanmak istenen durumlarda) yetersiz giriş pini sayısı sorunu ortaya çıkmaktadır. Sorunun çözümü yazılımla sağlanmakta, herhangi bir donanım kullanılmamaktadır. shiftint() komutunun görevi az sayıda dijital giriş pini kullanarak çok sayıda verinin kontrol edilmesini sağlanmaktadır. Bu komutla 8 bitlik veri tek bir seri giriş pininden girilerek kontrol edilmektedir. Kullanım şekli aşağıda verilmiştir.

shiftIn kullanım örneği

byte incoming = shiftIn(dataPin, clockPin, bitOrder) şeklinde yazılır.

dataPin: Data pinini belirler.

clockPin: Clock pinini belirler.

bitOrder: Bitleri kaydırmak için hangi sıra ile başlanacağını belirler (MSBFIRST: En büyük bitten başlanacağını, LSBFIRST: En küçük bitten başlanacağını belirler).

pulseIn()

Bir pin üzerinde bir sinyalin (HIGH veya LOW) olduğunu belirlemek için kullanılır. Örneğin değer HIGH ise, pulseIn() pinin HIGH konumuna gelmesini bekler, zamanlamaya başlar, sonra pinin LOW olmasını bekler ve zamanlamayı durdurur. Sinyalin uzunluğu mikrosaniye cinsinden döndürülmektedir.

pulseIn kullanım örneği

Gecikmeler

millis()

milis, program başladıktan sonra geçen milisaniye sayısını belirlemek için kullanılır. Yaklaşık 50 gün sonra bu süre sıfırlanmaktadır. Komutun kullanımında herhangi bir parametre bulunmamaktadır. Aşağıdaki örneği inceleyiniz.

millis kullanım örneği

micros()

micros, program başladıktan sonra geçen mikrosaniye sayısını belirlemek için kullanılır. Yaklaşık 70 dakika sonra bu süre sıfırlanmaktadır. Komutun kullanımında herhangi bir parametre bulunmamaktadır. Yandaki örneği inceleyiniz. Not: Bir milisaniyede 1.000 mikrosaniye ve 1 saniyede 1.000.000 mikrosaniye vardır.

micros kullanım örneği

delay()

delay program akışını milisaniye cinsinden duraklatmak için kullanılır. Örneğin 1 saniyelik gecikme ihtiyacı için delay(1000) şeklinde ifade edilir. Gecikme fonksiyonu süresince hiçbir algılayıcı, matematiksel hesaplama ya da pin okuması devam edemez. Bu nedenle 10’un milisaniyesinden daha uzun süren olayların zamanlaması için delay() kullanılmasına uygun değildir. Yanda verilen yanıp sonen LED örneğini inceleyiniz.

delay kullanım örneği

delayMicroseconds()

Programı parametre olarak belirtilen süre boyunca (mikro saniye olarak) duraklatmak için kullanılır. Şu anda doğru bir gecikme için üretilen en büyük değer 16383’tür. Bu işlev 3 mikro saniye ve üzeri aralıklarla çok doğru çalışır. Birkaç bin mikrosaniyeden daha uzun olan gecikmeler için bunun yerine delay() kullanılır. Aşağıdaki örneği inceleyiniz.

delayMicroseconds kullanım örneği

Matematiksel İşlevler

min()

X ve y sayısal değerlerinden en küçük olanını seçmek için kullanılır. min() genellikle bir değişken aralığının alt ucunu sınırlamak içindir. Aşağıdaki örneği inceleyiniz.

max()

X ve y sayısal değerlerinden en büyük olanını seçmek için kullanılır. max()genellikle bir değişken aralığın üst ucunu sınırlamak içindir. Aşağıdaki örneği inceleyiniz.

min ve max kullanım örneği

abs()

Bir sayının mutlak değerini hesaplamak için kullanılır. Sayı sıfırdan küçükse pozitif değerini, sıfırdan büyükse aynı sayıyı verir.

abs kullanım örneği

constrain()

Bir sayıyı belirli aralıklarla sınırlamak için kullanılır. constrain(x,a,b) şeklinde tüm veri türleri için kullanılır. x: herhangi türdeki bir sayı, a: alt aralık, b: üst aralık. Örnekte sensör değeri 10 ile 150 arasında sınırlandırılmıştır. Sensör değeri 10’dan küçükse çıktı 10, 150’den büyükse 150 olur. 10 ile 150 arasında bir değer ise o değer çıktı olarak kullanılır.

constrain kullanım örneği

map()

Sensor değerini belli aralıkta tutarak istenilen aralığa dönüştürmek için kullanılır. Bu amaçla gerekirse bir dizi aralığı tersine çevirmek için de kullanılabilir. Map() işlevi tamsayı matematiği kullanır, böylece kesirler üretmez, kesirli kalanlar kesilir ve yuvarlamaz veya ortalamalanmaz. map(value, fromLow, fromHigh, toLow, toHigh) şeklinde ifade edilir.

value: Sensorden gelen değer

fromLow: Değerin geçerli aralığının alt sınırı

fromHigh: Değerin geçerli aralığının üst sınırı

toLow: Değerin hedef aralığının alt sınırı

toHigh: Değerin hedef aralığının üst sınırı

Aşağıda verilen örnekte sensörden okunan değer 0 ile 1023 arasındadır fakat 0 ile 255 arasında bir değere dönüştürülmektedir.

map kullanım örneği

pow()

Bir sayının üstsel kuvvetini almak için kullanılır. Bir sayıyı kesirli bir kuvvete yükseltmek için de kullanılabilir. Değerlerin veya eğrilerin üstel haritalamasını üretmek için yararlı bir işlevdir. pow(base, exponent) şeklinde ifade edilir. Base: Taban sayısı, exponent: Üstsel kuvvet. Yanda “for döngüsü” boyunca bir değişkenin katlanarak kuvvetini alan bir örnek verilmiştir.

pow kullanım örneği

sqrt()

Bir sayının karekökünü hesaplamak için kullanılır. Sayı herhangi bir veri türünde olabilir.

sqrt kullanım örneği

Trigonometri İşlevleri

Trigonometri, üçgenlerin açıları ile kenarları arasındaki bağıntıları konu edinen matematik dalıdır. Açıların büyüklükleri arasındaki bağlantıları inceler. Trigonometrik işlemlerin yaptırılabilmesi için “math.h” kütüphanesinin kullanılması gereklidir. Kütüphane #include “math.h” şeklinde kullanıma alınır.

Dik üçgenin yapısı

sin()

Bir dik üçgende bir dar açının karşındaki dik kenar uzunluğunun hipotenüsün uzunluğunun oranına o dar açının sinüsü denir. Bir A açısının sinüsü Sin A şeklinde gösterilir. Bu işlev bir açının sinüsünü radyan cinsinden hesaplar. Sonuç -1 ile 1 arasında olacaktır. Radyan, bir dairede yarıçap uzunluğundaki yay parçasını gören merkez açıya eşit açı ölçme birimidir. Örneğin, yarıçap değeri 1 m, olan bir çemberde 1 m uzunlukta yayı gören merkez açı 1 radyan’dır. Hipotenüs, 90 derecelik açının karşısındaki kenardır.

cos()

Bir dik üçgende bir dar açının komşu dik kenar uzunluğunun hipotenüsün uzunluğuna oranına o dar açının kosinüsü denir. Bir A açısının kosinüsü Cos A şeklinde gösterilir. Bu işlev bir açının kosinusünü radyan cinsinden hesaplar. Sonuç -1 ile 1 arasında olacaktır.

tan()

Bir dik üçgende bir dar açının karşındaki dik kenar uzunluğunun komşu dik kenar uzunluğunun oranına o dar açının tanjantı denir. Bir A açısının tanjantı Tan A şeklinde gösterilir. Bu işlev bir açının tanjantını radyan cinsinden hesaplar. Sonuç negatif sonsuzluk ile pozitif sonsuzluk arasında olacaktır.



Trigonometrik işlev örnekleri

Karakterler

Bir karakterin ne tür bir karakter olduğunu kontrol etmek için kullanılmaktadır.

isAlphaNumeric(): Bir karakterin alphanumeric olup olmadığını kontrol eder.

isAlpha(): Bir karakterin alpha olup olmadığını kontrol eder.

isAscii(): Bir karakterin Ascii tablosundaki değerini verir.

isWhiteSpace(): Bir karakterin bir boşluk olup olmadığını kontrol eder.

isControl(): Bir karakterin kontrol karakteri olup olmadığını kontrol eder.

isDigit(): Bir karakterin dijital karakter olup olmadığını kontrol eder.

isGraph(): Bir karakterin grafik karakter olup olmadığını kontrol eder.

isLowerCase(): Bir karakterin küçük harfli bir karakter olup olmadığını kontrol eder.

isPrintable(): Bir karakterin yazdırılabilir bir karakter olup olmadığını kontrol eder.

isPunct(): Bir karakterin noktalama işareti olup olmadığını kontrol eder.

isSpace(): Bir karakterin boşluk olup olmadığını kontrol eder.

isUpperCase(): Bir karakterin büyük harfli bir karakter olup olmadığını kontrol eder.

isHexaDecimalDigit(): Bir karakterin geçerli heksedesimal (onaltılık) rakam olup olmadığını kontrol eder. Yukarıdaki örnek program gönderilen herhangi bir karakterin karakter analizini yapmaktadır.

Karakterlerin kullanım örneği

Rastgele Sayılar

randomSeed()

randomSeed() rastgele sayı üretimini rastgele sıralamayla rastgele bir noktadan başlatır. Bu dizi çok uzun ve rastgele iken daima aynıdır. Üretilen bir dizi sıranın farklı olması istendiğinde rastgele sayı üreteci, bağlantısız bir pin üzerinden (analogRead() gibi) oldukça rastgele bir girdi ile başlatılabilir. Rastgele sayı üretilirken bir Seed değeri alınır. Bu algoritmalarla uzun bir sayı listesi hesaplanır. Seed belirtilmezse şu anki zaman alınır ve sayılar hep aynı sırada rastgele olarak üretilir. Yandaki örnek 0 ile 249 arasında rastgele sayı üretmektedir.

randomSeed kullanım örneği

random()

Minimum ve maksimum olarak belirtilen sayılar arasında rastgele sayılar üretmek için kullanılır. Üretilen bir dizi sıranın farklı olması istendiğinde rastgele sayı üreteci, bağlantısız bir pin üzerinden (analogRead() gibi) oldukça rastgele bir girdi ile başlatılabilir. Yandaki örnek 10 ile 39 arasında rastgele sayı üretmektedir.

random kullanım örneği

Bit ve Bayt’lar

lowByte(): Bir değişkenin (örneğin bir sözcük) düşük sıralı (en sağdaki) baytı için kullanılır.

highByte(): Bir kelimenin üst sıra (en soldaki) baytını (veya daha büyük bir veri türünün en düşük ikinci baytını) ayıklamak için kullanılır.

bitRead(): Herhangi bir bit’i okumak için kullanılır.

bitWrite(): Bir sayısal değişken bit yazmak için kullanılır.

bitSet(): Bir sayısal değişkenin bit’ini ayarlamak için kullanılır.

bitClear(): Bir sayısal değişkenden bit silmek için kullanılır. bit(): Belirtilen bit değerini hesaplamak için kullanılır.

İnterruptlar (Kesmeler)

Arduino üzerinde bir programı yürütürken yürümekte olan programın duraklatıp arada başka bir programın çalıştırılması için kesmeler kullanılır. Arada çalıştırılan program komutları yerine getirildikten sonra ana program kaldığı yerden devam eder. Arduino’da farklı görevlerde kullanılmak üzere çeşitli Interrupt’lar (kesmeler) bulunur. Zaman kesmesi (timer interrupt) ve dış kesmeler (external İnterrupt) en yaygın kullanılan Arduino kesmeleridir.

interrupts()

Kesmeler, bazı önemli görevlerin arka planda yapılmasını sağlamak için kullanılır.

noInterrupts()

Kesmeleri devre dışı bırakmak için kullanılır, (interrupts() komu ile yeniden etkinleştirilebilir). Yanda kullanım şekli gösterilmektedir.

interrupts kullanım şekli

Harici Interruptlar (Kesmeler)

attachInterrupt()

Arduinonun belli bir pinine gelen sinyalle belli bir fonksiyonun ya da önceden belirlenmiş bir alt programın çalıştırılmasını sağlamak için kullanılır. Kullanılan Arduinonun türüne göre dijital pinlerden bazıları attachInterrupt pini olarak da işlev görmektedir. Aşağıdaki tabloda farklı Arduino modellerine göre kullanılabilir attachInterrupt pinleri listelenmiştir.

Arduino modellerine göre kullanılabilir attachInterrupt pinleri

Kullanımı attachInterrupt(pin, fonksiyon, mod) şeklindedir.

Pin: Kullanılan interrupt pinidir.

Fonksiyon: Interrupt tetiklendiğinde yapılacak işlemlerin içinde bulunduğu fonksiyonunu (Void loop’un altına yazılmalıdır),

Mod: Kesmeye ne zaman girileceğini ifade eder.

Kullanılan modlar şu şekildedir:

LOW: Dijital pindeki gerilim 0 olduğunda kesmeye girmesini sağlar.

CHANGE: Belirli dijital pinde oluşacak her gerilim değişiminde kesmeye girmesini sağlar. Yani pindeki gerilim 0’dan 5’e yükseldiğinde veya 5’ten 0’a düştüğünde kesmeye girer.

RISING: Yükselen kenar olduğunda kesmeye girmesini sağlar. Yani dijital pindeki gerilim 0’dan 5 volta çıktığında kesmeye girer.

FALLING: Düşen kenar olduğunda kesmeye girmesini sağlar. Yani dijital pindeki gerilim 5’ten 0 volta çıktığında kesmeye girer.

HIGH: Arduino Due, Zero ve MKR1000’da Dijital pindeki gerilim 5 volt olduğunda kesmeye girmesini sağlar.

attachInterrupts kullanım örneği

Yukarıdaki örnekte bir Led, buton ile kontrol edilmektedir. Bunun için 1 adet interrupt, CHANGE modunda kullanılmıştır.

detachInterrupt()

Verilen kesmeyi kapatmak için kullanılır. Devre dışı bırakılacak kesmenin pin numarası parantez içine girilmelidir.

Timer Interrupt

Zaman kesmesi (timer interrupt), belirli süre aralıklarında belirli görevlerin yapılabilmesi için kullanılır. Örneğin bir Led’in saniyede bir yakıp söndürülmesi işleminde. Bu işlem için loop fonksiyonunun kullanılması yerine, zaman kesmesinin kullanılması ile kesme her saniyede bir Arduino’ya haber vererek, LED’in yakılıp söndürülmesini sağlamaktadır. Timer interruptu kullanmak için hazır kütüphane olan <TimerOne.h> kütüphanesi kullanılmalıdır. Yandaki örnek bir LED’i 1’er saniye aralıklarla yakıp söndürmektedir.

Timer Interrupts kullanım örneği

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir