Skip to Content

Una guía completa para Arduino y la interfaz de la tarjeta SD

Una guía completa para Arduino y la interfaz de la tarjeta SD

En este tutorial, te llevaré a través de los detalles necesarios para construir un proyecto de Arduino y una tarjeta SD. Las tarjetas SD permiten registrar una cantidad considerable de datos.

Por lo tanto, Arduino y las tarjetas SD son una buena combinación para los proyectos de registro de datos.

Las tarjetas SD pueden almacenar muchas imágenes que puedes utilizar en juegos, menús de navegación, terminales de punto de venta, etc.

También puede almacenar archivos de texto y mostrarlos en su proyecto de lector de libros electrónicos. 

Las tarjetas SD son tarjetas de memoria diminutas que le proporcionan mucho espacio de almacenamiento.

Puedes interconectar un Arduino con la tarjeta SD con la ayuda de un módulo de tarjeta SD. 

Al final de este tutorial, comprenderás los fundamentos de las tarjetas SD, las opciones de módulos de tarjetas SD disponibles, una guía de conexión paso a paso, un código Arduino de ejemplo y una colección de preguntas frecuentes.

Comencemos.

Componentes necesarios para construir un proyecto con Arduino y una tarjeta SD

Componentes de hardware 

Software

Makerguides.com participa en el Programa de Asociados de Amazon Services LLC, un programa de publicidad de afiliados diseñado para proporcionar un medio para que los sitios ganen honorarios de publicidad mediante la publicidad y los enlaces a productos en Amazon.com.

Fundamentos de una tarjeta SD y del módulo de tarjeta SD

Tarjeta SD es el acrónimo de Secure Digital Card. Las tarjetas SD son memorias flash no volátiles diseñadas para dispositivos portátiles (Móviles, reproductores MP3, Dataloggers, etc. ) 

 Veamos la tarjeta SD de cerca.

La siguiente imagen le proporciona los detalles de los pines de la tarjeta SD y de la tarjeta Micro SD. Las tarjetas Micro SD son más comunes.

Puedes encontrar fácilmente muchos módulos con un soporte para tarjetas Micro SD en un extremo y accesibles para nosotros los pines DIP para conectar a la protoboard.

Hay dos interfaces, SD y SPI. En este artículo utilizamos la interfaz SPI. Encontrarás muchas librerías para Arduino y tarjetas SD con la interfaz SPI.

El protocolo SPI se utiliza en la mayoría de los proyectos Arduino que se ven. 

Puede cambiar entre el modo SD y el modo SPI de comunicación durante el encendido.

Por defecto, la tarjeta siempre arranca en modo SD. El Arduino tiene que realizar el cambio utilizando las líneas de selección de chip y de control. 

Una vez que se pone la tarjeta SD en modo SPI, no se puede cambiar el modo de comunicación sin proporcionar un reinicio de energía. 

La comunicación se produce en forma de comandos y respuestas. La comunicación de datos consiste en la transferencia de paquetes.

Cada paquete de datos tendrá una suma de comprobación asociada. 

Las siguientes imágenes muestran el protocolo de comunicación de alto nivel entre un host (Arduino) y la tarjeta SD.

Lectura de un solo bloque mediante comunicación SPI

Lectura de bloques múltiples - Modo SPI

Lectura de bloques múltiples - Modo SPI

Escritura de un solo bloque, modo SPI

Escritura de un solo bloque, modo SPI

Escritura en bloque múltiple, modo SPI

Escritura en bloque múltiple, modo SPI

Las tarjetas SD que se encuentran habitualmente en los dispositivos portátiles funcionan a 3,3 V. El Arduino UNO funciona a 5 V. Por lo tanto, es necesario un variador de nivel.

Por lo tanto, la mayoría de los módulos de tarjetas SD tendrán un traductor de voltaje a bordo, que ayuda a proteger las líneas de la tarjeta SD de la línea de Arduino UNO.

Las líneas SPI para la comunicación y 5 V para la alimentación son las conexiones estándar necesarias.

Puedes encontrar algunos módulos de tarjetas SD en la imagen de abajo.

Módulos de tarjetas SD

Comencemos con el módulo de la tarjeta SD que se encuentra comúnmente, que también tiene un regulador de 3,3 V a bordo. Utilizaré el siguiente módulo para la guía de conexión.

módulo para la guía de conexión

La siguiente tabla proporciona una breve descripción de los pines que se encuentran en el módulo de la tarjeta SD.

Etiqueta de la clavijaDescripción de la clavija
GNDConexión a tierra. Conectar a cualquiera de los pines GND de la placa Arduino
3.3 VEsta es la salida de 3,3 V del regulador de voltaje lineal integrado, que acepta 5 V y proporciona los 3,3 V necesarios para la tarjeta SD, así como una salida opcional para otros periféricos
+5 VConecta el pin de 5 V del Arduino a este pin. 5 V es la alimentación de entrada para el módulo de la tarjeta SD.
CSPin de selección de chip. Este pin es el pin de salida del Arduino y el pin de entrada para el módulo de la tarjeta SD. 
MOSIPin de salida del maestro y de entrada del esclavo. Este pin es el pin de salida del Arduino y el pin de entrada para el módulo de la tarjeta SD.
SCKLínea de reloj SPI. Este pin es el pin de salida del Arduino y el pin de entrada para el módulo de la tarjeta SD.
MISOLínea SPI MISO. Este pin es el pin de entrada del Arduino y el pin de salida para el módulo de la tarjeta SD.
GNDConexión a tierra

Las conexiones habituales necesarias entre Arduino y el módulo de la tarjeta SD se resumen en la siguiente tabla.

Clavijas del módulo de la tarjeta SDPines SPI IO de Arduino UNOPines SPI IO de Arduino Mega
GNDGNDGND
3.3 VNCNC
+5 V5 V5 V
CS453
MOSI1151
SCK1352
MISO1250
GNDGNDGND

Instrucciones paso a paso para conectar un módulo de tarjeta SD con Arduino

En esta sección, voy a dar instrucciones paso a paso para completar el cableado necesario entre el Arduino UNO y el módulo de la tarjeta SD.

Los módulos de tarjetas SD tienen varias formas y tamaños. Aunque el número de pines o el tipo de conector cambien, los detalles principales de conexión siguen siendo los mismos. 

Comencemos.

¿Cómo conectar el módulo de tarjeta SD al Arduino UNO?

A continuación se muestra la guía de conexión paso a paso para completar el cableado del Arduino y el módulo de la tarjeta SD.

Paso 1: Realizar la conexión a tierra

Realice la conexión a tierra

El pin GND del módulo de la tarjeta SD se conecta con el pin GND del Arduino.

Puedes elegir el pin GND más cercano disponible para completar la conexión.

Es una forma perfecta de empezar las conexiones con la conexión GND primero. 

Paso 2: Conectar el pin CS

Conecta el pin CS

Conecta el pin CS del módulo de la tarjeta SD al pin 4 del Arduino UNO.

Paso 3: Conectar el pin de señal SPI MISO

Conectar el pin de señal SPI MISO

Conecta el pin 11 del Arduino UNO al pin MISO del módulo de la tarjeta SD.

Paso 4: Conectar el pin de señal de reloj SPI

Conectar el pin de señal de reloj SPI

Conecta el pin 13 del Arduino UNO al pin SCK del módulo de la tarjeta SD.

Paso 5: Conectar el pin SPI MISO

Conectar el pin SPI MISO

Conecta el pin 12 del Arduino UNO al pin MISO del módulo de la tarjeta SD.

Paso 6: Conectar la clavija de 5 V

Conecte la clavija de 5 V

Conecta el pin 5 V del Arduino UNO al pin 5 V del módulo de la tarjeta SD. También puedes conectar otro pin GND, pero es opcional. 

Ejemplo de código Arduino para la interfaz de la tarjeta SD

En esta sección se verá un ejemplo de código Arduino para verificar la conexión. Necesita la biblioteca SD instalada para utilizar el código Arduino de ejemplo. 

Para instalar la biblioteca SD:

  • Vaya a Herramientas → Gestionar bibliotecas.
  • Introduzca SD en la ventana de búsqueda y pulse Intro.
  • Localice la biblioteca SD en los resultados de la búsqueda y haga clic en instalar. Una vez finalizada la instalación, podrá utilizar la biblioteca. 

Si tienes algún problema para acceder a él, por favor, deja un comentario. Intentaré ayudarte.

Biblioteca SD

El código completo de Arduino para leer la información de la tarjeta

