Go Down

Topic: Carte SD avec arduino pro mini 5v (Read 1 time) previous topic - next topic

pierrotm777

Bonjour à tous,
Partant de ce sujet, j'ai décidé de tester l'écriture de données sur un carte SD.
Ayant sous la main un adaptateur SD avec une mini carte SD de 16GB j'ai donc reproduit le montage !
J'utilise pour mes tests un arduino Pro mini en 5V.
La carte est donc connectée comme sur le schéma suivant:

Je pense avoir deux problème !
1.Je ne suis pas sur que la bibliothèque SD reconnaisse une carte 16GB.
2.J'ai un problème d'alimentation en 3,3v.
Je n'ai accés qu'à du 5V.
J'ai donc réalisé avec une résistance de 4,7k et une autre de 10k du 3,3v.
En théorie, cela donne bien 3,3v : U2 = U1 (10k/(4,7k+10k))

Pourtant, je mesure un peut plus de 2v avec la carte insérée et bien 3,3v sans la carte mini carte !
Ai-je un problème de courant insuffisant ?

Merci de votre aide !

Pierre

pierrotm777

Merci pepe de votre réponse !
Je viens de remettre en route ma Uno qui elle sort un 3.3v qui lui reste stable même avec la carte SD insérée.
Mais elle n'est pas reconnue . J'ai bien sûre enlevé le pont de résistance et alimenté directement avec le 3.3v !
J'ai vais essayé avec une autre mini carte SD pour voir si je ne l'ai pas fumée !

pierrotm777

#2
Feb 28, 2017, 04:32 pm Last Edit: Feb 28, 2017, 04:35 pm by pierrotm777
Bon, je viens de changer de carte SD et testé le croquis CardInfo en remplaçant la pin 4 par 10 !
La carte n'est pas reconnue !

Ce pourrait t'il que le problème provienne du formatage existant déjà sur la carte ?

Mon lecteur de carte est ancien et ne reconnait pas cette carte 16GB mais une 1GB et bien reconnue !

pierrotm777

Hehe,
Je viens de constater que j'avais une mauvaise soudure sur la pin CS !
Le resultat:
Quote
Initializing SD card...Wiring is correct and a card is present.

Card type: SDHC

Volume type is FAT32

Volume size (bytes): 2629828608
Volume size (Kbytes): 2568192
Volume size (Mbytes): 2508

Files found on the card (name, date and size in bytes):

pierrotm777

Alors, je viens de me rendre compte que l'exemple CardInfo me retourne que la taille de ma carte SD est de  2508Mbytes pour une carte de 16GB !
Alors que la librairie SDFat me retourne une valeurs de 16GB environ !
Est ce une erreur de la librairie SD ?

J'utilise le code:
Code: [Select]
/*
  SD card test

 This example shows how use the utility libraries on which the'
 SD library is based in order to get info about your SD card.
 Very useful for testing a card when you're not sure whether its working or not.

 The circuit:
  * SD card attached to SPI bus as follows:
 ** MOSI - pin 11 on Arduino Uno/Duemilanove/Diecimila
 ** MISO - pin 12 on Arduino Uno/Duemilanove/Diecimila
 ** CLK - pin 13 on Arduino Uno/Duemilanove/Diecimila
 ** CS - depends on your SD card shield or module.
  Pin 4 used here for consistency with other Arduino examples


 created  28 Mar 2011
 by Limor Fried
 modified 9 Apr 2012
 by Tom Igoe
 */
// include the SD library:
#include <SPI.h>
#include <SD.h>

// set up variables using the SD utility library functions:
Sd2Card card;
SdVolume volume;
SdFile root;

