Devo fare un progetto in cui ho dei dati da salvare all'interno della scheda SD, il problema nasce quando vado a provare lo sketch datalogger la scheda la riconosce ma quando va a salvare i dati all'interno del file non so perché ma non tutti li salva in alcuni casi, appare il carattere NULL al posto del dato, oppure, la stringa viene scritta in parte cioè per metà. Questo quando va bene, altrimenti appena provo ad inserire la scheda nel pc mi appare una finestra in cui dice che il file system è danneggiato.
Questo tipo di problema mi si presenta solo con il progetto datalogger perché con lo sketch ReadWrite il file viene scritto/letto correttamente sia dal pc che dal pic.
Utilizzo l'arduino mega e una Shield per la Sd collegata in questo modo :
ho modificato il programma in modo che il pin cs sia sul piedino n°53.
no, nessuna modifica, i pin corretti sono
pinMode(SS_PIN, OUTPUT);
digitalWrite(SS_PIN, HIGH);
pinMode(10, OUTPUT); // Set the CS pin as an output
digitalWrite(10, 1); // Turn off the W5100 chip! (wait for configuration)
pinMode(4, OUTPUT); // Set the SDcard CS pin as an output
digitalWrite(4, 1); // Turn off the SD card! (wait for configuration)
ho modificato il programma in modo che il pin cs sia sul piedino n°53.
no, nessuna modifica, i pin corretti sono
pinMode(SS_PIN, OUTPUT);
digitalWrite(SS_PIN, HIGH);
pinMode(10, OUTPUT); // Set the CS pin as an output
digitalWrite(10, 1); // Turn off the W5100 chip! (wait for configuration)
pinMode(4, OUTPUT); // Set the SDcard CS pin as an output
digitalWrite(4, 1); // Turn off the SD card! (wait for configuration)
ciao
Grazie in anticipo per la risposta ma nei commenti della libreria dice che il pin cs nell'arduino mega è il numero 53
// On the Ethernet Shield, CS is pin 4. Note that even if it's not
// used as the CS pin, the hardware CS pin (10 on most Arduino boards,
// 53 on the Mega) must be left as an output or the SD library
// functions will not work.
quando vado a provare lo sketch datalogger la scheda la riconosce ma quando va a salvare i dati all'interno del file non so perché ma non tutti li salva in alcuni casi, appare il carattere NULL al posto del dato
Attribuisci questo al pin 53?
Ia scrittura su SD o va o non va per nessun char, se alcuni vengo scritti e altri no, potrebbe essere un problema di sd o di sketch.
Se ci fai vedere il tuo sketch che ti da problemi magari si puo' capire dove sta il difetto.
quando vado a provare lo sketch datalogger la scheda la riconosce ma quando va a salvare i dati all'interno del file non so perché ma non tutti li salva in alcuni casi, appare il carattere NULL al posto del dato
Attribuisci questo al pin 53?
Ia scrittura su SD o va o non va per nessun char, se alcuni vengo scritti e altri no, potrebbe essere un problema di sd o di sketch.
Se ci fai vedere il tuo sketch che ti da problemi magari si puo' capire dove sta il difetto.
Si il codice che uso è questo..
/*
SD card datalogger
This example shows how to log data from three analog sensors
to an SD card using the SD library.
The circuit:
* analog sensors on analog ins 0, 1, and 2
* SD card attached to SPI bus as follows:
** MOSI - pin 11
** MISO - pin 12
** CLK - pin 13
** CS - pin 4
created 24 Nov 2010
modified 9 Apr 2012
by Tom Igoe
This example code is in the public domain.
*/
#include <SD.h>
// On the Ethernet Shield, CS is pin 4. Note that even if it's not
// used as the CS pin, the hardware CS pin (10 on most Arduino boards,
// 53 on the Mega) must be left as an output or the SD library
// functions will not work.
const int chipSelect = 53;
void setup()
{
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
Serial.print("Initializing SD card...");
// make sure that the default chip select pin is set to
// output, even if you don't use it:
pinMode(53, OUTPUT);
// see if the card is present and can be initialized:
if (!SD.begin(chipSelect)) {
Serial.println("Card failed, or not present");
// don't do anything more:
return;
}
Serial.println("card initialized.");
}
void loop()
{
// make a string for assembling the data to log:
// open the file. note that only one file can be open at a time,
// so you have to close this one before opening another.
File dataFile = SD.open("datalog.txt", FILE_WRITE);
// if the file is available, write to it:
if (dataFile) {
dataFile.println("Prova");
dataFile.close();
// print to the serial port too:
//Serial.println(dataString);
}
// if the file isn't open, pop up an error:
else {
Serial.println("error opening datalog.txt");
}
if(millis() > 30000) while(1);
}
non c'è la SPI.h e non dichiari i pin 4 e 10
comunque a me così modificato funziona
/*
SD card datalogger
This example shows how to log data from three analog sensors
to an SD card using the SD library.
The circuit:
* analog sensors on analog ins 0, 1, and 2
* SD card attached to SPI bus as follows:
** MOSI - pin 11
** MISO - pin 12
** CLK - pin 13
** CS - pin 4
created 24 Nov 2010
modified 9 Apr 2012
by Tom Igoe
This example code is in the public domain.
*/
#include <SD.h>
#include <SPI.h>
// On the Ethernet Shield, CS is pin 4. Note that even if it's not
// used as the CS pin, the hardware CS pin (10 on most Arduino boards,
// 53 on the Mega) must be left as an output or the SD library
// functions will not work.
int n=0;
void setup()
{
pinMode(SS_PIN, OUTPUT);
digitalWrite(SS_PIN, HIGH);
pinMode(10, OUTPUT); // Set the CS pin as an output
digitalWrite(10, 1); // Turn off the W5100 chip! (wait for configuration)
pinMode(4, OUTPUT); // Set the SDcard CS pin as an output
digitalWrite(4, 1); // Turn off the SD card! (wait for configuration)
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
Serial.print("Initializing SD card...");
// make sure that the default chip select pin is set to
// output, even if you don't use it:
//pinMode(53, OUTPUT);
// see if the card is present and can be initialized:
if (!SD.begin(4)) {
Serial.println("Card failed, or not present");
// don't do anything more:
return;
}
Serial.println("card initialized.");
}
void loop()
{
n++;
File dataFile = SD.open("datalog.txt", FILE_WRITE);
// if the file is available, write to it:
if (dataFile)
{
dataFile.println("Prova " + (String)n);
dataFile.close();
// print to the serial port too:
//Serial.println(dataString);
}
// if the file isn't open, pop up an error:
else
{
Serial.println("error opening datalog.txt");
}
if(millis() > 30000) while(1);
}
Attenzione a non estrarre la SD mentre sta scrivendo, sfasci il file system della sd e perdi tutto e questo sketch causa proprio questo, non smette mai di scrivere, in teoria hai pochi istanti in cui puoi estrarla, arduino dovrebbe fare la rimozione sicura e questo programma non lo fa assolutamente.
/*
SD card read/write
This example shows how to read and write data to and from an SD card file
The circuit:
* SD card attached to SPI bus as follows:
** MOSI - pin 11
** MISO - pin 12
** CLK - pin 13
** CS - pin 4
created Nov 2010
by David A. Mellis
modified 9 Apr 2012
by Tom Igoe
This example code is in the public domain.
*/
#include <SD.h>
File myFile;
void setup()
{
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
Serial.print("Initializing SD card...");
// On the Ethernet Shield, CS is pin 4. It's set as an output by default.
// Note that even if it's not used as the CS pin, the hardware SS pin
// (10 on most Arduino boards, 53 on the Mega) must be left as an output
// or the SD library functions will not work.
pinMode(10, OUTPUT);
if (!SD.begin(4)) {
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");
// open the file. note that only one file can be open at a time,
// so you have to close this one before opening another.
myFile = SD.open("test.txt", FILE_WRITE);
// if the file opened okay, write to it:
if (myFile) {
Serial.print("Writing to test.txt...");
myFile.println("testing 1, 2, 3.");
// close the file:
myFile.close();
Serial.println("done.");
} else {
// if the file didn't open, print an error:
Serial.println("error opening test.txt");
}
// re-open the file for reading:
myFile = SD.open("test.txt");
if (myFile) {
Serial.println("test.txt:");
// read from the file until there's nothing else in it:
while (myFile.available()) {
Serial.write(myFile.read());
}
// close the file:
myFile.close();
} else {
// if the file didn't open, print an error:
Serial.println("error opening test.txt");
}
}
void loop()
{
// nothing happens after setup
}
questo sketch funziona correttamente scrive e legge senza creare problemi. Provo a sparare una soluzione non è che la sd è lenta e quindi ha bisogno di più tempo per scrivere i dati sul file?? perché sennò non mi spiego come mai se eseguo la scrittura in un ciclo alla fine inizia a danneggiarmi il system file.
Ti ripeto a me lo sketch di prima funziona bene ..... magari mettere il tipo di shield che usi, fare prove con diverse sd, ad esempio io uso solo kingstom le altre mi hanno dato problemi in passato, il fatto che ti ritrovi il file system danneggiato te l'ho detto prima.....
quando arduino nel loop scrive a raffica all' infinito, per leggerla col pc cosa hai divuto fare? estrarla mentre scriveva, non c'era altro modo, questo ha danneggiato il file system dovendola riformattare.
Non so che shield possiedi, hai cercato su google il modello ed esempi di sketch?
pablos:
Ti ripeto a me lo sketch di prima funziona bene ..... magari mettere il tipo di shield che usi, fare prove con diverse sd, ad esempio io uso solo kingstom le altre mi hanno dato problemi in passato, il fatto che ti ritrovi il file system danneggiato te l'ho detto prima.....
quando arduino nel loop scrive a raffica all' infinito, per leggerla col pc cosa hai divuto fare? estrarla mentre scriveva, non c'era altro modo, questo ha danneggiato il file system dovendola riformattare.
Non so che shield possiedi, hai cercato su google il modello ed esempi di sketch?
mi sa che il problema dipende proprio dalla shield, uso una prodotta dalla lc studio e navigando in internet ho visto che molti hanno problemi con questo tipo di schede.
Ma hai lo schema elettrico? Di solito le SD lavorano a 3V3, se non c'è un traslatore di livelli oppure dei partitori per abbassare le tensioni dell'Arduino, puoi danneggiare le schedine che ci inserisci.