O módulo leitor de cartão SD permite a leitura e gravação de dados em cartões 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.
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:
Para montar o circuito, visualize na imagem a seguir como conectar os componentes entre a placa Arduino e a breadboard.
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() {
}