viernes, 25 de julio de 2025

Uso de tarjetas SD con Arduino

Manejo de archivos txt 

Vamos a trabajar con una tarjeta MicroSD en donde tenemos un archivo de texto llamado ESTADO.TXT

 

Si abrimos ese archivo con el Bloc de notas de Windows podemos ver su contenido y modificarlo si lo deseamos.

Como se puede ver este archivo contiene tres bytes, separados por comas. En el byte que ocupa la posición 0 hay un 0, en el byte que ocupa la posición 1 hay un 1 y en el byte que ocupa la posición 2 un 2.

Con SteamakersBlocks hacemos el siguiente programa.

El programa lee sucesivamente el byte que ocupa la posición 0, después el que ocupa la posición 1 y finalmente el que ocupa la posición 2. Estos valores los introduce en la variable de texto Control y posteriormente envía estos valores de la variable por el puerto serie. Por el puerto serie no vemos los valores 0, 1 y 2, sino que lo que envía a la Consola son los valores 48, 49 y 50, que son los códigos ASCII de esos dígitos.

Si en el archivo ESTADO.TXT ponemos una coma entre los valores 0, 1 y 2, en realidad estamos añadiendo dos bytes mas.


Si, con el mismo programa anterior, miramos lo que nos llega a la Consola del puerto serie veremos que llegan los valores 48, 44 y 49, correspondientes al 0, a la coma y al 1. De los dos siguientes bytes no nos devuelve su valor, ya que solo nos lee los tres primeros bytes.

Este otro programa con un bucle de repetición se consiguen los mismos resultados. Primeramente se crea la variable numérica Medida para guardar la longitud en bytes del archivo. Esta variable determinará después las veces que se repitan las operaciones que contiene el bucle. A continuación se asigna el valor 0 a la variable i que indica la posición del byte que se ha de leer. Dentro del bucle se lee el valor del byte correspondiente, se envía este valor por el puerto serie, se esperan cuatro segundos y se incrementa en una unidad el valor de la variable i.

El nombre del archivo se puede escribir como estado.txt, ESTADO.txt, estado.TXT, o ESTADO.TXT, ya que no discrimina entre mayúsculas y minúsculas.

Con los valores de los diferentes bytes del archivo estado.txt podemos formar una lista numérica de nombre Secuencia.

Una vez leídos los diferentes bytes del archivo y formada la lista se envían sus elementos por la Consola del puerto serie.

El valor de los bytes del archivo también los podemos guardar en una variable numérica llamamos Valor.

En este caso, todos los valores que se nos muestran por la pantalla de la Consola del puerto serie, tanto los valores de los bytes, como los elementos de la lista numérica, aparecen con decimales.

También podemos crear una lista de texto con nombre Secuencia1 en donde podamos ir añadiendo los valores numéricos correspondientes a los diferentes bytes.

En este caso en la Consola del puerto serie vemos los valores de los bytes con decimales y los elementos de la lista sin ellos.

Archivos con contenido RTTTL

Utilizando el entorno de programación SteamakersBlocks podemos recoger la información guardada en un archivo en una tarjeta microSD para poder reproducir una melodía RTTTL en Arduino. El programa es el siguiente. En Inicializar configuramos el puerto serie y la tarjeta SD. A continuación eliminamos el archivo estado.txt para volver a cargar contenido con el siguiente bloque. En este archivo guardamos el código de la sintonía de los Simpsons.

En el Bucle se leen sucesivamente los diferentes bytes del archivo, se guardan en una variable de texto llamada musica y se reproducen en el Zumbador conectado al pin 9 de Arduino. 

En el archivo estado.txt el contenido es:

 :d=4,o=5,b=160:c.6,e6,f#6,8a6,g.6,e6,c6,8a,8f#,8f#,8f#,2g,8p,8p

Con este programa conseguimos después de unos 22 segundos que se reproduzca una vez la sintonía de los Simpsons.

