Go Down

Topic: MP3 shield aansluit pinnen (Read 1 time) previous topic - next topic

Nataschabakker

Aug 03, 2017, 10:09 am Last Edit: Aug 03, 2017, 10:24 am by Nataschabakker
Hoi,

Ben aan het stoeien met een MP3 shield van Sparkfun. Zie op vele sites dat deze kaart boven op de Arduino geprikt word. Echter wil ik de kaart er niet op hebben vanwege de pinnen die ik nodig heb en de kaart hoeft alleen maar een geluid/bestand af laten spelen met een commando vanuit de Arduino, verdere functies als pauze, afspelen, verder ect hoeft niet met de pinnen gedaan te worden.

Bij andere kaarten kan ik met een 5V, Ground, resset en 2 data pinnen op de arduino en shield voldoende om hem geluiden af te laten spelen, simpel door bijvoorbeeld een command :Play geluidje.mp3 te sturen (dit is een voorbeeld).

Weet iemand of dat met deze mp3 kaart ook kan? Welke pinnen gebruik ik hiervoor? rx tx?

Het gaat om deze kaart:
https://www.sparkfun.com/products/12660

Alvast bedankt

Groetjes Natascha

Ik bedoel zoiets, is dit correct?

ArdLab_Gent

Dit shield gebruikt SPI.

deze pinnen worden gebruikt 11 of ICSP-4   12 of ICSP-1     13 of ICSP-3

 

ArdLab geeft Arduino workshops voor beginners.
ArdLab is lid van de STEM-Academie.
http://www.ardlab.gent - http://www.stem-academie.be/

Nataschabakker

hartstikke bedankt voor je reactie. Heb het een en ander besteld dus ben benieuwd.

Intussen ben ik begonnen aan het menu/sketch.
je kunt namelijk telkens een folder met geluiden kiezen, bijvoorbeeld folder 1, het is dat bedoeling dat button 6 de eerste file afspeelt in folder 1 en button 7 speelt de 2e file.

Als je folder 2 selecteer dan speelt button 6 de eerste geluid af uit folder 2 en button 7 pakt 2e bestand uit deze folder 2. 
Echter krijg ik het niet voor elkaar, ik weet welk commando het is, als voorbeeld:

myDFPlayer.playFolder(2, 2); speelt 2e file in folder 2 af
Maar als ik deze onder in menu bij folder 2 plaats dan blijft hij in soort van loop hangen waar hij niet uit komt.

Kan iemand mij hierin helpen? ik ben zelf een beetje thuis met arduino en vind programmeren best lastig om te begrijpen maar door veel spelen en proberen kom ik steeds stapje wijzer.

Zou fijn als iemand mij op weg kon helpen of eventueel voorbeeld heeft dan zou dat fijn zijn, wil evt wel donatie doen hoor.


dit is wat ik heb en menu werkt op zich prima:

Code: [Select]



/*
  With this menu you can selected 3 diferent sound folders on the dfplayer module with sd card, when folder 1 is selected in the menu, you can play files with other buttons (on pin 6 and 7), this buttons has other sounds files when you selected a other folder in menu.
   
  When folder 1 is selected, and button pin 6 is pressed, he must playning sound 1,1 thats folder named 1 en file nr 1. (myDFPlayer.playFolder(1,1);)
  When button 7 is pressed, he must playning sound 1,2, thats de second file in folder 1. (myDFPlayer.playFolder(1,2);)

  When folder 2 is selected, and button pin 6 is pressed, he must playning sound 2,1 thats folder named 2 en file nr 1. (myDFPlayer.playFolder(2,1);)
  When button 7 is pressed, he must playning sound 2,2, thats de second file in folder 2. (myDFPlayer.playFolder(2,2);)

  When folder 3 is selected, and button pin 6 is pressed, he must playning sound 3,1 thats folder named 3 en file nr 1. (myDFPlayer.playFolder(3,1);)
  When button 7 is pressed, he must playning sound 3,2, thats de second file in folder 2. (myDFPlayer.playFolder(3,2);)

  The DfPlayer is working fine, i test it without this menu and playing the mp3 file correct.
  But togheter it goes wrong, i think de df player goes in loop menu.
  what and where put I the right code to activate button pin 6 and 7 so that the can play the correct files.
  Its
 
*/

#include <LiquidCrystal_I2C.h> // libreria di gestione del display lcd
#include <SoftwareSerial.h>
#include <DFRobotDFPlayerMini.h>

#define butUp     12     //pulsante SU al pin 12
#define butDown   11     //Pulsante GIU al pin 11
#define butP    10       //Pulsante SELEZIONA al pin 10
#define butM       9     //non utilizzato in questo esempio


//Function
void changeMenu();
void dispMenu();
void mp3Folder1();
void mp3Folder2();
void mp3Folder3();

//Vars
char menu = 0x01;
char set1 = 0x00, set2 = 0x00 , set3 = 0x00;
boolean t_butUp, t_butDown, t_butP, t_butM;

int buttonPin6 = 6;        // button pin for playing mp3 file
int buttonState6 = 0;
int lastButtonState6 = 0;     // previous state of the button
int buttonPushCounter6 = 0;   // counter for the number of button presses
int buttonPin7 = 7;        // button pin for playing mp3 file
int buttonState7 = 0;
int lastButtonState7 = 0;     // previous state of the button
int buttonPushCounter7 = 0;   // counter for the number of button presses

//SoftwareSerial mySoftwareSerial(2, 3); // RX, TX
DFRobotDFPlayerMini myDFPlayer;

//Display Adres
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // definisce la tipologia del display

void setup() {
  lcd.begin(20, 4);
  pinMode(buttonPin6, INPUT); // set button pin to be an input
  pinMode(buttonPin7, INPUT); // set button pin to be an input

  t_butUp   = 0x00;
  t_butDown = 0x00;
  t_butP  = 0x00;
  t_butM  = 0x00;

  //myDFPlayer.playFolder(2, 2);

}

void loop() {

  changeMenu();
  dispMenu();
}


//Funzioni

void changeMenu() {

  if (digitalRead(butUp) == 0x00) {
    t_butUp = 0x01;
  }
  if (digitalRead(butDown) == 0x00) {
    t_butDown = 0x01;
  }
  if (digitalRead(butUp) && t_butUp) {
    t_butUp = 0x00;
    lcd.clear();
    menu++;
    if (menu > 0x03) {
      menu = 0x01;
    }
  }
  if (digitalRead(butDown) && t_butDown) {
    t_butDown = 0x00;
    lcd.clear();
    menu--;
    if (menu < 0x01) {
      menu = 0x03;
    }
  }

}

void dispMenu() {

  switch (menu) {
    case 0x01:
      mp3Folder1();
      break;
    case 0x02:
      mp3Folder2();
      break;
    case 0x03:
      mp3Folder3();
      break;
  }
}

/*Begin of Sound folder 1*/
void mp3Folder1() {
  lcd.setCursor(0, 0);
  lcd.print("Select folder");
  lcd.setCursor(0, 1);
  lcd.print("Sound folder 1");
  if (digitalRead(butP) == 0x00) {
    t_butP = 0x01;
  }
}

/*Begin of Sound folder 2*/
void mp3Folder2() {
  lcd.setCursor(0, 0);
  lcd.print("Select folder");
  lcd.setCursor(0, 1);
  lcd.print("Sound folder 2");
  if (digitalRead(butP) == 0x00) {
    t_butP = 0x01;
  }
}


/*Begin of Sound folder 3*/
void mp3Folder3() {
  lcd.setCursor(0, 0);
  lcd.print("Select folder");
  lcd.setCursor(0, 1);
  lcd.print("Sound folder 3");
  if (digitalRead(butP) == 0x00) {
    t_butP = 0x01;
  }
}







Alvast bedankt

Natasja x

MAS3

Hoi Natasja.

Ik vind het jammer dat men nogal snel verleid is om een code op te duiken en dan te proberen die code te hacken om m te laten doen wat je wil.
Heel vaak lukt dat niet, omdat de hacker niet weet met welk idee de originele schrijver de code heeft gebouwd (en uiteraard het gebrek aan ervaring).

Hoe goed is je Italiaans, lees je dat vloeiend ?
Zo niet, dan raad ik je aan om de eigenwijze commentaren in het Italiaans eens te vertalen naar het Nederlands (voor jezelf) of het Engels (om zoveel mogelijk mensen te bereiken in het geval je het ooit gaat publiceren).

Gisteren heb ik een nieuw Engels werkwoord geleerd: "to obfuscate".
Dat is dat men iets heel moeilijk laat lijken door er zoveel mogelijk ingewikkelde termen tegenaan te gooien.
Bij deze code is dat door een pin aan een drukknop uit te lezen, en dan te kijken of het de hexadecimale waarde 0x00 heeft.
Want dat ziet er wel erg indrukwekkend uit.
Maar het is precies hetzelfde als kijken of het 0 (nul) is, of LOW.

