Sycamoreent-Storage-SdMerhaba arkadaşlar bu yazımızda yine arduino üzerinde yazacağım. Yazımızda yine dışarıdan yada mevcut bir sd kart üzerine bilgi yazacağız.Bu bilgiyi elde ederken öncelikle bir timer ile zaman aralıklarıyla TMP102 üzerinden bir veri alacağız ve bu veriyi sd kart üzerine yazacağız.
Ben yine elimdeki materyalleri kullanarak MSP430 Kiti üzerinde bulunan SD kart yuvası ile Arduino bağlantısı sağlayacağım. Bağlantı her zamanki gibi kolay olacaktır. Belirli bir zamana kurulmuş Timer üzerinden de bahsedilecektir.
Sıcaklık sensörü olarak  TMP102 ‘yi kullanıyorum. SD Kart konusunda herhangi bir boyut sınırlamaması bulunmayıp istenilen büyüklükte kullanılabilir. Ben 8GB ‘lık kullanıyorum. Bu husus size kalmış bir durumdur.

İlk olarak SD karttan bahsedelim. SD Kart aslında basit bir sistemden oluşuyor.Toplamda 9 bacağı bulunmakta ve bu bacaklar direkt herhangi ekstra devre gereksinimi yada entegre gereknimi olmadan veri haberleşmesi sağlayabilmektedir. SD kart SPI haberleşme tipi ile direkt olarak veriyi aktarmak için 4 bacak gereklidir. Okuma işlemlerinde kartınızın FAT16-32 tiplerinden bir tanesinde bulunduğuna emin olunuz. Aksi halde okuma işlemini yapamamaktadır.
sd-card-pinoutBurada bize en gerekli olan bacaklarımızı sıralayacak olursak ;
1 – CS
2 – DI
5 – SCLK
7 – DO

Enerji için gerekli bacaklar :
3 – VSS1 – VSS2 ( GND )
4 – VDD ( +3.3V )

Bu bacaklar öncelikle SPI haberleşme tipinin getirilerinden birisi olup haberleşmekte gayet kolaylık sağlamaktadır. Gerekli kütüphaneler elde edildiği zaman sizi hızlandıracaktır. SPI hakkında internet üzerinde bir çok yazı , makale vb şeylere rastlayabilirsiniz. Mantığı çok zor anlaşılacak birşey değildir. Burada anlatıp sizleri boğmak istemiyorum.

MSP430 Eğitim kiti hakkında bahsedecek olursak kit üzerinde direk bağlı bir SD kart okuyucusu bağlı bulunmakta belirli bütün bağlantılar MSP430 için bağlanmış bir şekilde bizim sadece pinlere bağlantı yapmaya yönlendirmektedir. İsterseniz ilk olarak SD Kart’ı şematikten bakalım.

1

Gördüğünüz gibi 4 direk MSP430 üzerindeki VCC bacağına , 8. ve 9. pinler pull-up yapılmuş durumda ve CS (1.pin) ‘i farklı bir işlemci kullanacaksanız pull-up için jumper desteği sağlanmış ancak biz bu uygulamamızda kitteki sd kart üzerindeki jumper’ın cıkış şekilde olduğundan emin olunuz. SCLK -> P1.5 , DI ->P1.7 DO ->P1.6 ‘ya bağlanmış şekilde ve son iki pin direkt GND ye bağlanmıştır.,

2

Burada Dikkat etmemiz gerekn husus SD Kart’taki VCC’nin bağlanacağı noktadır. BCC U3 Kılıfında 1.pin olmaktadır. 21.Pin yanlış bağlantı şeklidir. Eğer +V_USB pinine bağlarsanız PCB üzerinde bu yol üzerinden enerji veremeyeceksiniz. Bunun sebebi bağlantı şekli yanlış yolda olmasıdır. GND olarak kullanacağım Pin direk belirtildiği gibi 20. Pin dir. Bir dişi- erkek kablo ile Arduino ya bağlantılarınızı yapmanız kolaylaştıracaktır.

Arduino tarafında yapmanız gerekenlere bakacak olursak Pin ayarlamalarımızı gösterelim.Bildiğiniz gibi data olarak 4 Pin 2 , enerji için 2 pin kullanılacaktır. Bu pinlerden enerji kısmı biraz sıkıntı yaşamanız için  VCC pinini Arduino üzerindeki 3.3V pinine bağlayınız.
ArduinoUno-sdkartbaglanti

Pin bağlantı şeklini bu şekilde yapmanız gerekmektedir. Aksi halde Arduino ‘nun bize sağladığı destekten yoksun kalabilirsiniz. Eğer pinleri farklı kullanmak zorunda iseniz kütüphaneyi iyi araştırıp bir konfigürasyon yapmanız mümkün olacaktır.
Ben bu sisteme elimdeki dijital sıcaklık sensörünüde bağlayamak istiyorum. Buradaki amacım sıcaklık bilgisini elde etmek şimdi şemamıza bakacak olursak :

ArduinoUno-sdkartbaglanti2

Devremizi tamamladığımıza göre şimdi kod bölümüne geçelim. Kod kısmında aslında basit bir yöntem bulunmaktadır. Öncelikle Timer için gerekli kütüphaneyi paylaşayım. Dökümanı android.cc üzerinden indirdim. Bazı arkadaşlar bulamamışlar.

Simple Timer kütüphanesi : Timer

Kütüphane içerisinden çağırmamız gereken fonksiyonlar üzerinde durmak istiyorum. setup() altında çağırmamız gerekebilen 3 fonksiyon bulunmaktadır. Bunlar  aşağıdaki gibidir.

  • SimpleTimer::setInterval(milisn, fonksiyon);
  • SimpleTimer::setTimeout(milisn, fonksiyon);
  • SimpleTimer::setTimer(milisn, fonksiyon, tekrarSayisi);
  1. Timer fonksiyonu her belirli mili saniyede belirlenen fonksiyona gitmeye sağlar.
  2. Timer fonksiyonu belirli mili saniye sonunda belirlenen fonksiyona gitmeye sağlar.
  3. Timer fonksiyonu belirlenen sayı kadar her belirli milisaniyede  belirlenen fonksiyona gitmeye sağlar.

Ben sistemimde her 20sn’de bir timer kurulmasını istiyorum. Bunun için mecburi şekilde 1.fonksiyonu kullanmak zorunda oluyoruz.Milisaniye kısmına 20000 yazacağız. Çünkü 20sn 20000 milisaniyedir. Fonksiyon kısmında ise istenilen değere gelindiğinde sıcaklık ölçümünü yapacağımız fonksiyonları eklememiz gerekmektedir. Sıcaklık işlemleri ile bilgileri daha önceki yazılarımda paylaştım araştırmanızı önereceğim.

SD Kart kısmına gelecek olursak burada yapmamız gereken işlemlerden bir tanesi 4. CS pinini dışarıdan tanımlamak olacaktır. Bunun sebebi pull-up değeri kütüphanenin içerisinde tanımlı olmasıdır.

İlk olarak ;

SD.open(“dosya adı”, Dosyaya yapılacak işlem);

şeklinde dosyaya okuma yazma işlemi yapacağımızı belirtiyoruz. Dosya işlemi olduğu için istediğiniz klasör altındanda okuyup yazabilirsiniz. Dosyaya yapılacak işlem kısmında iki adet fonksiyonumuz bulunuyor. Bunlar ;

FILE_WRITE ve FILE_READ bunlar önceden SD.h kütüphanesi içerisinde tanımlanmış tanımlamalardır. Sizler ihtiyacınıza göre işlem yapmalısınız. NOT : FILE_WRITE işlemi dosya oluşturma ve yazma işlemleri kapsamaktadır. FILE_READ sadece okuma işlemi yapma işlemlerini kapsamaktadır.Biz burada FILE_WRITE’ı seçeceğiz.Dosyanın orada olmadığı an oluşturulması kendiliğinden hazırlanmıştır.

Son olarak devre şemamızdan bir kaç fotoğraf bakacak olursak  :

IMG_20130203_013548

IMG_20130203_013627

KOD:

[codesyntax lang=”php”]

#include <SD.h>
#include <Wire.h>
#include <SimpleTimer.h>

SimpleTimer timer; 
File dosya;
int tmp102adres = 0x48; //tmp102 i2c ile yazılan adres
float temp102derece;

const int ESPinSecimi = 4; //ES pull-up için seçiliyor

void TimerInterrupt() {
  Serial.println("20sn Doldu....");   

  float tmp102Sicaklik = tmp102SicaklikOlcum(); 

  dosya = SD.open("LOG.txt", FILE_WRITE); // Dosya oluşturuluyor yok ise varsa gerekli ayarlamalar yapılıyor.
  if (SD.exists("LOG.txt")) { //Dosya yerindemi kontrol ediliyor.

    dosya.println(tmp102Sicaklik); //dosya'ya yazılıyor.
    dosya.close();

    Serial.print("TMP102 Sicaklik : "); //Seri monitörden görmemizi sağlıyoruz.
    Serial.println(tmp102Sicaklik);
  }
  else {
    Serial.println("Dosya acilamadi. Takili oldugunu kontrol ediniz..");
  }   
}
void setup()
{

  Serial.begin(9600);
   Wire.begin(); 
   timer.setInterval(20000, TimerInterrupt); // Interrupt'ı 20sn'ye ayarlıyoruz. TimerInterrupt'a bağlıy

 if (!SD.begin(ESPinSecimi)) {
    Serial.println("Kart hatasi. Bağlantinizi kontrol ediniz..");
 }
  Serial.println("Kart Algilandi...");
}

void loop()
{
   timer.run();
}

float tmp102SicaklikOlcum(){
  Wire.requestFrom(tmp102adres,2); // adresten 2bit veri alma. 

  byte ilkDeger = Wire.read(); // i2c ile ilk okunan değer
  byte sonDeger = Wire.read(); // i2c ile son okunan değer

  //okunan 12bit'lik verinin ilk olarak 8bit sağa kaydırılıp son değerle toplanıyor. Ardından
  //oluşan değer 4bit sağa kaydırılarak sonuç elde ediliyor.8 bit kaydırma negatif degerler içindir.
  int toplamOkunanDeger = ((ilkDeger << 8) | sonDeger) >> 4; 

  float derece = toplamOkunanDeger*0.0625; // referans değer ile çarpılıyor ve ana fonksiyona döndürülüyor.
  return derece;
}

[/codesyntax]
VİDEO :


Arkadaşlar böylece yazımın sonuna gelmiş bulunmaktayım. Sorularınız olursa yorum kısmından yada mail yoluyla ulaşırsanız yardımcı olmaya çalırım. Sizlere yardımcı olabildiysem ne mutlu bana iyi çalışmalar sağlıcakla kalınız…

______
Gökhan TARIM
tarim.gokhan@gmail.com