jueves, 5 de diciembre de 2019

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

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


https://robologs.net/2019/02/16/como-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…)
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#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.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#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.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#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á.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#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.

No hay comentarios:

Publicar un comentario