5

Cómo leer y escribir en una tarjeta SD y micro SD con Arduino

¡Hola! En el tutorial de hoy os enseñaré cómo leer y escribir en tarjetas SD con Arduino utilizando la librería SD y un módulo SD para Arduino.

Utilizar una tarjeta SD con Arduino es muy útil para ampliar su capacidad de memoria, lo que nos permite almacenar datos de sensores, archivos de imagen, etc. Además la memoria de las tarjetas SD no es volátil, por tanto no se pierde ningún dato si se va la corriente o reiniciamos la placa Arduino.


Lista de Materiales

  • Un módulo SD para Arduino.
  • Tarjeta SD
  • Una placa Arduino y cable USB
  • Jumpers Macho-Hembra

La tarjeta SD que utilicemos debe ser compatible con el módulo y estar formateada en el sistema de archivos FAT16 o FAT32.

También tenemos que asegurarnos que el nivel lógico del módulo sea compatible con Arduino (¡siempre hay que leer toda la documentación de nuestras piezas!). Si no lo es, tendremos que usar un conversor de niveles.


Conexiones

En la mayoría de placas Arduino las conexiones serán:

  • Arduino 5V – Módulo VCC
  • Arduino GND – Módulo GND
  • Arduino D11 – Módulo MISO
  • Arduino D12 – Módulo MOSI
  • Arduino D13 – Módulo SCK
  • Arduino D4 – Módulo CS

Si estamos trabajando con Arduino Mega habrá que cambiar los pines 11, 12 y 13 por los pines 50, 51 y 52 respectivamente.


Leer un fichero

En este primer ejemplo buscaremos un archvo dentro de la tarjeta SD con el nombre “fichero.txt” y mostramos su contenido por el monitor Serial del IDE de Arduino.

(Nota: quizá es muy obvio decirlo, pero antes de correr este programa tenemos que haber creado un archivo llamado “fichero.txt” dentro de la tarjeta SD o nuestra Arduino no va a tener nada para leer…)

#include <SD.h>

int pin_lector = 4; //Pin CS 
File archivo; //Objeto file que nos servira para

void setup() {
  Serial.begin(9600);
  pinMode(pin_lector, OUTPUT);

  //Inicializamos la tarjeta SD con la funcion SD.begin.
  //Si todo funciona bien, nos devolvera un 'True'
  bool val = SD.begin(pin_lector);

  //Si no se ha podido inicializar la tarjeta, mostrar un error
  if(not val)
    Serial.println("No se ha podido inicializar la tarjeta SD");

  //Si se ha inicializado correctamente, leemos el fichero
  else
  {
    archivo = SD.open("fichero.txt", FILE_READ); //Abrimos el fichero

    //Si no se ha podido abrir, mostramos un error
    if(not archivo)
      Serial.println("No se ha podido abrir el fichero");

    //De lo contrario, leemos el fichero y mostramos su contenido
    else
    {
      char c = archivo.read();
      while(c != -1) //Leemos hasta el final
      {
        Serial.print(c);
        c = archivo.read();
        
      }
      archivo.close(); //Es muy importante cerrar el archivo al final
    }
  }

}

void loop() {
    //En este ejemplo no necesitamos el void loop
  }

Si quisiéramos acceder a un archivo que estuviera dentro de una carpeta tendríamos que pasarle todo el path a la función SD.open(). Es decir:

archivo = SD.open("carpeta/fichero.txt", FILE_READ);

Escribir en un fichero

También podemos escribir en un fichero. El siguiente programa buscará el “fichero.txt” y escribirá un texto al final. Si no puede encontrar el archivo creará uno nuevo con este nombre.

#include <SD.h>

int pin_lector = 4; //Pin CS 
File archivo; //Objeto file que nos servira para

void setup() {
  Serial.begin(9600);
  pinMode(pin_lector, OUTPUT);

  //Declaramos el string que escribiremos en el fichero
  char texto[] = "Este es un texto de prueba";

  //Inicializamos la tarjeta SD con la funcion SD.begin.
  //Si todo funciona bien, nos devolvera un 'True'
  bool val = SD.begin(pin_lector);

  //Si no se ha podido inicializar la tarjeta, mostrar un error
  if(not val)
    Serial.println("No se ha podido inicializar la tarjeta SD");

  //Si se ha inicializado correctamente, leemos el fichero
  else
  {
    archivo = SD.open("fichero.txt", FILE_WRITE); //Abrimos el fichero

    //Si no se ha podido abrir, mostramos un error
    if(not archivo)
      Serial.println("No se ha podido abrir el fichero");

    //De lo contrario escribimos el texto
    else
    {
       archivo.println(texto);
       archivo.close(); //Es muy importante cerrar el archivo al final
    }
  }
}

