Llevo meses y meses retrasado con uno de los proyectos que tenía para la Arduino Leonardo (un sencillo seguidor de luz solar) porque estoy usando la placa para otras cosas. El caso es que si recordáis de este post, tenía en casa ya la placa para escribir a la SD y recuerdo haber tenido ciertos problemas para escribir a ella. Pues bien, hace unos días necesitaba escribir a la SD con Leonardo y los problemas persisten.

Fundamentalmente se deben a que, a diferencia de en la UNO, en la Leonardo la comunicación SPI funciona por hardware no estando los pines SPI disponibles en la tabla en ningún otro sitio que no sea el ICSP que trae la propia placa y que os comenté en el post que os referencio. Esto es un problema porque muchas placas no soportan la conexión por ICSP vaya usté a saber porqué (no soy ningún mago de la electrónica pero para el que quiera entender bien el protocolo SPI le animo a leer esto).

Bueno, después de muchas vueltas he conseguido escribir en la tarjeta SD así que os lo dejo aquí por si alguien tiene problemas con la SD y la Leonardo (y como nota mental futura para mi también).

Para empezar, el código que usé, como veis solo escribo “,” nada más que para probar:

#include
#include

SdFat sd;
const int chipSelect = 4 ;
const int analogPin = A1;

File dataFile;

void setup()
{
// Abrimos las comunicaciones serial y esperamos...
Serial.begin(9600);
while (!Serial) {
; // Es necesario esto porque la Leonardo tarda en conectar el Serial
}

Serial.print("Iniciando la tarjeta SD...");
// El chipSelect tiene que ser puesto a output aunque luego no se usase,
// que en este caso usaremos...
pinMode(chipSelect, OUTPUT);
pinMode(SS, OUTPUT);

// Iniciamos la tarjeta y comprobamos si se ha iniciado. Si el inicio es correcto,
// begin devuelve true.
// Tambien podeis usar SPI_FULL_SPEED para mas velocidad de lectura/escritura pero
// el SD.h original de arduino venia a velocidad media y me es suficiente asi que
// lo deje asi
if (!sd.begin(chipSelect, SPI_HALF_SPEED)) {
Serial.println("Card failed, or not present");
sd.initErrorHalt();
}
Serial.println("card initialized.");

// Abrimos el archivo que vamos a escribir
// PARA GARANTIZAR QUE FUNCIONE, YO CREO ANTES EL ARCHIVO EN LA TARJETA CON EL
// EXPLORADOR DE WINDOWS !!!!
dataFile = sd.open("datalog.txt", FILE_WRITE);
if (! dataFile) {
Serial.println("Error abriendo datalog.txt");
// Wait forever since we cant write data
while (1) ;
}
}

void loop()
{
// Un string para ir poniendo en el datalog
String dataString = "";

dataString += ",";

dataFile.println(dataString);

// Escribir tambien en la Serial para ven en pantalla lo que hace
Serial.println(dataString);

// Si pongo la orden flush, se salvan los datos a la SD cada vez que se crea una linea de datos
// Esto es mas seguro pero mas lento y limita la velocidad del loop() asi que ojo
// Si quiero mas velocidad pues quito esta orden, asi solo se escribira cada vez que se llene
// un sector completo de la SD (cada 512 bytes).
dataFile.flush();

// Un delay para escribir una coma cada 0,5 segundos
delay(500);
}

Un código sencillo.

Como veis, se usa la librería Sdfat.h: este autor me ha salvado el día. Podéis encontrarla en github aquí, para ver sus últimas versiones.

La placa de la SD va conectada a los ICSP de Arduino según su propio esquema:

icspheader

No usé el pin 2 porque conecté la alimentación directamente a los 5V en la sección de power de la placa (ojo a si vuestra placa de SD soporta 5 o 3,3V) y la conexión CS (chipSelect) de la placa SD va hacia el pin 4 que he marcado en el código anterior. Un par de fotos para que lo veáis:

Y ya está, he conseguido escribir a la SD usando la Leonardo. Ha costado lo suyo. Espero que a alguien le sea de utilidad. Comentad si usáis otro método o tenéis alguna duda.

Salu2.

 

Anuncios