Leer información de microSD con Arduino
Arduino es sin duda el microcontrolador mas popular por la compatibilidad con dispositivos externos. Almacenar y leer información es cada vez mas importante al momento de manipular censores y actuadores, en esta ocasión vamos a ver un pequeño ejemplo donde vamos a leer la información de una tarjeta microSD. En mi caso voy a utilizar un lector multitarjeta Catalex y un Arduino UNO.
Lo que vamos a utilizar:
- Arduino (yo voy a utilizar un Arduino UNO)
- Lector de tarjeta microSD (Catalex)
- Tarjeta microSD (cualquier capacidad)
- Cables
El esquemático de conexión entre el lector y Arduino es el siguiente:
- VCC a 5V de Arduino.
- GND a GND de Arduino.
- CS a PIN digital 4 de Arduino.
- MOSI a PIN digital 11 de Arduino.
- MISO a PIN digital 12 de Arduino.
- SCK a PIN digital 13 de Arduino.
Ahora voy a mostrar el código que he utilizado, quiero aclarar que lo he tomado del ejemplo oficial de Arduino y solamente he modificado unas cuantas lineas para hacerlo más amigable y compatible con futuros ejemplos:
// Incluimos librerias #include <SPI.h> #include <SD.h> // Variables utilizadas por la libreria SD Sd2Card card; SdVolume volume; SdFile root; const int chipSelect = 4; // Aquí le decimos en que PIN digital se va a conectar el lector SD void setup() { // Abrimos la comunicación por puerto Serial, y esperamos a que esté disponible: Serial.begin(9600); while (!Serial) { ; // Esperamos a que el puerto serial esté disponible } Serial.print("\nInicializando microSD..."); // El siguiente fragmento de código verifica que la tarjeta funcione correctamente if (!card.init(SPI_HALF_SPEED, chipSelect)) { Serial.println("inicialización fallida. Verifique lo siguiente:"); Serial.println("* la tarjeta ha sido incertada correctamente?"); Serial.println("* el cableado es correcto?"); Serial.println("* seleccionaste el PIN correcto de tu chipSelect?"); while (1); } else { Serial.println("El cableado es correcto y la tarjeta funciona"); } // Se imprime la información de la tarjeta Serial.println(); Serial.print("Tipo de tarjeta: "); 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("Desconocida"); } // Ahora se va intentar abrir el tipo de 'voluimen o partición, solamente se muestra FAT16 o FAT32 if (!volume.init(card)) { Serial.println("No se reconoce partición FAT16/FAT32. \nAsegurece de que el formato sea correcto"); while (1); } Serial.print("Clusters: "); Serial.println(volume.clusterCount()); Serial.print("Bloques x Cluster: "); Serial.println(volume.blocksPerCluster()); Serial.print("Total de Bloques: "); Serial.println(volume.blocksPerCluster() * volume.clusterCount()); Serial.println(); // Se imprime el tipo y tamaño del primer FAT que se encuentre uint32_t volumesize; Serial.print("El tipo de volumen es: FAT"); Serial.println(volume.fatType(), DEC); volumesize = volume.blocksPerCluster(); // Los clusters son colecciones de bloques volumesize *= volume.clusterCount(); // hay muchos grupos volumesize /= 2; // Los bloques de las SD son siempre 512 bytes (2 bloques son 1KB) Serial.print("Volume en (Kb): "); Serial.println(volumesize); Serial.print("Volume en (Mb): "); volumesize /= 1024; Serial.println(volumesize); Serial.print("Volume en (Gb): "); Serial.println((float)volumesize / 1024.0); Serial.println("\nLos archivos que se encontraron en la tarjeta (nombre, fecha y tamaño en bytes): "); root.openRoot(volume); // Se muestra la lista de archivos en la tarjeta con fecha y tamaño root.ls(LS_R | LS_DATE | LS_SIZE); } void loop(void) { }
Si todo funciona correctamente debemos revisar el Monitor serial presionando Ctrl+Mayus+M