De maker van dit hele zwakke excuus voor een voorbeeld maakt zich daar dus schuldig aan, en dat spreekt al boekdelen.

De code die je hier laat zien, bestaat uit meerdere functies die worden aangeroepen.
3 van die functies behandelen het menu (en dat is alweer een discutabele werkwijze, want dat kan veel eenvoudiger en overzichtelijker).
Nadat het menu voor de zoveelste keer werd afgebeeld op je LCD, wordt er gekeken of er op een of andere enter of select knop wordt gedrukt.
Die knop word P genoemd, er zal vast een Italiaans woord zijn waarvan de eerste letter met een P begint en dat overeen komt met "enter" of "select".
Wanneer er inderdaad op de P knop werd gedrukt, dan word dit opgeslagen.
Nu kan aan de hand van deze opgeslagen informatie de gekozen actie worden uitgevoerd.

Maar daarmee houd de code op.
Er is door het menu geteld, en daarna is er geregistreerd dat de keuze is gemaakt.
Maar wat er daar verder mee gedaan moet worden, zie ik er niet in staan.
Dus dit voorbeeld is een zeer omslachtige en inefficiƫnte wijze om een menu te maken, maar verder niets.
Jij moet dan iets gaan doen met de gemaakte keuze, en je kan zien dat er een keuze gemaakt is, omdat er is opgeslagen dat de P knop werd ingedrukt.

De myDFPlayer word nooit aangeroepen.
Want de enige keer dat die er in staat, is de regel die is uitgeschakeld door er een commentaarregel van te maken.
In die regel staan vaste waardes ingevuld, en dat is heel onhandig en kan ook anders.

Wanneer je dat voor mekaar hebt, dan moet je ook nog voorkomen dat ie blijft hangen in het steeds maar weer afspelen van een bestand dat eenmaal gekozen is.
En dat kun je voor mekaar krijgen door te vergeten dat je hebt gezien dat de P knop werd ingedrukt, nadat je de daarbij behorende actie eenmaal in gang hebt gezet.

Echt, dit is een ongelofelijk monster van een voorbeeld, en de maker ervan moet een harde straf krijgen.


Als je in het bovenste stuk van het commentaar kijkt, dan zie je staan wat die myDFPlayer verwacht om een bestand af te spelen.
Ik vermoed dat je dat zelf hebt geschreven, vanwege de foutjes in de Engelse tekst die duiden op Nederlandse invloed.
Het eerste getal dat er meegegeven moet worden, is het getal dat staat voor de folder, het 2e getal staat voor het bestand in die folder.
Wanneer je je menu wat dat betreft wil laten werken, dan moet je dus als eerste de waarde van je teller meegeven.
Dan krijg je dus dit:

Code: [Select]

myDFPlayer.playFolder(menu, 2);


Verder dus vergeten dat de P knop werd ingedrukt, en bovenstaande alleen uitvoeren als die P knop gezien is.

Code: [Select]

void loop() {

  changeMenu();
  dispMenu();
  if t_butP {                         // Dit wordt uitgevoerd als t_butP niet nul is
    myDFPlayer.playFolder(menu, 2);   // Speel het bestand af
    t_butP = 0;                       // Maak t_butP weer nul
    }                                 // Klaar met het uitvoeren van iets dat van t_butP afhankelijk moet zijn
}


Dit moet doen wat jij voor ogen had, en dit is hoe je code overzichtelijk en leesbaar maakt.
De commentaren zijn nu een hulp in plaats van een partij moeilijkdoenerij.
Dat menu ga ik niet voor je herschrijven, maar die aanpak slaat echt helemaal nergens op en meer ga ik er ook niet meer over zeggen.

Succes met de volgende stappen.
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

Nataschabakker

Hallo beste MAS3,

Dank je wel voor je uitgebreide reactie. Vind heel fijn dat iemand hier de tijd voor neemt.
Dat doe ik zelf ook, ook al zal je van niet denken omdat de code al gebruikt is. Zal niet al te diep erop in gaan maar heb als meisje al heel vroeg school moeten verlaten zonder papieren en met dyslexie soms moeilijk of pas laat stoffen of materie doen begrijpen.

Als je kijk hier op het forum of via google op andere website of forums worden menus uitgelegd, door deze te uploaden op een uno en er mee te spelen en lezen kan ik deze begrijpen, kan het een en ander veranderen en zo worden dingen mij toch aardig duidelijk, maar bijvoorbeeld het koppelen van opdrachten en iets dieper te gaan, bijvoorbeeld die loops, wat overigens heeeel veel terug komt op forums en rekenen met word voor mij al heel moeilijk, kan soms avonden lang naar enkele youtube films of uitleg kijken toch haal ik hier altijd enorm mijn plezier eruit en echt trots kan zijn aan iets wat ik voor elkaar heb gemaakt.

Stukje code die mee stuur is al meteen verhelderend, zeker nu je de commentaar erachter heb gezet


De DFPlayer is inderdaad uitgeschakeld, want wat je zegt klopt, hij blijft namelijk hangen.
De opdracht om iets te kunnen afspelen/uitvoeren stond onderaan deze code van folder 1 en andere folders

Code: [Select]
  lcd.print("Sound folder 1");
  if (digitalRead(butP) == 0x00) {
    t_butP = 0x01;


Voor mijn overzicht was het taak om eerst een menu werkend te krijgen en daar vanuit weer verder leren doen om de sketch uit te breiden met behulp van forum. Zal me vandaag er weer in verdiepen, dank je wel.




MAS3

Hoi Natasja.

In het stukje code dat je liet zien, staat niets wat zal leiden tot het afspelen van een bestand.
Dat is wat het stukje dat ik je heb laten zien, met die commentaren erbij, wel zal (moeten) doen.
In dat stukje is de inhoud van t_butP bepalend voor of er wel of niet iets word afgespeeld, en de inhoud van 'menu' voor wat er dan word afgespeeld.

Die commentaren zijn er om jezelf te helpen de code te begrijpen.
Dus voeg zelf ook commentaren toe.
Zelfs als die niet altijd kloppen, kunnen ze je toch helpen.
Doe dat dan wel zo dat het netjes, overzichtelijk en leesbaar blijft.

Dyslexie is niets om je voor te schamen, en het betekent zeer zeker niet dat iemand dom is.
Ook al zijn er genoeg idioten die dat wel denken en denken dat hun maatstaven voor iedereen moeten gelden (waarvan er dan wel weer onevenredig veel in het onderwijs zitten).
Sterker nog, de mensen die ik ken en weet dat daar dyslexie speelt, zijn de slimste mensen die ik ken.
Ik ben van mening dat dat komt omdat die mensen ondanks deze toestand, al dan niet gedwongen, manieren hebben gevonden om toch mee te kunnen en zo zelfs gedreven worden om het beter te doen dan gemiddeld.
En die manieren zijn heel geraffineerd.
Ik stel het persoonlijk op prijs als er verteld word dat dat speelt bij de betreffende persoon, want daarmee worden dan dingen verklaard die mij anders mogelijk zouden storen.
En dan word het ook mogelijk om er rekening mee te houden (alhoewel dit bericht je mogelijk anders zou doen denken).

De dyslexie kan je wel parten spelen bij het lezen van code, en met name van de namen van variabelen.
Een variabele t_butP, die opslaat of er op een selectie toets is gedrukt, slaat helemaal nergens op voor Engelstaligen of Nederlandstaligen.
Of het logisch is voor een Italiaan weet ik niet, maar ik waag het wel dat te betwijfelen.
Ik zou er een andere en vooral voor jou veel beter herkenbare naam aan geven.
Misschien iets als menuSelected.
Dat zijn meer letters en dus ook meer typen.
Maar het is wel een heel stuk duidelijker als wat er nu in die code staat.
Zo zou ik ook voor de namen van de knoppen voor meer duidelijkheid kiezen.
Iets als omhoog, omlaag, select en menu.
Wanneer je dat aanpast, dan word je hele code ineens een heel stuk meer leesbaar.

Ook zoiets als die heel vreemde toets namen mag je zien als een poging de code veel moeilijker te doen lijken dan het in werkelijkheid is.

Je hebt dus dit voorbeeld van een menu gevonden, maar dat voorbeeld is een heel slecht voorbeeld.
Want het doet allerlei onnodige zaken, zoals schermen die de juiste informatie al bevatten, opnieuw schrijven, en het doet dat ook in onnodig veel stappen.
Ik weet niet waar je het vandaan hebt, en dat doet er verder ook niet toe.
Maar degene die dat gemaakt heeft en het dan als voorbeeld beschikbaar stelt, moet zich de ogen uit de kop schamen.
Maar goed, daar ben jij verder niet mee geholpen.
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

Go Up