1 Kasım 2026 Pazar


Bu programda Proteus'ta Atmega328P'ye bağlı ledlerin sırayla yakıp söndürme işlemleri yapılmıştır.


Programlama Kodları

void setup() 
{
  pinMode(8,OUTPUT); //Arduino pin8   = ATMEGA328 PB0
  pinMode(9,OUTPUT); //Arduino pin9   = ATMEGA328 PB1
  pinMode(10,OUTPUT); //Arduino pin10 = ATMEGA328 PB2
  pinMode(11,OUTPUT); //Arduino pin11 = ATMEGA328 PB3
  pinMode(12,OUTPUT); //Arduino pin12 = ATMEGA328 PB4
  pinMode(13,OUTPUT); //Arduino pin13 = ATMEGA328 PB5
}

void loop() 
{
  digitalWrite(8,HIGH);//HIGH yerine 1 yazılabilir.
  delay(500);
  digitalWrite(8,LOW); //LOW yerine 0 yazılabilir.
  digitalWrite(9,HIGH);
  delay(500);
  digitalWrite(9,LOW);
  digitalWrite(10,HIGH);
  delay(500);
  digitalWrite(10,LOW);
  digitalWrite(11,HIGH);
  delay(500);
  digitalWrite(11,LOW);
  digitalWrite(12,HIGH);
  delay(500);
  digitalWrite(12,LOW);
  digitalWrite(13,HIGH);
  delay(500);
  digitalWrite(13,LOW);
}



Devre Şeması




Atmega32u4 Mikrodenetleyici Özellikleri


ATmega32u4, Atmel (günümüzde Microchip) firması tarafından üretilen, AVR RISC mimarisine sahip 8-bitlik yüksek performanslı bir mikrodenetleyicidir. Onu standart Arduino Uno'da kullanılan popüler ATmega328P işlemcisinden ayıran en büyük ve en kritik özellik, dâhili (Native) USB Desteğine sahip olmasıdır. Klasik kartlarda bilgisayarla haberleşmek için harici bir USB-Serial dönüştürücü çip (CH340 veya ATmega16U2 gibi) gerekirken, ATmega32u4 bu yeteneği doğrudan kendi içinde barındırır.






