Data-Logger SD/MMC com Arduino

Os cartões de memória Secure Digital ou MultiMedia Card , são dispositivos capazes de armazenar dados

O SD (Secure Digital) é um padrão de armazenamento portável, usado em celulares, câmeras mp3 players, computadores pessoais, impressoras, sistemas de navegação GPS entre outros. O termo Segure Digital (Segurança Digital) provém da capacidade destes dispositivos de armazenar direitos autorais em seus arquivos [1].

A adoção dos cartões de memória da família SD no mercado de eletroeletrônicos vem crescendo muito nos últimos anos, desta maneira percebemos que é uma excelente tecnologia para ser usada em projetos eletrônicos em geral.

Adoção padrão SD por eletroeletrônicos

Fonte: http://www.sdcard.org/developers/tech/sdcard – 2

Comunicação via SPI

Os cartões SD comunicam-se através de uma Interface Periférica Serial (SPI – Serial Peripheral Interface), que permite que vários dispositivos troquem dados em full-duplex. O SPI é um protocolo síncrono que permite um dispositivo mestre (master) iniciar a comunicação com um escravo (slave). Para prover o sincronismo, o sinal de clock (pino SCK) pode ser gerado somente pelo mestre, e este sinal controla quando os dados podem mudar e quando são válidos para leitura. Por ser síncrono, esse protolo torna-se interessante para ser usado em um oscilador não tão estável, como um oscilador RC, pois a taxa de transferência varia apenas de acordo com as subidas e descidas do oscilador, não afetando a integridade dos dados. Por permitir vários escravos, o SPI precisa controlar qual deles está sendo acessado, e o faz com um sinal CS (Chip Select) ou SS (Slave Select), que não precisa ser conectado caso haja apenas um escravo[3].

Portas SPI no Arduino

O Arduino nomeia os pinos de entrada e saída sendo MOSI (Master Out Slave In) e MISO (Master In Slave Out) respectivamente. O Duemilanove e outros Arduinos baseados no chip Atmega168/328 usam o SPI nos pinos: 10 (SS), 11 (MOSI), 12 (MISO) e 13 (SCK). Atenção especial ao Arduino Mega: nele os pinos são em outras portas, isso pode salvar um bom tempo seu: 50 (MISO), 51 (MOSI), 52 (SCK) e 53 (SS). Lembrando sempre que o pino SS precisa ser configurado no setup() como OUTPUT, do contrário a interface SPI irá por o microprocessador em escravo (slave), ficando então inoperável. [4].

Dica: Se estiver trabalhando com alguma biblioteca específica e receber um erro como este: “no sd/mmc pin mapping available!” significa que a biblioteca em questão não implementa as pinagens de seu Arduino. Isso ocorreu-me em quanto trabalhava com o Arduino Mega 1280 em testes com softwares de leitura do sistema de arquivos FAT dos cartões SDs.

Os pinos do cartão MMC/SD

Os cartões MMC possuem apenas 7 pinos, já os SD 9, fora as conexões de controle de bloqueio de escrita do cartão que nesta versão do projeto não serão implementadas. Visto isso a figura abaixo ilustra com facilidade a identificação dos pinos.

pinagem cartão MMC/SD

Os cartões MMC/SD funcionam com alimentação de 2,7 à 3,6 Volts e seu nível lógico alto é 3.3 Volts. Confira abaixo a tabela dos pinos:

Pino # Nome do Pino Função do Sinal
1 CS ou SS Chip Select – Slave Select
2 SI ou MOSI Serial Input – Master Out Slave In (SPI)
3 GND Ground
4 Vcc Tensão CC de 2.7 à 3.6 Volts
5 SCK Serial Clock (SPI)
6 GND Ground
7 SO ou MISO Serial Output – Master In Slave Out (SPI)
8 NC
9 NC

Esquema elétrico

esquema elétrico arduino e cartão sd-mmc

O esquema elétrico é bastante simples não envolvendo nada mais que seis resistores que atuam como divisores de tensão.

Isso é necessário, pois como já dito, os cartões SD/MMC trabalham com nível lógico alto em 3.3 Volts. Repare também que a alimentação do cartão é feita na porta 3V3 do Arduino.

