La interfaz entre el módulo de tarjeta micro SD y Arduino es crucial para el correcto funcionamiento de proyectos que requieran almacenar y leer datos de una tarjeta de memoria en el microcontrolador. En este artículo, exploraremos cómo conectar y comunicar estos dos dispositivos para sacar el máximo provecho de sus capacidades. ¡Sigue leyendo para descubrir todo lo que necesitas saber para integrar una tarjeta micro SD en tus proyectos con Arduino!
De vez en cuando se te ocurre una idea para un proyecto Arduino que necesita una forma de almacenar una gran cantidad de datos de registro y otra información, como un registrador GPS o un registrador de temperatura.
La solución es utilizar algo que se encuentra en todas las cámaras digitales o reproductores de MP3: Tarjetas didácticas! A menudo se las denomina tarjetas SD o tarjetas microSD. Su capacidad para colocar gigabytes de datos en un espacio más pequeño que una moneda los convierte en una parte esencial de nuestras vidas.
El módulo de tarjeta microSD facilita la integración del registro de datos en su próximo proyecto Arduino. Vamos a ver.
Descripción general del hardware
El módulo de la tarjeta microSD contiene dos componentes principales:
Una tarjeta microSD estándar tiene un voltaje de funcionamiento de 3,3V por lo que no podemos conectarla directamente a circuitos que utilicen lógica de 5V; De hecho, los voltajes superiores a 3,6 V pueden dañar permanentemente la tarjeta microSD. Por esta razón, el módulo tiene un regulador de voltaje de caída ultrabaja integrado que puede regular el voltaje a 3,3 V.
El módulo también incluye un 74LVC125A Chip Logic Level Shifter que permite una comunicación fácil y segura con su microcontrolador favorito de 3.3V o 5V sin dañar la tarjeta SD.
¡Hay una ranura para tarjeta microSD en el frente! Cualquier tarjeta de memoria microSD funciona bien. La dirección correcta para insertar una tarjeta microSD suele estar impresa en el módulo.
Modo de comunicación: SPI frente a SDIO
En realidad, las tarjetas microSD se pueden conectar de dos maneras: en modo SPI y modo SDIO.
El modo SDIO es mucho más rápido y se utiliza en teléfonos móviles, cámaras digitales y otros dispositivos. Sin embargo, es más complicado y requiere firmar acuerdos de confidencialidad. Por esta razón, es poco probable que los aficionados como nosotros encuentren un código de interfaz para el modo SDIO.
Por lo tanto, casi todos los módulos de tarjetas SD utilizan el modo SPI de “menor velocidad y menos gastos generales”, que es fácil de implementar en cualquier microcontrolador.
Configuración de pines del módulo de tarjeta MicroSD
El módulo de tarjeta microSD es fácil de conectar. Tiene seis pines:
VCC El pin suministra energía al módulo y debe conectarse al pin de 5V del Arduino.
Tierra es un pin de tierra.
MISO (Maestro en esclavo fuera) es la salida SPI del módulo de la tarjeta microSD.
MOSI (Master Out Slave In) es la entrada SPI al módulo de la tarjeta microSD.
SCK (reloj serie) El pin acepta pulsos de reloj del maestro (en nuestro caso un Arduino) para sincronizar la transferencia de datos.
CS (selección de chip) El pin es un pin de control que se utiliza para seleccionar uno (o más) dispositivos esclavos en el bus SPI.
Preparando la tarjeta microSD
Antes de insertar la tarjeta microSD en el módulo y conectarla al Arduino, debes formatear correctamente la tarjeta en FAT16 o FAT32.
Si tiene una tarjeta SD nueva, probablemente ya venga preformateada con un sistema de archivos FAT; Sin embargo, pueden surgir problemas con el formateo de fábrica de la tarjeta. Si tiene una tarjeta antigua, es necesario formatearla. En cualquier caso, se recomienda formatear la tarjeta antes de utilizarla.
Se recomienda utilizar la versión oficial. Utilidad para formatear tarjetas SD desarrollado por el Asociación SD. ¡Puede resolver muchos problemas causados por un formato deficiente! Descargar y ejecutar eso Formateador en tu ordenador; Simplemente seleccione la unidad adecuada y haga clic en Formatear.
Cableado de un módulo de tarjeta microSD a un Arduino
Ahora que su tarjeta está lista para usar, ¡podemos conectar la placa de conexión microSD a un Arduino!
Conecte el pin VCC del módulo a 5 V en el Arduino y el pin GND a tierra.
Ahora nos quedan los pines que se utilizan para la comunicación SPI. Dado que las tarjetas microSD requieren muchas transferencias de datos, funcionan mejor cuando se conectan a los pines SPI del hardware del microcontrolador.
Tenga en cuenta que cada placa Arduino tiene diferentes pines SPI que deben conectarse correctamente. En placas Arduino como UNO/Nano V3.0, estos pines son digitales 13 (SCK), 12 (MISO), 11 (MOSI) y 10 (CS).
La siguiente tabla enumera las conexiones de pines:
módulo de tarjeta microSD | arduino | |
VCC | 5V | |
Tierra | Tierra | |
MISO | 12 | |
MOSI | 11 | |
SCK | 13 | |
C.S. | 10 |
El siguiente diagrama muestra cómo conectar el módulo de la tarjeta microSD al Arduino.
¡Eso es todo! ¡Ahora puede comenzar a registrar datos!
Código Arduino: prueba del módulo de tarjeta SD con CardInfo
Comunicarse con una tarjeta SD supone mucho trabajo, pero afortunadamente el IDE de Arduino ya incluye una biblioteca muy útil llamada Dakota del Sur Esto facilita la lectura y escritura en tarjetas SD.
Comencemos con un boceto de ejemplo simple de CardInfo. Este boceto no escribe ningún dato en la tarjeta. En cambio, le indica si la tarjeta es reconocida y le muestra información al respecto. Esto puede resultar muy útil cuando desea determinar si una tarjeta SD es compatible o no. Por lo tanto, se recomienda ejecutar este boceto una vez antes de probar un mapa nuevo.
Para abrir el boceto de muestra de CardInfo, navegue hasta Archivo > Ejemplos > SD > CardInfo.
Asegúrese de que la línea ChipSelect esté inicializada correctamente al comienzo del boceto. En nuestro caso estamos usando el pin digital número 10, así que cámbielo a 10.
Ahora inserte la tarjeta SD en el módulo y cargue el boceto. Al abrir el monitor serie, es posible que vea resultados diferentes según el escenario.
Escenario 1: Todo está bien
Si todo está bien, deberías ver información útil. Por ejemplo, en nuestro caso, el tipo de tarjeta es SDHC (SD de alta capacidad), el tipo de disco es FAT32 y el tamaño de la tarjeta es de 4 GB.
Escenario 2: la tarjeta SD está dañada
Si tienes una tarjeta mala como esta, es posible que veas algo como esto:
Aunque la tarjeta respondió, todos los datos son inexactos. Como puede ver, no hay ID del fabricante ni ID del OEM y el ID del producto es «N/A». Aparentemente la tarjeta arrojó errores de SD.
Si obtienes algo como esto, puedes intentar reformatearlo. Sin embargo, si el problema persiste, es posible que tengas que desechar la tarjeta.
Escenario 3: Error de cableado o la tarjeta está dañada permanentemente
Si hay un error de cableado o la tarjeta está dañada permanentemente, verás algo similar. Puedes ver que la tarjeta SD ni siquiera se pudo inicializar.
En este caso, vuelva a verificar el cableado y ejecute el boceto nuevamente.
Escenario 4: la tarjeta SD no está formateada correctamente
Si el cableado es correcto pero la tarjeta SD no está formateada correctamente, verás algo como esto:
Intente formatear la tarjeta y ejecutar el boceto nuevamente.
Código Arduino: lectura y escritura de datos
Suponiendo que haya tenido éxito con el boceto anterior, pasemos al siguiente experimento. El siguiente esquema muestra cómo escribir en un archivo y luego verificar su contenido leyéndolo nuevamente. Antes de entrar en detalles, pruebe el boceto.
#include <SPI.h>
#include <SD.h>
File myFile;
// change this to match your SD shield or module;
const int chipSelect = 10;
void setup()
{
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
Serial.print("Initializing SD card...");
if (!SD.begin()) {
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");
// open the file. note that only one file can be open at a time,
// so you have to close this one before opening another.
myFile = SD.open("test.txt", FILE_WRITE);
// if the file opened okay, write to it:
if (myFile) {
Serial.print("Writing to test.txt...");
myFile.println("testing 1, 2, 3.");
// close the file:
myFile.close();
Serial.println("done.");
} else {
// if the file didn't open, print an error:
Serial.println("error opening test.txt");
}
// re-open the file for reading:
myFile = SD.open("test.txt");
if (myFile) {
Serial.println("test.txt:");
// read from the file until there's nothing else in it:
while (myFile.available()) {
Serial.write(myFile.read());
}
// close the file:
myFile.close();
} else {
// if the file didn't open, print an error:
Serial.println("error opening test.txt");
}
}
void loop()
{
// nothing happens after setup
}
Después de cargar el código, el monitor serie mostrará lo siguiente.
Si reinicia su Arduino y ejecuta el boceto nuevamente, los nuevos datos se agregarán al archivo sin sobrescribir los datos antiguos.
Explicación del código:
El boceto comienza incluyendo la biblioteca SD y la biblioteca SPI, que nos permiten comunicarnos con la tarjeta SD a través de la interfaz SPI.
#include <SPI.h>
#include <SD.h>
A continuación, declaramos el pin Arduino al que está conectado el pin CS (Chip Select) del módulo de la tarjeta SD. Aparte del pin CS, no necesitamos declarar ningún otro pin SPI porque estamos usando una interfaz SPI de hardware y estos pines ya están declarados en la biblioteca SPI.
Luego creamos un objeto de archivo llamado myFile
que tiene métodos y atributos para acceder y manipular archivos.
const int chipSelect = 10;
File myFile;
En la sección setup() inicializamos e invocamos la comunicación serie. SD.begin()
Función. Si logra reconocer la tarjeta, se imprimirá “Inicialización completa”. en el monitor serie. Si este no es el caso, se muestra «Error de inicialización». y el programa termina.
Serial.begin(9600);
Serial.print("Initializing SD card...");
if (!SD.begin()) {
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");
A continuación llamamos al open()
Función. Esta función abre un archivo o crea un archivo si no existe. Se requieren dos parámetros: el nombre del archivo a abrir y el modo en el que se debe abrir el archivo.
El modo de archivo puede ser FILE_READ
(abre el archivo para leer y coloca el cursor al principio del archivo) o FILE_WRITE
(abre el archivo para lectura y escritura y coloca el cursor al final del archivo).
En nuestro caso, creamos un archivo llamado “test.txt” y lo abrimos en modo lectura/escritura.
myFile = SD.open("test.txt", FILE_WRITE);
Después de abrir el archivo, usamos el println()
Función para escribirle datos. El println()
La función es similar a la que utilizamos para imprimir datos en el monitor serie. El print()
La función también está disponible si no desea mover el cursor a una nueva línea.
Luego cerramos el archivo con el close()
Función. Esta función cierra el archivo y garantiza que todos los datos escritos en él se guarden en la tarjeta SD.
if (myFile) {
Serial.print("Writing to test.txt...");
myFile.println("testing 1, 2, 3.");
myFile.close();
Serial.println("done.");
} else {
Serial.println("error opening test.txt");
}
Ahora volvamos a leer el contenido del mismo archivo para ver si la escritura anterior fue exitosa. Para lograr esto, primero abrimos el archivo de esta manera. open()
función, pero esta vez en modo lectura. Como el archivo test.txt ya se creó, simplemente se abrirá.
Entonces usa eso myFile.read()
Con esta función leemos el archivo y lo imprimimos en el monitor serie. Por eso read()
La función solo lee un carácter a la vez, tenemos que usarlo while
bucle y el myFile.available()
Función para leer todos los caracteres del archivo.
Finalmente cerramos el archivo.
myFile = SD.open("test.txt");
if (myFile) {
Serial.println("test.txt:");
while (myFile.available()) {
Serial.write(myFile.read());
}
myFile.close();
} else {
Serial.println("error opening test.txt");
}
Dado que este es sólo un boceto de demostración que muestra cómo leer y escribir archivos, no tiene sentido ejecutar el código varias veces. Por lo tanto, todo el código se coloca en la función setup(), que se ejecuta una vez, en lugar de en la función loop(), que se ejecuta repetidamente.
void loop()
{
}
Cosas importantes a tener en cuenta
- Puedes utilizar el…
print()
Yprintln()
Funciones para escribir cadenas, variables, etc., como objetos seriales. read()
La función devuelve un solo carácter a la vez. No se lee ninguna línea completa.- Cuando haya terminado con el archivo, deberá utilizar el
close()
Función para garantizar que todos los datos se escriban de forma permanente. Esto también reduce la cantidad de RAM utilizada. - Puede abrir archivos en un directorio. Por ejemplo, para abrir un archivo en el directorio, use
SD.open("/myfiles/example.txt")
. Recuerde que la ruta al archivo es relativa. - La biblioteca de tarjetas SD no admite nombres de archivos largos ya que utiliza el 8.3 formato de nombre de archivo. Por lo tanto, mantenga los nombres de los archivos cortos. Por ejemplo, “datalog.txt” está bien, pero “My Sensor log file.text” no.
- Tenga en cuenta que los nombres de archivos no distinguen entre mayúsculas y minúsculas. Entonces datalog.txt es lo mismo que DataLog.Txt y DATALOG.TXT
Algunas características útiles de la biblioteca SD
Funciones específicas del objeto SD
Hay muchas funciones útiles que puedes utilizar con SD Object. Algunos de ellos se enumeran a continuación:
exists(filename)
La función se puede utilizar para determinar si un archivo existe o no. Devuelve verdadero o falso.remove(filename)
La función se puede utilizar para eliminar un archivo. ¡Pero ten cuidado! Esto elimina permanentemente un archivo; No hay forma de deshacerlo.mkdir("/mynewdir")
La función se puede utilizar para crear subdirectorios. Esto es útil para almacenar una gran cantidad de archivos en un solo lugar.
Funciones específicas del objeto de archivo
Hay algunas funciones útiles que también puedes utilizar con objetos de archivo.
seek()
Esta función se puede utilizar para mover el cursor de lectura/escritura a una nueva posición.seek(0)
Por ejemplo, el cursor se mueve al principio del archivo.position()
La función devuelve la posición del cursor en el archivo.size()
La función devuelve el número de bytes de un archivo si desea saber su tamaño.isDirectory()
La función se puede utilizar para determinar si un archivo es un directorio.openNextFile()
La función se puede utilizar para buscar todos los archivos en un directorio.name()
La función se puede utilizar para encontrar el nombre de un archivo mientras se navega por un directorio.openNextFile()
Función. Devuelve un puntero a una matriz de caracteres con formato 8.3 que puede utilizar para imprimir directamenteSerial.print()
.
Interfaz entre el módulo de tarjeta micro SD y Arduino
Descripción general del hardware
El módulo de tarjeta microSD consta de dos componentes principales:
- Una tarjeta microSD estándar con un voltaje de funcionamiento de 3.3 V, por lo que no se puede conectar directamente a circuitos que utilizan lógica de 5V.
- Un chip de nivel de voltaje 74LVC125A que permite la comunicación segura y fácil con tu microcontrolador favorito de 3.3V o 5V sin dañar la tarjeta SD.
Modo de comunicación – SPI vs SDIO
Las tarjetas microSD se pueden interconectar de dos formas: modo SPI y modo SDIO. El modo SPI es más común en los módulos y más fácil de implementar en cualquier microcontrolador.
Pinout del módulo de tarjeta microSD
El módulo de tarjeta microSD es simple de conectar y tiene seis pines:
- VCC para alimentación.
- GND para tierra.
- MISO para la salida SPI.
- MOSI para la entrada SPI.
- SCK para el reloj serial.
- CS para seleccionar el dispositivo.
Preparación de la tarjeta microSD
Antes de insertar la tarjeta en el módulo y conectarla a Arduino, es necesario formatearla a FAT16 o FAT32. Se recomienda utilizar la utilidad oficial para formatear la tarjeta SD.
Cableado de un módulo de tarjeta microSD a un Arduino
Conecta el pin VCC del módulo a 5V en el Arduino, y el pin GND a tierra. Luego conecta los pines usados para la comunicación SPI.
Código de Arduino – Probando el módulo de tarjeta SD con CardInfo
Para probar la tarjeta SD, puedes utilizar el sketch de ejemplo CardInfo que viene con la librería SD de Arduino. Este sketch te mostrará información sobre la tarjeta.
Código de Arduino – Lectura y escritura de datos
Después de probar la tarjeta, puedes experimentar con la lectura y escritura de datos en la tarjeta SD. El sketch de ejemplo te guiará en este proceso, mostrándote cómo escribir y leer datos en un archivo.
Funciones útiles de la biblioteca SD
Existen varias funciones útiles que puedes usar con la biblioteca SD de Arduino, tanto con el objeto SD como con el objeto File. Estas funciones te permiten verificar la existencia de un archivo, eliminarlo, crear directorios y más.
Conclusión
Con el módulo de tarjeta microSD, puedes incorporar fácilmente la función de registro de datos en tus proyectos de Arduino. Sigue las instrucciones proporcionadas y comienza a experimentar con la comunicación entre tu Arduino y la tarjeta microSD.
¡Buenísimo! Ahora sí me animo a probar esto en mi proyecto con Arduino. ¡Gracias por explicarlo de forma tan clara!
Qué interesante, no tenía idea de cómo funcionaba esa interfaz. Gracias por la explicación!
¡Muy útil! Me ha quedado mucho más claro cómo conectar una tarjeta micro SD a mi Arduino. ¡Gracias por compartir!