Arduino e cartões SD, MicroSD e SDHC
Com a biblioteca SD, o Arduino suporta cartões SD e SDHC, tanto no formato normal quanto no formato micro, e veremos como conectar, gravar e ler arquivos.
A biblioteca SD vem junto com o Arduino, e oferece os recursos básicos para gravar e ler arquivos SD, listar os arquivos que constam neles, obter informações sobre os cartões, e mais.
A Usinainfo está patrocinando (obrigado!) um experimento que farei de montagem de um sistema básico de registro de acesso por meio de tags iButton, e um dos componentes que recebi da empresa para isso foi um leitor MicroSD da Catalex para poder gravar os registros de acesso e a base de tags autorizadas. Esse é o módulo SD que usarei hoje como base para esta breve documentação do que aprendi sobre o funcionamento do SD no Arduino, antes de entrar na aplicação pretendida.
Um aspecto interessante dos cartões SD é que eles não são meramente mídias: cada cartão é um dispositivo completo, e muitas vezes os módulos fazem pouco mais do que regular (ou converter) tensão e oferecer ao Arduino os contatos elétricos com os pinos do cartão.
Nas aplicações que eu uso, as operações típicas com arquivos são a de gravar após o seu final (criando-os se não existirem), e a de ler o seu conteúdo completo. Com essas duas operações, é possível criar e ler arquivos de configuração, bem como manter registros (logs) de dados ou ocorrências.
Veremos a seguir como realizar operações de gravação e leitura em um módulo SD típico, incluindo o que eu recebi.
Arduino e módulo SD: como conectar
O típico módulo SD tem pelo menos 6 pinos, sendo 2 deles dedicados à alimentação: o GND, que se conecta ao GND do Arduino, e o VCC (ou 5V, ou 3V) que geralmente deve ser conectado ao pino 5V do Arduino, a não ser que ele tenha alguma indicação de que funciona apenas em 3,3V, caso em que deve ser conectado ao pino 3V3 do Arduino1.
Os outros 4 pinos são dedicados ao padrão de comunicação chamado SPI, e geralmente terão os seguintes nomes: MISO, MOSI, SCK e CS.
Entender o uso de cada um desses 4 pinos no protocolo SPI não é necessário para usar cartões SD, mas é preciso saber a que pinos do Arduino eles devem ser plugados, e isso depende de cada modelo de Arduino. A imagem abaixo ilustra os pinos SPI do Arduino Uno (que é a mesma do Nano)2:
Note que 3 deles (13 - SCK, 12 - MISO e 11 - MOSI) têm os mesmos nomes de pinos encontrados nos módulos SD, e devem ser conectados diretamente a estes. O pino 10 (SS) é o que deveria ser conectado ao pino CS do módulo, mas você pode conectar outro pino à sua escolha, se desejar3, desde que lembre de usar o número desse pino como parâmetro na função SD.begin()
(que veremos adiante) e que lembre que o pino 10 (ou o que corresponder à função SS no seu modelo de Arduino) precisa ser configurado como OUTPUT, mesmo que você não esteja usando ele para conexão ao SD.
Arduino e cartões SD: como programar para gravar um arquivo
Após configurar as conexões eletrônicas como exposto acima, é hora de programar. O programa a seguir exemplifica como gravar ao final de um arquivo-texto (criando-o, caso ele não exista):
#include <SD.h>
File arquivoTXT;
void setup()
{
Serial.begin(9600);
SD.begin(10); // o parametro e' o pino conectado ao CS do modulo
arquivoTXT = SD.open("texto.txt", FILE_WRITE);
if (arquivoTXT) {
arquivoTXT.println("Teste de arquivos TXT em SD no Arduino");
arquivoTXT.println("BR-Arduino.org");
arquivoTXT.close();
Serial.println("OK.");
} else {
Serial.println("Erro ao abrir ou criar o arquivo texto.txt.");
}
}
void loop(void) {
}
Como de hábito, colorizei os trechos que merecem explicação. As duas linhas em vermelho no início do programa incluem a biblioteca e instanciam um objeto chamado arquivoTXT, do tipo File. Ambos os passos são necessários sempre que você for manipular arquivos-texto em dispositivos SD no Arduino.
A linha em laranja é crucial: ela inicializa a biblioteca SD, usando como parâmetro o número do pino do Arduino conectado ao pino CS do módulo. O padrão é usar o pino identificado como SS na documentação da pinagem de cada modelo do Arduino (no Uno e Nano, é o pino 10). Se você optar por (ou precisar) usar um pino diferente do padrão, ainda assim o pino SS do Arduino precisará ser colocado em modo OUTPUT na inicialização, e mantido assim.
Em seguida, em cor verde, estão a linha que abre (ou cria, se necessário) o arquivo com o nome de "texto.txt", na raiz do cartão SD, em modo de escrita, iniciando ao final do conteúdo do arquivo existente, se houver; e, um pouco adiante, a linha que fecha este mesmo arquivo, ao final do seu uso.
Em marrom estão as linhas que de fato modificam o arquivo, gravando duas linhas de texto nele. Notem que elas são precedidas por um if
que testa se a variável arquivoTXT é nula, identificando assim eventuais problemas na abertura do arquivo.
Arduino e cartões SD: como programar para ler um arquivo
A operação complementar à do programa acima é a que lê o arquivo e faz alguma coisa com o seu conteúdo. No exemplo abaixo, o arquivo texto.txt que criamos acima será aberto e lido, linha por linha, exibindo no monitor serial o conteúdo:
#include <SD.h>
File arquivoTXT;
void setup()
{
Serial.begin(9600);
SD.begin(10);
arquivoTXT = SD.open("texto.txt");
if (arquivoTXT) {
while (arquivoTXT.available()) {
Serial.write(arquivoTXT.read());
}
arquivoTXT.close();
} else {
Serial.println("Erro ao abrir o arquivo texto.txt");
}
}
void loop(void) {
}
A maior parte do programa é idêntica ao exemplo anterior. Destaquei em laranja a diferença: o arquivo é aberto em modo leitura, e a função available()
é usada para identificar se ainda há linhas adicionais para ler; se houver, elas são lidas com a função read()
.
Isso conclui as funcionalidades que eu mais uso em cartões SD no Arduino. Vale destacar que a biblioteca SD oferece bem mais que isso: funções de diretórios, de manipulação de arquivos binários e mais. Consulte a documentação da função SD para saber mais!
Patrocínio: UsinaInfo
Quero agradecer à UsinaInfo, que vem patrocinando alguns experimentos do BR-Arduino, inclusive este com o leitor de cartão SD, que fará parte de um experimento maior (elementos de um sistema de registro de acesso) patrocinado por ela.
Além de receber material da empresa para os experimentos como parte do acordo de patrocínio, eu já fiz compras de componentes lá, aproveitando a variedade, o estoque bem suprido, as descrições detalhadas e a qualidade do seu sistema de comércio eletrônico. Recomendo sem ressalvas.
Agradeço também pela confiança que ficou expressa nos termos do patrocínio: a empresa me enviou os componentes necessários ao experimento combinado (um sistema de registro de acesso), mas não fez qualquer exigência sobre a forma e nem buscou exercer controle sobre o que eu fosse escrever. Nem sempre os termos são tão amplos, ainda mais para um blog recém-iniciado. Obrigado, UsinaInfo!
- Boa parte dos módulos atuais converte automaticamente a tensão, mas alguns têm uma chave seletora. Só os mais simples, incluindo os caseiros, exigem ser plugados diretamente aos 3,3V do padrão SD. ↩
- Para outros modelos de Arduino você deve consultar a documentação: os pinos SPI variam bastante. ↩
- Nota: alguns shields com função SD fixam a função SS em algum outro pino, consulte a documentação do seu shield. ↩
Comentar