miércoles, 9 de mayo de 2012

Arduino - Manejo de Memoria

La memoria es una parte importante de cualquier microcontrolador. En ella podemos almacenar variables que no deseemos que se borren al reiniciar o apagar el dispositivo, lo cual dependiendo del sistema, puede ser la parte principal del funcionamiento de dicho dispositivo.

Existen 3 fuentes de memoria en el microcontrolador utilizado por la placa Arduino:

Memoria Flash
La memoria Flash (espacio del programa) es donde Arduino almacena el sketch. Un sketch es el nombre que usa Arduino para un programa. Es la unidad de código que se sube y ejecuta en la placa Arduino.

Esta memoria es no volátil, si Arduino deja de ser alimentado eléctricamente los datos que haya en esta memoria permanecerán.

SRAM (Static Random Access Memory)

Donde los sketches almacena y manipulan variables al ejecutarse. 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.

La memoria SRAM de Arduino es muy pequeña, por lo que debemos optimizar nuestros 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 que incorpora 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

EEPROM es un espacio de memoria que puede ser utilizada por los programadores para almacenar información de largo plazo. Este tipo de memoria es no volátil, por lo que los datos guardados en ella permanecerán aunque Arduino pierda la alimentación. Esta memoria puede ser usada para guardar valores si es necesario.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.

El Arduino Uno que yo tengo, contiene las siguientes especificaciones de memoria:
  • Flash Memory 32 KB (ATmega328) of which 0.5 KB used by bootloader
  • SRAM 2 KB (ATmega328)
  • EEPROM 1 KB (ATmega328)
Manipulación de la EEPROM

El microcontrolador en el Arduino tiene una memoria EEPROM como ya habíamos visto. Para poder manejarla, existe la librería EEPROM que permite leer y escribir bytes en ella.

Las dos funciones principales son read() y write().
  • read(): 
    • Descripción: Lee un byte desde la memoria EEPROM. 
    • Sintaxis: EEPROM.read(address)
    • Parámetros:
      • address: La localización de donde se leerá, iniciando desde 0(int).
    • Retorna: El valor guardado en esa localización(byte)
  • write()
    • Descripción: Escribe un byte en la memoria EEPROM.
    • Sintaxis: EEPROM.write(address, value)
    • Parámetros:
      • address: la localización en donde se escribirá, iniciando desde 0(int)
      • value: el valor a escribir, de 0 a 255(byte)
    • Retorna: nada
    • Nota: Escritura en la memoria EEPROM toma 3.3 milisegundos en completarse. La memoria EEPROM tiene una vida específífica de 100, 000 escrituras o ciclos de borrado, así que se debe ser cuidadoso en como se escribe en ella.
Código de Escritura:

#include<eeprom.h>

void setup()
{
  for (int i = 0; i < 512; i++)
    EEPROM.write(i, i);
}

void loop()
{
}

El código es el que viene por ejemplo en la página de Arduino. No hay mucho que explicar, simplemente escribimos valores enteros desde 0 al 511 en la memoria EEPROM una sola vez, como se puede observar, ya que no colocamos código dentro de loop().

Código de Lectura:

#include<eeprom.h>

int a = 0;
int value;

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  value = EEPROM.read(a);

  Serial.print(a);
  Serial.print("\t");
  Serial.print(value);
  Serial.println();

  a = a + 1;

  if (a == 512)
    a = 0;

  delay(500);
}

Ahora para poder verificar que lo anterior funciono, programamos este código para poder leer los datos que fueron almacenados anteriormente de la memoria EEPROM. El código inicializa una conexión serial, y lee los valores almacenados en la memoria, para después imprimirlos y visualizarlos en la computadora.

El resultado es el siguiente:


(Y continua imprimiendo todos los valores que se leen de la memoria EEPROM)


Ampliando la memoria

Dependiendo del uso que se vaya a dar para el Arduino, las memorias Flash, SRAM y EEPROM pueden resultar muy limitadas. Es decir, si queremos capturar vídeo o fotos de alguna manera y guardarla en las memorias del Arduino, de nada nos serviría utilizarlas, ya que estos archivos pesan mucho más de lo que soportan. Para esto existen alternativas de expansión, agregando una memoria EEPROM externa o con módulos para tarjeta SD.
  • EEPROM externa

Una posibilidad para ampliar la capacidad de memoria de Arduino es usar memoria EEPROM externa, adquiriendo este tipo de memoria (que no es muy cara) podremos disponer de más memoria EEPROM para nuestro programa. Este tipo de memoria es no volátil. Por ejemplo, una EEPROM 24LC64 puede costar unos 4 euros y tiene 64K de tamaño: 

Obviamente, este tipo de memorias EEPROM no tienen un gran tamaño, por ello, no serán útiles para proyectos con grandes requerimientos de espacio.
  • Módulo SD
Si se requiere desarrollar un proyecto hardware con Arduino que tenga grandes requerimientos de espacio (Megas, Gigas), por ejemplo si queremos trabajar con audio, vídeo, fotos, almacenamiento de datos, etc., la mejor opción es utilizar algún tipo de medio de almacenamiento removible. La mayoría de los microcontroladores tienen una capacidad de memoria interna extremadamente limitada, como ya hemos comentado.

Para conseguir este almacenamiento extra utilizaremos las tarjetas flash (SD, microSD). Estás tarjetas permiten almacenar varios GBytes de datos en un espacio muy reducido.
Para conectarla al Arduino, podemos usar un módulo SD como el siguiente:

4 comentarios:

  1. Muy bien; 10 pts lab integrados.

    ResponderEliminar
  2. Y como que Valor Aproximadamente tiene este el Modulo SD

    ResponderEliminar
  3. Disculpa Amigo.!
    Habria la posibilidad de que funcione un arduino solo conectando mi flash memory y lea el programa que esta ahi?
    Lo que pasa esque quiero hacer un carro que funcione inalambricamente del computador y solo poniendo mi Memoria Flash, ejecute el codigo que estaba ahi!! .
    Porfavor responde

    ResponderEliminar
  4. Y como borras por completo la memoria????he probado varias formas y no me funciona, me podrias ayudar

    ResponderEliminar