Professional Documents
Culture Documents
variables y, de repente ste se apaga? Qu pasa con todas las variables que
se han ido almacenando? Perdemos toda la informacin? En este tutorial os
explicaremos cmo gestionar la memoria EEPROM de Arduino.
EEPROM?
La EEPROM (de las siglas en ingls Electrically Erasable Programmable Read-Only
Memory) es un tipo de memoria que no necesita energa para mantenerse (por ello la llaman
memoria no voltil), y es, por decirlo de alguna manera, como un disco duro, dado que la
podemos usar para almacenar datos incluso cuando nuestra placa est apagada.
Cunta memoria EEPROM tiene mi placa?
Depende de la placa con la que ests programando hay ms o menos memoria EEPROM, lo
que te va a permitir almacenar ms o menos variables. Veamos algunas de las placas
Arduino:
Veamos un ejemplo que nos muestre qu tiene la EEPROM de nuestra placa Arduino:
Vamos a utilizar dos sketch diferentes para comprobar que, una vez apagamos y
encendemos el Arduino para cargar el segundo sketch, la temperatura sigue almacenada.
Necesito ms EEPROM
Est bien, la cantidad de EEPROM de las placas puede que no nos sea suficiente para
almacenarlo todo si ese es nuestro caso se puede conseguir poner una memoria externa.
La comunicacin entre una placa Arduino y una EEPROM se realiza va bus I2C. En la
pgina oficial de Arduino tenis un tutorial que os explica a cmo conectar una externa.
********************************************************
EEPROM es un espacio de memoria que puede ser utilizado por los programadores para
almacenar informacin a largo plazo. Este tipo de memoria es no voltil, por lo que los
datos guardados en ella permanecern aunque Arduino pierda la alimentacin. Esta
memoria puede ser usada para guardar valores si es necesario. Ms adelante explicaremos
cmo guardar y leer valores de esta memoria.
El ejemplo anterior se ejecutar una sola vez (no hemos usado "loop"). El bucle for se
ejecutar 1024 veces y guardar en cada posicin de la memoria el valor actual de i,
teniendo en cuenta que el valor mximo que se puede guardar en una posicin de memoria
es de 255, por ello cuando llegamos a 255 guardamos el valor de i menos 255.
A continuacin mostramos un sencillo ejemplo que lee y enva por el puerto serie de
Arduino todos los valores guardados en la memoria EEPROM (de un Arduino UNO, que
tiene 1024 valores):
#include
int posicionActual = 0;
int valorLeido;
void setup()
{
Serial.begin(9600);
}
void loop()
{
//obtenemos el valor de la posicin "posicionActual" de la EEPROM
valorLeido = EEPROM.read(posicionActual);
//enviamos por el puerto serie la posicin leda
Serial.print(posicionActual);
Serial.print("
");
//enviamos por el puerto serie el valor ledo de la posicin
Serial.print(valorLeido);
Serial.println();
//incrementamos la posicin actual, puesto que el programa se
//ejecuta indefinidamente leeremos todas las posiciones de memoria
EEPROM
posicionActual = posicionActual + 1;
//puesto que el programa se ejecuta indefinidamente
//para evitar que d error cuando nos excedamos de la ltima posicin
//de la EEPROM, cuando lleguemos al mximo 1024 empezaremos de nuevo
if (posicionActual == 1024)
posicionActual = 0;
//esperamos un segundo
delay(1000);
}
Obviamente, este tipo de memorias EEPROM no tienen un gran tamao, por ello, no sern
tiles para proyectos con grandes requerimientos de espacio.
Por supuesto existen libreras para trabajar con estas tarjetas en Arduino.
Si vamos a desarrollar un proyecto hardware con Arduino que tenga grandes requerimientos
de espacio (Megas, Gigas), por ejemplo si queremos trabajar con audio, vdeo, fotos,
almacenamiento de datos, etc., la mejor opcin es utilizar algn tipo de medio de
almacenamiento removible. La mayora 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).
Ests tarjetas permiten almacenar varios GBytes de datos en un espacio muy reducido.
En la imagen mostramos un mdulo SD Card para Arduino, acoplable directamente:
En este otro ejemplo mostramos una SD Card para Arduino que tenemos que conectar
manualmente, como se muestra en la imagen:
Por supuesto existen libreras para trabajar con estas tarjetas en Arduino.
***************************************************************
Por si todava no lo sabas, te dir que tu Arduino dispone de una memoria EEPROM, es
decir, una memoria no voltil (como la de un disco duro) en la que puedes almacenar datos
sin preocuparte de perderlos cuando le quites la alimentacin a tu Arduino. En este post
aprenders cmo usar la memoria EEPROM de Arduino para reutilizar los datos
importantes, recuperar la configuracin de tu Arduino o incluso pasar datos de un
sketch a otro.
Generalmente la memoria EEPROM de Arduino suele estar bastante desaprovechada. No s
si ser por desconocimiento o miedo a la hora de utilizarla pero es una lstima ya que, con
unas cuantas lneas de cdigo y por menos de 1kB de aumento en el tamao del sketch,
puedes tener a tu disposicin un recurso realmente interesante.
Utilizar la EEPROM de tu placa es especialmente til a la hora de guardar la
configuracin de tu Arduino (como por ejemplo las direcciones MAC e IP que aprendiste
a usar en este artculo) pero su uso va mucho ms all. Si quieres calibrar un sensor (por
ejemplo una LDR) para fijar sus valores lmite, no tienes por qu utilizar un cdigo que
siempre calibre el sistema al iniciarse (en el setup), puedes implementar un cdigo que
calibre y guarde los datos en la memoria EEPROM y, una vez los hayas guardado,
utilizarlos en otro sketch. Gracias a ello ahorrars espacio en tu microcontrolador y te
asegurars de que esos datos no dependen del da o la zona en la que utilices tu sistema
(volviendo al ejemplo de la LDR, puedes conseguir, por ejemplo, que si reinicias tu
Arduino por la noche, conserve los dato almacenados durante el da).
Cada modelo de placa posee una EEPROM distinta. Aunque en casi cualquier tipo de
proyecto te va a sobrar espacio con independencia de tu Arduino, aqu tienes una lista con
Programando la EEPROM
Leer y escribir un solo byte es realmente sencillo. Aqu te dejo un ejemplo para
que veas cmo se hace.
//Se tiene una variable compuesta por 2 bytes, por ejemplo un tipo int.
int A =800;
//Se crean dos variables de tipo byte para almacenar la informacin.
byte L;
byte H;
//Se almacenan los bytes ms y menos significativos.
H = highByte(A);
L = lowByte(A);
//Se escriben los bytes en direcciones de memoria contiguas.
EEPROM.write(Direccion, H);
EEPROM.write(Direccion+1, L);
************************************************************************
igual que muchos otros micro controladores posee una memoria no voltil, con un esacio de
almacenamiento ms reducido que la memoria voltil, pero an as muy til para nuestros
propsitos.
Me estoy refiriendo a la memoria EEPROM (Electrically Erasable Programmable ReadOnly Memory, o ROM programable y borrada elctricamente).
Casi todos los modelos de Arduino tienen una EEPROM disponible, con diferentes
capacidades dependiendo del modelo.
read()
write()
Con el mtodo read() se lee los valores que se hayan guardado en determinada posicin de
memoria, mientras que con el mtodo write() se guarda la informacin en las posiciones de
memoria.
Las posiciones de memoria son el equivalentes a casillas donde se guarda la informacin.
La cantidad de casillas disponibles depende del modelo. La cantidad de bytes equivale a
la cantidad de casillas, por lo que un modelo de 512 bytes tendr disponibles 512 casillas
disponibles para guardar datos.
Para escribir datos se utiliza:
write(posicin, valor)
Ejemplo:
#include <EEPROM.h> //Se implementa la librera EEPROM
void setup()
{
for (int i = 0; i < 512; i++)
EEPROM.write(i, i);
}
void loop()
{
}
void loop()
{
while (direccin>=0){
// Lee un byte de cada direccion de la EEPROM
valor = EEPROM.read(direccion);
Serial.print(direccion);
Serial.print("t");
Serial.print(valor, DEC);
Serial.println();
// incrementa "direccion" en 1 para avanzar a la siguiente direccin de la
EEPROM
direccion = direccion++;
// Solamente hay 512 bytes de EEPROM, desde 0 hasta 511
// Si estamos en la direccion 512, volvemos a la direccin 0
if (direccion == 512){
direccion = -1;
}
delay(500);
}
}
-------------------------------------------------------------------------------------------------------------
http://www.ajpdsoft.com/modules.php?name=News&file=article&sid=571
http://panamahitek.com/guardando-datos-en-arduino-utilizando-la-memoriaeeprom/
http://www.educachip.com/como-usar-la-memoria-eeprom-de-arduino/
http://www.opiron.com/portfolio/como-gestionar-memoria-eeprom-de-arduino