May 9, 2012

Memoria en Arduino

En Arduino existen 3 tipos de memoria en el microcontrolador utilizado por la placa:
  • Memoria Flash (espacio del programa) 
    Esta memoria es no volátil, si Arduino deja de ser alimentado eléctricamente los datos que haya en esta memoria permanecerán. En esta memoria es donde Arduino almacena el sketch, ques es el nombre que usa Arduino para un programa. Es la unidad de código que se ejecuta en la placa Arduino.

    El tamaño de la memoria Flash de Arduino puede variar dependiendo del microcontrolador, aunque no es muy grande. Por ejemplo, para el chip ATmega168 el tamaño de la Flash es de 16 kb, de los cuales 2 kb son utilizados por el bootloader. Para el ATmega328 (chip que incorpora Arduino UNO) el tamaño de la memoria Flash es de 32KB, de los cuales el bootloader usa 0.5 KB.
  • SRAM (static random access memory, memoria estatica de acceso aleatorio) 
    Es el espacio donde los sketches almacenan y manipulan variables a ejecutarse, y es de tipo volátil.

    La información guardada en esta memoria será eliminada cuando Arduino pierda la alimentación. Esta memoria es de uso exclusivo para el programa en ejecución.

    Esta memoria es muy pequeña, por lo que se deben optimizar los programas al máximo y no abusar de variables de tipo char muy grandes. Hay que tener en cuenta que cada carácter de una variable char utiliza un byte. En el microcontrolador ATmega 168 el tamaño de la memoria SRAM es de 1024 bytes, para el caso de un chip ATmega328, como el de Arduino UNO, el tamaño es de 2KB (2048 bytes).

    Si la SRAM se queda sin espacio, el programa de Arduino fallará de forma imprevista, aunque se compile y se suba a Arduino correctamente la aplicación no se ejecutará o se ejecutara de manera extraña.
  • EEPROM
    Es un espacio de memoria que puede ser utilizada por los programadores para almacenar información de largo plazo.

    El tamaño de la EEPROM para un chip ATmega128 es de 512 bytes, para un chip ATmega328 es de 1KB (1024 bytes). Hay que tener en cuenta que el tamaño de la memoria EEPROM interna de Arduino es "pequeño" pero Arduino admite añadir módulos de memoria EEPROM externa de mayor tamaño.


Algunos consejos para evitar consumir toda la memoria interna de la que dispone el Arduino son los siguientes:
  • Si el programa se comunica con una aplicación ejecutándose en una computadora, se puede intentar trasladar los datos a la computadora, y esto reducirá la carga en el Arduino.
  • Si el programa usa tablas de referencia o arreglos de gran tamaño, se recomienda utilizar el tipo de datos más pequeño que se pueda; por ejemplo, un int utliza 2 bytes, mientras que un byte utiliza solo 1 byte.
  • Si no se necesita modificar las cadenas o datos mientras el programa se ejecuta, se pueden almacenar en la memoria Flash en vez de la SRAM; para esto, hay que utilizar el instrucción PROGMEM.


Ampliar almacenamiento en Arduino

Cómo ya pudieron haber notado, las diferentes memorias de los chips de Arduino (Flash, SRAM y EEPROM) son muy limitadas para funcionalidades que requieren mayor espacio de memoria, por ejemplo, si se conecta una cámara de fotos o de vídeo a Arduino y se quiere guardar capturas de fotos o vídeos no servirán estas memorias.


Memoria EEPROM externa

Una posibilidad para ampliar la capacidad de memoria de Arduino es usar memoria EEPROM externa, adquiriendo este tipo de memoria se puede disponer de más memoria EEPROM para cualquier programa. Este tipo de memoria es no volátil y cabe aclarar que no tienen un gran tamaño, por ello, no serán útiles para proyectos con grandes requerimientos de espacio.

Para manejar este tipo de memorias existen librerías para trabajar con estas tarjetas en Arduino.


Tarjeta SD

Si lo que se va a desarrollar es un proyecto más grande, que requiere espacio de Megas o Gigas, por ejemplo trabajar con audio, vídeo, fotos, almacenamiento de datos, etc., la mejor opción es utilizar alguna memora extraíble.

Para conseguir almacenamiento extra se puede utilizar tarjetas flash (SD, microSD). Estás tarjetas permiten almacenar varios GBytes de datos en un espacio muy reducido.

Existen módulos SD para Arduino que se pueden acoplar fácilmente
Y al igual que con las memorias EEPROM externas, también existen librerías que permiten manejar este tipo de memorias.





Programa

Por último aquí les dejo un sencillo programa que escribe 1024 veces en la memoria EEPROM del Arduino UNO:



1 comment: