LilyPad MP3 formatieren bzw. rséset das LilyPad MP3

Hallo,

ich habe nochmal eine Frage. Ich habe einige Male einen Code auf das LilyPad MP3 geloadet und es hat auch immer funktioniert. Doch seit einigen Tagen muss ich immer die Verbindung zwischen dem Board und den Drucksenoren unterbrechen, um ein Lied abspielen zu können. Da ich sehr oft den Code auf das Board geladen habe, würde ich dieses gerne neu formatieren bzw. reseten. Jedoch hat das Board keinen direkten Reset-Button. Gibt es einen Befehl im Arduino IDE, um ein solches Board zu reseten. Kann mir jemand schnell helfen???

Vielen Dank im Voraus.

Der Grund für das Problem liegt evtl. an der Hardware. Ein Formatieren wie bei einer Festplatte o.ä. gibt es nicht. Der Speicher des Arduino wird immer beim Flashen überschrieben. Ein Reset erfolgt beim Flashen automatisch.

kitamrofni: ... und den Drucksenoren ...

Wie meinen? Von welchen Drucksenoren ist denn da die Rede?

Du meinst Señor, das spanische Wort für "Herr"?

Wer zum Teufel hat Dir diese spanischen Herren an Dein Arduino-Board angeschlossen? Und wie? Vielleicht mit Handschellen?

Können wir mal ein Schaltbild sehen? Oder ein Foto? :smiling_imp:

Und ist die Mehrzahl von "señor" nicht vielmehr "señores" statt "señoren"?`

Wie meinst das, dass der Grund Problem für das Problem an der Hardware liegt? Ich habe zwei verschiedene LilyPad MP3 ausprobiert, unterschiedliche Drucksensoren und auch unterschiedliche Widerstände. Wo kann da das Problem liegen? Durch die Verbindung mit Krokodilklemmen ist diese sehr instabil, daher habe ich einen Sensor angelötet, doch auch dann funktioniert es nicht. Wo liegt also das Problem? Kann mir bitte jemand helfen (schnell)???

Vielen Dank im Voraus.

Du bist lustig.

Bisher können wir nur raten, da du alles geheim hällst.
Was wir brauchen hat Jurs ja schon geschrieben.
Da du schreibst, das der Fehler plötzlich aufgetreten ist, meine Vermutung, es ist die Hardware.

Also Foto und Schaltbild und Link des Drucksensors. Ich vermute das du Sensor meinst.

Und auch den kompletten Sketch in Code-Tags (Schaltfläche </>) posten.

Hier nochmal alle Pläne, Sketches usw.

#include <SPI.h>            // To talk to the SD card and MP3 chip
#include <SdFat.h>          // SD card file system
#include <SFEMP3Shield.h>   // MP3 decoder chip

// Constants for the trigger input pins, which we'll place
// in an array for convenience:

const int TRIG1 = A0;
const int TRIG2 = A4;
const int TRIG3 = A5;
const int TRIG4 = 1;
const int TRIG5 = 0;
int trigger[5] = {TRIG1,TRIG2,TRIG3,TRIG4,TRIG5};

// And a few outputs we'll be using:

const int ROT_LEDR = 10; // Red LED in rotary encoder (optional)
const int EN_GPIO1 = A2; // Amp enable + MIDI/MP3 mode select
const int SD_CS = 9;     // Chip Select for SD card

// Create library objects:

SFEMP3Shield MP3player;
SdFat sd;

// Set debugging = true if you'd like status messages sent
// to the serial port. Note that this will take over trigger
// inputs 4 and 5. (You can leave triggers connected to 4 and 5
// and still use the serial port, as long as you're careful to
// NOT ground the triggers while you're using the serial port).

boolean debugging = true;

// Set interrupt = false if you would like a triggered file to
// play all the way to the end. If this is set to true, new
// triggers will stop the playing file and start a new one.

boolean interrupt = true;

// Set interruptself = true if you want the above rule to also
// apply to the same trigger. In other words, if interrupt = true
// and interruptself = false, subsequent triggers on the same
// file will NOT start the file over. However, a different trigger
// WILL stop the original file and start a new one.

boolean interruptself = false;

// We'll store the five filenames as arrays of characters.
// "Short" (8.3) filenames are used, followed by a null character.

char filename[5][13];


void setup()
{
  int x, index;
  SdFile file;
  byte result;
  char tempfilename[13];

  // Set the five trigger pins as inputs, and turn on the
  // internal pullup resistors:
 
  for (x = 0; x <= 4; x++)
  {
    pinMode(trigger[x],INPUT);
    digitalWrite(trigger[x],HIGH);
  }

  // If serial port debugging is inconvenient, you can connect
  // a LED to the red channel of the rotary encoder to blink
  // startup error codes:
 
  pinMode(ROT_LEDR,OUTPUT);
  digitalWrite(ROT_LEDR,HIGH);  // HIGH = off

  // The board uses a single I/O pin to select the
  // mode the MP3 chip will start up in (MP3 or MIDI),
  // and to enable/disable the amplifier chip:
 
  pinMode(EN_GPIO1,OUTPUT);
  digitalWrite(EN_GPIO1,LOW);  // MP3 mode / amp off


  // If debugging is true, initialize the serial port:
  // (The 'F' stores constant strings in flash memory to save RAM)
 
  if (debugging)
  {
    Serial.begin(9600);
    Serial.println(F("Lilypad MP3 Player trigger sketch"));
  }
 
  // Initialize the SD card; SS = pin 9, half speed at first

  if (debugging) Serial.print(F("initialize SD card... "));

  result = sd.begin(SD_CS, SPI_HALF_SPEED); // 1 for success
 
  if (result != 1) // Problem initializing the SD card
  {
    if (debugging) Serial.print(F("error, halting"));
    errorBlink(1); // Halt forever, blink LED if present.
  }
  else
    if (debugging) Serial.println(F("success!"));
 
  // Start up the MP3 library

  if (debugging) Serial.print(F("initialize MP3 chip... "));

  result = MP3player.begin(); // 0 or 6 for success

  // Check the result, see the library readme for error codes.

  if ((result != 0) && (result != 6)) // Problem starting up
  {
    if (debugging)
    {
      Serial.print(F("error code "));
      Serial.print(result);
      Serial.print(F(", halting."));
    }
    errorBlink(result); // Halt forever, blink red LED if present.
  }
  else
    if (debugging) Serial.println(F("success!"));

  // Now we'll access the SD card to look for any (audio) files
  // starting with the characters '1' to '5':

  if (debugging) Serial.println(F("reading root directory"));

  // Start at the first file in root and step through all of them:

  sd.chdir("/",true);
  while (file.openNext(sd.vwd(),O_READ))
  {
    // get filename

    file.getFilename(tempfilename);

    // Does the filename start with char '1' through '5'?      

    if (tempfilename[0] >= '1' && tempfilename[0] <= '5')
    {
      // Yes! subtract char '1' to get an index of 0 through 4.

      index = tempfilename[0] - '1';
     
      // Copy the data to our filename array.

      strcpy(filename[index],tempfilename);
 
      if (debugging) // Print out file number and name
      {
        Serial.print(F("found a file with a leading "));
        Serial.print(index+1);
        Serial.print(F(": "));
        Serial.println(filename[index]);
      }
    }
    else
      if (debugging)
      {
        Serial.print(F("found a file w/o a leading number: "));
        Serial.println(tempfilename);
      }
     
    file.close();
  }

  if (debugging)
    Serial.println(F("done reading root directory"));
 
  if (debugging) // List all the files we saved:
  {
    for(x = 0; x <= 4; x++)
    {
      Serial.print(F("trigger "));
      Serial.print(x+1);
      Serial.print(F(": "));
      Serial.println(filename[x]);
    }
  }

  // Set the VS1053 volume. 0 is loudest, 255 is lowest (off):

  MP3player.setVolume(10,10);
 
  // Turn on the amplifier chip:
 
  digitalWrite(EN_GPIO1,HIGH);
  delay(2);
}


void loop()
{
  int t;              // current trigger
  static int last_t;  // previous (playing) trigger
  int x;
  byte result;
 
  // Step through the trigger inputs, looking for LOW signals.
  // The internal pullup resistors will keep them HIGH when
  // there is no connection to the input.

  // If serial debugging is on, only check triggers 1-3,
  // otherwise check triggers 1-5.

  for(t = 1; t <= (debugging ? 3 : 5); t++)
  {
    // The trigger pins are stored in the inputs[] array.
    // Read the pin and check if it is LOW (triggered).

    if (digitalRead(trigger[t-1]) == LOW)
    {
      // Wait for trigger to return high for a solid 50ms
      // (necessary to avoid switch bounce on T2 and T3
      // since we need those free for I2C control of the
      // amplifier)
     
      x = 0;
      while(x < 50)
      {
        if (digitalRead(trigger[t-1]) == HIGH)
          x++;
        else
          x = 0;
        delay(1);
      }
       
      if (debugging)
      {
        Serial.print(F("got trigger "));
        Serial.println(t);
      }

      // Do we have a valid filename for this trigger?
      // (Invalid filenames will have 0 as the first character)

      if (filename[t-1][0] == 0)
      {
        if (debugging)
          Serial.println(F("no file with that number"));
      }
      else // We do have a filename for this trigger!
      {
        // If a file is already playing, and we've chosen to
        // allow playback to be interrupted by a new trigger,
        // stop the playback before playing the new file.

        if (interrupt && MP3player.isPlaying() && ((t != last_t) || interruptself))
        {
          if (debugging)
            Serial.println(F("stopping playback"));

          MP3player.stopTrack();
        }

        // Play the filename associated with the trigger number.
        // (If a file is already playing, this command will fail
        //  with error #2).

        result = MP3player.playMP3(filename[t-1]);

        if (result == 0) last_t = t;  // Save playing trigger
 
        if(debugging)
        {
          if(result != 0)
          {
            Serial.print(F("error "));
            Serial.print(result);
            Serial.print(F(" when trying to play track "));
          }
          else
          {
            Serial.print(F("playing "));
          }
          Serial.println(filename[t-1]);
        }
      }
    }
  }
}


void errorBlink(int blinks)
{
  // The following function will blink the red LED in the rotary
  // encoder (optional) a given number of times and repeat forever.
  // This is so you can see any startup error codes without having
  // to use the serial monitor window.

  int x;

  while(true) // Loop forever
  {
    for (x=0; x < blinks; x++) // Blink the given number of times
    {
      digitalWrite(ROT_LEDR,LOW); // Turn LED ON
      delay(250);
      digitalWrite(ROT_LEDR,HIGH); // Turn LED OFF
      delay(250);
    }
    delay(1500); // Longer pause between blink-groups
  }
}

Der Schaltplan ist im Anhang.

Vielen Dank für die Hilfe im Voraus.

Auf dem Schaltbild ist ein Reset-Knopf zusehen, ich verwende jedoch nicht genau dieses Board, sodass bei mir kein Reset-Knopf vorhanden ist. Das abgebildete Board kann aber synonym für mein LilyPad MP3 verwendet werden.

Trigger_funktioniert.ino (10.2 KB)

Hier noch der Link zum Drucksensor: http://interlinkelectronics.com/FSR402.php

Da ist auch das Datasheet erhältlich bzw. einsehbar.

Irgend etwas stimmt da nicht! Ist das der komplette Aufbau?

Mach doch mal ein Foto.

Du schreibst von einem Lilypad, aber dein Schaltbild zeigt ein anderes Board. Im Sketch sind 5 Ports belegt, im Schaltbild nur 3.

Was liegt auf den Ports 0 und 1 des Boards?

kitamrofni: ``` const int TRIG4 = 1; const int TRIG5 = 0;

