bclose

Shield Ethernet y SD card

Usando la tarjeta SD del Shield Ethernet

Objetivos

 

 
    • Presentar la SD disponible en el Shield Ethernet.
    • Mostrar como leer y escribir en la tarjeta SD.
    • Ver algunos ejemplos sencillos de uso.

 

 

Material requerido.

 

  Tienda España Tienda Mexico
Imagen de Arduino UNO  Arduino Uno o similar. Arduino UNO R3
Vista principal Un Ethernet shield R3 Un Ethernet shield R3

 

Las SD Card

 

En los últimos años, las tarjetas SD y microSD se han popularizado mucho, debido al auge de la fotografía digital y la telefonía móvil. No es fácil encontrar un teléfono móvil o Tablet, a quien no se le pueda ampliar la memoria con una de estas tarjetas, con la excepción claro está, de Apple, que como es habitual va por libre.

micro SD card
micro SD a SD completa

Basadas en la tecnología de memoria FLASH, permiten escribir con buena velocidad (Relativamente ) y además no pierden el contenido cuando las desconectamos, lo que las ha convertido en una solución de primera para intercambiar información.

Desde cámaras de fotos, Teléfonos digitales y Memorias USBs, la tecnología FLASH ha tenido un éxito rotundo y una aceptación masiva, lo que ha llevado los precios a la baja y prácticamente han acabado con CDs DVDs y demás formatos ópticos para la transferencia de información.

Hoy día no es raro comprar memorias USB de 8, 16 o 32 Gb por el precio de una entrada de cine. Y como nuestro Shield Ethernet lleva un lector grabador de tarjetas micro SD, no podíamos dejar pasar la ocasión sin ver cómo usarlas.

Detalle SD card

Aunque ya hemos comentado que los Arduinos, incluyen una memoria EEPROM interna que podemos usar como mini disco duro, no se puede comparar con la posibilidad de disponer de una tarjeta SD intercambiable, especialmente en lo que a capacidad se refiere.

Por eso, en muchos proyectos, es muy interesante de disponer de uno de estos pequeños grabadores, que nos permitan ir registrando los datos que vamos leyendo de sensores, normalmente en combinación un Reloj de tiempo real RTC, y a los que posteriormente podemos acceder y procesador en nuestros PCs mucho más cómodamente.

 

Características básicas de las SD Card

 

Lo primero que os interesa saber es que Arduino puede leer y escribir SD Cards con ciertas limitaciones, debido a la librería actualmente en uso. Como siempre estas limitaciones o especificaciones pueden cambiar en el futuro, pero es importante que las tengáis en cuenta.

La primera es que Arduino puede leer y escribir en estas tarjetas, pero no formatearlas. Esto debe hacerse desde vuestros PCs. No es grave, pero es así.

Lo segundo es que vuestros PCs pueden manejar varios formatos de sistema de archivos, pero la librería SD por ahora solo soporta FAT16 y FAT32.

Ambos formatos son una herencia de los viejos tiempos y de algún modo determinan el máximo tamaño de disco (O de tarjeta) que puedes usar. En principio si usas FAT32 deberías poder usar hasta una tarjeta de 32Gb.

Así que si queréis que el Shield Ethernet lea vuestra tarjeta, nada de formatearla en NTFS de Windows, HPFS de Apple o extN de Linux. Solo FAT16 y FAT32.

Después tenemos otra limitación con los nombres e archivos que quedan limitados al viejo formato 8.3, con nombre de 8 caracteres y extensiones de tres. Y nada de acentos en los nombres ni Ñs ni espacios en blanco. Nada que no sean letras y números, sin signos raros.

Si usas Windows en cualquier versión, puedes introducir la tarjeta SD y formatearla desde el administrador de archivos. Introduce la tarjeta en el lector y cuando la reconozca, apuntala y pulsa el botón derecho. Elige la opción formatear y veras una ventana como esta:

Formatear una tarjeta SD
Opciones de formateo para SD
En el sistema de archivos puedes elegir FAT32, y mantén el tick en la opción formato rápido. Con inicio te formateará la tarjeta.

En OSX ve a Aplicaciones, Utilidades, Discos. Elije la tarjeta SD y selecciona el formato de disco MS-DOS FAT

Como formatear una tarjeta SD

 

Existe un programa que suelen recomendar si tenéis cualquier problema, que tiene versiones para Mac y Windows llamado SD Formatter  que podéis descargar gratuitamente de internet. Está desarrollado y soporte por la asociación de fabricantes de tarjetas SD.

Por ultimo tenéis que saber que la librería puede no escribir inmediatamente los datos que le envías a la SD, y para asegurarse de que es así, debes hacer una llamada a flush (Vaciar) o close (Guardar y cerrar).

 

Comprobando la SD Card

 

Necesitáis saber que el Shield Ethernet y la librería, controlan el acceso a Ethernet y a la SD Card por SPI. Vimos que era así en el caso Ethernet y recordad que no podíamos usar unos pines en el Arduino, los que corresponden a la gestión el bus SPI.

Usamos el pin 10, Slave Select habitualmente en un UNO para seleccionar el acceso a Ethernet (El 53 en un MEGA), y necesitamos otro pin para indicar que vamos a hablar con la tarjeta SD. En el caso de un Arduino UNO el Shield Ethernet utiliza el pin 4 y por también lo reservamos en las sesiones anteriores.

Vamos a comprobar que la SD esta correcta y que podemos usarla. Aseguraros de que esta formateada y ponerle uso pocos ficheros en ella (con nombre 8.3) introducidla en el lector del Shield y enciende Arduino.

Como la librería SD viene de serie con nuestro Arduino, podemos cargar uno de los ejemplos para comprobar que lee la tarjeta:  \\Achivo\Ejemplos\SD\CardInfo

Salida ARduino

 

Si todo va bien cuando lo corráis tendréis una salida parecida a esto:

Os informa de que ha podido  identificar la SD, y os da información del tipo de formato, tamaño de la tarjeta y hasta hace un listado de los ficheros que contiene junto con algunas características.

Si veis algo así, perfecto podemos seguir. SI recibís algún mensaje de error, necesitamos que lo corrijáis antes de seguir.

Los problemas más típicos suelen ser

 
  • No tener bien encajado el Shield en el Arduino
  • Por defecto trae el pin 10 como output pero si usáis un Mega tenéis que cambiarlo pinMode(10, OUTPUT);     // change this to 53 on a mega
 

 

El programa de control

 

Para usar la tarjeta SD, tenéis en primer lugar que cargar las librerías SPI y la SD:

#include <SPI.h>
#include <SD.h>

Después tenéis que activar el pin SS

pinMode(10, OUTPUT);     // Para un Arduino UNO
pinMode(53, OUTPUT);     // Para un MEGA

Y como siempre, necesitamos iniciar la SD Card con

SD.begin(4) ;

Donde 4 es el chipSelect es de la tarjeta SD. El resto es fácil. Definir un objeto File para leer un fichero de la SD:

File root;

Ya solo queda abrir un fichero para lectura. Supón que se llama index.htm

File dataFile = SD.open("index.htm ");

Si consigue abrir correctamente dataFile tomara un valor que apunta a la estructura a leer del fichero, en caso contrario se pondrá a 0 indicando el error.

Vamos a ver cómo hacer un programa  que lea un fichero en la SD y lo envié a la consola para ver lo que contiene:

#include <SPI.h>
#include <SD.h>
const int chipSelect = 4;

void setup()
   {  Serial.begin(9600);
      while (!Serial)  ;       // wait for serial port to connect. Needed for Leonardo only
      Serial.print("Probando SD card...");
      pinMode(10, OUTPUT);         // Esto es necesario aunque creas que no lo usas.
      if (!SD.begin(chipSelect))
           {  Serial.println("No hay tarjeta");
              return;    // NO sigas
           }
      Serial.println("Sd encontrada.");
      File dataFile = SD.open("index.htm");
     if (dataFile)   // Si ha podido abrir el fichero
        {    while (dataFile.available())              // Mientras no llegues al final
                  Serial.write(dataFile.read());       // Lee el fichero y envialo al serie
             dataFile.close();                         // Cierra el fichero al acabar
        }
     else     // SI no puede abrir el fichero
           Serial.println("Error, no puedo usar indes.htm");
   }
void loop()
   { }

SD.open() abre el fichero que buscamos y devuelve un puntero de tipo File para leer datos directamente., o un 0 si no puede.