A continuación se puede ver otro programa que lee directamente el contenido del archivo estado.txt para reproducir sus bytes en el Zumbador.

Ahora la sintonía se reproduce continuamente, con unos 9 segundos en silencio entre las dos melodías.

Curiosamente este programa solamente funciona después de cargar el programa anterior y que haya sonado una vez la melodía, el que graba en el archivo el código RTTTL. Si una vez grabado se reinicia con el botón de RESET de la placa Arduino si que funciona bien, pero si se desconecta el cable de alimentación deja de funcionar, aunque se vuelva a cargar el programa. Si se desconecta el cable y se vuelve a conectar muy rápido si que sigue funcionando. Por todo ello este programa NO ES MUY SEGURO Y NO TIENE MAYOR UTILIDAD.

Intérprete de código ASCII

El contenido del archivo de texto es alfanumérico, pero cuando SteamakersBlocks lee su contenido proporciona el código ASCII de cada uno de sus bytes, por lo que para poder volver a utilizar estos caracteres originales hemos de transformar los códigos ASCII en sus correspondientes signos alfanuméricos.

Para conseguirle he hecho un subprograma que asigna un carácter alfanúmero a su correspondiente símbolo ASCII utilizando tantas estructuras condicionales como símbolos hay. Se puede encontrar este programa en SteamakersBlocks.

La función ASCII no se ve completa y tiene una estructura condicional para cada signo alfanumérico. En el Bucle se establece una estructura de repetición que repite las operaciones que se encuentran en su interior tantas veces como bytes tenga el archivo estado.txt. Al inicio del proceso se pone la variable i a 0 y también se borra la variable de texto Texto. Cada byte del archivo se guarda en una variable de texto llamada ASCII. Después se envía este valor a la función ASCII que devuelve dentro de esta variable el signo alfanumérico correspondiente.

A continuación este carácter alfanumérico se añade a la variable de texto Texto. Una vez fuera de la estructura de repetición se envía todo el contenido de la variable Texto para que el zumbador interprete esa melodía RTTL.

En el archivo estado.txt el contenido es:

 :d=4,o=5,b=160:c.6,e6,f#6,8a6,g.6,e6,c6,8a,8f#,8f#,8f#,2g,8p,8p

Uso de la tarjeta SD en la ESP32Plus STEAMaker 

La placa ESP32 Plus STEAMakers dispone de un zócalo para poder insertar tarjetas micro-SD. Para que funcione tiene que estar formateada en formato FAT32 permitiendo tamaños de hasta 2TB y archivos de un tamaño máximo de 2GB. La tarjeta le da gran flexibilidad a la placa ya que permite poder escribir y leer datos. Una de las funcionalidades más útiles es poder almacenar los datos de los sensores a modo de Datalogger. También nos permitirá leer datos de la tarjeta (por ejemplo, configuraciones de conexiones Wifi) para poder utilizarlas directamente en un programa. El zócalo para introducir la tarjeta micro SD se encuentra en la parte inferior de la placa.

Nota importante: el tipo de tarjeta de memoria SD que podemos conectar es de máximo 32GB y formateada en FAT32, si son de una capacidad mayor pueden no funcionar.

Existen una serie de bloques específicos en SteamakersBlocks para controlar la funcionalidad de la tarjeta SD.

Almacenar datos: Datalogger

Vamos a realizar un programa que nos permita almacenar los valores de temperatura y humedad en un fichero.

Primero inicializaremos la tarjeta SD y borraremos el archivo que pueda haber anteriormente. A continuación, leeremos la temperatura y la humedad y la almacenaremos en el fichero de texto datos.txt. Para separar los datos añadiremos el símbolo “;” para poder extraer luego los datos de forma más sencilla. Tomaremos las muestras en intervalos de 1 segundo.

El programa que realizaremos es el siguiente:

Una vez abramos la tarjeta en nuestro ordenador observaremos que se ha creado el fichero con el nombre que le hemos asignado.

Y si abrimos el fichero veremos la secuencia de muestras que hemos tomado y el formato de números obtenido.

