Problema con libreria Sd.h

Problema con libreria Sd.h

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 :

SS_PIN = 53;
MOSI_PIN = 51;
MISO_PIN = 50;
SCK_PIN = 52;

ho modificato il programma in modo che il pin cs sia sul piedino n°53.

la scheda è una microSd da 4gb formattata in Fat32.

non capisco deve è il problema.

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

pablos:

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.

Il pin CS é un pin che deve essere diverso per ogni dispositivo collegato al SPI. Puoi usare qualsiasi Pin libero come CS.

Il Pin 53 é solo necessario quando usi Arduino MEGA come slave.

Ciao Uwe

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.

pablos:

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.

ciao

Ho provato ma questo è il risultato:

Prova 1
Prova 2
Prova 3
         Prova 5
Prova 6
         Prova 8
         Prova 10
Prova 11
                              Prova 15
Prova 16
          Prova 18
Prova 19
Prova 20
Prova 21
Prova 22
Prova 23
Prova 24
Prova 25
          Prova 27
Prova 28
Prova 29
          Prova 31
          Prova 33
Prova 34
Prova 35
          Prova 37
Prova 38
Prova 39
          Prova 41
                    Prova 44
Prova 45
Prova 46
          Prova 48
Prova 49
Prova 50
Prova 51
Prova 52
Prova 53
Prova 54
Prova 55
Prova 56
Prova 57
Prova 58
Prova 59
Prova 60
Prova 61
Prova 62
Prova 63
Prova 64
Prova 65

Prova 15Prova 67
Prova 68
Prova 69
Prova 70
Prova 71
Prova 72
Prova 73
Prova 74
Prova 75
Prova 76
Prova 77
  Prova 27Prova 79
Prova 80
Prova 81
Prova 82
Prova 83
Prova 84
Prova 85
Prova 86
Prova 87
Prova 88
Prova 89
Prova 90
Prova 91

Prova 41Prova 93
Prova 94
  Prova 44
Prova 45Prova 97
Prova 98
Prova 99
Prova 100
Prova 101
Prova 102
Prova 103
 Prova 104
Prova 105
Prova 106
Prova 107
Prova 108
Prova 109
Prova 110
Prova 111
Prova 112
Prova 113
           Prova 115
Prova 116
Prova 117
Prova 118
Prova 119
Prova 120
Prova 121
Prova 122
Prova 123
Prova 124
Prova 125
Prova 126
Prova 127
Prova 128
Prova 129
Prova 130
Prova 131
Prova 132
Prova 133
Prova 134
Prova 135
Prova 136
Prova 137
           Prova 139
Prova 140
Prova 141
Prova 142
Prova 143
Prova 144
Prova 145
Prova 146
Prova 147
Prova 148
Prova 149
Prova 150
Prova 151
 105
ProvaProva 153
 107
Prova 108
ProvaProva 156
Prova 157
Prova 158
Prova 159
Prova 160
Prova 161
Prova 162
Prova 163
Prova 164
Prova 165
 119
ProvaProva 167
Prova 168
Prova 169
Prova 170
Prova 171
Prova 172
 126
Prova 127
ProvaProva 175
Prova 176
Prova 177
Prova 178
 132
Prova 133
ProvaProva 181
Prova 182
Prova 183
 137
     Prova 185
Prova 186
Prova 187
Prova 188
Prova 189
Prova 190
Prova 191
Prova 192
Prova 193
Prova 194
Prova 195
Prova 196
Prova 197
Prova 198
Prova 199
Prova 200
Prova 201
Prova 202
Prova 203
Prova 204
Prova 205
Prova 206
Prova 207
Prova 208
                      Prova 211
Prova 212
Prova 213
           Prova 215
           Prova 217
           Prova 219
Prova 220
Prova 221
Prova 222
Prova 223
           Prova 225
Prova 226
Prova 227
Prova 228
Prova 229
Prova 230
Prova 231
Prova 232
Prova 233
Prova 234
                      Prova 237
Prova 238
           Prova 240
           Prova 242
Prova 243
 197
ProvaProva 245
Prova 246
Prova 247
 201
Prova 202
ProvaProva 250
Prova 251
Prova 252
Prova 253
Prova 254
Prova 255
Prova 256
Prova 257
Prova 258
Prova 259
Prova 260
Prova 261
Prova 262
Prova 263
Prova 264
Prova 265
Prova 266
Prova 267
Prova 268
Prova 269
Prova 270
Prova 271
 225
ProvaProva 273
Prova 274
Prova 275
Prova 276
Prova 277
Prova 278
Prova 279
Prova 280
 234
                Prova 283
Prova 284
Prova 285
Prova 286
Prova 287
Prova 288
 242
ProvaProva 290
Prova 291
Prova 292
Prova 293
Prova 294
Prova 295

ProvaProvaProva 297
Prova 298
Prova 299
 253
Prova 254
ProvaProva 302
 256
ProvaProva 304
 258
Prova 259
Prova 260
ProvaProva 308
 262
ProvaProva 310
Prova 311
Prova 312
Prova 313
 267
ProvaProva 315
Prova 316
Prova 317
Prova 318
Prova 319
Prova 320
Prova 321
Prova 322
Prova 323
 277
ProvaProva 325
Prova 326
Prova 327
Prova 328
      ProvaProva 330
Prova 331
 285
ProvaProva 333
 287
ProvaProva 335
Prova 336
Prova 337
Prova 338
Prova 339
 293
ProvaProva 341
Prova 342
Prova 343
Prova 344
Prova 345
Prova 346
Prova 347

ProvaProvaProva 349
Prova 350
Prova 351
Prova 352
Prova 353

ProvaProva 308
 262
Prova 356
Prova 357
 311
ProvaProva 359
Prova 360
Prova 361
Prova 362
 316
ProvaProva 364
Prova 365
Prova 366
 320
ProvaProva 368
Prova 369
Prova 370

ProvaProva 325
ProvaProva 373
Prova 374
Prova 375
Prova 376
 330
ProvaProva 378
Prova 379
 333
 287
Prova 381
Prova 382
Prova 383
Prova 384
Prova 385
Prova 386
Prova 387
Prova 388
           Prova 390
           Prova 392
Prova 393
Prova 394
           Prova 396
Prova 397
Prova 398
Prova 399
Prova 400
Prova 401
Prova 402
Prova 403
Prova 404
Prova 405
Prova 406
Prova 407
Prova 408
           Prova 410
Prova 411
Prova 412
Prova 413
                      Prova 416
           Prova 418
Prova 419
                      Prova 422
           Prova 424
Prova 425
Prova 426
           Prova 428
Prova 429
 383
ProvaProva 431
 385
ProvaProva 433
Prova 434
Prova 435
Prova 436
Prova 437
Prova 438
 392
ProvaProva 440
Prova 441
Prova 442
Prova 443
 397
Prova 398
ProvaProva 446
Prova 447
Prova 448
Prova 449
Prova 450
 404
Prova 405
ProvaProva 453
 407
Prova 408
           ProvaProva 457
Prova 458
Prova 459
Prova 460
Prova 461
Prova 462
 416
     Prova 464
Prova 465
Prova 466
Prova 467
      Prova 422
     Prova 470
Prova 471
Prova 472
Prova 473
Prova 474
Prova 475
Prova 476
Prova 477
 431
 385
Prova 479
Prova 480
Prova 481
 435
ProvaProva 483
 437
ProvaProva 485
Prova 486
Prova 487
 441
Prova 442
Prova 443
 397
Prova 398
Prova 492
Prova 493
Prova 494
Prova 495
Prova 496
Prova 497
Prova 498
Prova 499
Prova 500
Prova 501
Prova 502
Prova 503
 457
Prova 458
ProvaProva 506
Prova 507
Prova 508
Prova 509
Prova 510
Prova 511
Prova 512
 466
Prova 467
     Prova 515
Prova 516
Prova 517
Prova 518
 472
ProvaProva 520
Prova 521
Prova 522
Prova 523
Prova 524

 385
ProvaProva 526
Prova 527
Prova 528

ProvaProvaProva 530

ProvaProvaProva 532
Prova 533
Prova 534
Prova 535
Prova 536
Prova 537
Prova 538
Prova 539
Prova 540
Prova 541
 495
Prova 496
ProvaProva 544
Prova 545
Prova 546
Prova 547
Prova 548
Prova 549
Prova 550
Prova 551
Prova 552
Prova 553
Prova 554
Prova 555
 509
ProvaProva 557
 511
ProvaProva 559
Prova 560
Prova 561
Prova 562
Prova 563
Prova 564
Prova 565
Prova 566
Prova 567
Prova 568
Prova 569
 523
ProvaProva 571
Prova 572
Prova 573
Prova 574
Prova 575
Prova 576
 530

ProvaProvaProvaProva 579
 533
ProvaProva 581
Prova 582
Prova 583
Prova 584
 538
Prova 539
ProvaProva 587
Prova 588
Prova 589
Prova 590
Prova 591
Prova 592
Prova 593
Prova 594
 548
Prova 549
Prova 550
ProvaProva 598
Prova 599
Prova 600
Prova 601
Prova 602
Prova 603
 557
 511
Prova 605
Prova 606
 560
Prova 561
Prova 562
Prova 563
ProvaProva 611
Prova 612
Prova 613
 567
Prova 568
Prov Prova 616
Prova 617
                      Prova 620
           Prova 622
Prova 623
Prova 624
Prova 625
Prova 626
Prova 627
Prova 628
Prova 629
           Prova 631
Prova 632
Prova 633
           Prova 635
Prova 636
Prova 637
Prova 638
Prova 639
Prova 640
Prova 641
Prova 642
                                 Prova 646
                      Prova 649
                      Prova 652
Prova 653
Prova 654
Prova 655
Prova 656
           Prova 658
           Prova 660
           Prova 662
Prova 663
Prova 664
           Prova 666
Prova 667
      ProvaProva 669
 623
ProvaProva 671
 625
Prova 626
ProvaProva 674
 628
ProvaProva 676
Prova 677
Prova 678
 632
Prova 633
     Prova 681
Prova 682
 636
ProvaProva 684
Prova 685
Prova 686
 640
Prova 641
ProvaProva 689
Prova 690
           Prova 692
Prova 693
Prova 694
      Prova 649
     Prova 697
Prova 698
 652
ProvaProva 700
Prova 701
Prova 702
 656
     Prova 704
Prova 705
      ProvaProva 707
      ProvaProva 709
Prova 710
Prova 711
                                 Prova 715
Prova 716
Prova 717
Prova 718
Prova 719
           Prova 721
Prova 722
           Prova 724
Prova 725
Prova 726
           Prova 728
           Prova 730
Prova 731
Prova 732
Prova 733
Prova 734
Prova 735
Prova 736
Prova 737
Prova 738
Prova 739
Prova 740
Prova 741
Prova 742
Prova 743
Prova 744
Prova 745
Prova 746
Prova 747
                      Prova 750
Prova 751
           Prova 753
Prova 754
Prova

ovviamente dopo aver ripristinato il file system perché era danneggiato.

prova a mettere un delay(10) dopo il close, a me non lo fa, non ho uno shield sd ma un ethernet con sd.

/*
  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.