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