En este proyecto, se lee el estado de la tarjeta. 

Abre el IDE de Arduino y haz clic en la opción "Archivo". En las opciones de archivo, selecciona "Ejemplos". Selecciona el proyecto SD → CardInfo.

El código completo de Arduino para leer la información de la tarjeta

Aquí está el código completo.

/*
  SD card test
 
  The circuit:
    SD card attached to SPI bus as follows:
 ** MOSI - pin 11 on Arduino Uno/Duemilanove/Diecimila
 ** MISO - pin 12 on Arduino Uno/Duemilanove/Diecimila
 ** CLK - pin 13 on Arduino Uno/Duemilanove/Diecimila
 ** CS - depends on your SD card shield or module.
    Pin 4 used here for consistency with other Arduino examples
 
 
  created  28 Mar 2011
  by Limor Fried
  modified 9 Apr 2012
  by Tom Igoe
*/
 
// include the SD library:
#include "SPI.h"
#include "SD.h"
 
// set up variables using the SD utility library functions:
Sd2Card card;
SdVolume volume;
SdFile root;
 
// change this to match your SD shield or module;
// Arduino Ethernet shield: pin 4
// Adafruit SD shields and modules: pin 10
// Sparkfun SD shield: pin 8
// MKRZero SD: SDCARD_SS_PIN
const int chipSelect = 4;
 
void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
 
 
  Serial.print("\nInitializing SD card...");
 
  // we'll use the initialization code from the utility libraries
  // since we're just testing if the card is working!
  if (!card.init(SPI_HALF_SPEED, chipSelect)) {
    Serial.println("initialization failed. Things to check:");
    Serial.println("* is a card inserted?");
    Serial.println("* is your wiring correct?");
    Serial.println("* did you change the chipSelect pin to match your shield or module?");
    while (1);
  } else {
    Serial.println("Wiring is correct and a card is present.");
  }
 
  // print the type of card
  Serial.println();
  Serial.print("Card type:         ");
  switch (card.type()) {
    case SD_CARD_TYPE_SD1:
      Serial.println("SD1");
      break;
    case SD_CARD_TYPE_SD2:
      Serial.println("SD2");
      break;
    case SD_CARD_TYPE_SDHC:
      Serial.println("SDHC");
      break;
    default:
      Serial.println("Unknown");
  }
 
  // Now we will try to open the 'volume'/'partition' - it should be FAT16 or FAT32
  if (!volume.init(card)) {
    Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
    while (1);
  }
 
  Serial.print("Clusters:          ");
  Serial.println(volume.clusterCount());
  Serial.print("Blocks x Cluster:  ");
  Serial.println(volume.blocksPerCluster());
 
  Serial.print("Total Blocks:      ");
  Serial.println(volume.blocksPerCluster() * volume.clusterCount());
  Serial.println();
 
  // print the type and size of the first FAT-type volume
  uint32_t volumesize;
  Serial.print("Volume type is:    FAT");
  Serial.println(volume.fatType(), DEC);
 
  volumesize = volume.blocksPerCluster();    // clusters are collections of blocks
  volumesize *= volume.clusterCount();       // we'll have a lot of clusters
  volumesize /= 2;                           // SD card blocks are always 512 bytes (2 blocks are 1KB)
  Serial.print("Volume size (Kb):  ");
  Serial.println(volumesize);
  Serial.print("Volume size (Mb):  ");
  volumesize /= 1024;
  Serial.println(volumesize);
  Serial.print("Volume size (Gb):  ");
  Serial.println((float)volumesize / 1024.0);
 
  Serial.println("\nFiles found on the card (name, date and size in bytes): ");
  root.openRoot(volume);
 
  // list all files in the card with date and size
  root.ls(LS_R | LS_DATE | LS_SIZE);
}
 
void loop(void) {
}

Una vez que ejecute el código, abra el terminal serie en el IDE de Arduino. Verás mensajes similares a los de aquí.

Inicializando la tarjeta SD... El cableado es correcto y hay una tarjeta presente.

Posteriormente, el código mostrará la capacidad de la tarjeta e información sobre el espacio disponible usado y libre.

Preguntas frecuentes sobre los proyectos de tarjetas SD de Arduino

En esta sección, encontrará respuestas a las preguntas más frecuentes sobre los proyectos de Arduino y la tarjeta SD.

