Micropython: Usando el Micro SD shield de la D1 Mini

Si bien los módulos ESP tienen una buena cantidad de memoria Flash, a veces necesitamos de almacenamiento extra y las tarjetas SD se presentan como una excelente opción. En este artículo veremos como utilizar un shield específico que se encuentra disponible para la D1 mini y que nos permitirá agregar la capacidad de almacenamiento de tarjetas SD a nuestros proyectos.

Usando tarjetas SD

Si tenemos la necesidad de almacenar grandes cantidades de información, como por ejemplo imágenes que vamos a mostrar en un LCD, archivos de música o sonido que vamos a reproducir en un parlante o necesitamos de un medio extraíble para sacar con facilidad la información almacenada por ejemplo por un data logger que guarda datos de varios sensores o fotografías tomadas por una cámara como la ESP-32 CAM o datos de posición provenientes de un GPS, una opción mas que interesante por su bajo costo es emplear algún tipo de adaptador que nos permita conectarnos a una tarjeta SD.

Para el caso de la D1 mini contamos con un shield dedicado a tal función que se puede montar con facilidad junto a nuestra placa ahorrándonos la necesidad de realizar conexiones.

Fig. 1. La Micro SD shield sobre la D1 mini

Conexiones

La tarjeta SD se conecta al ESP8266 de la D1 mini a través de una interface serie SPI, que emplea cuatro señales para la comunicación: MOSI (Master Out Slave In), MISO (Master In Slave Out), SCLK (Serial Clock) y SS (Slave Select). El ESP8266 funciona como Master y la SD como Slave. El ESP8266 tiene dos interfaces SPI, denominadas SPI y HSPI. La primera está reservada para la programación de la memoria Flash y la segunda está disponible para interconectar dispositivos compatibles, por lo que la tarjeta se conecta a esa interfaz.

Las conexiones en el shield son las siguientes:

  • D5 — SCLK
  • D6 — MISO
  • D7 — MOSI
  • D8 — SS

Como siempre sucede con este tipo de shields, que son fabricados por distintos proveedores, nos encontraremos con diferencias respecto de la información “oficial” de Wemos, que es la marca original de la D1 Mini. En este caso, el shield de Wemos tiene dos jumpers que nos dan varias posibilidades para conectar la señal SS de la tarjeta, pero el que ha caído en mis manos no cuenta con esa posibilidad, estando esa conexión fija al pin D8.

Programa

El port de Micropython para ESP8266 no incluye soporte para tarjetas SD, así que debemos importar un módulo externo específico para estas funciones. Lo podemos descargar del mismo repositorio de Micropython, en la carpeta micropython/drivers/sdcard/ Además del driver. que es el archivo sdcard.py también pueden ver un ejemplo de uso en el archivo sdtest.py

Una vez descargado sdcard.py y copiado a la memoria de nuestra D1 mini, veamos como debemos utilizarlo en el siguiente ejemplo que muestra el contenido de la tarjeta presente en el shield (la tarjeta debe estar formateada previamente usando el sistema de archivos FAT, como el que usa Windows)

import os, machine
import sdcard

spi = machine.SPI(1)
spi.init()

SS = machine.Pin (15)

sd = sdcard.SDCard(spi, SS) 

vfs = os.VfsFat(sd)

os.mount(vfs, "/sd")

print("Contenido de la tarjeta:")
print(os.listdir("/sd"))

En la línea 1 se importan los módulos os y machine que necesitaremos luego y en la línea 2 el módulo sdcard, que es el que copiamos a la memoria de la placa.

En la línea 4 se crea un objeto spi para esa interface. Recuerden que el ESP8266 tiene dos, la que se identifica como 0 se utiliza para la Flash interna y la identificada como 1 que podemos utilizar para otras funciones. Por eso el constructor SPI tiene como parámetro 1.

En la línea 5 se inicializa la interface SPI. El formato del método es:

SPI.init (baudrate=1000000*polarity=0phase=0bits=8firstbit=SPI.MSBsck=Nonemosi=Nonemiso=Nonepins=SCK, MOSI, MISO)