Conviene insistir en que la SD card es también una clase que deriva de stream y por tanto hereda propiedades que ya conocemos de otras sesiones. Es el caso de datFile.Available() que vimos anteriormente con Serial como Serial.Available(), es decir, mientras haya datos disponibles, pendientes de leer.

dataFile.read(), lee un carácter del fichero y Serial.write lo envía a la consola. Por ultimo dataFile.Close, cierra y libera el fichero .

 
  • Si no hacemos dataFile.close(), no podemos estar seguros de que se ha escrito todo lo que queríamos al fichero.
  • No basta con sacar la SD y llevártela. Si lo haces puedes corromper toda la información de la SD Card.
  • Además la librería SD solo permite un fichero abierto a la vez. Si quieres abrir otro fichero tienes que cerrar primero el anterior
 

 

Un programa que grabe datos en la SD card

 

La tarjeta SD se comporta como la puesta Serie, y prácticamente se maneja igual, con pequeñas diferencias. En el programa anterior para leer el fichero,  usábamos:

File dataFile = SD.open("index.htm");

Sin pasarle ningún parámetro a SD.open() diferente del nombre del fichero. Esto hace que lo abramos en forma de lectura, lo que impide que escribamos en él. Solo podemos leer.

Para conseguir escribir en un fichero usamos

File dataFile = SD.open("data.txt", FILE_WRITE);

La idea del nuevo programa, es que va a escribir unos valores que lee de las puertas A2 a A4 y lo graba en el fichero data.txt (Naturalmente, como no tenemos nada conectado, leerá basura, pero eso no nos importa mucho ahora mismo). La parte interesante del programa está aquí:

Contenido solo disponible para suscriptores. ¡Accede al contenido!

              

Abrimos el fichero data.txt y escribimos a él como si fuera la puerta Serie. Al acabar simplemente cerramos el fichero y listo.

Volcado() es una función que hace lo que vimos en el programa anterior. Copia a la consola el contenido del fichero para que veáis lo que contiene.

SAlida a consola del Arduino

Si corréis el programa unas cuantas veces veréis que, la primera vez, crea el fichero data.txt y escribe lo que le pedimos en él. Pero si cuando hace el SD.open () el fichero ya existe, la información que le enviamos se añade al final, sin borra el contenido anterior.

Lo que resulta muy práctico cuando quieres grabar información de sensores y generar un histórico

 

Operando con la estructura de ficheros de la SD

 

Siempre que creas un sistema de ficheros en un dispositivo vas a necesitar ayudas para mantenerlo. La librería SD de Arduino, nos da una serie de funciones para jugar con ficheros y directorios. Al hacer

SD.open (“File.txt”)

Se crea el fichero en caso de no existir y podemos leer, pero no escribir. Y cuando hacemos:

SD.open("data.txt", FILE_WRITE)

Se crea, si no existe, y escribirá desde el principio. Pero si existe, todo lo que escribamos decíamos que se añade al final de lo que ya existía.  Pero a veces nos interesa empezar una página en blanco, lo que podemos hacer borrando el fichero si existe:

SD.remove(“data.txt”);

Y mejor aún si comprobamos si existe antes:

