Magos do Arduino

Módulo leitor de cartão SD

Aprenda a utilizar um módulo leitor de cartão SD com o Arduino

Magos do Arduino

Módulo leitor de cartão SD

O módulo leitor de cartão SD permite a leitura e gravação de dados em cartões SD.

Módulo leitor de cartão SD

Ele é amplamente utilizado em projetos com Arduino e outros microcontroladores.

O módulo se comunica normalmente por meio do protocolo SPI.

SPI é um método de comunicação serial que permite a troca de dados entre dispositivos usando linhas separadas para dados, clock e seleção do dispositivo (MOSI, MISO, SCK e CS).

Ele permite o armazenamento de grandes volumes de dados.

Ele opera geralmente com tensão de 3.3v.

Muitos módulos possuem regulador de tensão integrado.

O leitor de cartão SD é usado para registro de dados (data logging).

O módulo é comum em projetos de monitoramento de sensores.

O módulo é compatível com a biblioteca SD do Arduino, disponível no Arduino IDE.

Módulo leitor de cartão SD

Neste projeto você criará um circuito que faz o uso de um módulo leitor de cartão SD com o Arduino.

Para a criação deste circuito serão necessários os seguintes componentes:

  • 1x Breadboard (opcional)
  • 1x Arduino UNO
  • 1x Módulo leitor de cartão SD
  • Jumpers

Circuito Módulo leitor de cartão SD

Para montar o circuito, visualize na imagem a seguir como conectar os componentes entre a placa Arduino e a breadboard.

Circuito Módulo leitor de cartão SD

Código fonte para o circuito do módulo leitor de cartão SD

Uma vez criado o circuito, use o código fonte a seguir no Arduino IDE para fazer o upload dele na placa Arduino e assim ver o resultado do circuito em funcionamento.

Código 1: imprime no monitor serial as principais informações sobre o cartão SD, como tipo, tamanho da partição e lista de arquivos presentes no cartão.

/**
 * Código do curso Magos do Arduino para utilizar módulo de cartão SD
 * com o Arduino. 
 * 
 * Código que imprime no monitor serial as principais informações sobre o cartão SD, 
 * como tipo, tamanho da partição e lista de arquivos presentes no cartão.
 * 
 * Depende da biblioteca SD, que já vem instalada por padrão na IDE do Arduino.
 * 
 * Cartão SD deve estar formatado em FAT16 ou FAT32 para funcionar corretamente.
 * 
 *  Pinos do módulo de cartão SD conectado ao Arduino UNO via SPI:
 * - SDO/MOSI - pino 11
 * - SDI/MISO - pino 12
 * - CLK/SCK  - pino 13
 * - CS       - pino  4
 *
 * (c) Copyright KazaleIT
 * @kazaleitoficial no YouTube
 **/

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

#define PINO_CS 4 // pino conectado ao CS (Chip Select) do módulo

// variáveis de conexão do módulo SD
Sd2Card cartao;
SdVolume volume;
SdFile root;

