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
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);
}
welche Shields benutzt Du? Bitte Links zu den Produkten
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
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: