Arduino projelerinde veri depolama, günlük tutma veya büyük dosyalarla çalışma gerektiğinde SD kart modülleri sıklıkla tercih edilir. Arduino SD kart modülü sayesinde, projelerinizde sensör verilerini kaydedebilir, ayar dosyalarını okuyabilir veya geniş depolama ihtiyacınızı karşılayabilirsiniz. Bu rehberde, Arduino ile SD kart kullanımını detaylıca ele alacağız.
SD Kart Nedir?
Son zamanlarda, bu yöntem çeşitli nedenlerden dolayı tepki çekmektedir. Bunun en önemli nedenlerinden biri de genellikle bu tür kısıtlamalardan sadece ilgili medyayı yasal yollarla temin eden kullanıcıların etkilenmesi ve buna rağmen korsan yayılımın engellenememesidir. Ayrıca teknik olarak DRM sisteminin tam anlamıyla başarılı olmasının imkansızlığı ortada olmasına rağmen, dijital medyayı dağıtan şirketler bu yöntemi kullanmaya hala devam etmektedir.

SD Kartların Yapısı
SD kart dahili bir denetleyici içerir. SD 1.1 standardına göre kartların depolama kapasitesi 8 MB ile başlayıp FAT16 dosya sisteminin sınırı olan 2 GB’a kadar katlanarak çıkmaktadır. SD 2.0 veya SDHC olarak bilinen standart ile beraber ise kapasite 32 GB’a ulaşmıştır. SD 3.0 veya SDXC olarak bilinen standart ile beraber ise en yüksek kapasite teorik olarak 2 TB’a erişmiştir. Ayrıca bazı kart modellerinin üzerinde bir adet yazma koruma tırnağı mevcuttur bu tırnak sayesinde sadece okuma işlemi yapılabilmektedir. Ayrıca daha ufak cihazlar için miniSD geliştirilmiştir. 20 mm × 21,5 mm × 1,4 mm ölçüleri ile ortalama SD-Card’ın yarısı kadardır. Küçük bir çevirici yardımı ile tüm normal SD Kart yuvalarına takılabilmektedir. Bu ufak kartlar 32 MB ila 2 GB arasında bir kapasiteye sahiptirler. MicroSD-kartlar ise SD Card ve miniSD den daha ufaktırlar. 11 mm × 15 mm × 1 mm ölçüleri ile 2005’te dünyanın en küçük Flash-RAM-hafıza kartıdır. SD kartlar farklı hızlarda olup hız değerleri CD-ROM sürücülerde olduğu gibi X harfiyle belirtilir ve 1X=150kB/s’dir.
SD, SDHC ve SDXC Kart
SD Kart maksimum 2GB veri depolayabilir, SDHC ise 32 GB. SDXC ise 2TB kadar veri depolayabilir.

MiniSD ve MiniSDHC
Varsayılan SD Kart’ın küçültülmüş halidir, neredeyse yarı boyutundadır.

MicroSD, MicroSDHC ve MicroSDXC
MicroSD Kartlar, TransFlash kart olarakta bilinmekte. Şuan boyut olarak en küçük kartlardır. Yeni telefon ve cihazlarda sıklıkla kullanılmaktadır, bu gün biz de bu kartı kullanacağız. MicroSD Kartların maksimum depolama kapasitesi 2GB dır. MicroSDHC kartların ise 32GB. MicroSDXC kartların kapasitesi 2TB kadar çıkmaktadır.

SD Kartların Transfer Hızı
Piyasaya ilk sürüldüğünde, ortalama 3,6 MB/s okuma ve 0,8 MB/s yazım hızına sahip iken, günümüz kartları 2 MB/s ile veri aktarabilmektedir. High-speed olarak nitelendirilen kartlar ise 40 MB/s hızında okuma ve yazım yapabilmektedir. En yüksek değerler, üreticiye ve kullanılan cihaza göre değişebilir. Çoğunlukla aktarım hızı doğrudan verilmez, bunun yerine CD okuma hızı baz alınarak verilir (= ortalama 150 kB/s ilk single speed veya 1x sürücüler). Bu yazım metodu CD-Yazıcılar ve diğer yazılabilir medyalar için de bir standart halini almıştır. Örneğin; High-speed SD card 50x = ortalama 7,5 MB/s yazım hızına denk gelir. 267X’e kadar SD Kart’lar mevcuttur.
High Speed SD kartlar aşağıda verildiği gibi “hız sınıfı dereceleri”‘ne sahiptir. Bunlar öngörülen en düşük yazma hızlarıdır.
- Class 2: 16 Mbit/s (2 MB/s)
- Class 4: 32 Mbit/s (4 MB/s)
- Class 6: 48 Mbit/s (6 MB/s)
- Class 10: 80 Mbit/s (10 MB/s)

Depolama Entegreleri
Hafıza (Memory) nedirBir önceki yazılarımızda ROM ve RAM olarak hafıza/depolama entegrelerinden bahsetmiştik. Buradan ilgili yazıya ulaşabilirsiniz.
Neden Depolamaya İhtiyaç Duyarız?
Bir çok projede verilerin kaydedilip işlenmesi, örneklerin çıkarılması önemli bir rol oynar. Örneğin GPS verileri, Sıcaklık verileri gibi. Çoğu mikroişlemci ‘nin hafızası yani EPROM’u düşük kapasitelere sahiptir. İhtiyacınız durumunda, isterseniz bir ROM çeşidi isterseniz bir SD Kart yardımı ile bu hafızayı yükseltebilirsiniz.
Bir SD Kart Okuma Modülüne Sahip Olmasaydık?
Bu modül olmadan SD Kartınızı doğrudan kartınıza bağlayabilirsiniz. Fakat bu yöntem ile kartınızın ömrünü kısaltabilir hatta tamamen bozabilirsiniz. SD kartların tamamı 3.3V ile çalışır. Ayrıca modül üstünde bulunan “level shifter” entegresi ile kartınızı sağlıklı bir biçimde kullanabilirsiniz. Kendiniz bir logic level shifter kullanmak isterseniz 74125 işinizi görecektir. 74125 quad buffer olarak adlandırılır. Bu entegrede 4 level shifter bulunmakta, E pini Enable anlamıan gelmekte. Kullanmayı düşünüyorsanız; 1,4 ve 10. pin, 7. pin ile GND’ye bağlamalısınız. Arduino kartınız üzerinden bir dijital pin ise, D pinine yani data in pinine bağlanmalıdır. O pini ise yani data out pini, SD Kartınıza bağlamalısınız kısacası yol şöyle oalcaktır; Arduino Pin 10 –> Buffer Pin 2 –> Buffer Pin 3 –> SD Kart Pin 2. Daha detaylı anlamak için veri tablosunu inceleyebilirsiniz.



Modül Hakkındaki Bilgiler
Micro sd kartlarla iletişim kurmanın iki yöntemi vardır; SPI modu ve SDIO modu. SDIO modu çok daha hızlıdır ve cep telefonlarında, dijital kameralar gibi hızın önemli olduğu cihazlarda kullanılır. Ancak daha komplikedir ayrıca bir koruma kilidi mevcuttur. Bu nedenle Arduino projeleri üzerinde çalışan kişiler tarafından SDIO modu tercih edilmemektedir. Bunun yerine, her SD kart modülü ile uyumlu ve basit, herhangi bir mikrodenetleyici ile kullanması kolay olan SPI modu tercih edilmektedir. Arıca seri haberleşme protokolleri hakkındaki yazımızı okuyarak SPI hakkında daha çok bilgiye sahip olabilirsiniz.

VCC pini modül için güç sağlar ve Arduino’daki 5V pine bağlanmalıdır.
GND Arduino GND pinine bağlanmalıdır.
MISO (Master In Slave Out) , Micro SD Kart Modülünden SPI çıkışıdır.
MOSI (Master Out Slave In) , Micro SD Kart Modülüne SPI girişidir.
SCLK (Seri Saat) pini, Arduino tarafından üretilen, seri haberleşmeyi sağlayan, veri iletimini senkronize eden saat darbelerini kabul eder.
SS (Slave Select) pini, Arduino (Master) tarafından SPI veri yolundaki belirli cihazları etkinleştirmek ve devre dışı bırakmak için kullanılır.
SD Kartı Hazırlamak
Mikro SD kartı modüle takmadan ve Arduino’ya bağlamadan önce kartı düzgün bir şekilde biçimlendirmelisiniz. MicroSD kart, arduino kütüphanesi için gerekli olan ve neredeyse tüm diğer SD kütüphaneleri için kart FAT16 veya FAT32 formatında biçimlendirilmelidir. Kartı biçimlendirmek için SDA tarafından yayınlanan resmi SD kart biçimlendirici programı kullanmanızı tavsiye ediyoruz. Formatlayıcıyı indirin ve bilgisayarınızda çalıştırın, doğru sürücüyü seçin ve doğrudan FORMAT’a tıklayın.

Arduino SD Kart Kullanımı İçin Devre Şeması

Başlamak için mikro SD kart modülünü breadboard’a takın. Modüldeki VCC pinini Arduino’daki 5V pinine, GND pinini GND ‘ye bağlayın.
Micro SD kartlar çok fazla veri aktarımı gerçekleştirdiğinden dolayı, SPI pinlerine bağlayarak en iyi performansı alabilirsiniz.
Her Arduino Kartında buna göre bağlanması gereken farklı SPI pinleri olduğunu unutmayın. UNO / Nano gibi Arduino kartları için bu pinler; 13 SCLK, 12 MISO ve 11 MOSI‘dir. Ayrıca ‘chip / slave select’ SS hattı için dördüncü bir pine ihtiyacınız olacaktır. Genellikle bu pin 10’dur, ancak istediğiniz herhangi bir pini kullanabilirsiniz.
| MOSI | MİSO | SCK | CS | |
| Arduino Uno | 11 | 12 | 13 | 10 |
| Arduino Nano | 11 | 12 | 13 | 10 |
| Arduino Mega | 51 | 50 | 52 | 53 |
Arduino SD Kart Kodu – CardInfo ve Veri Okuma-Yazma
Arudino IDE üzerinde, SD adında bir kütüphane mevcut, bir çok test ve okuma yazma işlemi için bunu kullanacağız. CardInfo örneği için bunu örnekler alt menüsünde görebilirsiniz. Devre şemasını bağlantılarını doğru bağladıysanız ve kartı FAT formatında yazdıysanız ufak bir test kodu ile kartı test edebilirsiniz.
CardInfo
Bağlantılar ve biçimlendirme işlemi doğru ise seri port çıktısı bu şekilde olacaktır;

