fbpixel
Etiquetas: , ,

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.

sd-card-module Ler e escrever num cartão SD com Arduino
sd-card-shield-v4 Ler e escrever num cartão SD com Arduino

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

arduino-sd-module_bb Ler e escrever num cartão SD com Arduino
  • 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