fbpixel
Etiquetas: , ,
4.7
(3)

Um dos pontos fracos do microcontrolador Arduino é sua a memória pequena. Quando se pretende tratar uma quantidade considerável de dados (registrar valores, ler ou escrever ficheiros, etc.), é preciso acrescentar espaço de memória. Para isso, pode-se utilizar um cartão Secure Digital, ou cartão SD, que permite alocar memória suplementar sem abrir mão das dimensões pequenas.

Material

  • Computador
  • 1 x Arduino UNO
  • 1 x cabo USB para conectar o Arduino ao computador
  • Módulo shield para cartão SD

Estrutura do shield para Cartão SD

Qualquer que seja o módulo escolhido, sua estrutura básica será sempre a mesma: um compartimento para encaixar o cartão SD e pinos para estabelecer uma interface.

O módulo shield para cartão SD apresenta 6 pinos que permitem estabelecer a conexão. 2 para a alimentação e 4 para estabelecer a ligação SPI (Serial Peripheral Interface)

  • V ou 3.3V para a alimentação do módulo
  • GND a terra do módulo
  • CS ou ChipSelect para ativar a comunicação
  • MISO (Master Input, Slave Output) pino de transmissão equivalente ao pino Tx de uma porta serial. Saída do módulo.
  • MOSI (Master Output, Slave Input) pino de entrada equivalente ao pino Rx de uma porta serial. Entrada do módulo.
  • SCK (Clock) relógio que permite sincronizar a comunicação

No caso de um shield, as conexões são predefinidas. Verifique como utilizar o componente na sua documentação técnica.

Esquema de ligação

  • 3.3V com 3.3V
  • GND com GND
  • CS em geral com 4 (aqui com 10)
  • MISO com 12
  • MOSI com 11
  • SCK com 13

Código para recuperar as informações de um cartão SD

Para interagir com o seu cartão SD, há uma biblioteca na IDE do Arduino:  a SD.h.  Há exemplos disponíveis no software e na internet.

#include <SPI.h>
#include <SD.h>

Sd2Card card;
SdVolume volume;
SdFile root;

const int chipSelect = 10;

void setup() {
  Serial.begin(9600);
  while (!Serial) {
  }



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

  if (!card.init(SPI_HALF_SPEED, chipSelect)) {
    Serial.println("initialization failed");
    return;
  } else {
    Serial.println("Wiring is correct and a card is present.");
  }

  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");
  }

  if (!volume.init(card)) {
    Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
    return;
  }

  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);

  root.ls(LS_R | LS_DATE | LS_SIZE);
}


void loop(void) {}



Código para ler e escrever dados num ficheiro armazenado no cartão SD

#include <SPI.h>
#include <SD.h>

File myFile;

String buffer;
String filename = "test";

void setup() {
  Serial.begin(9600);
  while (!Serial) {
  }


  Serial.print("Initializing SD card...");

  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");

  myFile = SD.open(filename + ".txt", FILE_WRITE);

  if (myFile) {
    Serial.print("Writing to " + filename + ".txt...");
    myFile.println("testing 1, 2, 3.");
    myFile.close();
    Serial.println("done.");
  } else {
    Serial.println("error opening " + filename + ".txt");
  }
  //Read file byte by byte
  myFile = SD.open(filename + ".txt");
  if (myFile) {
    Serial.println("Read " + filename + ".txt byte by byte:");

    while (myFile.available()) {
      Serial.write(myFile.read());
    }

    myFile.close();
  } else {

    Serial.println("error opening " + filename + ".txt");
  }

  //Read file line by line
  myFile = SD.open(filename + ".txt");
  if (myFile) {
    Serial.println("Read " + filename + ".txt line by line:");

    while (myFile.available()) {
      buffer = myFile.readStringUntil('\n');
      Serial.println(buffer);
    }
    myFile.close();
  } else {
    Serial.println("error opening " + filename + ".txt");
  }

}

void loop() { }

É possível apagar o ficheiro utilizando a função:

SD.remove("test.txt");

Atenção: Se os seus ficheiros não forem reconhecidos, experimente usar um nome curto para o ficheiro salvo no cartão SD (máximo 8 caracteres).  O número de caracteres para ficheiros em cartões SD é limitado com o Arduino.

Experimente e combine estes exemplos para obter as funcionalidades que desejar. Se tiver problemas para utilizar o seu cartão SD com o microcontrolador Arduino, escreva-nos um comentário ou envie uma mensagem.

Bônus: Visualizar os ficheiros armazenados no cartão SD

Para se certificar de que os ficheiros estão salvos no cartão SD, é possível exibir os ficheiros armazenados na raiz. Para isso, basta utilizar o objecto File, que permite percorrer os diretórios do cartão SD.

//Libraries
#include <SD.h>//https://www.arduino.cc/en/reference/SD 
#include <SPI.h>//https://www.arduino.cc/en/Reference/SPI 

//Constants
#define SD_ChipSelectPin 4

//Objects
File root;

void setup() {
  //Init Serial USB
  Serial.begin(9600);
  Serial.println(F("Initialize System"));
  //Init sd shield
  if (!SD.begin(SD_ChipSelectPin)) {
    Serial.println(F("SD fail"));
    return;
  }
  printFilenames();
}

void loop() {

}

void printFilenames(void ) { /* function printFilenames */
  ////find files in SD card
  root = SD.open("/");
  while (true) {
    File entry =  root.openNextFile();
    if (! entry) {
      break;// no more files
    }
    Serial.println(entry.name());
    entry.close();
  }
}

Aplicação

Fontes

How useful was this post?

Click on a star to rate it!

Average rating 4.7 / 5. Vote count: 3

No votes so far! Be the first to rate this post.

As you found this post useful...

Follow us on social media!

We are sorry that this post was not useful for you!

Let us improve this post!

Tell us how we can improve this post?