Los valores por omisión son apropiados para el funcionamiento de la tarjeta, por lo que no es necesario que le pasemos parámetro alguno (en otro artículo entraré en detalle sobre el significado de cada uno).

En la línea 7 se crea un objeto tipo Pin llamado SS en GPIO15 (D8), que es el que usaremos para habilitar la tarjeta.

A continuación en la línea 9 se crea el objeto sd asociado a la tarjeta. Debemos pasarle como parámetros el objeto de la interface SPI (spi) y el pin de habilitación de la tarjeta (SS).

Luego en la línea 11 se crea un objeto del tipo sistema de archivos (vfs) que usa el formato FAT (compatible con Windows) en la tarjeta (sd).

En la línea 13 montamos ese sistema de archivos en el sistema de archivos de Micropython (como se monta una unidad en Linux) en el directorio sd.

Llegados a este punto la tarjeta ya está lista para ser utilizada.

Las líneas 15 y 16 sólo sirven para mostrar el contenido de la tarjeta y comprobar su correcto funcionamiento.

Solo lectura

Si queremos usar la tarjeta sólo para leer datos, puede ser útil montarla como sólo lectura. Para ello debemos usar os.mount con la siguiente sintaxis:

os.mount (vfs, “/sd”, readonly=True)

Comprobemos el funcionamiento de la tarjeta escribiendo y leyendo algunos archivos. Les sugiero que, si no lo han hecho antes, lean este artículo y este otro que detallan los métodos y funciones que se utilizan para guardar y leer información en el sistema de archivos de Micropython.

Primero grabemos información de texto:

import os, machine
import sdcard

spi = machine.SPI(1)
spi.init()

SS = machine.Pin (15)

sd = sdcard.SDCard(spi, SS) 

vfs = os.VfsFat(sd)

os.mount(vfs, "/sd")

#Crear un archivo y escribir texto
file = open ("/sd/archivo.dat", "w")

file.write ("Esta es una prueba\n")
file.write ("del funcionamiento\n")
file.write ("del Shield SD en D1 mini\n")

file.close ()

En el ejemplo anterior, luego de montar la tarjeta abrimos en modo escritura un archivo llamado “archivo.dat” en la tarjeta y escribimos en él algunas líneas de texto, para luego cerrarlo.

Si llevamos la tarjeta a una PC podemos comprobar que el texto se haya guardado correctamente:

Fig. 2. Abriendo la tarjeta en la PC

Ahora en la PC copiamos a la tarjeta una imagen PNG:

Fig. 3. Imagen en la tarjeta SD

Y luego de volver a insertar la tarjeta en el shield, leemos los primeros 8 bytes de la imagen abriéndola como archivo binario.

import os, machine
import sdcard

spi = machine.SPI(1)
spi.init()

SS = machine.Pin (15)

sd = sdcard.SDCard(spi, SS) 

vfs = os.VfsFat(sd)

os.mount(vfs, "/sd")

buf = bytearray (8)

#Abre la imagen y lee los primeros 8 bytes
file = open ("/sd/bender48.png", "rb")
buf=file.read (8) 
file.close ()

print (buf)

La última línea nos imprime los 8 bytes leídos que, si todo funcionó correctamente, deben ser la “firma” que tienen todos los archivos PNG al comienzo (los valores 137, 80, 78, 71, 13, 10, 26, 10).

Fig. 4. Firma del archivo PNG

Conclusión

Vimos las características de la “Micro SD shield” de la D1 mini y los detalles de su conexión interna. También analizamos el procedimiento para crear un sistema de archivos FAT con la tarjeta y montarlo en el sistema de archivos de Micropython. Vimos también algunos ejemplos de grabación y lectura de datos y comprobamos que el formato de la tarjeta es totalmente compatible con Windows.

Espero que esta información les sea de utilidad para incorporar este utilismo shield en sus propios proyectos. Cualquier duda o sugerencia, pueden dejarla mas abajo en la sección de comentarios.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Habilitar notificaciones OK No, gracias