Após a passagem pelos resistores temos as conexões do pino 1 do SD ao pino 53 do Arduino, o pino 2 conecta-se ao 51, o pino 5 ao 52 e por último o pino 7 conecta-se diretamente ao pino 50. O Arduino  interpreta a tensão de 3 Volts como sendo nível lógico 1 e 0 Volts como nível lógico 0.

Os resistores usados foram 10k (10000 ohms) e 4k7 (4700 ohms). Se juntarmos os dois em série e conectarmos um deles em 5 Volts e outro em 0 Volts, a diferença de tensão (ddp) entre o positivo da fonte e a conexão dos resistores será de 3.4 Volts. Vamos à fórmula: Vres = V x R1 / R1 + R2 = 23500 / 14700 = 1.60 Volts. Agora Pegamos a tensão total (5 Volts) menos a tensão obtida e teremos 5 – 1.60 = 3.4 Volts que se encaixa muito bem nos requisitos do cartão de memória.


Circuito elétrico - Arduino com cartão de memória SD-MMC
Parece um pouco difícil de acreditar, mas é só este hardware mesmo que é ncessário para interfacear os cartões SD-MMC com o Arduino. Agora falta a camada de software que nos permitirá gravar e ler arquivos no cartão de memória. Inicialmente você precisa formatar seu cartão de memória com sistema de arquivos FAT16, se tiver dúvidas segue a dica: http://www.ladyada.net/make/logshield/sd.html.

Atualização em 24-10-11 – Circuito opcional com outros valores de resistores

Uso de outros resistores para dividir tensão

Outro exemplo de conexão entre o Arduino e o cartão SD pode ser visto aqui: http://img441.imageshack.us/img441/2391/schematicuo7.jpg. Neste caso temos o uso de resistores de resistores com 1.8k e 3.3k, mas se fizermos os cálculos chegaremos a 3.23 Volts, o que também está dentro da faixa de tensão aceitável pelo cartão de memória. Usei os resistores de 10k e 4k7 pois eram os que eu tinha aqui, você pode usar quaisquer resistores, desde que consiga uma ddp perto de 3.3 Volts.

Atualização em 09-07-12 – Detectando remoção do cartão SD

Nosso amigo Edipo me pediu sobre como poderíamos detectar se o cartão foi removido para poder então reiniciar o acesso via software. Bom, todos os soquetes de cartões que conheço possuem um sensor de presença do cartão. Alguns usam este mesmo sensor para detectar se ele é protegido contra gravação ou não.

Este sensor é basicamente um botão, logo podemos conectá-lo à uma interrupção externa do Arduino a qual pode informar nosso software que o cartão foi inserido ou removido. O status do cartão (inserido ou removido) pode ser controlado por uma simples flag.

Abaixo a foto de dois soquetes diferentes, encomendados na Farnell – excelente loja para se comprar componentes eletrônicos no Brasil, quais possuem diferentes contatos, porém ambos permitem a verificação da presença do cartão. Os dois contatos selecionados pela área em amarelo são as conexões que devem ser tratados como dois pinos de um botão. Para mais detalhes de como podemos trabalhar com botões, acesse esse material usado no curso de Arduino que estou ministrando em nossa cidade.

A camada de software – leitura e escrita de arquivos no cartão de memória

Feita a formatação você precisará de uma biblioteca capaz de ler sistema de arquivos FAT16. Fiz testes com várias, mas a primeira que consegui fazer funcionar com o Arduino Mega foi esta: http://code.google.com/p/sdfatlib/. Talvez pelo fato de que as outras assumem que você está com o Arduino padrão Duemilanove.

Olha só, fiz testes agora (10/05/11 às 20:49 kk) e percebi que com a biblioteca padrão do Arduino funciona também. Basta que alteremos o chipSelect para 53 (const int chipSelect = 53;) logo após a inclusão de <SD.h> e que dentro do setup() definamos pinMode(53, OUTPUT). Feito isso, testei aqui e funcionou perfeitamente. Mesmo sendo simples, segue aqui o fonte usado (disponível na instalação padrão da IDE do Arduino):

/*
  SD card datalogger

 This example shows how to log data from three analog sensors
 to an SD card using the SD library.

 The circuit:
 * analog sensors on analog ins 0, 1, and 2
 * SD card attached to SPI bus as follows:
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 4

 created  24 Nov 2010
 updated 2 Dec 2010
 by Tom Igoe

 This example code is in the public domain.

 */