1) ¿Cómo puedo utilizar una tarjeta Micro SD con un Arduino?

La mayoría de las tarjetas SD soportan la interfaz SPI. Necesitarás líneas SPI en el Arduino UNO con la tarjeta SD. Las líneas SPI necesarias son SPI MISO, SPI MOSI, SPI CLK y SPI CS.

También puedes utilizar una librería de software para SPI si las líneas SPI del hardware del Arduino están ocupadas.

2) ¿Arduino utiliza la tarjeta SD? 

Sí, Arduino puede almacenar y acceder a los datos mediante una tarjeta SD.

Por ejemplo, en una aplicación que implique la detección de la temperatura ambiente, puede registrar la temperatura de la habitación durante días o incluso meses sin preocuparse por la pérdida de datos debido a un corte de energía. 

Arduino puede gestionar el sistema de archivos de la tarjeta SD de forma que también sea reconocido por el ordenador.

Significa que puede acceder directamente a los archivos de registro desde una aplicación de Microsoft.

Arduino también puede utilizar una tarjeta SD para almacenar los vídeos e imágenes de sus proyectos con un controlador TFT.

Por lo tanto, la capacidad de la tarjeta SD es una opción práctica para futuros proyectos de Arduino. 

3) ¿Se pueden almacenar datos en el Arduino?

Puede almacenar los datos del Arduino en un PC si ha conectado el Arduino a través de un puerto serie.

El Arduino tiene bastante menos memoria, por lo que no se puede utilizar para almacenar archivos de registro.

Si los datos a almacenar son diminutos, entonces la EEPROM es la mejor opción. El tamaño de la EEPROM dentro de tu Arduino depende del tipo de placa que tengas.

Puede tener EEPROM de tamaño 512 bytes, un kilobyte o cuatro kilobytes, dependiendo del tipo de MCU.

Una tarjeta SD es la mejor opción para almacenar enormes cantidades de datos utilizando Arduino.

Es portátil, el sistema de archivos se reconoce en otros ordenadores y, además, es una opción más barata. 

4) ¿Cómo puedo añadir más memoria al Arduino UNO?

El Arduino UNO tiene una cantidad limitada de RAM y memoria flash interna. Si tiene que añadir más memoria, puede planear actualizar la placa a un Arduino Mega o utilizar una opción de tarjeta SD. 

Arduino Mega tiene cuatro veces más RAM, cuatro veces más EEPROM y ocho veces más memoria flash interna en comparación con un Arduino UNO.

5) ¿Cuál es el tamaño máximo de la tarjeta SD que puedo utilizar con Arduino?

Según las especificaciones de la biblioteca SdFat, puedes utilizar hasta 2 GB de tarjetas SD. Los 2 GB son suficientes para almacenar más de 1000 imágenes a 2 MP. 

Arduino también admite tarjetas SDHC, que pueden ser de hasta 32 GB.

Si registra la información meteorológica cada 1 minuto una vez, y la cantidad de datos registrados es de 20 bytes, puede registrar los datos durante más de 200 años utilizando una tarjeta SD de 2 GB.

Conclusión

Espero que hayas subido con éxito el proyecto de Arduino y el módulo de la tarjeta SD. Te he llevado a través de los fundamentos de la tarjeta SD guía de conexión paso a paso.

También vimos un código de ejemplo que verificará las conexiones. 

Anteriormente he utilizado una tarjeta SD para registrar los datos en un simple archivo de texto.

El Arduino registró los datos del GPS, la temperatura exterior y la calidad del aire. 

Todos los datos grabados estaban contenidos en una trama de tamaño 64 bytes. Almacenaba los fotogramas en la tarjeta SD cada 1 minuto. 

Estaré encantado de leer los proyectos que planeas construir utilizando tarjetas SD.

Por favor, comparta los enlaces a sus proyectos. Espero que el artículo sea sencillo de seguir.

Si tiene alguna sugerencia para mejorar el artículo, menciónela en los comentarios. 

No olvides compartir el artículo con tus amigos y compañeros entusiastas de Arduino.

Lauqué

Saturday 23rd of September 2023

hello When I remove the SD card to read its content, and I insert it again, the systeme seams not to wrtie to the card an does notz give any error message.after a program reset it continue to write to the file. how to proceed in order not to have to reset the CPU.