miércoles, 2 de mayo de 2012

Manejo de memoria

En esta entrada mostrare el manejo de memoria que podría tenerse en un arduino y como podemos ampliar las posibilidades de almacenamiento en el. 



En los microcontroladores la memoria de instrucciones y datos está integrada en el propio chip. Una parte debe ser no volátil, tipo ROM, y se destina a contener el programa de instrucciones que gobierna la aplicación. Otra parte de memoria será tipo RAM, volátil, y se destina a guardar las variables y los datos.

Tipos de memoria en Arduino: Flash, SRAM y EEPROM
Existen tres tipos de memoria en los microcontroladores utilizados por las placas Arduino(ATmega168, ATmega328, ATmega1280, etc.): Memoria Flash, memoria SRAM y memoria EEPROM. 
Aqui les indicare las diferencias de cada una de ellas y el uso que Arduino pude darles.


Memoria Flash (espacio del programa) en Arduino
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.
  • 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 memoria Flash es de 16 kilobytes, de los cuales 2 kilobytes son utilizados por el bootloader. 
  • Para el caso del microcontrolador ATmega328 (como el que incorpora Arduino UNO) el tamaño de la memoria Flash es de 32KB, de los cuales el bootloader usa 0,5KB. Por lo que debemos desarrollar los programas de forma muy optimizada, usando los tipos de variables que menos memoria requieran, en la medida de lo posible. 
  • También debemos optimizar el código fuente de la aplicación para no repetir líneas de código.

Memoria SRAM (Static Random Access Memory ó memoria estática de acceso aleatorio) en Arduino
La memoria SRAM (Static Random Access Memory ó memoria estática de acceso aleatorio) es de tipo volátil, es el espacio donde los sketches (programas) almacenan 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.
  • A continuación muestro algunos consejos para optimizar los programas y evitar que consuman toda la memoria SRAM disponible:
  • Si el programa se comunica con una aplicación ejecutándose en un ordenador, se puede intentar trasladar los datos o cálculos al ordenador, reduciendo la carga en el Arduino.
  • Si el programa usa tablas de referencia u otros arreglos de gran tamaño, es recomendable utilizar el tipo de datos más pequeño que se pueda para almacenar estos datos; por ejemplo, un "int" utliza 2 bytes, mientras que un "byte" utiliza solo 1 byte (pero puede almacenar un rango menor de datos).
  • Si no se necesita modificar las cadenas o datos mientras el programa se ejecuta, se pueden almacenar en la memoria Flah (de programa) en vez de la SRAM; para esto, hay que utilizar el keyword PROGMEM.

Memoria EEPROM en Arduino
EEPROM es un espacio de memoria que puede ser utilizado por los programadores para almacenar información a 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. 
  • 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.

Cómo ampliar las posibilidades de almacenamiento de Arduino

Cómo se ha indicado, las diferentes memorias de los chips de Arduino (Flash, SRAM y EEPROM) son demasiado limitadas para determinadas funcionalidades. Por ejemplo, si conectamos una cámara de fotos o de vídeo a Arduino y queremos guardar capturas de fotos o vídeos no nos servirán estas memorias.
Para esto existen memorias externas que pueden ayudar a solucionar los problemas y tener un mejo manejo de memoria para que no ocurra ningún error. 


Ampliar con memoria 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.
Pero este tipo de memorias EEPROM no tienen un gran tamaño, por ello, no serán útiles para proyectos con grandes requerimientos de espacio. Por supuesto existen librerías para trabajar con estas tarjetas en Arduino.


Ampliar memoria con SD Card       
Si vamos a 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.
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.

Este es un módulo SD Card para Arduino, acoplable directamente:


Aquí una SD Card para Arduino que tenemos que conectar manualmente, como se muestra en la imagen:


  • Flash 16k bytes (de los que 2k son utilizados por el bootloader)
  • SRAM 1024 bytes
  • EEPROM 512 bytes

Como escribir en la memoria EEPROM de Arduino
La comunicación entre Arduino y la EEPROM se realiza mediante el bus I2C , que se trata de un bus de comunicaciones serie formado por dos lineas: una para los datos y otra para el reloj.
La librería Wire  permite manejar un bus I2C desde nuestro Arduino, y encontramos 4 funciones que usando la librería anterior implementan la lectura/escritura en la EEPROM.
  • El parámetro deviceaddress al que hacen referencia estas funciones en el caso de esta memoria se trata del 0×50.
  • No debemos olvidarnos de inicializar la conexión antes de usar estas funciones
  • En cuanto a las conexiones de los pines: el pin 5 de la EEPROM (SDA) lo conectamos a la entrada analógica 4 de nuestro Arduino, el pin 6 (SCL) a la entrada analógica 5 (observar en la foto que los cables de color naranja se cruzan), el pin 8 a 5V y todos los demás a tierra.

  • Los pines analógicos 4 y 5 de Arduino son los que usa la librería Wire.



1 comentario: