DIY: Wetterstation - Teil 3: SD-Karten Modul

Posted by Tobias on 2013-12-03 at 9:27 pm

Das hier ist der dritte Teil meines Projektes rund um die Do-It-Yourself Wetterstation. In der Projekteinführung habe ich bereits ausführlich über das Projekt erzählt und im vorherigen Teil Zwei die Funktion des Real-Time-Clock Modus genauer beschrieben. In diesem drittem Teil möchte ich genauer auf das SD-Karten Modul eingehen - sprich, wie kann mit einer SD-Karte kommuniziert werden und Dateien gelesen bzw. geschrieben werden.

Wie auch schon das Real-Time-Clock Modul habe ich auch den SD-Kartenleser bzw. Modul aus China via Ebay. Natürlich erwarte ich dementsprechend kein hochqualitativ verarbeitetes Produkt, aber für meinen Einsatzzweck genügt es und für umgerechnet rund 1,34 Euro für zwei Module kann ich mich auch wirklich nicht beklagen.

Für mein Projekt benötige ich ein SD-Modul um Daten auf einer SD-Karte für eine Langzeitauswertung zu speichern. Dabei soll bei jeder Messung der aktuelle Zeitstempel und die Temperatur bzw. die Luftfeuchtigkeit (draußen und drinnen) ein Datensatz auf SD-Karte in eine Datei geschrieben werden. Bei Interesse kann ich dann die SD-Karte aus dem Modul nehmen und am Mac/PC entsprechende Auswertungen anfertigen. Man könnte diese Funktion durchaus auch als Datalogger bezeichnen.

Der Zugriff auf das SD-Modul und letztendlich auf die SD-Karte erfolgt mit der SD-Library. Diese Library kommt bei der Arduino Standardinstallation bereits mit auf die Festplatte und steht sowohl im Library als auch im Beispiel-Menü zur Verfügung. Doch sehen wir uns zunächst einmal an, wie das Modul selbst an den Arduino angeschlossen wird.

Es gibt verschiedene SD-Module. Ich habe eines, welches sich wie ein Ethernet-Shield mit kombiniertem SD-Kartenleser ansprechen lässt. Der Anschluss erfolgt am SPI-Interface des Aduino. Dazu müssen die folgenden Pins mit dem Arduino verbunden werden:

SD-Modul Pin SD-Modul Pin Beschreibung Arduino Pin Arduino Pin Beschreibung
GND Ground / Erdung GND Ground / Spannung
5V 5V Spannung 5V 5V Spannung
SDCS Chip-Select Pin PIN 4 abhängig vom eingesetzten Modultyp
MOSI Master Out Slave In PIN 11 Digital PIN 11
SCK Serial Clock PIN 12 Digital PIN 12
MISO Master In Slave Out PIN 13 Digital PIN 13

Wie in der Tabelle oben bereits erwähnt, kann es beim Anschluss gewisse Unterschiede je nach eingesetztem SD-Modul kommen. Da sich meines wie ein Ethernet-Shield mit integriertem SD-Modul verhält, schließe ich den SDCS (Chip-Select) Pin an Pin 4 auf dem Arduino an. Diesen Pin müssen wir später im Sketch (Programmcode), welchen wir auf den Arduino hochladen, entsprechend konfigurieren.

 

Nachdem der Hardwareaufbau soweit steht, können wir uns ein paar Gedanken zur SD-Karte machen. Zu beachten ist, dass die eingesetzte SD-Karte gewisse Voraussetzungen erfüllen muss, damit sie vom Arduino angesprochen werden kann. Von der Arduino SD-Library werden grundsätzlich SD und auch die neueren SDHC Karten unterstützt. Auf der Karte muss sich dabei eine FAT16 oder FAT32 Partition befinden. NTFS oder exFAT-Formatierungen werden nicht unterstützt. Die SD-Library nutzt die 8.3 Schreibweise für Dateinamen. Die schon etwas älteren unter euch werden die Schreibweise sicherlich noch aus den MS-DOS Zeiten kennen. Für den Dateinamen gibt es maximal 8 Zeichen, es folgt ein Punkt und drauf eine dreistellige Dateiendung. Sollte der Name länger als 8 Zeichen sein, so werden die ersten 6 Zeichen mit angehängtem ~1 als Dateinamen verwendet (wobei die 1 bei Namensgleichheit hochgezählt wird).

Die erste praktische Übung besteht darin die eingesteckte SD-Karte zu erkennen und Informationen zur Karte und deren Inhalt (eine Verzeichnisstruktur) auszugeben. Hierzu gibt es ein Beispielprogramm in der Arduino SD-Library. In der Arduino Software kann das Beispiel über das Menü Datei -> Beispiele -> SD -> CardInfo geöffnet werden. Bevor das Beispiel auf den Arduino hochgeladen werden kann, muss ggf. noch die "ChipSelect" Variable angepasst werden (je nach eingesetztem SD-Modultyp). Hierzu im oberen Bereich des Beispielprogramms die folgende Zeile suchen und je nach eingesetztem SD-Modul ggf. abändern und einen anderen Chip wählen:

const int chipSelect = 4;

Wenn der passende Chip-PIN eingetragen wurde kann das Programm auf den Arduino hochgeladen werden. Jetzt muss noch eine passende SD-Karte in das SD-Modul gesteckt werden. Wie bereits erwähnt muss es sich dabei um eine SD-Karte mit FAT16 bzw. FAT32 Partition handeln. Wird nach dem Upload der Serial-Monitor gestartet, erscheinen einige Informationen zur eingelegten SD-Karte und die Verzeichnisstruktur. Falls die Initialisierung der SD-Karte fehlschlägt ist das SD-Modul entweder falsch angeschlossen, der falsche Modultyp (ChipSelect) ist gewählt oder die eingelegte SD-Karte ist inkompatibel bzw. falsch formatiert.

Sollte der erste Test um Informationen zur eingelegten SD-Karte erfolgreich verlaufen sein, können wir einen Schritt weiter gehen und versuchen Daten auf die SD-Karte zu schreiben und wieder zu lesen. Dafür gibt es ebenso ein Beispiel in der Arduino SD-Library. Dieses Mal im Menü unter Datei -> Beispiele -> SD -> ReadWrite. Dieses Beispiel erzeugt auf der eingelegten SD-Karte zunächst eine Datei mit dem Namen "test.txt", schreibt eine Zeile Text in diese Datei, liest die Datei im Anschluss ein und gibt den Inhalt der Datei im Serial-Monitor wieder aus. In diesem Beispiel gibt es leider keine einfach zu findende Variable für den ChipSelect. Daher muss nach der folgenden Zeile im Quellcode Ausschau gehalten und die Ziffer in der Klammer entsprechend dem ChipSelect abgeändert werden:

// Arduino Ethernet shield: pin 4
// Adafruit SD shields and modules: pin 10
// Sparkfun SD shield: pin 8

if (!SD.begin(4)) {

Jetzt kann das Programm auf den Arduino hochgeladen werden und der Ablauf des Programms über den Serial Monitor verfolgt werden.

Nach ersten Tests erweist sich das "Billig-China" Modul allerdings etwas zickig, wenn es darum geht welche SD-Karten vom Modul erkannt werden. Von bisher drei getesteten SD-Karten wird lediglich die teure "Extreme III 2GB" von SanDisk erkannt. SDHC Karten habe ich bisher noch gar nicht getestet - wird allerdings für meinen Einsatzzweck auch nicht nötig sein, da keine extrem großen Datenmengen entstehen sollten.

Weiter geht es in Kürze mit dem Temperatur- und Luftfeuchtigkeitssensor DHT11.

Electronics
Comment on This Post