if (SD.exists(data.txt)
    SD.remove(“data.txt”) ;

También podemos usar estructuras de directorios (Aunque no tengo claro hasta donde) y podemos crearlos y bórrarlos con la SD library:

SD.mkdir("/a/b/c")
SD.rmdir(filename)

Mkdir puede crear directorios anidados y basta con referir el path completo del fichero y rmdir los elimina con todo su contenido

También dispone de un juego completo de funciones de ayuda:

Contenido solo disponible para suscriptores. ¡Accede al contenido!

              

Hay algún que otro método adicional que podéis consultar en la documentación de la SD library

 

Resumen de la sesión

 

 
    • Hemos presentado la librería Arduino que nos permite acceder a la SD Card incluida.
    • Hemos visto un par de ejemplos sencillos, para mostrar cómo se lee y se escribe en la tarjeta.
    • Hemos visto que cuando escribimos, el modo por defecto, es añadir desde el final de lo que hubiera. La idea de esto es facilitar la creación de registros de datos de una forma cómoda, y es uno de los usos más habituales de las tarjetas SD.

 

 

 

 

Para porder realizar consultas a nuestros expertos, tienes que ser suscriptor. Suscribiendote nos ayudas a mantener este proyecto en marcha.

¡ Quiero Suscribirme !

Si ya eres premium y no puedes comentar haz login. Hacer login

(79) Comments

  • Avatar for Charly
    • Gustavo

    Muy buenas días comunidad, tenga este inconveniente y quisiera su colaboración. tengo el módulo nrf24l01 y el modulo micro sd. mediante el nrf24l01 debo recibir datos de otro nodo que los envía, y esos datos deben almacenarse en la tarjeta micro sd. Cuando pruebo los módulos por separado funcionan perfectamente el nrf24l01 recibe los datos, y el modulo sd escribe y lee datos. El problema surge cuando los conecto ambos módulos ya que ambos utilizan la comunicación SPI del arduino, el problema es que no recibe datos ni se inicializa la tarjeta sd. Alguien que haya tenido alguna experiencia con los módulos por favor agradecería bastante.

  • Avatar for Charly
    • Ivan Uriarte

    Hola Juan, estás seguro que están formateadas en ese formato?

  • Avatar for Charly
    • Juan

    Hola, por mas vueltas que he dado, no consigo pasar del CardInfo, he probado con varias SD, el shield es el HanRun HR911105A y la parte de ethernet va perfecto. ero con la SD solo sale esto:

    Initializing SD card…Wiring is correct and a card is present.

    Card type: SD2
    Could not find FAT16/FAT32 partition.
    Make sure you’ve formatted the card

    Agradezco la ayuda de antemano.

  • Avatar for Charly
    • Prueba TPV TPV

    Hola Emilio, una pregunta interesante. Una busqueda rapida por ahi m eha llevado a encontrar este parrafo (https://www.arduino.cc/en/Reference/SD)

    The communication between the microcontroller and the SD card uses SPI, which takes place on digital pins 11, 12, and 13 (on most Arduino boards) or 50, 51, and 52 (Arduino Mega). Additionally, another pin must be used to select the SD card. This can be the hardware SS pin – pin 10 (on most Arduino boards) or pin 53 (on the Mega) – or another pin specified in the call to SD.begin(). Note that even if you don’t use the hardware SS pin, it must be left as an output or the SD library won’t work.

    Asi que deberias poder llamar al iniciador con algo como SD.begin(8), para usar ese pin con el select del spi para el lector, pero no lo he probado. Ya me contaras

  • Avatar for Charly
    • EMILIO-JOSÉ

    Buenas tardes, es posible en un Arduino UNO usar otro pin que el 4? Sucede que tengo un shield que lo usa por HW y no puedo cambiarlo

  • Avatar for Charly
    • Ivan

    Hola Juan Manuel, puedes probar a guardar el número de la tarjeta RFID en una String y después grabarlo en la SD como está en la sesión. ¿Puedes concretarnos un poco más dónde tienes el problema? UN saludo.

  • Avatar for Charly

    Estimado:
    Estoy siguiendo varios de tus proyectos. Pero cuando quiero integrar dos de ellos estoy con problemas. Estoy tratando de iniciar una tarjeta SD y crear una archivo *.txt luego leer una tarjeta RFID con un lector MFRC522 y guardar el número en el archivo dentro de la tarjeta.
    Por separado puedo crear archivos en eliminarlos en la tarjeta. Por otro lado puedo leer las tarjetas y sacar por puerto serie el número y demás.
    De necesitar puedo incluir el programa completo

  • Avatar for Charly
    • Ivan

    Hola Lalo, lo que habría que hacer sería cambiar la instrucción en la que abres el archivo que quieres escribir (recuerda lque si es la primera vez lo crea. Ahí en vez de ponerle el nombre «a mano», puedes pasarle una variable en la que tengas por ejemplo la fecha, el ID o lo que sea.

    File dataFile = SD.open(variable, FILE_WRITE);

    Un saludo.

  • Avatar for Charly
    • Lalo

    disuclpe en el caso de que queramos que el nombre del txt sea un valor que queramos imprimir, como la fecha como seria? porque lo que quiero hacer es pasar una rfid y que en el teto se registre el año, mes, dia, hora y minuto junto con la id del rfid, pero no dentro del txt sino como el titulo del txt, como podría hacerlo?

  • Avatar for Charly

    Hola, una pregunta. Necesito guardar una matriz en la SD y luego leer ese archivo (que el programa lo lea) para usar esa información dentro de mi programa, es posible?
    Es decir, leer la información que guardé en la SD y asignarla a una variable.

  • Avatar for Charly
    • Enrique

    Buenas tardes, quiza sea un poco pesado,
    en el Prog_65_2, despues de muchas pruebas me dba siempre error de que no habia tarjeta SD.
    Probe con el program SD ReadWrite que viene el Arduino y si veia la tarjeta SD.
    Comprando programas al 65_2 le quite pinMode (10, OUTPUT ) y ya me leia la tarjeta y la escribia.

    Un saludo

  • Avatar for Charly
    • Admin

    Hola Felix.

    Cuando quieres combinar los tutos de varios sensores puedes copiar las lineas de codigo correspondiente a un unico programa, una a continuacion de la otra en el loop principal y se ejecutaran en secuencia. de ese mido primero lee una, luego la 2ª y despues la 3ª y ahora vuelta a empezar es muy sencillo

    Si quieres cerrar la SD y asegurarte de que no hay nada pendiente antes de extraerla haz file.close()

  • Avatar for Charly

    Buenas tardes, voy iniciando en el mundo de Arduino y en mi proyecto debo implementar 3 medidas (flujo, voltaje y corriente), ya tengo los sensores, la SHIELD y manejo arduino uno.
    Como se pueden poner los 3 «programas» de medicion dentro del mismo? Por que hasta donde lei del post solo podre abrir 1 archivo, entonces debo tener las 3 mediciones dentro del mismo.
    Y otra duda, para detener el uso de SD simplemnte la expulso del shield? o debo hacer otra cosa?
    Gracias de antemano.

  • Avatar for Charly
    • Admin

    En efecto, aunque el soft ware te impide tener dos archivos abiertos a la vez puedes cerrar uno, abrir el dos y escribir, cerrar el dos, y volver a abrir el uno para seguir escribirendo desde el final sin borrar, escribiendo al final

    No recuerdo de memoria los comandos, pero habia una forma de abrir un archivo existente y que apunte al final para añadir mas texto

  • Avatar for Charly
    • Rafa

    Hola. Gracias por los tutos. Estoy usando la SD para guardar datos de temperatura, humedad y hora. La cuestión es que quiero guardar también la máxima y la mínima de esos datos pero sin que se escriban a cada toma. Se que no se pueden grabar datos en dos archivos, pero ¿puedo cerrar uno, abrir otro, escribir y luego cerrarlo? Es decir, escribir en dos archivos, pero alternando. ¿Es posible?¿Cómo tendría que hacerlo? Muchas gracias.

  • Avatar for Charly
    • Ivan

    Hola Camilo, ¿qué librerías estás utilizando?en principio no necesitas más librerías que las que se indican en la sesión , las que corresponden a SPI.h y a Sd.h, con ellas podrías guardar los datos que quieras en la SD siguiendo la estructura del ejemplo. Un saludo.

  • Avatar for Charly
    • Camilo

    Hola me parece muy interesante todos sus post, me han servido de mucha ayuda. Tengo una duda y me encantaría que pueda ayudarme. Baje 2 librerías sd que hay en Arduino, para guardar datos en la tarjeta sd desde un teclado matrícial. La tarjeta sd y teclado están bien configurados pero cuando reviso los datos almacenados guarda datos que supone son de un sensor y no de un teclado. Muchas gracias!

  • Avatar for Charly
    • Admin

    naturalmente que si gabriel. una tarjeta ethernet es basicamente una puerta serie que envia por tcpip lo que quieras enviar.otro tema diferente es como enviar un fichero, para lo quw vas anecesitar alguna libreria que te haga la gestion de la transferenci pormftp por ejemplo, peromdispones de las librerias de tcpip completas en ru arduino

  • Avatar for Charly
    • Gabroel

    puedo mandar archivos con esta targeta por la direccion ip?

Para porder realizar consultas a nuestros expertos, tienes que ser suscriptor. Suscribiendote nos ayudas a mantener este proyecto en marcha.

¡ Quiero Suscribirme !

Si ya eres premium y no puedes comentar haz login. Hacer login