Attempting to play music from SD card to speaker

I am attempting to have my Arduino Mega 2560 read a file from an SD card and play the audio through a speaker. There have been several times this has been brought up in the forum but I have not been able to resolve it with those same solutions. I am not getting any errors in the code but the file is not playing through the speaker. The speaker makes a loud buzzing sound for a 1-2 seconds and then stops. There are other sensors involved in the project that I am currently not having issues with but I am listing them in case they could somehow be a culprit or related to my issue.

All items below are being powered off the 5V Power Supply except for the SD Card Module which was initially on 3.3V but reading other forums on here it seemed like the unit I purchased could be used on 5V. Nothing is being directly powered off the Arduino Mega pins!

Solutions I have currently attempted & Other Info:

  • SD card was formatted set to 32FAT 11025HZ and 8bit for the audio file. It is a top level file on the card (not in a folder or sub folder)

  • I have tried adding a delay after the file is supposed to play as I have heard that can sometime help.

  • To ensure the amplifier is not defective, I tried a 2nd unit (same type) and tried using a transistor at one point as well.

  • I am including the code which is mostly base level right now until I can get the speaker to play files from the SD card.

  • I am also including a schematic to assist but am new to the Fritzing software so apologize as there were several pieces of my setup I could not find assets for in Fritzing. If there is a way to make your own custom assets, I have not gotten that far yet. Hopefully what I have makes sense though.

PARTS LIST:

/*
  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 it's 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 53
// Adafruit SD shields and modules: pin 10
// Sparkfun SD shield: pin 8
// MKRZero SD: SDCARD_SS_PIN
const int chipSelect = 53;

#include <Stepper.h>
int irMotionPin = 3;
int stepsPerRevolution = 2048;
int motSpeed = 10;
int dt = 1000;
Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11);

#include "SD.h"
#define SD_ChipSelectPin 53
#include "TMRpcm.h"
#include "SPI.h"

TMRpcm tmrpcm;

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);

  Serial.begin(9600);
  myStepper.setSpeed(motSpeed);
  pinMode(stepsPerRevolution, OUTPUT);

  tmrpcm.speakerPin = 4;
  Serial.begin(9600);
  if (!SD.begin(SD_ChipSelectPin)) {
    Serial.println("SD fail");
    return;
    {
      tmrpcm.play("hello.wav");
      delay(dt);
    }
  }
}



void loop() {
  // put your main code here, to run repeatedly:
  while (digitalRead(irMotionPin) == HIGH) {
    myStepper.step(2048);
    delay(dt);
    myStepper.step(-stepsPerRevolution);
    delay(dt);
  }

  while (digitalRead(irMotionPin) == LOW)
    ;
  {
    myStepper.step(0);
    delay(dt);
  }
}

I am fairly new to all this and have tried to be thorough but if you need other info or anything elaborated on definitely let me know! Also, if would be helpful, I can remove the coding pertaining to the PIR sensor and stepper motor. I left it in for now on the off chance it is somehow playing into my speaker issue. Any help or suggestions on how to address the issue are much appreciated. Thanks!

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