Teknik Özellikleri

  • Çekirdek Mimarisi: 8-bit AVR RISC.

  • Çalışma Voltajı: 5V (Bazı özel model ve klonlarda 3.3V sürümleri de bulunur).

  • Saat Hızı (Clock Speed): 16 MHz.

  • Flash Bellek: 32 KB (Bunun 4 KB kısmı bootloader için kullanılır).

  • SRAM (RAM): 2.5 KB (ATmega328P'ye göre daha geniş bir RAM alanı sunar)

  • EEPROM: 1 KB

  • Dijital Giriş/Çıkış Pinleri: Toplamda 20 pindir. Modeline göre değişmekle birlikte Leonardo/Pro Micro standardında 20 pindir. 

  • PWM (Darbe Genişlik Modülasyonu) Pinleri: 7 adet.

  • Analog Giriş Pinleri: 12 adet (10-bit çözünürlüğe sahip zengin analog kanal desteği).

  • Donanımsal İletişim Arayüzleri: 1 adet UART (Seri Haberleşme), 1 adet I2C, 1 adet SPI.

  • 135 güçlü komut.

  • 32 x 8 Genel Amaçlı register.

  • Yazma/Silme Döngüleri: 10.000 (Flash) / 100.000 (EEPROM).

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

  • 12 Mbit/s ve 1,5 Mbit/s'ye kadar veri aktarım hızları.

  • USB Veri Yolu Sıfırlama (Bus Reset) algılandığında CPU sıfırlama imkânı.

  • 10-bit yüksek hızlı Zamanlayıcı/Sayıcı.

  • 10-bit ADC.

  • Dahili analog karşılaştırıcı.

  • Dahili sıcaklık sensörü

  • Pin değişiminde kesme (interrupt) ve uyandırma (wake-up) özelliği.

  • Altı Farklı Uyku Modu: Boşta (Idle), ADC Gürültü Azaltma (ADC Noise Reduction), Güç Tasarrufu (Power-save), Güç Kapatma (Power-down), Bekleme (Standby) ve Genişletilmiş Bekleme (Extended Standby).


ATmega32u4'ü öne çıkaran en büyük avantaj USB HID (Klavye & Fare Simülasyonu) özelliğine sahip olmasıdır. ATmega32u4 işlemcisini kullanan kartlar (örneğin Arduino Leonardo veya Arduino Pro Micro), doğrudan USB protokolünü desteklediği için bilgisayara takıldıklarında sıradan bir seri aygıt olarak görünmezler. Bilgisayar onları doğrudan bir Klavye, Fare (Mouse) veya Oyun Kumandası (Joystick) olarak algılar. Kod yazarak bilgisayarınıza otomatik klavye tuşları bastırabilir, fare imlecini hareket ettirebilirsiniz.

ATmega32u4 kompakt yapısına rağmen Uno'ya kıyasla daha fazla analog pin (12 adet) ve daha geniş SRAM (2.5 KB) sunar. Dahili USB nedeniyle, bazen kod yüklerken kartın portu anlık olarak değişebilir. Yükleme sırasında sorun yaşanırsa, kart üzerindeki reset butonuna doğru zamanda basmak gerekebilir.

NOT: Eğer projeniz sadece sensörlerden veri okuyup ekrana yazmakla kalmayacak, aynı zamanda bilgisayarı klavye veya fare gibi yönlendirecekse, kalbinde ATmega32u4 taşıyan bir kart (Leonardo veya Pro Micro) seçmeniz doğru olur. 


Block Diagramı
























31 Ekim 2026 Cumartesi

Arduino


Arduino Nedir?

Arduino, açık kaynaklı bir mikrodenetleyici platformudur. En basit tanımıyla üzerine bağlanan sensörlerden (sıcaklık, ışık, mesafe vb.) aldığı verileri işleyen ve bu verilere göre motorları, ışıkları veya ekranları kontrol edebilen "küçük bir bilgisayar beyni" dir.

Açık kaynaklı olması, kartın tasarım planlarının herkese açık olduğu anlamına gelir. Bu sayede hem orijinal İtalyan üretimi kartları hem de farklı firmaların ürettiği daha uygun fiyatlı "klon" kartları piyasada bulmak mümkündür.


Çeşitli Arduino Modelleri

1. Arduino Uno -R3


İşlemci: ATmega328P (8-bit)

Çalışma Voltajı / Saat Hızı: 5V, 16 MHz

Giriş/Çıkış: 14 Dijital (6 PWM), 6 Analog Giriş

Bellek: 32 KB Flash, 2 KB SRAM, 1 KB EEPROM

Özellik ve Kullanım Alanı: En popüler ve standart Arduino modelidir. Genellikle eğitim, hobi projeleri ve prototipleme için temel kart olarak kullanılır. Üzerinde tak-çıkat kılıfta (veya SMD) ATmega328P bulunur.



30 Ekim 2026 Cuma


Programlama Kodları

//AÇIKLAMA
//Bu uygulamada okutulan kartın belirlediğimiz kart UID'si ile aynı olup olmadığını test ettik.
//Aynıysa doğru, aynı değilse yanlış ifadesini seri port ekanına yazdırdık.

#include<SPI.h>
#include<MFRC522.h>

#define SS_PIN 10
#define RST_PIN 9

MFRC522 rfid(SS_PIN, RST_PIN);

String kart_ID = "6934CE06";
String okunan_ID = "";
int i;

void setup()
{
  Serial.begin(9600);
  SPI.begin();
  rfid.PCD_Init();
  Serial.println("MIFARE Classic Kart/Etiket Bekleniyor...");
}

void loop()
{
  //__________________________________Kart/Etiket kontrolü_______________________________
  //If'in içerisinde return kullanmamızın nedeni: If içi 1(true) olduğunda programın, loop
  //döngüsünün başına gitmesini sağlamak içindir.
  if (!rfid.PICC_IsNewCardPresent())  //Yeni bir kart/etiket algılanıp algılanmadığını kontrol eder.
  {
    return;
  }

  if (!rfid.PICC_ReadCardSerial())  //Kartın/etiketin UID (Benzersiz Kimlik)’sinin okunup okunamadığını belirler.
  {
    return;
  }
  Serial.println("Kart/Etiket Algılandı.");

  okunan_ID = ""; //Stringi boşalt.

  //__________________UID'yi bayt bayt okuma, birleştirme, büyük harfe çevirme____________________
  for (i = 0; i < 4; i++)
  {
    if (rfid.uid.uidByte[i] < 0x10)
    {
      okunan_ID += "0";   // Tek haneli sayıların başına 0 ekleme.
    }
    okunan_ID.concat(String(rfid.uid.uidByte[i], HEX)); //"rfid.uid.uidByte[i]" komutuyla sayı olarak okuduğumuz baytı, HEX'e çevir ve ardından String yap. ardından, "concat" komutu ile okunan_ID stringinin son haliyle birleştir. for döngüsü ile bu durumu 4 sefer tekrarla.
  }

  okunan_ID.toUpperCase();  //büyük harfe çevir. kart_ID değişkenindeki harfler büyüktür. Ancak üstteki komutla HEX e dönüştürüldüğünde UID içerisindeki harfler küçülür. bu nedenle büyük harfe çevirme işlemi yapıldı.
  Serial.print("Kart UID: ");   Serial.println(okunan_ID);


  //__________________Okunan UID ile tanımlanan ID'yi karşılaştır____________________
  if (kart_ID == okunan_ID)
  {
    Serial.println("Okunan UID DOĞRU.");
    delay(1000);
  }
  else
  {
    Serial.println("Okunan UID YANLIŞ!.");
    delay(1000);
  }

  rfid.PCD_StopCrypto1(); //okuyucu (PCD) ile kart/etiket(PICC) arasındaki şifreli iletişimi (Crypto1) güvenli bir şekilde kapat.

}



Devre Şeması




Seri Port Ekran Görüntüsü





Programlama Kodları

//AÇIKLAMA
//Bu uygulamada "MEHMET-GOKDAG-78" yazısı kartın 2. bloğuna yazılır ve ardından okunarak seri port ekranına yazdırılır. Ardından
//Kartın/Etiketin Bellek Dökümünü/Haritası ekrana seri port ekranına yazdırılır.

#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN 10
#define RST_PIN 9

MFRC522 rfid(SS_PIN, RST_PIN);
MFRC522::MIFARE_Key key;  //'key' adında bir MIFARE_Key yapısı değişkeni oluşturuldu. Bu değişkeni, güvenlik anahtarını programa bildirmek için kullanacağız. 6 bayttır.

int blok = 2;  //Bu, içine yazıp sonra okuyacağımız blok numarasıdır.0. sektör 2. blok anlamındadır.
byte gonderilen_veri[16] = {"MEHMET-GOKDAG-78"};  //Bloğa yazdıracağımız verilerimizi belirlemek için, 16 baytlık bir dizi tanımlayıp, içerisine yazı yazıyoruz. Eğer bir bloğun içini silmek istiyorsak; {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; dizisinin o bloğa yazdırılması yeterlidir.
byte okunan_veri[18];   //Bloktaki verileri okuduktan sonra kaydedeceğimiz diziyi tanımlıyoruz. Okuyacağımız veri 16 bayt olmasına rağmen diziyi 18 elemanlı tanımladık. Bunun nedeni, MFRC522 kütüphanesindeki MIFARE_Read fonksiyonunun en az 18 baytlık bir tampon gerektirmesidir.

void setup()
{
  Serial.begin(9600);
  SPI.begin();
  rfid.PCD_Init();
  Serial.println("MIFARE Classic Kart/Etiket Bekleniyor...");

  //_______________________Güvenlik Anahtarını Kütüphaneye Bildirme____________________
  //Yukarıda tanımladığımız 'key' adındaki 6 baytlık değişkeni kullanarak, güvenlik anahtarını kütüphaneye bildiririz.
  //Güvenlik anahtarı aşağıdaki for döngüsünde görüldüğü üzere her biri 1 baytlık olan 6 adet "0xFF" verisinden oluşur.
  //Yeni RFID kartlarının tümünün güvenlik anahtarı varsayılan olarak 0xFF olarak belirlenir.
  for (byte i = 0; i < 6; i++)
  {
    key.keyByte[i] = 0xFF;
  }
}

void loop()
{
  //If'in içerisinde return kullanmamızın nedeni: If içi 1(true) olduğunda programın, loop
  //döngüsünün başına gitmesini sağlamak içindir.
  if (!rfid.PICC_IsNewCardPresent())
  {
    return;
  }

  if (!rfid.PICC_ReadCardSerial())
  {
    return;
  }
  Serial.println("Kart/Etiket Algılandı.");

  veriyaz(blok, gonderilen_veri);  //"gonderilen_veri" dizisinde tanımlanan veri 2 numaralı bloğa yazılır.

  verioku(blok, okunan_veri);  //2 numaralı bloktaki veri okunarak "okunan_veri" dizisine kaydedilir.

  //Bloktan okunan veri seri port ekranına yazdırılır.
  Serial.print("Bloktan Okunan Veri: ");
  for (int j = 0; j < 16; j++) {
    Serial.write(okunan_veri[j]);
  }
  Serial.println("");

  //Kart/etiket hakkında tüm bilgileri seri port ekranına yazdırır.
  Serial.println(" ");
  Serial.print("_________________");  Serial.print("Kartın/Etiketin Bellek Dökümünü/Haritası"); Serial.println("__________________");
  rfid.PICC_DumpToSerial(&(rfid.uid));

  rfid.PCD_StopCrypto1(); //okuyucu (PCD) ile kart/etiket(PICC) arasındaki şifreli iletişimi (Crypto1) güvenli bir şekilde kapat. 
}

//_______________________Bloğa Veri Yazma Fonksiyonu____________________
int veriyaz(int blok_no, byte gon_veri_dizisi[])
{
  //Bu kısımda trailer(son) blok değeri belirlenir ve blok kontrolü yapılır. Verilen blok numarasının veri bloğuna mı yoksa sonlandırıcı bloğa mı karşılık geldiği kontrol edilir. Verilen blok numarası bir veri bloğuna karşılık gelmiyorsa, fonksiyon bir hata mesajı döndürür.
  int sayi_tam_kisim = blok_no / 4 * 4;   //blok_no önce 4'e bölünür sonra 4 ile çarpılır. Fakat değişkenler int türünden tanımlandığı için blok_no 4'e bölündüğünde sonuç virgüllü çıksa bile sadece tam kısmı alınır. Örn: 7/4=1,25 olarak değil sadece tam kısmı alınacağından bölüm sonucu 1 olur.
  int trailer_blok = sayi_tam_kisim + 3;  //Sektör için trailer(son) blok değerini belirleyin.
  if (blok_no > 2 && (blok_no + 1) % 4 == 0)
  {
    Serial.print(blok_no);
    Serial.println(" numaralı blok trailer bloğudur.");
    return 2;
  }
  Serial.print(blok_no);
  Serial.println(" numaralı blok veri bloğudur.");

  //Bu kısımda bloğa erişim için key doğrulaması yapılır. Doğrulama başarısız olursa, fonksiyon bir hata mesajı döndürür.
  byte status = rfid.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailer_blok, &key, &(rfid.uid));
  if (status != MFRC522::STATUS_OK)
  {
    Serial.print("Key doğrulama hatası: ");
    Serial.println(rfid.GetStatusCodeName(status));
    return 3;  //return "3" as error message
  }

  //Bu kısımda belirlenen veri olan "MEHMET-GOKDAG-78" yazısı bloğa yazılır.
  status = rfid.MIFARE_Write(blok_no, gon_veri_dizisi, 16);
  if (status != MFRC522::STATUS_OK)
  {
    Serial.print("MIFARE_Write() Yazma Hatası: ");
    Serial.println(rfid.GetStatusCodeName(status));
    return 4;  //return "4" as error message
  }
  Serial.println("Bloğa yazma işlemi yapıldı.");
}

//_______________________Bloktan Veri Okuma Fonksiyonu____________________
int verioku(int blok_no, byte okunan_veri_dizisi[])
{
  //Bu kısımda trailer(son) blok değeri belirlenir
  int sayi_tam_kisim = blok_no / 4 * 4;
  int trailer_blok = sayi_tam_kisim + 3;  //Sektör için trailer(son) blok değerini belirleyin.

  //Bu kısımda bloğa erişim için key doğrulaması yapılır. Doğrulama başarısız olursa, fonksiyon bir hata mesajı döndürür.
  byte status = rfid.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailer_blok, &key, &(rfid.uid));
  if (status != MFRC522::STATUS_OK)
  {
    Serial.print("Key doğrulama hatası: ");
    Serial.println(rfid.GetStatusCodeName(status));
    return 3;  //return "3" as error message
  }

  //Bu kısımda bloktan veri okunur.
  byte dizi_boyutu = 18;  //"okunan_veri_dizisi" dizinin boyutunu belirlemek ve boyut değişkeninin adresini kütüphaneye bildirebilmek için değişken tanımlandı. boyut değişkeninin adresi, "&" işaretçisi kullanılarak kütüphaneye bildirilir.
  status = rfid.MIFARE_Read(blok_no, okunan_veri_dizisi, &dizi_boyutu);
  if (status != MFRC522::STATUS_OK)
  {
    Serial.print("MIFARE_read() Okuma Hatası: ");
    Serial.println(rfid.GetStatusCodeName(status));
    return 4;  //return "4" as error message
  }
  Serial.println("Blok Okundu");
}



