quinta-feira, setembro 25, 2014

Usando Cartões SD com o Arduino- Parte 2

Encerrando o nosso rápido estudo, vamos ver a questão do software.



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: