Can't Detect/Initialize MicroSD Card with Adafruit Music Maker MP3 Shield on MEGA

Edit: Seems to be a faulty shield... I received my new shield today and it works. No modifications needed whatsoever.

I have spent the past day troubleshooting why the music maker shield doesn't recognize my microSD card. I would greatly appreciate any help! Thanks in advance!

Hardware:

  1. Adafruit Music Maker MP3 Shield Adafruit Music Maker MP3 Shield for Arduino w/3W Stereo Amp [v1.0] : ID 1788 : $34.95 : Adafruit Industries, Unique & fun DIY electronics and kits
  2. Arduino MEGA R3 https://www.amazon.com/dp/B01H4ZLZLQ?ref=ppx_yo2_dt_b_product_details&th=1

I followed the Adafruit guide initially: https://learn.adafruit.com/adafruit-mus ... r/assembly

The message I got from this was:
"The message I got:
"Adafruit VS1053 Simple Test
VS1053 found
SD failed, or not present"

Here are a few things I tried:

  1. Tried with three different microSD cards, formatted with SDFormatter. No success.

I thought it might be an issue with SD card reader and Mega boards in general so I wanted to see if I could get the default "Cardinfo" or the SdFat library "SdInfo" sketches to work.

As expected, I got messages along these lines:

"Initializing SD card...initialization failed. Things to check:

  • is a card inserted?
  • is your wiring correct?
  • did you change the chipSelect pin to match your shield or module?"
  1. Tried following setting different chipSelect pins and adding "pinMode(10, OUTPUT); digitalWrite(10, HIGH)" as this articles shows https://embedjournal.com/arduino-sd-car ... on-failed/ (I tried both 53 and 10 for the pinMode

  2. In this post (SD card Initialize Failure with Arduino Mega - Page 2 - adafruit industries), a user was able to modify "if (!card.init(SPI_HALF_SPEED, chipSelect))" into "if (!card.init(SPI_QUARTER_SPEED, chipSelect))" to get their SD card initialization code working. I copied their code but that didn't work either.

  3. I downloaded an older version of the SD library (v. 1.0.8). That also didn't lead to any difference.

I really don't know what else to try. I am now waiting for a new music maker shield, a UNO and another MEGA to see if it might be the boards themselves. If anyone could offer help that would be great!

Code I used from the Adafruit library:

/*************************************************** 
  This is an example for the Adafruit VS1053 Codec Breakout

  Designed specifically to work with the Adafruit VS1053 Codec Breakout 
  ----> https://www.adafruit.com/products/1381

  Adafruit invests time and resources providing this open source code, 
  please support Adafruit and open-source hardware by purchasing 
  products from Adafruit!

  Written by Limor Fried/Ladyada for Adafruit Industries.  
  BSD license, all text above must be included in any redistribution
 ****************************************************/

// include SPI, MP3 and SD libraries
#include <SPI.h>
#include <Adafruit_VS1053.h>
#include <SD.h>

// define the pins used
//#define CLK 13       // SPI Clock, shared with SD card
//#define MISO 12      // Input data, from VS1053/SD card
//#define MOSI 11      // Output data, to VS1053/SD card
// Connect CLK, MISO and MOSI to hardware SPI pins. 
// See http://arduino.cc/en/Reference/SPI "Connections"

// These are the pins used for the breakout example
#define BREAKOUT_RESET  9      // VS1053 reset pin (output)
#define BREAKOUT_CS     10     // VS1053 chip select pin (output)
#define BREAKOUT_DCS    8      // VS1053 Data/command select pin (output)
// These are the pins used for the music maker shield
#define SHIELD_RESET  -1      // VS1053 reset pin (unused!)
#define SHIELD_CS     7      // VS1053 chip select pin (output)
#define SHIELD_DCS    6      // VS1053 Data/command select pin (output)

// These are common pins between breakout and shield
#define CARDCS 4     // Card chip select pin
// DREQ should be an Int pin, see http://arduino.cc/en/Reference/attachInterrupt
#define DREQ 3       // VS1053 Data request, ideally an Interrupt pin

Adafruit_VS1053_FilePlayer musicPlayer = 
  // create breakout-example object!
  Adafruit_VS1053_FilePlayer(BREAKOUT_RESET, BREAKOUT_CS, BREAKOUT_DCS, DREQ, CARDCS);
  // create shield-example object!
  //Adafruit_VS1053_FilePlayer(SHIELD_RESET, SHIELD_CS, SHIELD_DCS, DREQ, CARDCS);
  
void setup() {
  Serial.begin(9600);
  Serial.println("Adafruit VS1053 Simple Test");

  if (! musicPlayer.begin()) { // initialise the music player
     Serial.println(F("Couldn't find VS1053, do you have the right pins defined?"));
     while (1);
  }
  Serial.println(F("VS1053 found"));
  
   if (!SD.begin(CARDCS)) {
    Serial.println(F("SD failed, or not present"));
    while (1);  // don't do anything more
  }

  // list files
  printDirectory(SD.open("/"), 0);
  
  // Set volume for left, right channels. lower numbers == louder volume!
  musicPlayer.setVolume(20,20);

  // Timer interrupts are not suggested, better to use DREQ interrupt!
  //musicPlayer.useInterrupt(VS1053_FILEPLAYER_TIMER0_INT); // timer int

  // If DREQ is on an interrupt pin (on uno, #2 or #3) we can do background
  // audio playing
  musicPlayer.useInterrupt(VS1053_FILEPLAYER_PIN_INT);  // DREQ int
  
  // Play one file, don't return until complete
  Serial.println(F("Playing track 001"));
  musicPlayer.playFullFile("/track001.mp3");
  // Play another file in the background, REQUIRES interrupts!
  Serial.println(F("Playing track 002"));
  musicPlayer.startPlayingFile("/track002.mp3");
}

void loop() {
  // File is playing in the background
  if (musicPlayer.stopped()) {
    Serial.println("Done playing music");
    while (1) {
      delay(10);  // we're done! do nothing...
    }
  }
  if (Serial.available()) {
    char c = Serial.read();
    
    // if we get an 's' on the serial console, stop!
    if (c == 's') {
      musicPlayer.stopPlaying();
    }
    
    // if we get an 'p' on the serial console, pause/unpause!
    if (c == 'p') {
      if (! musicPlayer.paused()) {
        Serial.println("Paused");
        musicPlayer.pausePlaying(true);
      } else { 
        Serial.println("Resumed");
        musicPlayer.pausePlaying(false);
      }
    }
  }

  delay(100);
}


/// File listing helper
void printDirectory(File dir, int numTabs) {
   while(true) {
     
     File entry =  dir.openNextFile();
     if (! entry) {
       // no more files
       //Serial.println("**nomorefiles**");
       break;
     }
     for (uint8_t i=0; i<numTabs; i++) {
       Serial.print('\t');
     }
     Serial.print(entry.name());
     if (entry.isDirectory()) {
       Serial.println("/");
       printDirectory(entry, numTabs+1);
     } else {
       // files have sizes, directories do not
       Serial.print("\t\t");
       Serial.println(entry.size(), DEC);
     }
     entry.close();
   }
}

Code I used for Cardinfo (I also tried SdInfo from the SdFat library; and I tried different card select pins (it's 7 according to the Adafruit example sketch), as well as pinMode and digitalWrite the SS pins (tried both 10 and 53) to high.

/*
  SD card test

  This example shows how use the utility libraries on which the'
  SD library is based in order to get info about your SD card.
  Very useful for testing a card when you're not sure whether its working or not.

  The circuit:
    SD card attached to SPI bus as follows:
 ** MOSI - pin 11 on Arduino Uno/Duemilanove/Diecimila
 ** MISO - pin 12 on Arduino Uno/Duemilanove/Diecimila
 ** CLK - pin 13 on Arduino Uno/Duemilanove/Diecimila
 ** CS - depends on your SD card shield or module.
       Pin 4 used here for consistency with other Arduino examples


  created  28 Mar 2011
  by Limor Fried
  modified 9 Apr 2012
  by Tom Igoe
*/
// include the SD library:
#include <SPI.h>
#include <SD.h>

// set up variables using the SD utility library functions:
Sd2Card card;
SdVolume volume;
SdFile root;

// change this to match your SD shield or module;
// Arduino Ethernet shield: pin 4
// Adafruit SD shields and modules: pin 10
// Sparkfun SD shield: pin 8
// MKRZero SD: SDCARD_SS_PIN
const int chipSelect = 10;

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }


  Serial.print("\nInitializing SD card...");

  // we'll use the initialization code from the utility libraries
  // since we're just testing if the card is working!
  if (!card.init(SPI_HALF_SPEED, chipSelect)) {
    Serial.println("initialization failed. Things to check:");
    Serial.println("* is a card inserted?");
    Serial.println("* is your wiring correct?");
    Serial.println("* did you change the chipSelect pin to match your shield or module?");
    while (1);
  } else {
    Serial.println("Wiring is correct and a card is present.");
  }

  // print the type of card
  Serial.println();
  Serial.print("Card type:         ");
  switch (card.type()) {
    case SD_CARD_TYPE_SD1:
      Serial.println("SD1");
      break;
    case SD_CARD_TYPE_SD2:
      Serial.println("SD2");
      break;
    case SD_CARD_TYPE_SDHC:
      Serial.println("SDHC");
      break;
    default:
      Serial.println("Unknown");
  }

  // Now we will try to open the 'volume'/'partition' - it should be FAT16 or FAT32
  if (!volume.init(card)) {
    Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
    while (1);
  }

  Serial.print("Clusters:          ");
  Serial.println(volume.clusterCount());
  Serial.print("Blocks x Cluster:  ");
  Serial.println(volume.blocksPerCluster());

  Serial.print("Total Blocks:      ");
  Serial.println(volume.blocksPerCluster() * volume.clusterCount());
  Serial.println();

  // print the type and size of the first FAT-type volume
  uint32_t volumesize;
  Serial.print("Volume type is:    FAT");
  Serial.println(volume.fatType(), DEC);

  volumesize = volume.blocksPerCluster();    // clusters are collections of blocks
  volumesize *= volume.clusterCount();       // we'll have a lot of clusters
  volumesize /= 2;                           // SD card blocks are always 512 bytes (2 blocks are 1KB)
  Serial.print("Volume size (Kb):  ");
  Serial.println(volumesize);
  Serial.print("Volume size (Mb):  ");
  volumesize /= 1024;
  Serial.println(volumesize);
  Serial.print("Volume size (Gb):  ");
  Serial.println((float)volumesize / 1024.0);

  Serial.println("\nFiles found on the card (name, date and size in bytes): ");
  root.openRoot(volume);

  // list all files in the card with date and size
  root.ls(LS_R | LS_DATE | LS_SIZE);
}

void loop(void) {
}

I do not see how you resolve the difference in the locations of the SPI pins between the Uno that the shield was meant for and the Mega. The Uno has the SPI pins on pins 11, 12 and 13. The SPI pins on the Mega are 50, 51 and 52.

Hi thanks for the reply. The Adafruit tutorial is using the ICSP 2x3 header for that. It says to solder the ICSP jumpers on the shield if you were using a Mega (the ones saying MISO, SCK, MOSI on the shield)

Sorry I forgot to post pictures of my setup. Here's the shield.


OK, I see.

It shouldn't cause a problem in this case because you are not using Pins 11-13 but when you soldered the jumpers to connect MOSI, MISO, and SCK to the ICSP header you should probably cut the traces that jumper them to Pins 11, 12, and 13.

Thanks for the heads up :smiley:

It's a long time since I touched an Arduino (now in my 70th year and rusty!) and I'm out of touch with the practicalities - and my questions are rather basic. Any help will be appreciated. I hope to stack Adafruit Music Maker MP3 shield onto an Arduino Mega or Uno. But the pinouts of Mega and Uno look so different and this difference seems to apply to position of the 3x2 header for the serial connection. Is it equally easy to stack this MP3 shield on both Arduinos ? If I also want to connect to some of the Mega's GPIO do I have to solder in stacking headers with longer pins that protrude through the Music Maker's PCB ?
Thank You for considering my question, Steve

The ICSP header is in the same relative place on the UNO and MEGA. It is the only place where the SPI interface (Uno 11, 12, 13, Mega 50, 51, 52) are in the same physical location on both boards. That's why shields that use SPI have to use the ICSP header if they want to work on both boards.

The shield documentation says that the SD slot CS/SS line is connected to Pin 4 on the Arduino. Did you tell the SD library to use Pin 4?

Thank you John, I really appreciate your help ! As well as the helpfulness of your answer, you got me over my hang up with the apparent visual difference, it's given me a confidence boost. Last year I was diagnosed with Parkinson's disease, which had been, from the brain scans, degenerating the 'grey matter' for about a decade, so I decided (now the meds have really kicked in and I'm on the 'up') to revisit Arduino, give my brain a workout. This is not the forum for personal stories I guess, but I just wanted you to know that your timely reply made a much bigger difference to me than you might have otherwise guessed ! Thank You.

Whilst I'm just getting my head back into C (for Arduino) in readiness for firing up some hardware (shopping list in progress) the library config side lies ahead. Does the CS/SS line ground pin 4 so that the library code knows there is a memory card inserted ?

This is kinda strange - Nevertheless, you can always get your latest updates to fix that.

No.

If you want to read the card inserted pin you need to do that yourself.

But the library code can already tell you if there is a card inserted, it attempts to read it, and there will be a fail if there is no card.

(Note: The SPI interface pins have been using the problematic terms "Master" and "Slave". That gave us the pin names MOSI (Master Out / Slave In), MISO (Master In / Slave Out), and SS (Slave Select). Sometimes CS (Chip Select) was used in place of SS. Recently there has been some move towards the less problematic terms "Controller" and "Peripheral": CIPO, COPI, and PS.)

The Peripheral Select line is how multiple peripherals share the CIPO and COPI pins. Only the peripheral whose PS line is LOW is allowed to drive the CIPO line and is the only peripheral that acts on the data presented on the COPI line.

Thank you so much for explaining this and demystifying the terminology. Your explanation of the functions of the 3 lines has helped me grasp the principle: PS [ peripheral select] ; CIPO [ controller in/peripheral out] ; COPI [controller out/peripheral in ]. This has rung bells with me (revived distant memory from much earlier involvement at work) and I presume that there is also a clock line driven by the Arduino ?

Thank you ! That's made it clear for me, I really appreciate your help.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.