#include <SD.h>

// On the Ethernet Shield, CS is pin 4. Note that even if it's not
// used as the CS pin, the hardware CS pin (10 on most Arduino boards,
// 53 on the Mega) must be left as an output or the SD library
// functions will not work.
const int chipSelect = 53;

void setup()
{
  Serial.begin(9600);
  Serial.print("Initializing SD card...");
  // make sure that the default chip select pin is set to
  // output, even if you don't use it:
  pinMode(53, OUTPUT);

  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  }
  Serial.println("card initialized.");
}

void loop()
{
  // make a string for assembling the data to log:
  String dataString = "";

  // read three sensors and append to the string:
  for (int analogPin = 0; analogPin < 3; analogPin++) {
    int sensor = analogRead(analogPin);
    dataString += String(sensor);
    if (analogPin < 2) {
      dataString += ",";
    }
  }

  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  File dataFile = SD.open("datalog.txt", FILE_WRITE);

  // if the file is available, write to it:
  if (dataFile) {
    dataFile.println(dataString);
    dataFile.close();
    // print to the serial port too:
    Serial.println(dataString);
  }
  // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening datalog.txt");
  }
}

Com o arquivo acima carregado no Arduino, ele irá gerar um arquivo chamado datalog.txt dentro do cartão com as informações de leitura dos sensores analógicos 0 à 2. Isso pode ser muito útil para as mais difersas coisas, como por exemplo um logger de sensor de temperatura, direção do vento e umidade do ar.

Faça agora testes com o exemplo ReadWrite da biblioteca do Arduino lembrando sempre de alterar o pino 4, padrão em shields com SD/MMC, para 53 que é o usado no Arduino Mega.

Estudos e melhorias futuras

Com certeza o que apresentei aqui foi só uma introdução ao funcionamento de cartões de memória com Arduino. Entre futuros estudos podemos citar a redução do tamanho da biblioteca para que possa funcionar com o Atmega8, estudo aprofundado do protocolo SPI e quem sabe também, implementar sistema de arquivos ext4.

Referências

[1] http://www.sdcard.org/developers/tech

[2] http://www.sdcard.org/developers/tech/sdcard

[3] http://ww1.microchip.com/downloads/en/devicedoc/spi.pdf

[4] http://arduino.cc/en/Reference/SPI

http://www.interfacebus.com/Multi_Media_Card_Pinout_MMC.html

http://www.ladyada.net/make/logshield/sd.html

http://www.ladyada.net/learn/arduino/ethfiles.html

Minha Reflexão

O custo de um shield SD é alto. Com cerca de 25 centavos (6 resistores) e uma câmera fogográfica/placa mãe de notebook queimada, que tem como destino o lixo, podemos montar um DataLogger funcional e pronto para uso. Se tiveres vontade de montar um adaptador como esse, divirta-se, aprende-se muito fazendo isso! Se gostou deste estudo, comente abaixo, vamos trocar algumas ideias!

Comments

  1. By Alencar

    Responder

  2. By Alencar

    Responder

  3. By Alencar

    Responder

    • Responder

  4. By Angélica

    Responder

  5. By sergio

    Responder

    • Responder

      • By sergio

        Responder

        • Responder

  6. By sergio

    Responder

  7. By Tacy Martins

    Responder

  8. By Tacy Martins

    Responder

  9. By Mickael

    Responder

    • Responder

  10. By daniel sa

    Responder

    • Responder

  11. By Maicon

    Responder

  12. By Pedro Henrique

    Responder

    • Responder

  13. By Luiz Felipe

    Responder

  14. By Fernando

    Responder

    • Responder

  15. By felipe

    Responder

    • Responder

  16. By Gabriel Assumpcao

    Responder

  17. By Jean Rocha

    Responder

    • Responder

  18. By JAACSJC

    Responder

    • Responder

  19. By Renato Maranhão

    Responder

    • Responder

  20. By Tacy

    Responder

    • Responder

  21. Responder

    • Responder

  22. By vitor

    Responder

    • Responder

  23. By Vanderlei

    Responder

    • Responder

  24. By Rafael

    Responder

    • Responder

  25. By José Soares

    Responder

    • Responder

  26. By Marina

    Responder

    • Responder

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *