Luis LLamas - Leer SD

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 6

https://www.luisllamas.

es/tarjeta-micro-sd-arduino/

LEER Y ESCRIBIR EN UNA TARJETA SD O MICRO SD CON ARDUINO

16 OCTUBRE, 2016
     

¿QUÉ ES UN LECTOR SD O MICRO SD?


Un lector SD es un dispositivo que permite emplear como almacenamiento una tarjeta SD, que podemos
incorporar en nuestros proyectos de electrónica y Arduino.
Las tarjetas SD y micro SD se han convertido en un estándar, desplazando a otros medios de
almacenamiento de datos debido a su gran capacidad y pequeño tamaño. Por este motivo han sido integradas
en una gran cantidad de dispositivos, siendo en la actualidad componentes frecuentes en ordenadores, tablets
y smartphones, entre otros.
Dentro del mundo de Arduino, es posible encontrar lectores de bajo coste tanto para tarjetas SD como
micro SD. Los primeros en aparecer fueron los lectores SD y posteriormente los micro SD. Por tanto, en
general, los módulos con micro SD son modelos más modernos que los de SD
En ambos tipos de lectores, la lectura puede realizarse a través de bus SPI. Aunque pueden disponer de
otros interfaces, como bus I2C o UART, normalmente es preferible emplear SPI por su alta tasa de
transferencia.
Anuncio:
Respecto a las tarjetas empleadas, podemos emplear tarjetas SD o SDSC (Standard Capacity) o SDHC
(High Capacity), pero no SDXC (Extended Capacity). 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 se incorpora la electrónica
necesaria para conectarlo de forma sencilla a Arduino, lo que frecuentemente incluye un regulador de voltaje
que permite alimentar directamente a 5V.
Emplear una tarjeta SD o micro SD en con Arduino tiene la ventaja de proporcionar una memoria casi
ilimitada para nuestros proyectos. Además es no volátil (es decir, resiste cuando se elimina la alimentación), y
puede ser extraída y conectada a un ordenador con facilidad.
La gran desventaja es que supone una importante carga de trabajo para Arduino. Sólo el programa
ocupará el 40% de la memoria Flash, y casi el 50% de la memoria dinámica. El uso del procesador también es
exigente.
En general, manejar una tarjeta micro SD o SD puede considerarse en al límite de la capacidad de
Arduino como procesador. Aunque es posible emplearlas en proyectos sencillos, en proyectos reales
deberíamos plantearnos emplear otra opción como un Raspberry Pi.
En los proyectos caseros se emplean tarjetas SD y micro SD, principalmente, en proyectos de tipo
datalogger, es decir, para mantener el registro de las mediciones de un sensor. También pueden ser
empleadas, por ejemplo, para llevar movimientos o rutas de robots precalculados, y cargarlos bajo dejo
demanda.
PRECIO
Los lectores de tarjetas son dispositivos muy baratos. Podemos encontrar lectores de tarjetas micro SD
por unos 0.35€, y lectores de tarjetas SD por unos 0.65€, buscando en vendedores internacionales de eBay o
AliExpress.

Dado que los lectores de tarjetas micro SD son más baratos, modernos, y compactos, normalmente
preferiremos los lectores micro SD a los SD. El único motivo real para comprar un lector SD frente a un micro
SD es aprovechar alguna tarjeta que tengamos disponible.

Respecto a la tarjeta, es sabido que han tenido un gran descenso en sus precios. En la actualidad, una
tarjeta SD o micro SD de 1GB tiene un precio muy reducido, y es capacidad más que suficiente para la
mayoría de proyectos. Incluso es frecuente que podamos reciclar antiguas tarjetas que hemos sustituido por
otras de mayor capacidad.

ESQUEMA DE MONTAJE
La conexión es sencilla y similar tanto para lectores SD como Micro SD. Simplemente alimentamos el
módulo desde Arduino mediante 5V y Gnd. Por otro lado, conectamos los pines del bus SPI a los
correspondientes de Arduino.
La conexión del lector SD sería la siguiente,
Similar a la de un lector micro SD, que sería la siguiente.

En ambos casos la conexión, vista desde el lado de Arduino, es la misma, y quedaría así.

Los pines SPI indicados son válidos para los modelos de Arduino Uno, Nano y Mini Pro. Para otros modelos
de Arduino consultar el esquema patillaje correspondiente.
Verificar que vuestra placa es tolerante a un bus de 5V antes de conectarla a Arduino. Si no, tendréis que
usar un adaptador de nivel lógico.
EJEMPLO DE CÓDIGO
Para realizar la lectura y escritura en la SD emplearíamos la librería SD.h, incluida en el IDE estándar de
Arduino.
Esta librería incorpora funciones para el manejo de ficheros y directorios, bajo el objeto SD.
1 // Iniciar la SD
SD.begin(cspin);
2
 
3
// Comprobar si existe un fichero (devuelve true si existe, falso en caso contrario)
4
SD.exists(filename);
5
 
6
// Borrar un fichero
7
SD.remove(filename);
8
 
9
// Abrir un fichero
10
// Mode: FILE_READ para sólo lectura
11
//        FILE_WRITE para lectura y escritura
12
SD.open(filepath, mode);
13
 
14
// Crear un directorio
15
SD.mkdir(directory);
16
 
17
// Eliminar un directorio
18
SD.rmdir(dirname);
19
También incorpora funciones para la lectura y escritura de ficheros, bajo el objeto File.

// Obtener el tamaño de un fichero


1
file.size()
2
 
3
// Comprobar si quedan bytes por leer
4
file.available()
5
 
6
// Leer un byte del fichero
7
file.read()
8
 
9
// Escribir un byte en el fichero
10
file.write(data)
11
 
12
// Escribir una variable en un fichero (en forma similar a Serial.Print)
13
file.print(data)
14
 
15
// Obtener el punto de lectura/escritura actual
16
file.position()
17
 
18
// Mover el punto de lectura/escritura actual
19
// Pos: Debe estar entre 0 y file.size()
20
file.seek(pos)
21
 
22
// Cerrar el fichero
23
file.close()
24
La librería proporciona ejemplos de código, que resulta aconsejable revisar. Los siguientes ejemplos son
modificaciones a partir de los disponibles en la librería.
LECTURA DE UN FICHERO
En este ejemplo realizamos la lectura de un fichero y mostramos el contenido por puerto Serial. El fichero
leído "dataFile.txt" debe existir previamente en la tarjeta.
En un problema real el fichero podría contener, por ejemplo, los ángulos que deben adoptar los servos de
un robot para adoptar distintas posiciones, separados por comas.
En la lectura de cada línea se procesaría la información leída, y se emplearía para realizar las acciones
oportunas.
#include <SD.h>
1  
2 File dataFile;
3  
4 void setup()
5 {
6   Serial.begin(9600);
7   Serial.print(F("Iniciando SD ..."));
8   if (!SD.begin(9))
9   {
10     Serial.println(F("Error al iniciar"));
11     return;
12   }
13   Serial.println(F("Iniciado correctamente"));
14
15   // Abrir fichero y mostrar el resultado
16   dataFile = SD.open("datalog.txt");
17   if (dataLine)
18   {
19    string dataLine;
20     while (dataFile.available())
21    {
22       dataLine = dataFile.read();
23        Serial.write(dataLine);  // En un caso real se realizarían las acciones oportunas
24     }
25     dataFile.close();
26   }
27   else
28   {
29     Serial.println(F("Error al abrir el archivo"));
30   }
31 }
32  
33 void loop()
34 {
35 }
36

ESCRITURA DE UN FICHERO (DATALOGGER)


El siguiente ejemplo muestra las funciones de escritura. El ejemplo simula la función de un datalogger, un
proyecto muy habitual que registra periódicamente la lectura de un evento.
En este caso, empleamos una función readSensor que simula el proceso de lectura 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.
Cada medición guarda el tiempo de toma de datos, y el valor simulado de la lectura del sensor.

1 #include <SD.h>
2  
3 File logFile;
4  
5 void setup()
6 {
7   Serial.begin(9600);
8   Serial.print(F("Iniciando SD ..."));
9   if (!SD.begin(9))
10   {
    Serial.println(F("Error al iniciar"));
11     return;
12   }
13   Serial.println(F("Iniciado correctamente"));
14 }
15  
16  
17 // Funcion que simula la lectura de un sensor
18 int readSensor()
19 {
20    return 0;
21 }
22  
23 void loop()
24 {
25   // Abrir archivo y escribir valor
26   logFile = SD.open("datalog.txt", FILE_WRITE);
27   
28   if (logFile) {
29         int value = readSensor;
30         logFile.print("Time(ms)=");
31         logFile.print(millis());
32         logFile.print(", value=");
33         logFile.println(value);
34         
35         logFile.close();
36   
37   }
38   else {
39     Serial.println("Error al abrir el archivo");
40   }
41   delay(500);
42 }
43

Si t

También podría gustarte