Devre Şeması




Seri Port Ekran Görüntüsü





Programlama Kodları

#include <SPI.h>
#include <MFRC522.h>

#define RST 9
#define SS  10

MFRC522 rfid(SS, RST);

byte piccType;

void setup()
{
  Serial.begin(9600);
  SPI.begin();
  rfid.PCD_Init();  //“rfid” nesnesini başlatır.
  delay(4); //Bazı kartların hazır hale gelmesi için başlatıldıktan sonra daha fazla zamana ihtiyacı vardır.
  rfid.PCD_DumpVersionToSerial(); //RC522 kart/etiket okuyucu modülün bilgilerini gösterir.
}

void loop()
{
  //If'in içerisinde return kullanmamızın nedeni: If içi 1(true) olduğunda programın, loop
  //döngüsünün başına gitmesini sağlamak içindir.
  if (!rfid.PICC_IsNewCardPresent())  //Yeni bir kart/etiket algılanıp algılanmadığını kontrol eder.
  {
    return;
  }
  if (!rfid.PICC_ReadCardSerial())  //Kartın/etiketin UID (Benzersiz Kimlik)’sinin okunup okunamadığını belirler.
  {
    return;
  }

  Serial.print("Kart UID: ");
  Serial.print(rfid.uid.uidByte[0],HEX);  Serial.print(" ");
  Serial.print(rfid.uid.uidByte[1],HEX);  Serial.print(" ");
  Serial.print(rfid.uid.uidByte[2],HEX);  Serial.print(" ");
  Serial.println(rfid.uid.uidByte[3],HEX);

  delay(1000);
}



