Arduino + microSD: más funciones de la librería

Entre las funciones que aún no hemos visto están:
  • SD.usedBytes(<fichero>), que devuelve un long con los bytes empleados en el fichero. Es decir, los bytes desde el primero hasta el EOF, que para esta librería es el código ASCII 3.
  • SD.del(<fichero>), fija el primer byte del fichero a 0×03, es decir a EOF. Con esto la longitud del fichero pasa a ser 0, por lo que, a ojos de la librería, estará vacío y disponible para escribir. No borra el fichero, sólo su contenido. Y en realidad, tampoco borra todo su contenido: si después del del() y antes de escribir examinamos el fichero, veremos que se mantienen todos los contenidos, excepto el primer byte.
  • SD.startSector(<fichero>), retorna un long con el primer sector del fichero.
Y además, una serie de funciones interactivas que hablan (y escuchan) por el puerto serie, por lo que requieren que esté iniciado:
  • SD.ls(<fichero>), muestra en la terminal cuántos bytes y sectores tiene asignado el fichero, y cuántos bytes está utilizando.
  • SD.cat(<fichero>), vuelca por el puerto serie el contenido de fichero
  • SD.write(<fichero>), escucha por el puerto serie bytes hasta recibir un . (el punto normal y corriente). Guarda todo lo recibido en el fichero. No se hace eco de lo recibido.
  • SD.printEvent(<fichero>), manda un mensaje por el puerto serie informando de qué operación va a hacer o a hecho.
  • SD.append(<fichero>), añade al final del fichero lo recibido por el puerto serie hasta encontrar un punto. Se imprime lo recibido.
Lo mejor para hacerse una idea de cómo funcionan es jugar con el programa que suministran de ejemplo.

Arduino

Comments (0)

Permalink

Arduino + microSD: programación de la librería

Una vez que tenemos instalada la librería, que tenemos una tarjeta que funciona con la librería y que hemos probado que Arduino es realmente capaz de leer/escribir en ella, vamos a hacer nuestros propios programas.

En primer lugar, incluímos la interfaz de la librería:

#include “SDuFAT.h”

Esto nos proporciona un objeto llamado SD para acceder a la tarjeta.

Probablemente usemos el pin digital 8 para alimentar el shield, así que definimos una constante:

const unsigned short pinSDPower=8;

Y en la inicialización nos preocuparemos de alimentar el shield, poniendo a alto el pin 8:

pinMode(pinSDPower, OUTPUT);
digitalWrite(pinSDPower, HIGH);

Y, optativamente, silenciar los mensajes de la librería:

SD.verbose(OFF);

Por defecto, la librería arranca en modo parlanchín, por lo que cada vez que haya un error o haga algo, nos lo comentará mediante el puerto serie (que deberemos haber inicializado). Para activarlo o desactivarlo está el método SD.verbose(estado), siendo estado ON u OFF (constantes definidas en SDuFAT.h)
No he leído en ningún sitio que haya que dejarle tiempo para arrancar y no sé si hay que hacerlo.

Podemos usar el método SD.println(fichero, cadena) para añadir cadena al final de fichero, seguida de un salto de línea:

SD.println(“hola.txt”, “tengo hambre”);

O bien, sin salto de línea usamos la función print():

char pez[]=”quiero bananas”;
char glu[2];
for(int i=0; i glu[0]=pez[i]
glu[1]=0;
SD.print(“hola.txt”, glu);
}
SD.print(“hola.txt”, “\n”);

Los métodos print y println reciben siempre dos punteros a cadena de caracteres: uno para el nombre de fichero y otro para la cadena a imprimir. No se puede imprimir un caracter directamente, ni un entero ni un real. Con la implementación actual sólo se puede una cadena de caracteres.

En imprimir la frase letra por letra (15 bytes, 15 accesos de escritura), Arduino emplea 10 segundos. La velocidad de escritura es muy lenta porque la librería (creo yo, no he mirado la implementación en tanto detalle) debe recorrer todas las estructuras de datos de la FAT almacenadas en la microSD. Por lo que es mejor guardar lo que queramos imprimir en una cadena, y luego imprimir la cadena en el fichero. Además, mantener el número de escrituras al mínimo aumenta la vida de la tarjeta y podría, en mi opinión, ayudar a disminuir el consumo de corriente.

Arduino

Comments (0)

Permalink

Arduino + microSD: instalación de la librería

La gente de Libelium desarrollaron una librería para trabajar con este shield en el año 2008. Al parecer ahora David Cuartielles e Ino Schlaucher han adoptado el proyecto, aunque la realidad es que no hay mucho desarrollo en torno a él.

Una vez descargada, debe descomprimirse sobre el subdirectorio libraries/ de la instalación de arduino, y la próxima vez que iniciemos el IDE podremos utilizar con un simple #include “SDuFAT.h”.

Para probarla desarrollaron un pequeño programa que podemos compilar y subir al arduino. El programa está disponible en el propio ZIP de la librería, bajo el directorio examples/ (/libraries/examples). Lo tengo por aquí un poco modificado, porque había algún mensaje para el usuario que no estaba claro.

Antes de probarla, deberemos formatear la tarjeta microSD en formato FAT, si no lo estaba ya, y copiarle el fichero hola.txt que viene empaquetado con la librería (/libraries/hola.txt). La librería es limitada, por lo que no podemos crear un fichero nuevo, sino que escogemos uno ya creado, que podremos vaciar, añadirle nuevo contenido o leer. El tamaño de este fichero no es modificable por la librería, así que si se intenta escribir más allá del final del fichero, obtendremos un error.

Este programa, una vez quemado en al Arduino y ejecutándose, esperará órdenes del usuario vía el puerto serie. Mismamente con el Monitor de puerto serie del IDE de Arduino (Menú Tools/Serial Monitor, configurado a 9600, aunque en el ejemplo original se usan 19200 baudios) podemos enviar una ‘L’ para que nos muestre el tamaño del fichero hola.txt, y cuánto de él estamos utilizando. Otros comandos nos permiten ver el contenido del fichero, vaciarlo, añadirle contenido a voluntad, etc. La ‘H’ ofrece una breve ayuda.

Arduino

Comments (0)

Permalink

Arduino + microSD: el shield

Estos últimos días he estado jugando con el módulo microSD que venden en Libelium. Es un shield que permite añadir almacenamiento persistente a un Arduino mediante su bus ICSP.

En esencia, el módulo es una interfaz entre las patillas del bus y la tarjeta microSD. El resto de componentes son SMCs que juegan con la corriente, sin que haya ningún procesamiento intermedio de los mensajes, ni ninguna traducción entre el bus y la tarjeta.

El bus ICSP usa 6 patillas, aunque hay una variante de 10 patillas (y pareceser que para el ICSP esas cuatro patillas no aportan nada). Esas patillas son reloj (SCK), reset (SS), comunicación desde el AVR (MISO), comunicación hacia el AVR (MOSI) y las dos de alimentación.

El shield va conectado al Arduino con los pines digitales 9 (CD, Card Detection, no es ICSP, pero sí es de la tarjeta), 10 (SS, el reset), 11 (MOSI), 12 (MISO), 13 (SCK), el siguiente (14) que es GND, y el 8, si se pone alto, se puede usar para alimentar el shield (VCC).

No sólo se pueden usar esos pines, sino que en Arduino Duemilanove hay 6 pines junto al micro, al borde, a los que también se les puede conectar el shield, y que, de hecho, están puenteados con los de la fila lateral.

Arduino

Comments (0)

Permalink