sq(a) : a'nın karesini alır.

sqrt(b) : b'nin karekökünü alır.

pow(b, a) : b'nin a üssünü alır.

min(c, d) : c ile d değerlerinden küçük olanı alır.

abs(e) : e'nin mutlak değerini alır.

constrain(d, 10, 20) : d değişkeni; 10 ile 20 arasında ise d'yi alır. 10'dan küçükse 10'u alır. 20'den büyükse 20'yi alır.

map(h, 0, 200, 0, 50) : 0 ile 200 arasında olan h değerini 0 ile 50 arasındaki değere dönüştürür.


Program Kodları

int a = 2, b = 9, c = 4, d = 9, g = 0, h = 120, j = 0;

int e = -6;

void setup()

{

      Serial.begin(9600);


      Serial.print("a nın karesi= ");

      Serial.println(sq(a));    //a nın karesini al ekrana yazdır.


      Serial.print("b nin karekökü= ");

      Serial.println(sqrt(b));  //b nin karekökünü ol ekrana yazdır.


      Serial.print("b nin a üssü= ");

      Serial.println(pow(b, a));  //b nin a üssünü al ekrana yazdır.


      Serial.print("minimum değer= ");

      Serial.println(min(c, d));  //c ve d değerlerinden küçük olanı ekrana yazar.


      Serial.print("e nin mutlak değeri= ");

      Serial.println(abs(e));     //e nin mutlak değerini al ekrana yazdır.


      g = constrain(d, 10, 20);   //d değişkeni; 10 ile 20 arasında ise g = d, 10'dan küçükse g = 10, 20'den büyükse g = 20 olur.

      Serial.print("g= "); Serial.println(g);


      j = map(h, 0, 200, 0, 50);  //0 ile 200 arasında olan h değerini 0 ile 50 arasındaki değere dönüştürüp j ye atar.

       Serial.print("j= "); Serial.println(j);


}


void loop()

{


}




___________________________________________________________________________________


Programlamada değişkenler önemlidir. Hangi tür işleme göre hangi tür değişken tanımlamamız gerektiğine doğru karar vermemiz gerekir. Aksi halde sonuçlarda yanlışlıklarla karşılaşırız. Değişkenlerin tanımlandığı yerler de önem arz etmektedir. Bu kapsamda Arduino'da değişkenleri tanımladığımız yerleri iki gruba ayırırsak, Global ve Yerel değişkenler olmak üzere iki gruptan bahsedebiliriz.

Global değişkenler: Programın tamamında geçerlidir ve her yerde kullanılabilir. En üstte tanımlanır.

Yerel(lokal) değişkenler: Değişkenin bulundu void() ya da döngü ya da fonksiyon içerisinde kullanılabilirler.


Değişkeni herhangi bir döngü ya da void() içerisinde kullanacağımız zaman program bu değişkenin tanımını önce yerelde sonra globalde arar. Aramaya içten dışa doğru devam eder.


*Arduino penceresinin alt kısmındaki mesajlarda, global değişkenlerin ve yerel değişkenlerin bellekte ne kadar yer kapladığını ve kalan bellek miktarını görebiliriz.
*Büyük projelerde global değişken kullanmak sevilmez. Yerel değişkenler tercih edilir. Global değişkenler bellekte sürekli yer kapladığı için yerel değişkenler kullanılır ve işi bittiğinizde ömürleri sonlandırılır.



Örnek Program:

Değişken a üç farklı yerde kullanılmış ve sonuçlar ekrana yazdırılmıştır. En içteki for döngüsü, a değişkenini, önce kendi lokalinde aramış ve bulmuştur. Bu nedenle globaldeki değeri değil kendi lokalindeki değeri yazdırmıştır.


int a = 3;

int i = 0;

void setup()

{

      int a = 5;

      Serial.begin(9600);

      Serial.print("void setup içindeki a= "); Serial.println(a);

      delay(5000);

}

void loop()

{

      int a = 5;

      Serial.print("void loop içindeki a= "); Serial.println(a);

      for (i = 0; i < 10; i++)

  {

        int a = 7;

        Serial.print("for içindeki a= "); Serial.println(a);

  }

      delay(5000);

}