Veri Okuma ve Yazma
SD kartı başarıyla çalıştırdığınızı düşünürsek, bir sonraki denemeye geçelim. Aşağıdaki kod, bir dosyadan veri yazma ve okuma ile ilgili temel bir açıklama içerir. Ayrıntılı dökümüne başlamadan önce taslağı deneyin.
Arduino SD Kart Kullanımı Kod Açıklaması
Kod, dahili SD kütüphanesi ve SPI arayüzü üzerinden SD kart ile kolayca iletişim kurmamızı sağlayan SPI kütüphanesini dahil etmekle başlar.
Kütüphaneler dahil edildikten sonra, yaptığımız bir sonraki şey, SD kart modülünün chipSelect (CS) Arduino pinini bildirmektir. CS pini, Arduino dijital pinlerinden biri olarak sabitlenmeyen tek pindir. SPI arabirimini kullandığımız ve bu pinler zaten SPI kütüphanesinde bildirildiğinden diğer SPI pinlerini bildirmemize gerek yok. Pini bildirdikten sonra, SD kartta veri depolamak için kullanılacak bir myFile nesnesi oluşturalım.
Ardından, setup () bölümünde: Sonuçları ekranda göstermek için seri iletişimi başlatırız. Şimdi, SD.begin() fonksiyonunu kullanarak SD kartı başlatacağız ve başlatma başarılı olursa “ if ” ifadesi gerçekleşir ve “String” başlatma yapılır. Başarısız ise “ başlatma başarısız! ”Yazdırılır ve program sona erer.
Ardından, SD.open() işlevi “ test.txt ” adlı dosyayı açacaktır. Diğer FILE_WRITE parametresi dosyayı okuma-yazma modunda açar.
Dosya açıldıktan sonra, ekranda “test.txt yazdırılıyor” görmeliyiz. Ardından myFile.println() işlevini kullanarak “test 1, 2, 3” metnini yazacağız. Bundan sonra, dosyaya yazılan verilerin kaydedilmesini sağlamak için close() işlevini kullanmamız gerekir.
Şimdi, yazma işleminin başarılı olup olmadığını kontrol etmek için SD.open() işlevini kullanacağız, ancak bu sefer “ test.txt ” dosyası zaten oluşturulmuş olduğu için, işlev sadece dosyayı açar. Sonra myFile.read() işlevini kullanarak ekran da göreceğiz. read() işlevi aslında bir seferde yalnızca bir karakter okur, bu nedenle tüm karakterleri okumak için “while” döngüsünü ve myFile.available() işlevini kullanmamız gerekir. Sonunda da dosyayı kapatmamız gerekiyor.
Bu, dosyaların nasıl okunacağını ve yazılacağını göstermek için sadece bir demo taslağı olduğundan, kodu birden çok kez çalıştırmanın bir anlamı yoktur. Böylece tüm kod bir loop() koymak yerine sadece bir kez çalışan setup() işlevine yerleştirilmiştir.
EKSTRA: Kullanışlı Fonksiyonlar
- Dizeler, değişkenler vb. yazmak için seri nesneler gibi print () ve println () işlevlerini kullanabilirsiniz.
- Read() yalnızca bir karakter döndürür. Tam satır veya sayı okumaz!
- close() Tüm verilerin kalıcı olarak yazıldığından emin olmak için işiniz bittiğinde dosya (lar)! Bu, kullanılan RAM miktarını azaltır.
- Dosyaları bir dizinde açabilirsiniz. Örneğin, dizinde bir dosya açmak istiyorsanız, SD.open(“/myfiles/example.txt”) kullanabilirsiniz. Kodu kendi dosyalarınıza göre düzenleyiniz.
- SD kart kütüphanesi ‘uzun dosya adlarını’ desteklemiyor. Bunun yerine, dosya adları için 3 biçimini kullanın ve dosya adlarını kısa tutun! Örneğin datalog.txt ismi idealdir ancak “Sensörümün günlük dosyası.txt” gibi isimler iyi değildir!
- Ayrıca dosya adlarının ‘büyük / küçük harf’ duyarlılığına sahip olmadığını unutmayın, bu nedenle datalog.txt dosyası DataLog.Txt dosyası ile aynıdır ve DATALOG.TXT dosyası ile aynıdır
SD nesnesiyle kullanabileceğiniz kullanışlı işlevler:
- Sadece bir dosyanın var olup olmadığını kontrol etmek istiyorsanız, exists(“filename.txt”) kodunu kullanın.
- remove(“unwanted.txt”) kodu ile bir dosyayı silebilirsiniz dikkatli olun! Bu gerçekten tamamen siler ve silinen verileri geri getirecek bir ‘Geri Dönüşüm Kutusu‘ yoktur.
- mkdir(“/mynewdir”) kullanarak bir alt dizin oluşturabilirsiniz. Zaten bu kodu daha önce kullandıysanız, SD.exists() kodunu öncelikli olarak kullanabilirsiniz.
File nesneleriyle kullanabileceğiniz birkaç işlev vardır:
- Bir dosyada seek() kodu, okuma / yazma imlecini yeni bir konuma taşıyacaktır. Örneğin seek(0) çok kullanışlı olabilir, imleci dosyanın başlangıcına götürecektir.
- Aynı şekilde, dosyada nerede olduğunuzu söyleyen position() kodunu çağırabilirsiniz.
- Bir dosyanın boyutunu bilmek istiyorsanız, size() kodunu kullanabilirsiniz.
- Dizinler / klasörler özel dosyalardır, isDirectory() kodunu çağırarak bir dosyanın dizin de olup olmadığını belirleyebilirsiniz.
- Bir dizininiz olduğunda, openNextFile() kodunu kullanarak dizindeki tüm dosyaları getirebilirsiniz.
- Bir dosyanın adını bilmeniz gerekebilir (örneğin, bir dizinde openNextFile () öğesini çağırdıysanız, 8.3 biçimlendirilmiş karakter dizisine bir işaretçi döndürecek olan name () öğesini doğrudan Serial.print () yapabilirsiniz.

SD Kart İle Sıcaklık Verilerini Kaydetmek
Arduino ve SD kart kullanarak bir veri kaydedici(data logger) oluşturmak çok kolaydır, bu konuda DHT11 sensörü ile basit bir sıcaklık ve nem veri kaydedicisi yapıyoruz. DHT11 sensörü bağıl nemi ve sıcaklığı algılamak için kullanıyoruz. SD kartı nem ve sıcaklık değerlerini her 1 saniyede bir kaydetmek için kullanacağız. Sıcaklık ve nem değerleri SD kartta saklanan .TXT metin dosyasına kaydedilecek.
Devre Şeması

Fritzing Çizimi Karışık Geldiyse:

SD Kart Modülünüz Olmaksızın Sadece Adaptör İle

Arduino Kodu
Son Görüntüler



Arduino ile SD Karta Sensör Verisi Kaydetme: Adım Adım Uygulama
SD kart modülünün en yaygın ve pratik kullanımlarından biri, periyodik aralıklarla okunan sensör verilerini zaman damgasıyla birlikte bir dosyaya yazmaktır. Böyle bir veri kaydı sistemi (datalogger) kurmak için SD kütüphanesine ek olarak genellikle bir RTC (Real Time Clock) modülü de devreye eklenir; böylece her ölçüm tarih ve saatle ilişkilendirilebilir. DS1307 veya DS3231 gibi yaygın RTC modülleri I2C protokolüyle Arduino’ya bağlanır.
Kayıt uygulamasının temel akışı şu adımlardan oluşur:
- SD.begin(chipSelectPin): SD modülünü başlatır; bu adım başarısız olursa kart takılı değil ya da SPI bağlantısı hatalıdır.
- SD.open(“data.csv”, FILE_WRITE): Kart üzerinde bir CSV dosyası oluşturur veya sona ekleyerek açar.
- File.println(zaman + “,” + sicaklik + “,” + nem): Her döngü adımında ölçüm değerlerini virgülle ayrılmış biçimde yazar.
- File.close(): Her yazma işleminin ardından dosyayı kapatmak, veri bütünlüğünü garanti eder; güç kesilse bile yazılan veriler korunur.
- delay(60000): 1 dakikada bir ölçüm gibi periyotlar SD kartın yazma döngüsü sayısını azaltarak kartın ömrünü uzatır.
Bu yaklaşımla oluşturulan CSV dosyası, kart bilgisayara takıldığında Excel veya Python/pandas ile doğrudan açılabilir. Uzun süreli sıcaklık takibi, bitki sulama izleme veya güneş paneli verim analizi gibi uygulamalar bu basit veri kaydedicisi altyapısıyla rahatlıkla hayata geçirilebilir.
SD Kart Kullanımında Sık Yapılan Hatalar
Arduino projelerinde SD kart sorunlarının büyük çoğunluğu birkaç yaygın nedenden kaynaklanır. İlk ve en sık rastlanan sorun güç kaynağı yetersizliğidir: SD kart modülleri 3.3 V’ta çalışır; ancak bazı ucuz modüllerde güç regülatörü ve seviye dönüştürücü birlikte yüksek akım çekerek Arduino’nun USB güç kaynağını zorlar. Ayrı bir 5 V adaptör kullanmak bu sorunu ortadan kaldırır. İkinci yaygın hata ise donanım SPI pinlerinin karıştırılmasıdır: Arduino Uno’da CS için herhangi bir dijital pin kullanılabilir; ancak MOSI (11), MISO (12) ve SCK (13) pinleri sabit olup değiştirilemez.
- Kart FAT16 veya FAT32 formatlanmış ve 32 GB’ın altında olmalıdır; SDXC kartlar çoğu Arduino kütüphanesiyle uyumlu çalışmaz.
- Dosya isimlerini 8.3 formatında tutun (örn. DATA.CSV); uzun isimler SD kütüphanesinin eski sürümlerinde sorun çıkarabilir.
- loop() içinde her döngüde dosyayı açıp kapatmak performansı düşürür; belirli aralıklarda topluca yazmak daha verimlidir.
- Yüksek hızlı sensör verisi yazan projelerde bazen yazmak yerine “SD.begin()” başarısızlığı alınır; bunun temel nedeni SPI veri yoluna aynı anda bağlı başka bir cihazın müdahalesidir. Her SPI cihazının kendi CS pini olduğundan emin olun.
Yorum yapma özelliği, forum tarafından gelen istek sebebiyle kapatılmıştır. Lütfen tartışmalar ve sorularınız için topluluk forumumuza katılın.
