Gleichzeitig mp3 und RFID shield

Hi,

ich hoffe, jemand hier kann mir helfen, ich verzweifle langsam.

Ich möchte mp3s (mit sparkfun's mp3shield) über RFIDs kontrollieren (rc522 reader). Ich habe einen Arduino Mega. Beim mp3shield habe ich die folgenden Pins überbrückt, so dass es mit dem spi verbunden ist
11 -> 51
12 -> 50
13 -> 52
Die pins 50, 51, 52 werden gleichzeitig auch vom RFID reader benutzt. Jedes Gerät für sich funktioniert tadellos, ich kriege es aber nicht zusammen hin.

Unten ist ein Stück Code, der nur aus dem Grund perfekt funktioniert, weil meine Testdateien track001.mp3 und track002.mp3 weniger als 5 Sekunden lang sind und ich anschliessend ein delay(5000); ranhänge. Dadurch ist das mp3 garantiert fertig abgespielt wenn der rfid reader wieder eine neue Karte sucht. Sobald ich z.B. auf delay(1000); setze hängt sich der Arduino auf.

Ich hoffe, jemand kann helfen :slight_smile:
Christian


#include <SPI.h>
#include <MFRC522.h>
#include <BlockDriver.h>
#include <FreeStack.h>
#include <MinimumSerial.h>
#include <SdFat.h>
#include <SdFatConfig.h>
#include <SysCall.h>
#include <SFEMP3Shield.h>

// Pins for rfid reader
#define RST_PIN   5     // Configurable, see typical pin layout above
#define SS_PIN    53    // Configurable, see typical pin layout above

byte currentByte = 0x00;

SdFat sd; 
MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance
SFEMP3Shield MP3player; 
const uint8_t volume = 80; // MP3 Player volume 0=max, 255=lowest (off)

MFRC522::MIFARE_Key key;

void setup() {
 Serial.begin(9600);  // Initialize serial communications with the PC
 initSD();  // Initialize the SD card
 initMP3Player();

 while (!Serial);     // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
 SPI.begin();         // Init SPI bus
 mfrc522.PCD_Init();  // Init MFRC522 card
}

void loop() {
 mfrc522.PICC_IsNewCardPresent();
 mfrc522.PICC_ReadCardSerial();

 // Print out current card ID
 Serial.print(F("Card UID:"));
 Serial.print(mfrc522.uid.uidByte[3], HEX);
 Serial.print("\n");

 // Check if a new card id is used and play the respective song
 if(mfrc522.uid.uidByte[3] != currentByte){
   currentByte = mfrc522.uid.uidByte[3];
   MP3player.stopTrack();
   if(mfrc522.uid.uidByte[3] == 0xA4){
     Serial.println("White");
     MP3player.playMP3("track001.mp3");
     delay(5000);
   }
   else if(mfrc522.uid.uidByte[3] == 0x63){
     Serial.println("Blue");
     MP3player.playMP3("track002.mp3");
     delay(5000);
   }
   }
 delay(1000);
}

void initSD()
{
 //Initialize the SdCard.
 if(!sd.begin(SD_SEL, SPI_HALF_SPEED)) 
   sd.initErrorHalt();
 if(!sd.chdir("/")) 
   sd.errorHalt("sd.chdir");
}

void initMP3Player()
{
 uint8_t result = MP3player.begin();
 MP3player.setVolume(volume, volume);
}

Setze Deinen Sketch bitte in Codetags (</>-Button oben links im Forumseditor), dann ist er für alle besser lesbar.

Gruß Tommy

Hallo,

wie hast Du die /CS-Leitungen von RFID-Reader und SD-Card angeschlossen?
Für den Reader habe ich

#define SS_PIN 53 // Configurable, see typical pin layout above

in Deinem Source gesehen, bei der SD-Card sehe ich aber nicht, wo das angeschlossen ist.
In initSD() sehe ich zwar

if(!sd.begin(SD_SEL, SPI_HALF_SPEED))

finde aber keine Stelle wo SD_SEL bei Dir definiert ist?

Gruß aus Berlin
Michael

  1. welche Shields benutzt Du? Bitte Links zu den Produkten
  2. Die SPI Schnittstelle braucht 4 signalleitungen: Clock, MOSI, MISO und Enable (EN bzw SS)
    Jedes Gerät am SPI muß sein Enable signal haben damit jedes einzeln angesprochen werden kann.
    Standartmäßig sind Pin 10 und 4 vorgesehen. Du mußt jedem Shield sienen Enable-Pin geben und den sketch bzw die Bibliotheken disbezüglich ändern.
    Grüße Uwe

Hallo,

danke schonmal für die Antworten. Zu den Shields:
Das mp3 shield ist SparkFun MP3 Player Shield - DEV-12660 - SparkFun Electronics
Der RFID reader ist hier: Nr.19 RFID Kit – Funduino – Kits und Anleitungen für Arduino

@amithlon: Genau, der reader ist an 53 angeschlossen. Das mp3shield ist aufgesteckt, wenn ich mir die Pin-Belegung angucke
https://learn.sparkfun.com/tutorials/mp3-player-shield-hookup

würde ich tippen, dass die SD-Karte an pin 9 angeschlossen ist (SD Card CS).
Nachtrag: Die Pin-Belegung ist in einer SPEMP3ShieldConfig.h in der Library gespeichert, hier ein Auszug - bei mir müsste das wie gesagt Pin 9 sein

#if defined(__BIOFEEDBACK_MEGA__)
  #define MP3_XCS             67      //PK5 Output, Active Low,  Control Chip Select Pin (for accessing SPI Control/Status registers)
  #define MP3_XDCS            68      //PK6 Output, Active Low,  Data Chip Select / BSYNC Pin
  #define MP3_DREQ            66      //PK4 Input , Active High, Data Request Pin: Player asks for more data
  #define MP3_RESET           65      //PK3 Output, Active Low,  Reset is active low
  #define SD_SEL              76      //PJ6 Output, Active Low
  #define MP3_DREQINT          5 //Corresponding INTx for DREQ pin
#elif ( SEEEDUINO == 1 ) // if SEEDUINO use the following pin outs
  #define MP3_XCS             A3 //Control Chip Select Pin (for accessing SPI Control/Status registers)
  #define MP3_XDCS            A2 //Data Chip Select / BSYNC Pin
  #define MP3_DREQ            A1 //Data Request Pin: Player asks for more data
  //#define MP3_DREQINT        0 // There is no IRQ used on Seeduino
  #define MP3_RESET           A0 //Reset is active low
  #define SD_SEL              10 //select pin for SD card
#elif ( TEENSY2 == 1 )
  #define MP3_XCS              7
  #define MP3_XDCS             8
  #define MP3_DREQ             4
  #define MP3_DREQINT          1
  #define MP3_RESET            9
  #define SD_SEL               0 // Teensy SDI CS on pin 0
  // Connect SDI pins as follows:
  // Sparkfun shield 11 -> Teensy 2 (mosi)
  // Sparkfun shield 12 -> Teensy 3 (miso)
  // Sparkfun shield 13 -> Teensy 1 (sck)
// if BARETOUCH or ARDUINO_AVR_BARETOUCH use the following pin map
#elif (( BARETOUCH == 1 ) || ( ARDUINO_AVR_BARETOUCH == 1 )) 	
  #define MP3_XCS             9  //Control Chip Select Pin (for accessing SPI Control/Status registers)
  #define MP3_XDCS            6  //Data Chip Select / BSYNC Pin
  #define MP3_DREQ            7  //Data Request Pin: Player asks for more data
  #define MP3_DREQINT         4  //Corresponding INTx for DREQ pin
  #define MP3_RESET           8  //Reset is active low
  #define SD_SEL              5  //select pin for SD card	
// otherwise use pinout of typical Sparkfun MP3 Player Shield.
#else // otherwise use pinout of typical Sparkfun MP3 Player Shield.
  #define MP3_XCS              6 //Control Chip Select Pin (for accessing SPI Control/Status registers)
  #define MP3_XDCS             7 //Data Chip Select / BSYNC Pin
  #define MP3_DREQ             2 //Data Request Pin: Player asks for more data
  #if defined(__AVR_ATmega32U4__)
    #define MP3_DREQINT          1 //Corresponding INTx for DREQ pin
  #else // swapped between Uno and Leonardo.
    #define MP3_DREQINT          0 //Corresponding INTx for DREQ pin
  #endif
  #define MP3_RESET            8 //Reset is active low
  #if ( GRAVITECH == 1 )
    #define SD_SEL               4 //select pin for SD card
  #else
    #define SD_SEL               9 //select pin for SD card
  #endif // GRAVITECH
#endif // none SEEEDUINO

Das Projekt ist inzwischen abgeschlossen und ich wollte mich nochmal bedanken für die Hilfe. Schlussendlich hat sich herausgestellt, dass der sparkfun mp3 player in vielerlei Hinsicht buggy (ich muss aber fairerweise auch dazusagen, dass sparkfun inzwischen eine neue Version hat, vielleicht ist die verbessert).
Ich habe mich schlussendlich für den DFPlayer mini entschieden, da er seriell ist hatte sich mein ursprüngliches Problem auch erledigt und ich konnte problemlos rfid und mp3 player gleichzeitig bedienen.

Die Hörspiel-Jukebox, die ich daraus gebaut habe war der absolute Hit beim Geburtstag von meinem Sohn, wen es interessiert, so sieht das Teil jetzt aus:

Witzige Idee, gut gemacht...

Gruß SG