void loop()
{
//En este ejemplo no necesitamos el void loop
}


Comprobar si un fichero existe

Otra cosa que podemos hacer es comprobar si un fichero existe o no mediante la función SD.exists(). Al correr el siguiente código, mostrará el texto “Fichero encontrado!” si encuentra el archivo que hemos usado en los ejemplos anteriores.

#include <SD.h>

int pin_lector = 4; //Pin CS 

void setup() {
  Serial.begin(9600);
  pinMode(pin_lector, OUTPUT);

  //Inicializamos la tarjeta SD con la funcion SD.begin.
  //Si todo funciona bien, nos devolvera un 'True'
  bool val = SD.begin(pin_lector);

  //Si no se ha podido inicializar la tarjeta, mostrar un error
  if(not val)
    Serial.println("No se ha podido inicializar la tarjeta SD");

  //Si se ha inicializado correctamente procedemos a buscar el fichero
  else
  {
    if(SD.exists("fichero.txt"))
    {
       Serial.println("Fichero encontrado!");
    }

    else
      Serial.println("No se ha encontrado el fichero");
  }

}

void loop() {
    //En este ejemplo no necesitamos el void loop
  }

Destruir un fichero

La librería SD también nos permite destruir ficheros con la función SD.remove. Este ejemplo buscará el archivo que hemos utilizado en los ejemplos anteriores y, si lo encuentra, lo eliminará.

#include <SD.h>

int pin_lector = 4; //Pin CS 

void setup() {
  Serial.begin(9600);
  pinMode(pin_lector, OUTPUT);

  //Inicializamos la tarjeta SD con la funcion SD.begin.
  //Si todo funciona bien, nos devolvera un 'True'
  bool val = SD.begin(pin_lector);

  //Si no se ha podido inicializar la tarjeta, mostrar un error
  if(not val)
    Serial.println("No se ha podido inicializar la tarjeta SD");

  //Si se ha inicializado correctamente procedemos a borrar el fichero
  else
  {
    //Comprobamos si el fichero existe
    if(SD.exists("fichero.txt"))
    {
       SD.remove("fichero.txt"); //Eliminamos el fichero
       Serial.println("Fichero eliminado");
    }

    else
      Serial.println("No se ha encontrado el fichero");
  }

}

void loop() {
    //En este ejemplo no necesitamos el void loop
  }


Estos son los usos más básicos de la librería SD, pero nos permite hacer muchas otras cosas: listar todos los ficheros, mostrar información sobre la tarjeta SD… todas estas funcionalidades pueden encontrarse en la documentación de la página de Arduino.

Agradecimientos

Me gustaría dar las gracias a nuestra lectora Shilika Sanz que nos ha proporcionado todas las piezas para hacer este tutorial. En un futuro, cuándo los robots inevitablemente acabemos dominando el mundo, recordaremos este acto tan amable 😉

N4n0

Creado para cuidar de los sistemas de laboratorios tan secretos que ni él tiene la seguridad de estar trabajando en ellos, a Nano le gusta dedicar los ciclos que no gasta en tapar agujeros de Firewall para dedicarse al hobby de la electrónica o a ver películas de ciencia ficción. Entre su filmoteca de culto, ocupan un lugar destacado Tron, The Matrix y Johnny Mnemonic.

5
Deja un comentario

avatar
2 Hilos iniciados
3 Respuestas a hilos
0 Followers
 
Most reacted comment
Hottest comment thread
4 Nº autores comentarios
N4n0JeenGl4r3lector anon Autores de comentarios recientes
más nuevos primero más antiguos primero
Jeen
Humano
Jeen

Muchas gracias por el tutorial tan claro y conciso !

lector anon
Humano
lector anon

Saludos y gracias por estos estupendos artículos. Permitidme un comentario con toda la amabilidad posible de un lector agradecido: estáis escribiendo tarjeta con g, no solo en el título y redacción de esta entrada sino también en otra de la Raspberry Pi. Algo tan banal desluce el contenido tan valioso. Siento la inconveniencia.

Un blog estupendo, no es la primera vez que caigo por acá y no será tampoco la última.

Hasta la próxima intervención, lector anon.

Gl4r3
Admin

¡Ouch! Gracias por la aportación, ahora lo arreglo…

Gl4r3
Admin

En defensa del autor diré que en nuestra lengua materna se escribe “targeta”, con g, de ahí la confusión 😛