void setup() {
  Serial.begin(9600); // inicializa a conexão serial
  while (!Serial) {
    ;  // aguarda pela conexão serial
  }

  Serial.println("inicializando o cartão SD...");

  // inicializa a conexão com o cartão SD
  if (!cartao.init(SPI_HALF_SPEED, PINO_CS)) {
    Serial.println("erro inicializando cartão SD, verifique a conexão do módulo");
    while (1);
  }
  
  Serial.println("inicialização do cartão SD realizada com sucesso!");

  // imprime o tipo do cartão SD
  Serial.print("\nTipo do cartão SD:   ");
  switch (cartao.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("desconhecido");
  }

  // verifica se o cartão SD está formatado em FAT16 ou FAT32
  if (!volume.init(cartao)) {
    Serial.println("partição FAT16/FAT32 não encontrada, insira um cartão formatado em FAT16 ou FAT32");
    while (1);
  }

  Serial.print("Clusters:            ");
  Serial.println(volume.clusterCount());
  Serial.print("Setores por cluster: ");
  Serial.println(volume.blocksPerCluster());
  Serial.print("Total de setores:    ");
  Serial.println(volume.blocksPerCluster() * volume.clusterCount());

  // imprime o tipo da partição e seus valores
  uint32_t tamanhoParticao;
  Serial.print("\nPartição:            FAT");
  Serial.println(volume.fatType(), DEC);

  tamanhoParticao = volume.blocksPerCluster() * volume.clusterCount();
  tamanhoParticao /= 2; // setores do cartão SD são sempre de 512 bytes (2 setores são 1 KB)
  Serial.print("Partição (KB):       ");
  Serial.println(tamanhoParticao);
  Serial.print("Partição (MB):       ");
  tamanhoParticao /= 1024;
  Serial.println(tamanhoParticao);
  Serial.print("Partição (GB):       ");
  Serial.println((float) tamanhoParticao / 1024.0);

  Serial.println("\nArquivos encontrados no cartão SD (nome, data e tamanho em bytes): ");
  root.openRoot(volume);

  // listam todos os arquivos do cartão SD
  root.ls(LS_R | LS_DATE | LS_SIZE);
  root.close();
}

void loop() {
}

Código 2: cria um novo arquivo no cartão SD, escreve um texto nele, e depois realiza sua leitura imprimindo o seu conteúdo no Monitor Serial.

/**
 * Código do curso Magos do Arduino para utilizar módulo de cartão SD
 * com o Arduino. 
 * 
 * Código que cria um novo arquivo no cartão SD, escreve um texto nele, e depois realiza 
 * sua leitura imprimindo o seu conteúdo no Monitor Serial.
 * 
 * Depende da biblioteca SD, que já vem instalada por padrão na IDE do Arduino.
 * 
 * Cartão SD deve estar formatado em FAT16 ou FAT32 para funcionar corretamente.
 * 
 *  Pinos do módulo de cartão SD conectado ao Arduino UNO via SPI:
 * - SDO/MOSI - pino 11
 * - SDI/MISO - pino 12
 * - CLK/SCK  - pino 13
 * - CS       - pino  4
 *
 * (c) Copyright KazaleIT
 * @kazaleitoficial no YouTube
 **/

#include <SD.h>

#define PINO_CS 4 // pino conectado ao CS (Chip Select) do módulo

File arquivo;

void setup() {
  Serial.begin(9600); // inicializa a conexão serial
  while (!Serial) {
    ;  // aguarda pela conexão serial
  }

  Serial.println("inicializando o cartão SD...");

  // inicializa a conexão com o cartão SD
  if (!SD.begin(PINO_CS)) {
    Serial.println("erro inicializando cartão SD, verifique a conexão do módulo");
    while (1);
  }

  Serial.println("inicialização do cartão SD realizada com sucesso!");

  // abre um arquivo, somente um arquivo pode ser aberto de cada vez,
  // para abrir outro arquivo, feche o aberto primeiramente
  arquivo = SD.open("teste.txt", FILE_WRITE);

  // verifica se o arquivo foi aberto, e então escreve nele
  if (arquivo) {
    Serial.println("\nescrevendo no arquivo teste.txt...");
    arquivo.println("Magos do Arduino, por Kazale IT!");
    // fecha o arquivo
    arquivo.close();
    Serial.println("operação de escrita realizada com sucesso!");
  } else {
    // exibe erro caso não consiga abrir o arquivo para escrita
    Serial.println("erro abrindo o arquivo teste.txt para escrita");
  }

  // abre o arquivo novamente, mas agora para leitura dos dados
  arquivo = SD.open("teste.txt");
  if (arquivo) {
    Serial.println("\nconteúdo do arquivo teste.txt:");

    // lê e imprime to do o conteúdo do arquivo
    while (arquivo.available()) {
      Serial.write(arquivo.read());
    }
    // fecha o arquivo
    arquivo.close();
  } else {
    // exibe erro caso não consiga abrir o arquivo para escrita
    Serial.println("erro abrindo o arquivo teste.txt para leitura dos dados");
  }
}

void loop() {
}