Leer datos almacenados

Ahora vamos a leer los datos que hemos almacenado en la actividad anterior. Vamos a realizar un programa que nos permita volcar todos los datos por el puerto serie.

El programa resultante es el siguiente:

Los datos obtenidos por la consola son los que hay almacenados en el fichero de la tarjeta SD.


Escribir y leer datos

A continuación, vamos a realizar un programa que reúna las funcionalidades vistas anteriormente. Utilizaremos un pulsador para iniciar la grabación de los datos y otro pulsador para parar la grabación. En el momento que se pare la grabación de datos, los mostrará por la Consola. Mientras que esté almacenando datos se encenderá el led rojo y cuando los muestre por la Consola se encenderá el led azul. Cada vez que apretemos el pulsador de almacenar datos se irán añadiendo a las muestras que ya tenemos registradas.



La información que veremos por la consola será la siguiente (cada vez que abrimos la Consola se reinicia el programa y empieza a coger muestras desde 0):

Como podemos observar en la imagen siguiente, cada vez que almacena una muestra (Almacenando datos) se añade una nueva muestra al fichero de datos. En el ejemplo tenemos 6 muestras y, cuando pulsamos el botón de almacenar, almacena 1 nueva muestra. Al pulsar el botón de mostrar, ahora aparecen 7 muestras.

Podemos mejorar el programa si en lugar de escribir cada dato en la SD (que abre y cierra el fichero datos.txt) lo hacemos de una vez. La función de almacenar datos quedaría de la siguiente forma:

El programa definitivo quedaría de la siguiente forma:

Manejo de tarjetas SD desde el IDE de Arduino

Las memorias SD son las más usadas por dispositivos portátiles, por su gran capacidad y su reducido tamaño, debido a su gran demanda son fáciles de conseguir en diferentes capacidades y precios. Estas características nos dan una buena alternativa de almacenamiento para usarlo en Arduino, sobre todo cuando necesitamos guarda gran cantidad de información.

Estas memorias vienen en tres tamaños, SD estándar, Mini SD y Micro SD, siendo este último el tamaño más común, funcionalmente son iguales, pudiéndose usar adaptadores para utilizarlos en sockets de diferente tamaño.

Con respecto al formato podemos encontrar 4 tipos, las tarjetas SD o SDSC (Standard Capacity), SDHC (High Capacity), SDXC (Extended Capacity) y las SDIO (Input/Output), permitiéndonos Arduino trabajar con los dos primeros tipos.

La comunicación de la memoria es por SPI pero trabajan con 3.3V, para utilizarlo con Arduino necesitamos módulos externos que aparte de tener el socket traen los componentes necesarios para adaptar los voltajes a TTL y poder conectarlo de forma fácil a nuestro Arduino.

Arduino tiene una librería para usar estas memorias, que funciona con cualquiera de los módulos antes mencionados. La librería ya viene junto con el IDE de arduinos, por lo que no necesitamos instalar ni descargar nada.

Para poder usar la librería en nuestro Sketch es necesario incluir a la librería SD al inicio del código:

#include <SD.h>

A continuación explicamos las funciones principales de la librería SD, el cual es un resumen de la referencia proporcionada en la página oficial de Arduino

SD.begin(cspin)

Inicializa la biblioteca SD y la tarjeta, como parámetro se le indica el pin CS al que está conectado el modulo, si no se especifica cspin , se usa el valor por defecto del CS por hardware. Los demás pines deben estar conectados al SPI por hardware del Arduino.

SD.exists(filename)

Comprueba si existe el archivo especificado, filename es el nombre del archivo y/o directorio en la tarjeta SD si este existe la función nos retorna un true, de lo contrario retorna false.

SD.mkdir(directory)

Crea el directorio especificado, si los subdirectorios no existen, también se crearan. Por ejemplo: SD.mkdir(“Arduino/proyecto1/archivos), crea la carpeta “archivos” y si las carpetas Arduino y proyecto1 no existen, entonces también se crearan. La función retorna true si la creación del directorio fue exitosa de lo contrario nos retorna un false

SD.remove(filename)

Elimina el archivo (filename) de la tarjeta SD, se debe de incluir el directorio. Solo elimina el archivo más no el directorio. Devuelve true se logra eliminar el archivo de lo contrario nos retorna un false.

SD.rmdir(dirname)

Eliminar el directorio (dirname) de la tarjeta SD. El directorio debe estar vacío. Devuelve TRUE si la eliminación del directorio tuvo éxito o FALSE en caso contrario.

SD.open(filepath, mode)

Abre el archivo especificado y se debe de incluir el directorio si el archivo está en carpetas. Si el archivo no existe, se creara un archivo con el nombre especificado, pero no será posible crear el directorio si este no existe. Se puede abrir un archivo como solo lectura (si mode es FILE_READ) o como lectura y escritura (si mode es FILE_WRITE), el modo por defecto en caso no se especifique es FILE_READ

Ésta función nos retorna un objeto tipo FILE, el cual es necesario declararlo antes como una variable. Por ejemplo:

  File myFile;

  myFile = SD.open("archivo.txt", FILE_WRITE);

Funciones de la clase File:

file.available()

Compruebe si hay bytes disponibles para leer en el archivo y retorna el número de bytes disponibles

file.read()

Lee un byte de la variable File (archivo abierto anteriormente con SD.open())

file.write(data)

Escribe un byte en el archivo, el archivo debe estar abierto en modo lectura y escritura. Usando file.write(buf, len) se puede escribir un array de byte (buf) pero se debe especificar el tamaño (len).

file.print(data)

Esta función tiene las mismas características que un Serial.print(); data puede ser una variable o texto, el cual será enviado como caracteres. Si queremos agregar al final un salto o nueva línea se usa file.println(data)

file.size()

Retorna el tamaño en bytes del archivo

file.position()

Retorna la posición actual en donde se leerá o escribirá el siguiente byte.

file.seek(pos)

Nos ubicamos en una posición específica en el archivo. Pos debe ser un número entre 0 y el tamaño en bytes del archivo

file.close()

Cerramos el archivo, y recién en este momento los datos se guardan en la SD, pudiendo extraer de forma segura nuestra SD.

Conexión entre Arduino y modulo SD y micro SD

Las conexiones para el modulo SD son las siguientes;

* Se puede alimentar con 5V o 3,3V usando los pines correspondientes, pero no se debe de alimentar por ambos pines a la vez.

 Y las conexiones si se trabaja con el módulo micro SD son:

* Se puede alimentar con 3,3V en lugar de 5V usando el pin correspondientes, pero no se debe de alimentar por ambos pines a la vez.

Leer un archivo de la SD con Arduino

En este ejemplo vamos a leer un archivo de texto desde la SD. Para esto insertamos nuestra SD en el ordenador, abrimos y creamos un archivo de hoja de texto, por ejemplo archivo.txt, e introducimos el texto que posteriormente vamos a leer desde Arduino:

Seguidamente extraemos la tarjeta SD del ordenador, la insertamos en el módulo SD. Y cargamos el siguiente sketch en nuestro Arduino:

#include <SD.h>

File myFile;

void setup()
{
  Serial.begin(9600);
  Serial.print("Iniciando SD ...");
  if (!SD.begin(4)) {
    Serial.println("No se pudo inicializar");
    return;
  }
  Serial.println("inicializacion exitosa");
 
  myFile = SD.open("archivo.txt");//abrimos  el archivo 
  if (myFile) {
    Serial.println("archivo.txt:");
    while (myFile.available()) {
    	Serial.write(myFile.read());
    }
    myFile.close(); //cerramos el archivo
  } else {
    Serial.println("Error al abrir el archivo");
  }
}

void loop()
{
  
}

EL programa envía por el puerto serie todo el contenido del archivo guardado en la tarjeta SD.











No hay comentarios:

Publicar un comentario