Usando um Cartão SD com o Arduino: Software
Tratar os sistema FAT de arquivos é algo bastante complexo (poderíamos dizer que corresponde ao coração das primeiras versões do MSDOS). Felizmente o pessoal da Sparkfun e da Adafruit fez uma biblioteca para isto, e esta biblioteca faz parte da instalação da IDE do Arduino.
O Arduino é bastante limitado para uma implementação muito sofisticada. Em particular temos o problema da memória. Para melhor desempenho, o MSDOS procurava manter a FAT sempre na memória (alguém se lembra do comando BUFFERS no CONFIG.SYS?). A biblioteca SD (até onde pude observar) se vira com um único buffer de 512bytes (lembrar que o ATmega328 tem apenas 2K de Ram).
Um detalhe é que a biblioteca configura o pino D10 do Arduino como saída, devido ao funcionamento do sinal SS do ATmega que comentei na parte anterior.
O código abaixo é uma variação do exemplo DataLogger da biblioteca. Ele grava em um arquivo a temperatura medida pelo LM35, de cinco em cinco segundos. A abertura e fechamento do arquivo é comandada pela serial do Arduino (lembre-se de fechar o arquivo antes de desligar o Arduino).
/*
Registra temperatura em arquivo no cartão SD
DQ 21/09/14
Adaptação do exemplo datalogger da biblioteca SD
created 24 Nov 2010
modified 9 Apr 2012
by Tom Igoe
Montagem:
* Sensor LM35 ligado a AN0
* Cartão SD conectado ao SPI
** MOSI - pin 11
** MISO - pin 12
** CLK - pin 13
** CS - pin 4
*/
#include <SD.h>
// Saída digital usada para o CS do cartão SD
const int chipSelect = 4;
// Arquivo de dados
File dataFile;
// Iniciação
void setup()
{
// Abre a porta inicial
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
// Acesso o cartão SD
Serial.print("Acessando cartao SD...");
if (!SD.begin(chipSelect)) {
Serial.println(" falha ao acessar o cartao.");
return;
}
Serial.println(" sucesso.");
}
// Laco de coleta
void loop()
{
// Trata a serial
if (Serial.available() > 0) {
// recebeu caracter pela serial, espaço abre ou fecha o arquivo
if (Serial.read() == ' ') {
if (dataFile) {
dataFile.close();
Serial.println ("Arquivo fechado");
} else {
dataFile = SD.open("datalog.txt", FILE_WRITE);
if (dataFile) {
Serial.println ("Arquivo aberto");
} else {
Serial.println("Erro ao abrir datalog.txt");
}
}
}
}
// Se arquivo aberto, le o sensor e grava a leitura
if (dataFile) {
unsigned sensor = analogRead(A0);
sensor = (sensor*500)/1024; // converte para temperatura
dataFile.println(sensor);
Serial.println(sensor);
delay (5000); // 5 segundos entre leituras
}
}
O tamanho da bilbioteca SD é significativo: o exemplo acima ocupa
cerca de 14K, o que é próximo da metade da memória do ATmega328. Destes
14K, 11K são da biblioteca SD. Comentário Finais
O uso de cartões SD no Arduino está pouco acima do nível "urso andando de bicicleta" (ele não anda muito bem, mas é incrível conseguir andar alguma coisa). Gasta uma parcela significativa da Flash e Ram do ATmega e não é muito veloz.
Se você deseja salvar poucos dados, considere usar a EEProm do ATmega ou uma EEProm externa. Se a biblioteca SD for lenta para as suas necessidades, mas não muito, você pode deixar de lado o sistema FAT e acessar diretamente os blocos.
Se você quer fazer um uso mais sofisticado do cartão, considere usar um "mini PC" como o Raspberry Pi e a Beaglebone Black.

Nenhum comentário:
Postar um comentário