Global ve Yerel değişkenlerin yerleri:




___________________________________________________________________________________






Program Kodları

float x1, x2, x3, y, z;     //sonuc ondalıklı çıkma durumu varsa değişkenlerin hepsi float olarak tanımlanır.

int a, b, c, d, k, m, n;

void setup()

{

      a = 3; b = 5; c = 7; d = 27;

      y = 23; z = 9;

      Serial.begin(9600);

      

      //a'yı ekrana yazdırır.

      Serial.print("a= ");    Serial.println(a);


      //işlemin sonucunu ekrana yazdırır.

      k = a + b;

      Serial.print("k= ");    Serial.println(k); 


      //işlemin sonucunu ekrana yazdırır.

      m = c * d;

      Serial.print("m= ");    Serial.println(m); 


      //işlemin sonucunu ekrana yazdırır.

      n = d - a;

      Serial.print("n= ");    Serial.println(n); 


      //x,y,z float tanımlandıysa sonuç virgüllü çıkar.

      x1 = y / z;

      Serial.print("x1= ");

      Serial.println(x1, 5);     //virgülden sonra 5 basamak.


      //x float, c ve a int tanımlandıysa sonuc tam çıkar.

      x2 = c / a;

      Serial.print("x2= ");

      Serial.println(x2, 5);     //virgülden sonra 5 basamak.


      //işleme giren tam sayılardan birine virgüllü kısım eklenirse sonuç virgüllü çıkar.

      x3 = 5.0 / 2;

      Serial.print("x3= ");

      Serial.println(x3, 5);     //virgülden sonra 5 basamak.


      //d sayısının b ile bölümünden kalan a ya atanır.

      a = d % b;

      Serial.print("Kalan= "); 

      Serial.println(a);

}


void loop()

{


}


 


1. int    :Hafızada 2 byte yer kaplar. Tam sayıdır. -32768 ile 32767 arasında değer alır.

2. unsigned int    :Hafızada 2 byte yer kaplar. Tam sayıdır. 0 ile 65535 arasında değer alır.

3. long    :Hafızada 4 byte yer kaplar. Tam sayıdır. -2147483648 ile 2147483647 arasında değer alır.

4. unsigned long    :Hafızada 4 byte yer kaplar. Tam sayıdır. 0 ile 4294967295 arasında değer alır.

5. float    :Hafızada 4 byte yer kaplar. Ondalıklı sayıdır. -3.14*10^38 ile 3.14*10^38 arasında değer alır.

6. bool    :Hafızada 1 byte yer kaplar. Mantıksal değer tutar. 1(true) veya 0(false).

7. char    :Hafızada 1 byte yer kaplar. Karakter tanımlamak için kullanılır. ASCII standartlarına göre tanımlama yapılır.

8. byte    :Hafızada 1 byte yer kaplar. 1 bayt yani 8 bit. 0 ile 255 arası değer alır.

9. static    :static int, static char vb. şekilde tanımlanan değişkenler yerel olarak herhangi bir döngü içerisinde tanımlansa bile void setup() üzerinde tanımlanmış gibi olur. Döngünün her tekrarında ilk verdiğimiz değeri tekrar almaz.

10. int(veri)    :"veri"değişkeni int türüne dönüştürüldü.

11. char(veri)    :"veri" değişkeni char türüne dönüştürüldü.

12. const int b = 3;     :const ifadesi ile tanımlanan değişken program içerisinde sadece okunabilir, değiştirilemez. İlk kaç olarak tanımlandıysa öyle kalır. Örnekte b değişkenine atanan 3 değeri sabit kalır. Programın tümünde artık b=3'tür. Programın başka yerinde, herhangi bir döngü içerisinde b'ye farklı bir değer atanamaz.

13. #define c 5     :#define ile tanımlanan durumda ise; program, derlendiği sırada, kodlar içerisinde nerede c görürse oraya 5 koyar. Bunu arka planda yapar. Biz göremeyiz. Bir nevi ön derleyicidir. Bu nedenle bellekte yer kaplamaz. #define c 5 yazdıktan sonra sonuna noktalı virgül koyulmaz.


ÖNEMLİ:

float olarak tanımlanan bir değişkene, "int" türünden sayılarla ya da değişkenlerle yapılan işlem sonucu atanırsa, float olarak tanımladığımız değişken sonucu "int" türünden verilir. Örneğin;


void loop()

{

       float a;

       a = 5 / 2;

       Serial.print(a);

}


Bu kod parçacığı çalıştırıldığında a değeri 2.5 olması gerekirken 2 olarak sonuç verir. Bu durumun önüne geçmek için yani sonucu float olarak almak için işleme giren değişkenlerden birini veya hepsini float olarak tanımlamalı ya da işleme giren sayılardan birini veya hepsini ondalıklı sayı olarak yazmalıyız. 


a = 5.0 / 2; gibi ya da 

a = 5.0 / 2.0; gibi.



Örnek Program Kodları:

int a = 0;

const int b = 3;

#define c 5

void setup()

{

      Serial.begin(9600);

      Serial.println(b);

      Serial.println(c);

}


void loop()

{


}



___________________________________________________________________________________


 



Arduino'da yaptırdığımız işlemlerin sonuçlarını görmek için kullanabileceğimiz bir seri port ekranı mevcuttur. Bu seri port ekranından Arduino'ya bilgi gönderebilir ve Arduino'da yapılan işlemleri bu ekrana yazdırabiliriz.


- Seri monitör Arduino kartı PC ye takılıyken kullanılabilir.

- Program içerisinde void loop() altında Serial.begin(9600); komutu ile seri monitörün 9600 baudrate hızında başlangıç ayarı yapılır. 

- Serial.begin(9600) komutundaki baudrate ile seri monitörün baudrate i aynı olmalıdır.

- Seri monitör Arduino IDE'sinin sağ üst tarafından açılır ve alt taraftan baudrate ayarı yapılır.

- Seri port ekranı PC ile Arduino arasındaki veri iletişimini izlememizi ve veri gönderip almamızı sağlar.


Baudrate Nedir? 

Baud hızı (sembol "Bd"), iki elektronik cihaz arasındaki iletişimin "hızını" tanımlamak için kullanılan birimdir. 9600 baud hızı, cihazlar arasında saniyede 9600 sinyal değişimi hızında veri akışı olacağı anlamına geliyor. Sinyal değişimi; HIGH’dan LOW’a ya da LOW’dan HIGH’a durumudur. Seri portta 1 sinyal değişimi 1 biti kodladığı için, "9600 baud", seri portun saniyede maksimum 9600 bit aktarabildiği anlamına gelir. Fakat sinyal değişiminin 1 birden fazla biti kodladığı iletişim yöntemleri de mevcuttur. 

Örneğin; 

Faz Kaydırmalı Anahtarlama olan PSK’da her sinyal değişikliği 2 bit kodlar. Yani, 1 baud = saniyede 2 bittir. Dörtlü Genlik Modülasyonu QAM’da ise her sinyal değişimi 4 biti kodlar. Bu nedenle 1 baud = saniyede 4 bit olur. 

Arduino ile PC iletişimi seri port ile olduğu için; 1 sinyal değişimi 1 biti kodlar. Bundan dolayı 9600 baud hız saniyede maksimum 9600 bit aktarır.

İki cihazı aynı hıza ayarlamazsanız, bir cihaz, diğerine, beklenenden daha hızlı veya daha yavaş veri gönderecektir. İki seri cihaz aynı iletişim hızına ayarlanmadığında, veri alışverişi güvenilir olmayacaktır.


___________________________________________________________________________________



     

    LED_BUILTIN kodu ile Arduino kartı üzerindeki SMD led'i yakıp söndürebiliriz. Bu kod ile aynı zamanda 13. pini de kontrol edebiliriz. LED_BUILTIN kodunu programa doğrudan eklemek için: Arduino IDE üzerinde; Dosya > Örnekler > Basic > Blink 'e tıklayarak aşağıda gösterilen program kodlarını hazır olarak alabilirsiniz.


