Interaction Design WikiPhysical Computing

SD Karten

SD Karten

Eine SD Karte ist ein sogenannter Flash Speicher, welcher es erlaubt, Daten “nichtflüchtig” auf kleinstem Raum zu speichern. Nichtflüchtig bedeutet, dass der Inhalt des Speichers auch ohne Spannungsversorgung nicht verloren geht. Der Name SD leitet sich nicht vom Entwickler des Speichers (SanDisk) sondern von “Secure Digital” ab. Die Entwicklung dieser Art der Speicherung war zunächst eng an die Entwicklung der Digital Kamera geknüpft, wo es nötig wurde sehr viele Informationen auf kleinstem Raum dauerhaft zu speichern. Zuvor war der Flash Speicher schon bei Embedded Systemen oder für die Speicherung von Firmwares oder des BIOS zum Einsatz gekommen. Zunehmend wird Flash Speicher auch in Form von Solid State Drives (SSD) in Notebooks verbaut. Die Vorteile gegenüber der klassischen Fetplattentechnik liegen in der mechanischen Robustheit, des schnellen Zugriffes, sowie der geringen Stromaufnahme.

SD_Cards_02

Bauformen

Die obige Darstellung zeigt von Links nach Rechts die drei möglichen Formen einer SD Karte: SD Card, miniSD und microSD. Die ersten SD Karten wurden mit einer Kapazität von 8MB geliefert. Weitere Grössen leiten sich von dieser Kapazität ab (2GB,4GB,8GB,…). Früher waren Zugriffsgeschwindigkeiten von um die 4MB/s möglich. Heute erreichen die Karten Schreibgeschwindigkeiten von bis zu 80MB/s.

SD_Card_Anschluss_01

Anschlüsse

Der Zugriff auf die Karte erfolgt via SPI Interface (Wikipedia Link). Damit ist es möglich, die SD Karte direkt von Arduino aus zu beschreiben und auch auszulesen. Wichtig ist, dass das SPI Interface dabei mit 3.3V und nicht direkt mit 5V betrieben wird, ansonsten kann die Karte beschädigt werden.
Um die SD Karte mit dem Arduino zu betreiben müssen wir also das 5V Signal auf ein 3.3V Signal konvertieren. Dazu verwenden wir den oben abgebildeten Level-Shifter 74HC4050 (Datenblatt). Aus dem Datenblatt entnehmen wir die Pinbelegung und können nun eine Anordnung auf dem Breadboard aufbauen.

Das Schema dazu sieht folgendermassen aus:

SD_Karte_Schema

SD Library

Für das Schreiben und Lesen der SD Karte mit dem Arduino existiert eine Library, welche zum Standard-Download von Arduino gehört. Die Library heisst SD (Link zur Referenz). Um die Library in ein Programm einzubinden wird zu Beginn die Library hinzugefügt.

#include <SD.h>

Im setup() verwenden wir die Funktion SD.begin() um zu überprüfen ob eine SD Karte vorhanden ist.

if (!SD.begin(chipSelect))
{
   Serial.println(&quot; Card failed, or not present & quot;);
   return;
}

Ist die Karte richtig angeschlossen, sollte diese Routine erfolgreich verlaufen. Danach können wir im loop() auf die SD Karte schreiben oder sie auslesen.

Dateien Schreiben

Für das Schreiben von Daten auf die SD Karte müssen diese im String Format vorliegen. Dazu können wir beliebige Werte (z.B. von einem analogen Sensor) in Strings konvertieren. Dies geschieht mit der Funktion String()

String dataString = ""; //Leeren String erstellen
int sensorValue = analogRead(0); //Sensor einlesen
dataString += String(sensorValue); //Sensorwert anfügen

Um diesen so generierten String auf der Karte zu speichern, rufen wir zunächst eine Datei auf, schreiben den String in diese Datei und schliessen die Datei anschliessend wieder. Der Dateiname darf dabei nur 8 Buchstaben lang sein (exklusive Extension). Existiert die aufgerufene Datei nicht, so wird sie neu erstellt. Existiert sie bereit, so wird ans Ende der Datei geschrieben.

File dataFile = SD.open("datalog.txt", FILE_WRITE);

if (dataFile)
{
   dataFile.println(dataString);
   dataFile.close();
   Serial.println(dataString);
}

Hier ein Beispiel zum speichern eines Sensorwertes mit einem timestamp:

Beispiel Datei schreiben Expand source
#include <SD.h>
#define chipSelect 10

void setup()
{
  Serial.begin(9600);
  Serial.print("Initializing SD card…");
  pinMode(10, OUTPUT);
  if (!SD.begin(chipSelect))
  {
    Serial.println("Card failed, or not present");
    return;
  }
  Serial.println("card initialized.");
}

void loop()
{
  String dataString = "";
  int currentTime = millis() / 1000;
  dataString += String(currentTime);
  dataString += ",";
  int sensorValue = analogRead(0);
  dataString += String(sensorValue);
  File dataFile = SD.open("datalog.txt", FILE_WRITE);
  if (dataFile)
  {
    dataFile.println(dataString);
    dataFile.close();
    Serial.println(dataString);
  }
  else
  {
    Serial.println("error opening datalog.txt");
  }
}

Dateien Lesen

Um Dateien wieder von der SD Karte auszulesen, benutzen wir die Funktion myFile.read(). Die anderen Funktionen bleiben die gleichen, wie beim Schreiben der Karte.

Beispiel Datei lesen Expand source
#include <SD.h>
#define chipSelect 10

void setup()
{
  Serial.begin(9600);
  Serial.print("Initializing SD card…");
  pinMode(10, OUTPUT);
  if (!SD.begin(chipSelect))
  {
    Serial.println("Card failed, or not present");
    return;
  }
  Serial.println("card initialized.");
}

void loop()
{
  File myFile = SD.open(&quot; datalow.txt & quot; , FILE_READ);
  if (myFile)
  {
    Serial.println(&quot; datalog.txt: &quot;);
    while (myFile.available())
    {
      Serial.write(myFile.read());
    }
    myFile.close();
  }
}

Da immer nur eine Datei geöffnet werden kann, ist es wichtig nach jedem Zugriff die Funktion myFile.close() aufzufrufen.

Weitere Informationen

SD Library Referenz auf arduino.cc
Datenlogger-Tutorial auf arduino.cc