How to Interface SD card to Arduino (without SD card shield)?

Introduction

I wonder if I can interface SD card to a microcontroller without using any adapter or shield. After a quick search of SD card pinout in google, I found out that SPI is use in order to communicate with SD card. To minimize my effort, I then search for some reference and below are my tinkering with it.

So first, let me introduce myself. My name is George! Welcome to tech-to-tinker Youtube channel where technology is explored and shared.

Bill Of Materials

  1. Arduino Uno.
  2. A spare SD card you are willing to kiss goodbye :). Because you might damage it.
  3. Soldering iron, some soldering leads, and your soldering skills.
  4. Some jumper wires.

Hardware Instruction

  1. First, make the necessary soldering of jumper wires to the SD card. Please refer to the schematic below. You may also break out the SD card cover to expose its internal parts. This is to make soldering easier. I suggest to make the connection from inside so that you may still connect the SD card to a computer for transferring of files (please refer to what I did).

Please take note of the following:

  • SD card pin 1 (C/S pin) is connected with (green) wire to Arduino Uno pin 10.
  • SD card pin 2 (MOSI pin) is connected with (blue) wire to Arduino Uno pin 11.
  • SD card pin 3 and pin 6 (VSS pin) is connected with (violet) wire to Arduino Uno GND pin.
  • SD card pin 4 (VDD pin) is connected with (dark gray) wire to Arduino Uno +3.3V pin (but I believe you can also use 5V, but Im not sure with regards to this).
  • SD card pin 5 (SCK pin) is connected with (light gray) wire to Arduino Uno pin 13.
  • SD card pin 7 (MISO pin) is connected with (black) wire to Arduino Uno pin 12.
  1. Connect the Arduino Uno to a computer.
  2. Run the Arduino IDE.
  3. Make sure “Arduino Uno” is selected under Tools > Board.
  4. Check that the correct serial port is selected under Tools > Port.
  5. The source code is available in the Arduino IDE under Files > Examples > SD, or you may copy the source code provided below.

  1. If all goes well, you should be able to see something similar to above picture in your Serial Monitor.
  2. Enjoy.

Video Demonstration

Source Code

  1/*
  2  SD card test
  3
  4  This example shows how use the utility libraries on which the'
  5  SD library is based in order to get info about your SD card.
  6  Very useful for testing a card when you're not sure whether its working or not.
  7
  8  The circuit:
  9    SD card attached to SPI bus as follows:
 10 ** MOSI - pin 11 on Arduino Uno/Duemilanove/Diecimila
 11 ** MISO - pin 12 on Arduino Uno/Duemilanove/Diecimila
 12 ** CLK - pin 13 on Arduino Uno/Duemilanove/Diecimila
 13 ** CS - depends on your SD card shield or module.
 14   Pin 4 used here for consistency with other Arduino examples
 15
 16
 17  created  28 Mar 2011
 18  by Limor Fried
 19  modified 9 Apr 2012
 20  by Tom Igoe
 21*/
 22// include the SD library:
 23#include <spi .h="">
 24#include <sd .h="">
 25
 26// set up variables using the SD utility library functions:
 27Sd2Card card;
 28SdVolume volume;
 29SdFile root;
 30
 31// change this to match your SD shield or module;
 32// Arduino Ethernet shield: pin 4
 33// Adafruit SD shields and modules: pin 10
 34// Sparkfun SD shield: pin 8
 35// MKRZero SD: SDCARD_SS_PIN
 36const int chipSelect = 10;
 37
 38void setup() {
 39  // Open serial communications and wait for port to open:
 40  Serial.begin(9600);
 41  while (!Serial) {
 42    ; // wait for serial port to connect. Needed for native USB port only
 43  }
 44
 45
 46  Serial.print("nInitializing SD card...");
 47
 48  // we'll use the initialization code from the utility libraries
 49  // since we're just testing if the card is working!
 50  if (!card.init(SPI_HALF_SPEED, chipSelect)) {
 51    Serial.println("initialization failed. Things to check:");
 52    Serial.println("* is a card inserted?");
 53    Serial.println("* is your wiring correct?");
 54    Serial.println("* did you change the chipSelect pin to match your shield or module?");
 55    while (1);
 56  } else {
 57    Serial.println("Wiring is correct and a card is present.");
 58  }
 59
 60  // print the type of card
 61  Serial.println();
 62  Serial.print("Card type:         ");
 63  switch (card.type()) {
 64    case SD_CARD_TYPE_SD1:
 65      Serial.println("SD1");
 66      break;
 67    case SD_CARD_TYPE_SD2:
 68      Serial.println("SD2");
 69      break;
 70    case SD_CARD_TYPE_SDHC:
 71      Serial.println("SDHC");
 72      break;
 73    default:
 74      Serial.println("Unknown");
 75  }
 76
 77  // Now we will try to open the 'volume'/'partition' - it should be FAT16 or FAT32
 78  if (!volume.init(card)) {
 79    Serial.println("Could not find FAT16/FAT32 partition.nMake sure you've formatted the card");
 80    while (1);
 81  }
 82
 83  Serial.print("Clusters:          ");
 84  Serial.println(volume.clusterCount());
 85  Serial.print("Blocks x Cluster:  ");
 86  Serial.println(volume.blocksPerCluster());
 87
 88  Serial.print("Total Blocks:      ");
 89  Serial.println(volume.blocksPerCluster() * volume.clusterCount());
 90  Serial.println();
 91
 92  // print the type and size of the first FAT-type volume
 93  uint32_t volumesize;
 94  Serial.print("Volume type is:    FAT");
 95  Serial.println(volume.fatType(), DEC);
 96
 97  volumesize = volume.blocksPerCluster();    // clusters are collections of blocks
 98  volumesize *= volume.clusterCount();       // we'll have a lot of clusters
 99  volumesize /= 2;                           // SD card blocks are always 512 bytes (2 blocks are 1KB)
100  Serial.print("Volume size (Kb):  ");
101  Serial.println(volumesize);
102  Serial.print("Volume size (Mb):  ");
103  volumesize /= 1024;
104  Serial.println(volumesize);
105  Serial.print("Volume size (Gb):  ");
106  Serial.println((float)volumesize / 1024.0);
107
108  Serial.println("nFiles found on the card (name, date and size in bytes): ");
109  root.openRoot(volume);
110
111  // list all files in the card with date and size
112  root.ls(LS_R | LS_DATE | LS_SIZE);
113}
114
115void loop(void) {
116}

Call To Action

If you find this lesson useful, please consider leaving your comments and suggestion below.

Thank you and have a good day. Happy tinkering!



Posts in this series



No comments yet!

GitHub-flavored Markdown & a sane subset of HTML is supported.