Program Kodları:

void setup() 

{

    pinMode(LED_BUILTIN, OUTPUT);

}

void loop() 

{

    digitalWrite(LED_BUILTIN, HIGH); 

    delay(1000);

    digitalWrite(LED_BUILTIN, LOW);

    delay(1000); 

}





__________________________________________________________________________________



    Bu programımızda Arduino'nun 10 ve 11 nolu pinlerine bağladığımız kırmızı ve sarı ledlerin 500'er milisaniye yanıp sönmesini sağladık. Burada kullandığımız komutlar:

pinMode(10, OUTPUT);    : 10 nolu pini çıkış pini yapar.

digitalWrite(10, HIGH);    : 10 nolu pini 5 volt yapar.

digitalWrite(10, LOW);     : 10 nolu pini 0 volt yapar.

delay(500);                       : Programın 500 ms beklemesini sağlar.


Program Komutları:

void setup() 

{

      pinMode(10,OUTPUT);

      pinMode(11,OUTPUT);

}


void loop() 

{

      digitalWrite(10,HIGH);

      delay(500);

      digitalWrite(10,LOW);

      digitalWrite(11,HIGH);

      delay(500);

      digitalWrite(11,LOW);

}


Proteus'ta Simülasyon:




__________________________________________________________________________________





 


    Arduino ile yazdığımız programı derleyerek hex kodlarına çevirebilir ve ardından bu hex kodu ile bir simülasyon programında(Örn: Proteus) programı simüle edebiliriz. Arduino IDE'de sol üst köşede bulunan tik işareti ile programı derleme işlemi yapılır. Ardından "Taslaklar > Derlenmiş binary'i çıkar" dedikten sonra hex kodlarını içeren dosya Arduino programının bulunduğu klasöre üretilecektir.



    - Arduino'nun özelliklerini kullanabilmek için ya da herhangi bir sensörü, elektronik kartı, LCD ekran vb. cihazları tanıtabilmek için hazır olarak yazılmış dosyalara kütüphane denir. Bu özellikleri Arduino'nun kayıtçılarına komutlarla doğrudan ulaşarak da kullanabiliriz. Fakat bunun yerine hazır yazılmış fonksiyonlarla bu işi yapmak daha kolay olacaktır. Arduino'nun aynı özelliğini kullanmak için yazılmış farklı kütüphaneler bulunabilir. 






_________________________________________________________________________



1.
Klon Arduino Uno CH340 chiplidir.


2. Normalde windows Arduino Uno kartının driverını yükler ama bu klon Arduino Uno kartında driver sorunu olursa;

http://www.5v.ru/zip/ch341ser.zip   adresinden bu driver indirilerek kurulur.

3. Arduino için kod yazımını yapmak, komutları yazmak için kullanılan IDE'yi https://www.arduino.cc/en/software adresinden indirebilirsiniz. Burada 2 adet IDE vardır:

a- Arduino IDE 2.0.0 : Geliştirme aşamasında olan IDE'dir.

b- Legacy IDE(1.8.X) Arduino IDE 1.8.19 : Uzun yıllardır kullanılan IDE.

Her ikisini de kullanabilirsiniz.


Legacy IDE(1.8.X)



Arduino IDE 2.0.0



4. Arduino IDE'yi yükleyip Arduino Uno kartını bilgisayara taktıktan sonra Bilgisayarın "Aygıt Yöneticisinde" USB-SERIAL CH340 (COM...) şeklinde görmemiz gerekmektedir. Eğer göremiyorsak bilgisayarımız Arduino'yu görmemiş demektir. Klon Arduino'larda bu tür durumlar yaşanabilir. Bu sorunu aşmak için yukarıda anlatıldığı gibi CH340 driver'ını kurmamız gerekiyor.

5. IDE üzerinde bazı ayarlar yapmamız gerekiyor:

a- "Araçlar > Kart" kısmından kullandığımız kart "Arduino Uno" kartı olduğu için bunu seçeriz.

