Arduino Mega 2560 and sd card module

Arduino Mega 2560 and sd card module

Arduino Mega 2560 and sd card module

I bought a sd card module some time ago, from a Chinese seller on Ebay. These modules are really cheap, I paid 2,03€ for it and that includes shipping to Belgium. You really wonder how they can do it. To try it out I connected the sd card module to my Arduino Uno and uploaded the data logger example sketch. This sketch reads the value of 3 analogue inputs and logs it to a file on the sd card. This worked out of the box. Then I tried doing the same with my Arduino Mega 2560 and it caused me some head scratching. I plugged my sensor shield on the mega, this shield has a break out connector for a sd card module. Unfortunately the pinout of this connector is not written on the board itself. After some googling I finally found a small drawing with the pinout of the connector.

Arduino Mega shield

Arduino Mega shield

The sd card talks to the Arduino over the SPI bus. The Mega 2560 uses different pins for the SPI then the Uno. This caused me some trouble in getting the sketch to work. In the example data logger sketch the chipselect pin is set to 4, and the pinmode for pin 10 is to output. This is necessary for the sd library to work. After some fiddling I found that for the Mega 2560 you have to set both to pin 53 for the sd library to work 🙂
Here is the sketch:

/*
  http://www.bajdi.com
  SD card datalogger for Arduino Mega (this sketch will ONLY work with Arduino Mega) 
 
 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 51
 ** MISO - pin 50
 ** CLK - pin 52
 ** CS - pin 53
 
 created  24 Nov 2010
 updated 2 Dec 2010
 by Tom Igoe
 updated 22 Jan 2012 for Arduino Mega
 by Bajdi.com 
 
 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");
  } 
}

16 responses to “Arduino Mega 2560 and sd card module”

  1. Kevin

    nice article. I have the lcsoft sd card that looks like yours. I’ve been struggling to get this working with your code and and Arduino Mega 2560. I always get Card failed. I was wondering if you could clarify thelast sentence of your paragraph below, maybe that’s where I’m going wrong. Did you physically connect the pins together? you don’t set any as outputs in the sketch.
    Thanks

    >>>
    The sd card talks to the Arduino over the SPI bus. The Mega 2560 uses different pins for the SPI then the Uno. This caused me some trouble in getting the sketch to work. In the example data logger sketch the chipselect pin is set to 4, and the pinmode for pin 10 is to output. This is necessary for the sd library to work. After some fiddling I found that for the Mega 2560 you have to set both to pin 53 for the sd library to work

  2. Shyam B

    Can you tell me if I can use an external SD card (like this one), with the ArduPilot mega (APM-1) board given by DIY Drones. It uses an IMU board busy communicating on the SPI bus.

    looking forward to your help?

  3. Shyam B

    Hi,

    Could you have connected the SD card directly to the ICSP interface header (as it also is internally connected to pins 50,51,52,53) on Mega. I am using the ArduPilotMega (APM 1.4) board from DIYDrones.com built on ATMega2560. I need help, thanks!

  4. Shyam B

    Thanks. SD card now works, but having Serial.print(..) output alongside more often gives me junk characters in the Serial output. Any reasons why this might happen?

    I am using ICSP pin headers for connecting the SD card module.

    Thanks.

  5. Pobs

    I am getting the error, I will try with another card. By the way, are you sure that the pin numbers for Miso and Mosi are ok in your comments. I had them the other way around.

  6. Klaus

    on the sd card module are the Pins Gnd,3.3 and 5 V.Which pin is connected with the violet wire? I cannot see it clearly on the photo, is ist 5V to Vcc and 3.3 pin open?
    Thanks

  7. Ed

    A word of warning.. I have what appears to be the exact same sensor shield. I immediately got weird errors and had my arduino shut down twice. I got lucky and accidentally found the problem. The sensor shield has a jumper right next to the external power connector. Look between the shield and the arduino 2560 when they are plugged in. Make sure the leads from these jumper pins are not shorting out against the metal housing of your USB plug of the 2560. I could actually see mine spark as it shorted.
    Easy to fix if you have this problem too…
    I wanted to mention it since they look the same as mine and may have this problem.

  8. Joy

    Hello Admin, I am facing problem in interfacing similar type of SD Module as yours (link: http://www.lctech-inc.com/Hardware/Default.aspx?Id=38dab293-e293-4022-9a8b-9c5abf4b9fe5 ) and could not initialize it with my Arduino MEGA2560 board. I have connected the module with Arduino board as per instructions of arduino website but failed every time. I am sharing my connection diagram and sample code i have been using for initializing the module.
    Can you please check it and suggest me an effective way to work with this.

    Connection diagram: https://drive.google.com/file/d/0B1UMcEDPy9t0aTA5N3RYOVpzaWc/edit?usp=sharing

    ========
    code
    ————–
    #include

    int CS_pin = 53;

    void setup()
    {
    Serial.begin(9600);
    pinMode(53, OUTPUT);
    if (!SD.begin(CS_pin))
    {
    Serial.println(“card not initialized”);
    return;
    }
    Serial.println(“card ready”);
    }

    void loop()
    {
    String datastring = “Hello world”;
    File datafile = SD.open(“check.txt”,FILE_WRITE);
    if (datafile)
    {
    datafile.println(datastring);
    datafile.close();
    Serial.println(datastring);
    }
    else
    {
    Serial.println(“file not accessed”);
    }
    delay (5000);
    }

  9. Bill

    I wouldn’t touch that SD formatting software with a 10 meter pole. It is obviously published by the legal department for their benefit.

Leave a Reply

*