Ampliación Memoria Arduino

Cuando se desarrolla un proyecto con Arduino, es posible que a medida que crezca en tamaño y complejidad nos quedemos sin memoria, ya sea sin SRAM que es lo más sencillo, al ser un recurso escaso, y también lo más fácil de solucionar o sin EEPROM o sin memoria flash.

Si al compilar un sketch ocupa mucho espacio y no cabe en la memoria flash, lo primero que se debe hacer es optimizar el código siguiendo estas recomendaciones. https://learn.adafruit.com/memories-of-an-arduino/optimizing-program-memory. Hay que tener en cuenta que no es posible ampliar la memoria flash de Arduino con memoria externa. Una alternativa es que si el sketch tiene muchos strings de solo lectura, imágenes, ficheros, arrays de gran tamaño, etc…, una solución es mover toda esa gran cantidad de datos a una tarjeta SD externa y leer los valores sólo cuando se necesitan.

En caso de necesitar más EEPROM  de la que dispone el microcontrolador, es sencillo usar EEPROM externas conectadas por I2C o SPI, aunque también es posible almacenar los datos no volátiles en una tarjeta SD externa en lugar de la EEPROM.

Un buen ejemplo de uso de una EEPROM externa I2C, puede ser la EEPROM de microchip 24LC256 con una capacidad de 32K x 8 (256 Kbit). Datasheet: http://ww1.microchip.com/downloads/en/DeviceDoc/21203M.pdf. Tutoriales:

Otra alternativa para la expansión de memoria es dataflash https://en.wikipedia.org/wiki/DataFlash que es un protocolo serie desarrollado por Atmel para el acceso a memorias Flash http://www.mouser.es/Search/Refine.aspx?Keyword=dataflash.

Más información:

O también es posible usar SPI flash memory como 4MBIT W25X40CLSNIG que usa Moteino para almacenamiento de datos y la programación inalámbrica. La librería desarrollada es https://github.com/LowPowerLab/SPIFlash.

En caso de quedarnos sin memoria SRAM, lo primero es seguir estos consejos para optimizar su uso y mover a la memoria flash (si queda espacio) todas los strings y datos que no se modifican en tiempo de ejecución (read-only):  https://learn.adafruit.com/memories-of-an-arduino/optimizing-sram.

Si con esto no es suficiente, entonces podemos ampliar la memoria SRAM. Obtener más SRAM es en realidad bastante sencillo. Hay módulos de SPI RAM (memoria volatil) como el microchip 23K256, data sheet: http://ww1.microchip.com/downloads/en/DeviceDoc/22100D.pdf. Dispone de 32k de SRAM con un interfaz SPI. Se accede a ellos a través de SPI y hay la biblioteca SpiRAM para ayudar a su uso. Debe tenerse en cuenta que opera a 3,3V y no 5V y que no es posible usarla con Arduino Mega.

Dado que no es posible ampliar la memoria flash de Arduino, ampliando la memoria SRAM, podríamos reestructurar el sketch y reducir el tamaño del código a expensas de aumentar el tamaño de los datos, haciéndolo un poco más lento.

Más información:

Uso de tarjetas SD en Arduino

Una forma ampliar la capacidad de almacenamiento de un Arduino es añadir una memoria externa y la forma más sencilla y barata es mediante un lector de tarjetas SD. Esto nos permite añadir un almacenamiento local no volátil para por ejemplo guardar un log de temperaturas o los datos de configuración de nuestro programa.

Como hemos visto anteriormente, tanto si nos quedamos sin memoria SRAM, flash o EEPROM podríamos recurrir al uso de una tarjeta SD para tratar de solucionar el problema directa o indirectamente.

En teoría, se podría ir tan lejos como traducir todo el sketch en algún lenguaje interpretado, almacenar esa versión del sketch en una tarjeta SD, y luego escribir un intérprete para que el lenguaje que se ejecute en Arduino y recoja, interprete y ejecute esas instrucciones de la tarjeta SD. Por ejemplo http://playground.arduino.cc//CommonTopics/ForthOnArduino que puede ser usado como una shell para ejecutar comando interactivos.

Veamos el uso de tarjetas SD con Arduino. Para ello lo primero que necesitamos es un HW externo que nos proporcione un lector de tarjetas y luego una librería adecuada para usar ese HW adicional.

Con la Ethernet shield disponemos de un lector de tarjetas micro SD y es accesible gracias a la librería SD: https://www.arduino.cc/en/Reference/SD

Otros shield interesante es el Adafruit datalogger shield que dispone de un lector de tarjetas SD, un RTC (Real Time Clock), una zona de prototipado para soldar componentes adicionales y dos LEDs indicadores configurables.

Más información: https://learn.adafruit.com/adafruit-data-logger-shield/overview

Otro HW para tarjetas SD:

La librería para manejar los lectores de tarjetas SD es la librería SD, el reference está disponible en http://arduino.cc/en/Reference/SD.Casi todos los módulos usan esta librería porque el acceso a la tarjeta SD es mediante el bus SPI directamente a la tarjeta o mediante un voltage level shifter.

La librería SD está basada en la librería SDfat: https://github.com/greiman/SdFat. Es compatible con sistemas de archivos FAT16 y FAT32 entarjetas SD estándar y tarjetas SDHC. Utiliza cortos 8.3 nombres de los ficheros. Los nombres de los archivos pasados a las funciones de la librería SD pueden incluir la ruta usando el caracter “/”, por ejemplo “directory/filename.txt”. El directorio de trabajo siempre es el root de la tarjeta SD.

Cuestiones a tener en cuenta cuando se usa la librería SD: https://www.arduino.cc/en/Reference/SDCardNotes

Tutoriales disponibles

  • Card Info: Obtiene información de la tarjeta SD.
  • Datalogger: Log data de tres entradas analógicas a la tarjeta SD.
  • Dump File: Lee un fichero de la SD card.
  • Files: Crea y borra un fichero de la SD card.
  • List Files: Imprime el listado de fichero en un directorio de la SD card.
  • Read Write: Lee y escribe datos de una SD card.

La librería SD tiene dos clases: SD que ofrece funciones para acceder a la tarjeta SD y manipular sus directorios y ficheros y la clase File que tiene los métodos para leer y escribir de ficheros individuales de la tarjeta SD.

Ver todos los métodos en https://www.arduino.cc/en/Reference/SD

Pineado de tarjetas SD:

Pin – Name – Description
1 – NC – not connected
2 – CS – Chip Select/Slave Select (SS)
3 – DI – Master Out/Slave In (MOSI)
4 – VDD – Supply voltage
5 – CLK – Clock (SCK)
6 – VSS – Supply voltage ground
7 – DO – Master In/Slave Out (MISO)
8 – RSV – Reserved

A la hora de conectar con Arduino, solo debemos definir en Arduino el pin CS (Chip Select). Antes de empezar a leer y escribir datos en la tarjeta SD de Arduino hay que utilizar la instrucción SD.begin(), determinando en el paréntesis el pin CS de tu shield de SD o del pin de la tarjeta SD. Esto quiere decir que si se utiliza una placa de Arduino UNO (o similar) se utiliza la instrucción SD.begin(10) pero si (por ejemplo) se utiliza el shield de Ethernet debe ponerse SD.begin(4).

Antes de utilizar la tarjeta SD de Arduino debes abrir el archivo sobre el que vayas a trabajar (verás cómo más adelante). Si por cualquier motivo pierdes la comunicación con dicho archivo antes de cerrarlo, podrías perder tus datos. Los datos solo se guardan cuando cierras el archivo o usas la función flush().

Más información:

Ejercicios con SD

Ejercicio30-SD: Grabar y leer en una tarjeta SD

Basarse en los tutoriales.

Solución:  https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio30-SD

Ejercicio50-DAQ_SD:  Leer y guardar en una tarjeta SD cada 30 segundos la temperatura y humedad de una sonda DHT22. Los datos son guardados en un fichero llamado datalog.csv. Los datos también son mostrados por en una pantalla LCD modelo https://www.sparkfun.com/products/9395

Para leer los datos de la SD y sacarlos por el puerto serie, usar el sketck: https://www.arduino.cc/en/Tutorial/DumpFile

Modificar el sketch para que funcione con la sonda y el display LCD del curso:

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio50-DAQ_SD

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s