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.
Importante
Las tarjetas empleadas pueden ser: SD, SDSC, SDHC. Pero NO SDXC.
Deberá estar formateada en sistema de archivos FAT16 o FAT32.
La tensión de alimentación es de 3.3V, pero en la mayoría de los módulos poseen un regulador de voltaje que permite alimentarlos directamente con 5V.
A TENER EN CUENTA - La gran desventaja a la hora de utilizar estos adaptadores, es que requieren una carga importante de trabajo para Arduino.
Tanto en el uso de recursos, la librería ocupará el 40% de la memoria Flash, y casi el 50% de la memoria dinámica. Y también exige una carga importante para el procesador.
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:
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);
}