Devre Şeması




Seri Port Ekran Görüntüsü





Programlama Kodları

#include <SPI.h>
#include <MFRC522.h>

#define RST 9
#define SS  10

MFRC522 rfid(SS, RST);

byte piccType;

void setup()
{
  Serial.begin(9600);
  SPI.begin();
  rfid.PCD_Init();  //“rfid” nesnesini başlatır.
  delay(4); //Bazı kartların hazır hale gelmesi için başlatıldıktan sonra daha fazla zamana ihtiyacı vardır.
  rfid.PCD_DumpVersionToSerial(); //RC522 kart/etiket okuyucu modülün bilgilerini gösterir.
}

void loop()
{
  //If'in içerisinde return kullanmamızın nedeni: If içi 1(true) olduğunda programın, loop
  //döngüsünün başına gitmesini sağlamak içindir.
  if (!rfid.PICC_IsNewCardPresent())  //Yeni bir kart/etiket algılanıp algılanmadığını kontrol eder.
  {
    return;
  }
  if (!rfid.PICC_ReadCardSerial())  //Kartın/etiketin UID (Benzersiz Kimlik)’sinin okunup okunamadığını belirler.
  {
    return;
  }

  piccType = rfid.PICC_GetType(rfid.uid.sak);
  Serial.print("Kart Tipi: ");
  Serial.println(rfid.PICC_GetTypeName(piccType));
  delay(1000);
}