// change this to match your SD shield or module;
// Arduino Ethernet shield: pin 4
// Adafruit SD shields and modules: pin 10
// Sparkfun SD shield: pin 8
// MKRZero SD: SDCARD_SS_PIN
const int chipSelect = 10;

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }


  Serial.print("\nInitializing SD card...");

  // we'll use the initialization code from the utility libraries
  // since we're just testing if the card is working!
  if (!card.init(SPI_HALF_SPEED, chipSelect)) {
    Serial.println("initialization failed. Things to check:");
    Serial.println("* is a card inserted?");
    Serial.println("* is your wiring correct?");
    Serial.println("* did you change the chipSelect pin to match your shield or module?");
    return;
  } else {
    Serial.println("Wiring is correct and a card is present.");
  }

  // print the type of card
  Serial.print("\nCard type: ");
  switch (card.type()) {
    case SD_CARD_TYPE_SD1:
      Serial.println("SD1");
      break;
    case SD_CARD_TYPE_SD2:
      Serial.println("SD2");
      break;
    case SD_CARD_TYPE_SDHC:
      Serial.println("SDHC");
      break;
    default:
      Serial.println("Unknown");
  }

  // Now we will try to open the 'volume'/'partition' - it should be FAT16 or FAT32
  if (!volume.init(card)) {
    Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
    return;
  }


  // print the type and size of the first FAT-type volume
  uint32_t volumesize;
  Serial.print("\nVolume type is FAT");
  Serial.println(volume.fatType(), DEC);
  Serial.println();

  volumesize = volume.blocksPerCluster();    // clusters are collections of blocks
  volumesize *= volume.clusterCount();       // we'll have a lot of clusters
  volumesize *= 512;                            // SD card blocks are always 512 bytes
  Serial.print("Volume size (bytes): ");
  Serial.println(volumesize);
  Serial.print("Volume size (Kbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);
  Serial.print("Volume size (Mbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);


  Serial.println("\nFiles found on the card (name, date and size in bytes): ");
  root.openRoot(volume);

  // list all files in the card with date and size
  root.ls(LS_R | LS_DATE | LS_SIZE);
}


void loop(void) {

}

pierrotm777

#5
Mar 01, 2017, 11:01 am Last Edit: Mar 01, 2017, 11:04 am by pierrotm777
Merci pour le lien pepe !

Effectivement, si je passe la variable volumesize en uint64_t au lieu de uint32_t,
le calcul est bien meilleur, mais, j'obtiens une valeur de 14GB au lieu de 16GB!

Mon code:
Code: [Select]
      // print the type and size of the first FAT-type volume
      uint64_t volumesize;
      Serial << F("SDFATTYPE|") << _DEC(volume.fatType()) <<endl; 
      volumesize = volume.blocksPerCluster();    // clusters are collections of blocks
      volumesize *= volume.clusterCount();       // we'll have a lot of clusters
      volumesize *= 512;//Serial.print("Volume size (bytes): ");Serial.println(volumesize);// SD card blocks are always 512 bytes
      waitMs(500);
      volumesize /= 1024;//      Serial.print("Volume size (Kbytes): ");Serial.println(volumesize);
      volumesize /= 1024;//      Serial.print("Volume size (Mbytes): ");Serial.println(volumesize);
      volumesize /= 1024;//GBytes
      Serial << F("SDVOLSIZE|") << _DEC(volumesize) <<endl;   


Une autre question, pour l'avoir testé avec succés, la librairie SDFat permet de formater une carte !
Ca ne semble pas possible avec la librairie standard ?

pierrotm777

#6
Mar 01, 2017, 02:25 pm Last Edit: Mar 01, 2017, 02:25 pm by pierrotm777
Après plusieurs essai, j'ai ce code qui semble fonctionner !
Code: [Select]
      // print the type and size of the first FAT-type volume
      uint64_t volumesize;
      Serial << F("SDF|") << _DEC(volume.fatType()) <<endl;
      // clusters are collections of blocks
      volumesize = volume.blocksPerCluster();
      // we'll have a lot of clusters
      volumesize *= volume.clusterCount();
      // SD card blocks are always 512 bytes
      volumesize *= 512;//Serial.print("Volume size (bytes): ");Serial.println(volumesize);
      waitMs(500);
      double v;
      v = volumesize / 1024;//      Serial.print("Volume size (Kbytes): ");Serial.println(volumesize);
      v = v / 1024;         //      Serial.print("Volume size (Mbytes): ");Serial.println(volumesize);
      v = v / 1024;         //GBytes
      Serial << F("SDV|") << v <<endl;


La difficulté était pour moi d'envoyer la valeur finale au port série, celui-ci n'acceptant pas une valeur de 64bits.

J'obtiens 14,45GB pour une SD de 16GB !

C'est bon je suppose ?

pierrotm777

Plus clair, je meur ! Merci pepe !

Go Up