Diskutera här:
https://groups.google.com/forum/?hl=sv#!forum/mp3-spelare-wtv020-sd-mini
Gamla sidan 'Simpel MP3 player' flyttad till Arkiv Simpel MP3 player
Denna koppling är två tråds seriellt interface med mp3-spelare, och kan bara köra wav-filer och ad4-filer(Har inte provat ad4-filer). Vill du köra mp3 måste du välja mp3-Mode och styra med knappar eller med en kabel från Uno-kortet för varje funktion. Denna sida visar inte Mp3-mode bara den gamla sidan gör det.
Högtalaren är 8 ohm 0.5 Watt
Uno-kortet har inte alltid ström så det räcker om du spelar ett starkt ljud på hög volym.
Detta kan lösas med en extern strömförsörjning, att sänka volymen, eller att koppla en större kondensator över plus och gnd på mp3-spelaren (100uF eller mer). Om spelaren startar ljudet
och spelar ca en halv sekund, då det troligt detta fel.
/*
Experiment med Arduino Uno R3
MP3-spelare WTV020-SD-mini
3st strömbrytare
Högtalare
Detta program är skapat av Per-Anders Hult.
Denna skript ar publicerad för det kit och komponenter som vi
säljer på Tradera under namnet pc_h
Denna skript får av andra personer endast användas för privat bruk.
Om all text i denna anmärking bibehålls, får denna skript ändras och förbättras och publiceras igen.
Om den översätts till annat språk måste även denna text översättas.
Om du publicerar denna skrip igen, så skriv ditt namn eller alias här.
Denna skript är ändrad av: (skriv ditt namn här)
*/
//Felsökaren
//Värde 0 ingen felsökning på.
//Värde 1 skriver händelser till datorn via RS 232 och USB.
#define Mp3Debug 0
//Namn på ingångarna och utgångarna
#define BUSY 5 //Stift 15 på mp3 kortet
#define RST A3 //Stift 1 på mp3 kortet
#define CLK A4 //Stift 7 på mp3 kortet
#define DAT A5 //Stift 10 på mp3 kortet
#define KNAPP_PAUS 2 //Stift på tryck-knapp
#define KNAPP_PLAY 3 //Stift på tryck-knapp
#define KNAPP_STOP 4 //Stift på tryck-knapp
//Namn på ljudspår som ligger SD-kortet
#define MP3_INCA 0
#define MP3_PLING 1
#define MP3_PIP 2
#define MP3_KROCK 3
#define MP3_BILTUTA 4
#define MP3_PIP_BAS 5
#define MP3_PIP_DISKANT 6
#define MP3_PIP_MELLAN 7
#define MP3_APPLADER 8
#define MP3_GASP 9
#define MP3_BROMS 10
#define MP3_BROMS_SAMMA 11
//Kommandon som går att sända till spelaren
#define SPELARE_VOLYM_0 0xFFF0 //STUM
#define SPELARE_VOLYM_1 0xFFF1
#define SPELARE_VOLYM_2 0xFFF2
#define SPELARE_VOLYM_3 0xFFF3
#define SPELARE_VOLYM_4 0xFFF4
#define SPELARE_VOLYM_5 0xFFF5
#define SPELARE_VOLYM_6 0xFFF6
#define SPELARE_VOLYM_7 0xFFF7 //MAX
#define SPELARE_PAUS_PLAY 0xFFFE
#define SPELARE_STOP 0xFFFF
#define MAX_KO_I_SPELLISTAN 10 //Justera denna efter dina behov
//interna variabler
boolean LastKnappPaus = HIGH;
boolean LastKnappPlay = HIGH;
boolean LastKnappStop = HIGH;
boolean SpelareStatusPaus = false;
int AntalILista = 0;
int SpelLista[MAX_KO_I_SPELLISTAN];
void setup() {
#if Mp3Debug > 0
Serial.begin(9600);
#endif
pinMode(BUSY, INPUT);
pinMode(KNAPP_PAUS, INPUT_PULLUP);
pinMode(KNAPP_PLAY, INPUT_PULLUP);
pinMode(KNAPP_STOP, INPUT_PULLUP);
pinMode(RST, OUTPUT);
pinMode(CLK, OUTPUT);
pinMode(DAT, OUTPUT);
digitalWrite(RST, HIGH);
digitalWrite(CLK, HIGH);
digitalWrite(DAT, HIGH);
digitalWrite(RST, LOW);
delay(5);
digitalWrite(RST, HIGH);
delay(300);
SpelaSpelLista1(); //Laddar spellista 1 vid uppstart, ta bort om du vill.
#if Mp3Debug == 1
Serial.print(AntalILista);Serial.println(".");
#endif
}
void loop() {
LoopSpellista(); //Gör denna till en del av huvudloopen.
//Denna ser till att knappen bara avläses en gång
if(digitalRead(KNAPP_PAUS) == LOW){
if(LastKnappPaus == HIGH){
SpelarePaus();
LastKnappPaus = LOW;
}
}else{
LastKnappPaus = HIGH;
}
//Denna ser till att knappen bara avläses en gång
if(digitalRead(KNAPP_PLAY) == LOW){
if(LastKnappPlay == HIGH){
SpelarePlay();
LastKnappPlay = LOW;
}
}else{
LastKnappPlay = HIGH;
}
//Denna ser till att knappen bara avläses en gång
if(digitalRead(KNAPP_STOP) == LOW){
if(LastKnappStop == HIGH){
SpelareStop();
LastKnappStop = LOW;
}
}else{
LastKnappStop = HIGH;
}
}
//Denna anropas varje gång som Uno-kortets huvud loop gör ett varv
//om insignalen BUSY är klar spelas nästa ljudspår
void LoopSpellista(){
if(digitalRead(BUSY) == LOW){
delay(100);
if(AntalILista > 0){
int n;
n = HamtaNastaUppSpelning();
Mp3send(n);
}
}
}
void SpelareStop(){
Mp3send(SPELARE_STOP);
//Om spellistan inte resas stoppas bara aktuellt ljudspår.
//Fortsätter sedan att spela nästa ljudspår
RensaSpelLista();
}
//Pausar och kan sedan startas med play
void SpelarePaus(){
if(SpelareStatusPaus == false){
Mp3send(SPELARE_PAUS_PLAY);
SpelareStatusPaus = true;
}
}
//Starta spelning igen efter paus.
//om spelare inte var i paus laddas spellista 1 in i spel kön.
void SpelarePlay(){
if(SpelareStatusPaus == true){
Mp3send(SPELARE_PAUS_PLAY);
SpelareStatusPaus = false;
}else{
SpelaSpelLista1();
}
}
//Ingen aning vad denna gör. hihi.
void RensaSpelLista(){
AntalILista = 0;
}
//Laddar spellista 1 till spelkön
void SpelaSpelLista1(){
#if Mp3Debug == 1
Serial.println("Startar spellista 1.");
#endif
SpelListaLaggTill(MP3_INCA);
SpelListaLaggTill(SPELARE_VOLYM_4); //Det går att sätta volymen från spellistan
SpelListaLaggTill(MP3_INCA);
SpelListaLaggTill(SPELARE_VOLYM_7);
SpelListaLaggTill(MP3_INCA);
SpelListaLaggTill(MP3_BILTUTA);
SpelListaLaggTill(MP3_KROCK);
SpelListaLaggTill(MP3_APPLADER);
SpelListaLaggTill(MP3_GASP);
}
//Denna returnerar nästa ljudspår som ska spelas upp från spel kön.
int HamtaNastaUppSpelning(){
int Nasta;
Nasta = 0;
if(AntalILista > 0){
Nasta = SpelLista[0];
for (int i=0; i<AntalILista; i++){
SpelLista[i] = SpelLista[i+1];
}
AntalILista --;
}
return Nasta;
}
//Lägg till en uppspelning i spellistan
void SpelListaLaggTill(int Nummer){
#if Mp3Debug == 1
Serial.print("Lagger till:");Serial.println(Nummer);
#endif
//Kolla att det inte är fullt i spellistan
if(AntalILista < MAX_KO_I_SPELLISTAN){
SpelLista[AntalILista] = Nummer;
AntalILista ++;
}else{
#if Mp3Debug == 1
Serial.println("Fick inte plats.");
#endif
}
}
//Denna sänder serie-data till spelaren, 16 bitar
//Normalt sett ligger denna typ av kod i ett bibliotek
void Mp3send(int kod){
#if Mp3Debug == 1
Serial.println(kod);
#endif
//Har du problem med spelaren?
//Denna kod skickar en reset före varje kommando.
//Prova att ta bort anmärkningen på kommande 4 rader
//digitalWrite(RST, LOW);
//delay(5);
//digitalWrite(RST, HIGH);
//delay(300);
digitalWrite(CLK, LOW);
delay(2);
for (int i=15; i>=0; i--){
digitalWrite(CLK, LOW);
if(bitRead(kod, i) == HIGH){
digitalWrite(DAT, HIGH);
#if Mp3Debug == 1
Serial.print("1");
#endif
}else{
digitalWrite(DAT, LOW);
#if Mp3Debug == 1
Serial.print("0");
#endif
}
delayMicroseconds(100);
digitalWrite(CLK, HIGH);
delayMicroseconds(100);
}
#if Mp3Debug == 1
Serial.println(".");
#endif
delay(50);//Vänta en stund så att BUSY hinner bli hög. Ev, justera denna
}