b- "Araçlar > Port" kısmından ise "Aygıt Yöneticinde" Arduino hangi COM portta gözüküyorsa o seçilir.

c- "Dosya > Tercihler" kısmından ise; "Kod katlatmayı aktive et" ve "Satır numaralarını göster" işaretlenir. Font boyutu da yine burdan değiştirilebilir.

6. // ile başlayan yada /* başlayıp */ ile biten aralık yorum, açıklama kısmıdır. Kod işleyişine dahil edilmez.

7. void setup() fonksiyonu: Arduino çalışmaya başladığında sadece 1 kez çalışan fonksiyondur. Kurulum ve ayarlamalar ve tanımlamalar yapılır. 

void loop() fonksiyonu:  void setup() fonksiyonundan sonra çalışmaya başlar ve kendi içinde sürekli döngüde olan fonksiyondur. İş yaptırdığımız kodlar buraya yazılır.

8. ctrl + T kısayolu ile değişkenler, eşitlikler arası otomatik boşluk açılır, komutlar hizalanır.

9. Arduino çalışmalarını https://www.tinkercad.com adlı sitede yada Proteus'ta simüle edebilirsiniz. Proteus'ta simüle etmek için indirdiğiniz Arduino Proteus kütüphanesini programın kurulu olduğu; C:\Program Files (x86)\Labcenter Electronics\Proteus 7 Professional\LIBRARY klasörünüze kopyalamanız yeterlidir. 

10. Kütüphaneler en üst kısımda aşağıdaki şekilde tanımlanır:

#include <kutuphane_ismi>
veya
#include "kutuphane_ismi"

Arduino ve Atmega328 İçin Proteus Ayarları:




__________________________________________________________________________________





     AVR, Atmel şirketi tarafından tasarlanıp 1996’dan beri piyasaya sunulan mikro denetleyici ailesinin adıdır. Atmega328 de bu AVR ailesi içinde yer alır. Bu mikrodenetleyiciler modifiye edilmiş Harvard mimarisi üzerine RISC komutu kümesiyle tasarlanmıştır. RISC (Reduced Instruction Set Computer), basit komutlar kullanan ve komutları daha hızlı işleten bir işlemci mimarisidir. RISC mimarisinde karmaşık komutlar kullanılmadığından dolayı komutlar daha hızlı işletilir. RISC mimarisini kullanan işlemcilere şunlar örnek verilebilir:

 

Alpha

ARC

ARM

SUN SPARC

MIPS R2000

INTEL i860

MOTOROLA 8800

IBM RS/6000