Devre Şeması




Seri Port Ekran Görüntüsü




28 Ekim 2026 Çarşamba


Programlama Kodları

#include <SPI.h>
#include <MFRC522.h>

#define RST 9
#define SS  10

MFRC522 rfid(SS, RST);

void setup()
{
  Serial.begin(9600);
  SPI.begin();
  rfid.PCD_Init();  //“rfid” nesnesini başlatır.
  delay(4); //Bazı kartların hazır hale gelmesi için başlatıldıktan sonra daha fazla zamana ihtiyacı vardır.
  rfid.PCD_DumpVersionToSerial(); //RC522 kart/etiket okuyucu modülün bilgilerini gösterir.
}

void loop()
{
  //If'in içerisinde return kullanmamızın nedeni: If içi 1(true) olduğunda programın, loop
  //döngüsünün başına gitmesini sağlamak içindir.
  if (!rfid.PICC_IsNewCardPresent())  //Yeni bir kart/etiket algılanıp algılanmadığını kontrol eder. 
  {
    return;
  }
  if (!rfid.PICC_ReadCardSerial())  //Kartın/etiketin UID (Benzersiz Kimlik)’sinin okunup okunamadığını belirler.
  {
    return;
  }

  rfid.PICC_DumpToSerial(&(rfid.uid));  //Kart/etiket hakkında tüm bilgileri seri port ekranına yazdırır.
}



Devre Şeması




Seri Port Ekran Görüntüsü




26 Ekim 2026 Pazartesi


RC522 RFID Modülü

RFID Teknolojisi Nedir Ve Nasıl Çalışır?

RFID, “Radio Frequency Identification” teriminin kısaltmasıdır. Türkçe olarak “Radyo Frekansı Tanımlama” anlamına gelir. RFID teknolojisi nesnelerin radyo dalgaları kullanılarak tanınması için kullanılan teknolojidir. Bir kimliklendirme sistemi de denilebilir. Temel olarak kullanım amacı, nesneleri tanımak, bunlarla ilgili veri toplamak ve bu verileri ilgili yazılım sistemleriyle paylaşmaktır. Barkodun aksine etiketin, okuyucunun görüş alanında olması gerekmez. RFID etiketlerinde kodlanan dijital verilerin radyo dalgaları aracılığıyla okuyucular tarafından yakalandığı bir teknolojiyi ifade eder.

RFID teknolojisinin kullanım alanları oldukça geniştir. Toplu taşıma biletlerinde, işyeri ve okul girişlerindeki turnikelerde, alışveriş merkezlerinde, marketlerde, kargo firmalarında, canlı hayvan takiplerinde vs. kullanılmaktadır. RFID teknolojisi sayesinde şirketlerin insan gücü maliyeti, stok kontrolü, ürün takibi gibi konularda kayda değer kolaylıklar sunmaktadır.

RFID sistemleri temek olarak 2 bileşenden oluşur: 

  • RFID Okuyucu.

  • Etiket adı verilen, aktif veya pasif küçük bir radyo transponderi.


RFID Okuyucu: 


Çevresinde yüksek frekanslı elektromanyetik alan oluşturan bir radyo frekansı modülü ve bir anten içerir. Yakındaki bir RFID etiketine elektromanyetik sorgulama darbesi gönderir. Etiketten gelen verileri analiz ederek etiketi tanımlar. Barkod veya QR kodunun aksine, etiketin okuyucunun görüş alanında olması gerekmez.




Arduino Eğitimi Konu - 7

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

Sensörler ve Aygıtların Arduino İle Kullanımı

Popular Posts

Yararlanılan Kaynaklar

İletişim

gokdag17@gmail.com