Introducción

Esta guía muestra cómo usar un adaptador de tarjeta SD para proyectos de Arduino que requieren mucha capacidad de almacenamiento.

Algunos proyectos pueden recopilar una gran cantidad de datos, como la lecturas de datos de sensores leídos periodicamente, los que se desea almacenar permanentemente.

Este artículo le mostrará cómo conectar y usar un módulo de tarjeta SD genérico con un Arduino.

¿Qué es un lector de tarjetas SD?

Un lector SD es un dispositivo que permite emplear como almacenamiento una tarjeta SD, que podemos incorporar en nuestros proyectos con Arduino.

Existe varios protolos en el Arduino se comunica via el bus SPI, I2C o UART. Es preferible emplear SPI por su alta tasa de transferencia.

Esquema de conexiones

La conexión es sencilla y similar tanto para lectores SD como Micro SD.
Alimentacion: conectamos el modulo a 5V y Gnd.
Datos: conectamos los pines del bus SPI a los correspondientes de Arduino.

La conexión del modulo SD es la siguiente:

modulo micro sd - conexiones modulo sd - conexiones

Código de ejemplo

Para realizar la lectura y escritura en la tarjeta SD empleamos la librería SD.h (incluida en el IDE estándar de Arduino).

      
// Iniciar la tarjeta SD
SD.begin(cspin);

// Comprobar si existe un archivo x
// (devuelve true o false)
SD.exists(filename);

// Borrar un archivo
SD.remove(filename);

// Abrir un archivo
// mode: FILE_READ para sólo lectura
//       FILE_WRITE para lectura y escritura
SD.open(filepath, mode);

// Crear un directorio
SD.mkdir(directory);

// Eliminar un directorio
SD.rmdir(dirname);
      
    

Funciones del objeto file

      
// Obtener el tamaño de un archivo
file.size()
 
// Comprobar si quedan bytes por leer
file.available()
 
// Leer un byte del archivo
file.read()
 
// Escribir un byte en el archivo
file.write(data)
 
// Escribir una variable en un archivo 
//(en forma similar a Serial.Print)
file.print(data)

// Cerrar el archivo
file.close()
      
    

Lectura de Archivos

OBJETIVO Realizar la lectura de un archivo de texto e imprimir el contenido al puerto Serial
REQUISITOS Crear un archivo de texto "dataFile.txt", con datos diferente por cada linea, guardarlo en la raiz la tarjeta SD.

Contenido del archivo "dataFile.txt"

      
Lorem ipsum dolor sit amet.
Lorem ipsum dolor sit amet.
Lorem ipsum dolor sit amet.
Lorem ipsum dolor sit amet.
Lorem ipsum dolor sit amet.
Lorem ipsum dolor sit amet.
Lorem ipsum dolor sit amet.
Lorem ipsum dolor sit amet.
Lorem ipsum dolor sit amet.
      
    
      
#include <SD.h>

File dataFile;

void setup(){
  Serial.begin(9600);
  Serial.print(F("Iniciando SD ..."));
  if (!SD.begin(9)){
    Serial.println(F("Error al iniciar"));
    return;
  }
  Serial.println(F("Iniciado correctamente"));

  // Abrir fichero y mostrar el resultado
  dataFile = SD.open("datalog.txt"); 
  if (dataLine){
    string dataLine;
    while (dataFile.available()){
      dataLine = dataFile.read(); 
      Serial.write(dataLine);  
      // Se muestra el contenido en el puerto serial
    }
    dataFile.close();
  }else{
    Serial.println(F("Error al abrir el archivo"));
  }
}

void loop(){
}
      
    

Escritura de Archivos

OBJETIVO Registrar periódicamente la lectura de un evento
REQUISITOS

Para simular la lectura de un sensor realizamos una función readSensor que emula la captura de datos de un sensor.
En el ejemplo simplemente devuelve siempre 0 pero, en un caso real, esta función se sustituiría por una función que realice la lectura de un sensor o una entrada analógica.

      
#include <SD.h>

File logFile;

void setup(){
  Serial.begin(9600);
  Serial.print(F("Iniciando SD ..."));
  if (!SD.begin(9))
  {
    Serial.println(F("Error al iniciar"));
    return;
  }
  Serial.println(F("Iniciado correctamente"));
}

// Funcion que simula la lectura de un sensor
int readSensor(){
  return random(300);
}

void loop(){
  // Abrir archivo y escribir valor
  logFile = SD.open("datalog.txt", FILE_WRITE);

  if (logFile) { 
    int value = readSensor;
    logFile.print("Time(ms)=");
    logFile.print(millis());
    logFile.print(", value=");
    logFile.println(value);
    logFile.close();
  } 
  else {
    Serial.println("Error al abrir el archivo");
  }
  delay(500);
}