MOTOROLA 8800

 


    Atmega mikrodenetleyicilerde program ile veriler farklı belleklerde saklandığı için bunlara farklı veri yolları ile erişilmektedir. Böylelikle program ve verilere aynı anda erişimin mümkündür. Bu da hızı artırmaktadır. Geleneksel mikrodenetleyicilerde verilere ve programa tek veri yolu üzerinden erişilirdi.

        Atmega mikrodenetleyiciler 8-bit olup istisna olarak bir dönemde 32-bit olan modelleri de üretilmiştir. Birçok gömülü sistemlerde ve özellikle hobi devrelerinde en çok kullanılan mikro denetleyicilerden olup Arduino’nun da temelini oluşturur.


         ATmega328 ile ATmega328P arasında ne fark var?

        Atmega328 ve Atmega328P aynı mimari yapıya sahiptir. Atmega328P, Atmega328’e göre daha az enerji tüketir. Datasheet’lere bakıldığında 328P’nin 60nm, 328’in ise 90nm olduğu görülür.

    Atmega çipi, yüksek performanslı, düşük güç tüketimine sahip 8 bitlik bir mikro denetleyicidir. Değişik boyutlarda EEPROM, SRAM ve FLASH belleğe sahiptir. Atmega uyku modunda ise 0.1 uA değere sahip bekleme akımı çeker.

    Program Belleği(Flash Memory): Program komutlarının tutulduğu hafıza türüdür. Defalarca silinip tekrar programlanabilir. Arduino Uno’da Flash Bellek yaklaşık 10.000 kez yeniden yazılabilir. Ayrıca enerji kesildiğinde içindeki veriler saklanmaktadır.

    SRAM(Static Random Access Memory): Sistemdeki verilerin ve bilgilerin geçici olarak saklandığı bellektir. Genel ve özel amaçlı kayıtların bulundu hafızadır. Elektrik kesildiği zaman veri belleğinde tutulan veriler kaybolmaktadır. Örneğin; int a=1 gibi genel amaçlı, bir portun durumu giriş mi çıkış mı olacağı gibi özel amaçlı bilgiler tutulur.

    Burada dikkat edilmesi gereken husus SRAM belliğin fazla olmamasıdır. Eğer yazılan programda çok fazla değişken varsa hafıza yetmeyebilir. Bunu önlemek için; tablo veya uzun diziler için en küçük veri yapısı kullanılabilir. Örneğin; int tipi 2 byte yer kaplarken, byte tipi ise 1 byte yer kaplar. Bu da yeterli gelmezse değişkenleri SRAM yerine EEPROM’da tutabilirsiniz.

    EEPROM: Bilgilerin uzun süreli saklanabildiği bölümdür. Elektrik beslemesi kesildiğinde içerisinde saklanan veriler silinmez. Bir nevi bilgisayarlarda kullanılan hard disk gibi düşünebiliriz. Mikro denetleyici içerisinde dâhili bulunan EEPROM olduğu gibi, gerekli olursa harici olarak da dışardan EEPROM bağlanabilmektedir. Arduino Uno’da EEPROM yaklaşık 100.000 kez yeniden yazılabilir.


    8,16, 32, vb. Bit Mikroişlemci Neyi İfade Eder?

    Mikroişlemcinin tek seferde işleyebileceği veri sayısını ve mikroişlemcinin veri yolu sayısını ifade eder. 

  Veri sayısı, mikroişlemci ya da mikro denetleyicinin bir saat darbesi süresinde işleyebileceği veri miktarını ifade eder. 16 bitlik bir veriyi 8 bitlik mikro denetleyici 2 çevrimde işleyebilirken 16 bitlik mikro denetleyici bir çevrimde işler. 

    Veri yolu ise, denetleyici içerisindeki işlemciden çevre birimlerine giden hatlardır. 8 bit mimarisinde veri yolu 8 hattan oluşurken, 16 bit mimarisinde 16 hattan oluşur. 

    Bit sayısının artması işlem hızının da artması anlamına gelir. Yapılan işlem kapasitesinin artması beraberinde güç tüketiminin artmasını meydana getirir. Dolayısıyla 8 bit mikrodenetleyiciler, 16 bit mikro denetleyicilere göre düşük güç tüketimine sahiptir.


        Atmega328P Teknik Bilgiler

131 adet, çoğunluğu tek çevrimde çalışan güçlü bir komut seti.

32 adet 8 bitlik genel amaçlı kayıtçı.

16 Mhz çalışma hızı.

32 KB Flash bellek.

1Kbayt EEPROM.

2Kbayt dahili SRAM.

Yazma/silme döngüleri: 10.000 Flash Bellek / 100.000 EEPROM.

Yazılım güvenliği için programlama kilidi.

2 adet 8 bitlik sayıcı/zamanlayıcı.

1 adet 16 bitlik sayıcı/zamanlayıcı.

6 adet PWM çıkışı.

TQFP ve QFN/MLF paketinde 8 kanallı 10 bitlik ADC.

Programlanabilir seri USART.

SPI iletişim desteği.

I2C iletişim desteği.

Programlanabilir Watchdog Timer.

Dahili ve harici kesmeler.

Uyku modu ve sinyal girişi olduğunda uyanma özelliği.

23 adet programlanabilir giriş-çıkış portu.




Block Diagramı




__________________________________________________________________________________





Toplam Sayfa Görüntüleme Sayısı

Seri İletişim Protokolleri

Sensörlerin Arduino İle Kullanımı

Popular Posts

Yararlanılan Kaynaklar

İletişim

gokdag17@gmail.com