SD-Card-Modul TE417

SD-Card-Modul TE417
Abb.: SD-Card-Modul TE417

Das TE417-Modul unterstützt Micro SD-Karten, Micro SDHC-Karten (High Speed), Micro SD(<=2G) und Micro SDHC(<=32G). Die Stromversorgung ist bei 4,5V - 5,5V.

Anschlüsse

Pinout des TE417-Moduls
Abb.: Pinout des TE417-Moduls

Das TE417-Modul verfügt über eine SPI-Schnittstelle, die mit dem Arduino folgendermaßen verbunden werden muss:

Arduino TE417
5V VCC
GND GND
beliebiger, freier digitaler Pin CS (Chip Select)
13 SCK (Serial Clock)
11 MOSI (Master Out Slave In)
12 MISO (Master In Slave Out)

Für detailliertere Informationen über das SPI-Protokoll in Verbindung mit dem Arduino sind folgende Links interessant:
- Introduction to SPI: https://www.arduino.cc/en/Reference/SPI
- Serial Peripheral Interface (SPI): https://learn.sparkfun.com/tutorials/serial-peripheral-interface-spi

Verwendete Bauteile

Aufbau

Aufbau der Schaltung
Abb.: Aufbau der Schaltung

Ex.1: Test des TE417-Moduls

Eine beliebige SD-Karte wird in das Modul eingelegt (idealerweise mit einige vorhandenen Daten) und der erste Sketch "sd_card_test" wird auf dem Arduino ausgeführt. In der seriellen Konsole erscheint eine ähnliche Ausgabe wie folgt:

Ausgabe in der seriellen Konsole
Abb.: Ausgabe in der seriellen Konsole

Sketch

#define PIN_CS 10

#include <SPI.h>
#include <SD.h>

Sd2Card card;
SdVolume volume;
SdFile root;

void setup()
{
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect.
  }

  Serial.print("Initializing SD card on pin " + String(PIN_CS) + "...");
  if (!card.init(SPI_HALF_SPEED, PIN_CS)) {
    Serial.println("Initialization failed. Things to check:");
    Serial.println("- SD card inserted?");
    Serial.println("- Is your wiring correct?");
    Serial.println("- Did you change the chipSelect pin to match the module?");
    return;
  } else {
    Serial.println("Wiring is correct and a card is present.");
  }

  Serial.print("\nCard type: ");
  switch (card.type()) {
    case SD_CARD_TYPE_SD1:
      Serial.println("SD1");
      break;
    case SD_CARD_TYPE_SD2:
      Serial.println("SD2");
      break;
    case SD_CARD_TYPE_SDHC:
      Serial.println("SDHC");
      break;
    default:
      Serial.println("Unknown card type");
  }

  // Try to open the volume/partition - it should be FAT16 or FAT32
  if (!volume.init(card)) {
    Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
    return;
  }

  // Print type and size of the first FAT-type volume
  uint32_t volumesize;
  Serial.print("\nVolume type is FAT");
  Serial.println(volume.fatType(), DEC);
  Serial.println();

  volumesize = volume.blocksPerCluster();    // clusters are collections of blocks
  volumesize *= volume.clusterCount();       // we'll have a lot of clusters
  volumesize *= 512;                            // SD card blocks are always 512 bytes
  Serial.print("Volume size: ");
  Serial.print(volumesize);

  Serial.print(" = ");
  volumesize /= 1024;
  Serial.print(volumesize);
  Serial.print("kB");

  Serial.print(" = ");
  volumesize /= 1024;
  Serial.print(volumesize);
  Serial.println("MB");

  Serial.println("\nFiles found on the card (name, date and size in bytes): ");
  root.openRoot(volume);

  // list all files in the card with date and size
  root.ls(LS_R | LS_DATE | LS_SIZE);
}

void loop()
{
}

Ex.2: Lesen einer Datei von der SD-Karte

Zunächst muss die Datei "data.csv" auf die SD-Karte geladen werden, bevor diese in das TE417-Modul eingelegt wird. Nach dem Hochladen und Ausführen des Sketches erscheint in der seriellen Konsole folgende Ausgabe:

Ausgabe in der seriellen Konsole
Abb.: Ausgabe in der seriellen Konsole

Sketch

#define PIN_CS 10

#include <SPI.h>
#include <SD.h>

File myFile;
const char *SD_FILE = "data.csv";

void setup()
{
  Serial.begin(9600);
  Serial.flush();
  while (!Serial) {
    ; // wait for serial port to connect.
  }

  Serial.print("Initializing SD card on pin " + String(PIN_CS) + "...");
  if (!SD.begin(PIN_CS)) {
    Serial.println("failed!");
    return;
  }
  Serial.println("success.");
  Serial.println("Begin reading data from file...");


  char* dataLine = "";
  myFile = SD.open(SD_FILE, FILE_READ);
  if (myFile) {
    while(readLine(myFile, dataLine, 1024)) {
      Serial.println(dataLine);
      delay(50);
    }
    myFile.close();
  } else {
    Serial.println("File " + String(SD_FILE) + " not found!");
  }
}

void loop()
{
}

bool readLine(File &inputFile, char* line, size_t maxLen) {
  for (size_t n = 0; n < maxLen; n++) {
    int c = inputFile.read();
    if (c < 0 && n == 0) {
      return false;  // EOF
    }
    if (c < 0 || c == '\n') {
      line[n] = 0;
      return true;
    }
    line[n] = c;
  }
  return false;
}

Ex.3: Schreiben in eine Datei auf der SD-Karte

Im letzten Experiment wird nach dem Hochladen des Sketches zunächst eine neue Datei auf der Hauptebene der SD-Karte angelegt, in welche darauf einige Daten geschrieben werden. Anschließend wird die Datei wieder gelöscht.

Ausgabe in der seriellen Konsole
Abb.: Ausgabe in der seriellen Konsole

Sketch

#define PIN_CS 10

#include <SPI.h>
#include <SD.h>

File myFile;
const char *SD_FILE = "example.txt";

void setup()
{
  Serial.begin(9600);
  Serial.flush();
  while (!Serial) {
    ; // wait for serial port to connect.
  }

  Serial.print("Initializing SD card on pin " + String(PIN_CS) + "...");
  if (!SD.begin(PIN_CS)) {
    Serial.println("failed!");
    return;
  }
  Serial.println("success.");
  printFileExist();

  // open a new file and immediately close it:
  Serial.print("\nCreating/opening " + String(SD_FILE) + "...");
  myFile = SD.open(SD_FILE, FILE_WRITE);
  Serial.println("done.");
  Serial.print("\nWriting data to file...");
  if (myFile) {
    int pinValue;
    for (byte i=0; i<20; i++) {
      // get some random demo data from Pin1
      pinValue = analogRead(1);

      // write demo data to the file on the SD card
      myFile.println(String(millis()) + "," + String(pinValue));
      myFile.close();
    }
  }
  Serial.println("done.");
  printFileExist();

  Serial.print("\nDeleting file...");
  SD.remove(SD_FILE);
  Serial.println("done.");
  printFileExist();
}

void loop()
{
}

void printFileExist()
{
  if (SD.exists(SD_FILE)) {
    Serial.println(String(SD_FILE) + " exists.");
  } else {
    Serial.println(String(SD_FILE) + " does not exist.");
  }
}
zurück