boolean debugging = true;

void setup() { ...

 if (debugging)  {    Serial.begin(9600); }

Mir sieht das nicht ganz koscher aus, was Du da machst:

Sobald in Deinem Code die Zeile "Serial.begin" ausgeführt wird, sind die Pins-0/1 fest der seriellen Schnittstelle des Atmega328 zugeordnet und können dann NICHT mehr beliebig als Input/Output Pins verwendet werden.

Du selbst verwendest die Pins-0/1 mit diesem Sketch nicht nur für Serial RX/TX, sondern auch noch für TRIG4 und TRIG5.

Also hast Du mit Deiner Hardwareschaltung eine Pin-Mehrfachbelegung am Atmega328.

jurs: Mir sieht das nicht ganz koscher aus, was Du da machst:

Sobald in Deinem Code die Zeile "Serial.begin" ausgeführt wird, sind die Pins-0/1 fest der seriellen Schnittstelle des Atmega328 zugeordnet und können dann NICHT mehr beliebig als Input/Output Pins verwendet werden.

Du selbst verwendest die Pins-0/1 mit diesem Sketch nicht nur für Serial RX/TX, sondern auch noch für TRIG4 und TRIG5.

Also hast Du mit Deiner Hardwareschaltung eine Pin-Mehrfachbelegung am Atmega328.

Jurs, genau das ist das Problem. Ich hatte mir das mehrfach angesehen und immer gemeint, Seriell arbeitet ja nur bei "Debugging". Da ist aber "Debugging = True" und dann gibt es das Problem mit den Ports 0 und 1.

Also muss Debugging auf False.

kitamrofni schalte Debugging aus.

Ich befürchte, so richtig weiß er nicht was er macht. ;)

Diese Problematik hatte ich schon in dem anderen Thread angesprochen. Da war es aber noch false

Serenifly:
Diese Problematik hatte ich schon in dem anderen Thread angesprochen. Da war es aber noch false

Dann versteh ich nicht, warum der TO sich das nicht durchliest.
Auch auf der Produktseite steht, was zu machen ist.
https://learn.sparkfun.com/tutorials/getting-started-with-the-lilypad-mp3-player

An Trigger 4 und 5 ist gar nichts angeschlossen und es funktioniert auch nicht, wenn ich debugging auf false setze. Den Code habe ich von github und er sollte eigentlich einfach funktioieren. Hat er ja auch schon mal. Nur tut er es jetzt nicht mehr.

kitamrofni: An Trigger 4 und 5 ist gar nichts angeschlossen und es funktioniert auch nicht, wenn ich debugging auf false setze. Den Code habe ich von github und er sollte eigentlich einfach funktioieren. Hat er ja auch schon mal. Nur tut er es jetzt nicht mehr.

Und wenn du nichts am Sketch verändert hast, kann es ja nur ein Fehler der verwendeten Komponenten (Hardware) sein.

Warum spielst du nicht einfach den original Anfangssketch wieder drauf?

Der hat ja wohl schon mal funktioniert.

kitamrofni: An Trigger 4 und 5 ist gar nichts angeschlossen und es funktioniert auch nicht, wenn ich debugging auf false setze. Den Code habe ich von github und er sollte eigentlich einfach funktioieren. Hat er ja auch schon mal. Nur tut er es jetzt nicht mehr.

Wenn Du die TX/RX-Pins nicht doppelt belegst, kannst Du über Serial zu jedem Zeitpunkt in einem Programm Debug-Meldungen raushauen und Dir anzeigen lassen.

Da sollte es wohl nicht zu schwierig sein herauszubekommen, woran es hakt: - ob Deine Sensoren nicht mehr richtig HIGH/LOW liefern also nicht mehr richtig schalten - oder ob Dein MP3-Modul das Abspielen nicht mehr startet

"Funktioniert nicht" ist jedenfalls keine exakte Fehlerbeschreibung.

Gib im Sketch einfach entsprechende Debug-Meldungen aus, die anzeigen, was gerade im Sketch ablaufen soll, und dann kannst Du genau erkennen - ob das Programm andere Debug-Meldungen ausgibt als erwartet - oder ob erwartete Debug-Meldungen einfach ausbleiben Das nennt sich dann "Debugging", wenn Du die gemäß Sketch-Code erwarteten Ausgaben des Programms mit den tatsächlichen Ausgaben des Programms vergleichst, z.B. beim Betätigen Deiner Kraftsensoren.