Music Shield проигрывание по сигналу

Тема в разделе "Arduino & Shields", создана пользователем grambler, 7 сен 2013.

  1. grambler

    grambler Нуб

    Код (C):

    #include <Fat16.h>
    #include <Fat16Util.h>
    #include <NewSPI.h>
    #include <arduino.h>
    #include "pins_config.h"
    #include "vs10xx.h"
    #include "newSDLib.h"
    #include "MusicPlayer.h"

    MusicPlayer myplayer;
    int senPin = 5;
    int start = 0;

    unsigned int songN =0;
    char* myStrings[] = {"1.mp3", "2.mp3", "3.MP3"};

    void setup()
    {
      Serial.begin(9600);  
    //  pinMode(senPin, INPUT);  
      myplayer.keyDisable();//keys disable first;
      myplayer.digitalControlEnable();
      myplayer.begin();
      myplayer.setVolume(80);
      myplayer.attachDigitOperation(5, Play,HIGH);
        Serial.println("begin");
        myplayer.setPlayMode(MODE_NORMAL);
       myplayer.creatPlaylist();
       myplayer.playSong("2.mp3");
    }
    void loop()
    {  
    }

    void Play()//User-defined function
    {
      Serial.println("Play");
      myplayer.playSong("1.mp3");
    }
     
    1. При приходе сигнала происходит ошибка при запуске проигрывания
    Play
    The song is exist.
    error: open file failed

    2. Если на запустить myplayer.playSong("2.mp3");, то сигнал вообще не приходит
     
  2. nailxx

    nailxx Официальный Нерд Администратор

    Не могу найти у себя код, который мог бы выводить `open file failed`. Подскажите, какой версией библиотеки вы пользуетесь?
     
  3. grambler

    grambler Нуб

  4. nailxx

    nailxx Официальный Нерд Администратор

    Можете попробовать в файле `newSDlib.cpp`, перед строкой 94 (которая и печатает `open file failed`) добавить:

    error(fileName)

    Это поможет убедиться, что впытается открыться именно тот файл, что и требуется. Дальше можно будет рассуждать.

    Ещё вот что подумал: какая у вас SD-карта и файловая система на ней? Должны быть не более 2 ГБ (т.е. не SDHC) и отформатированны в FAT32 или FAT16.
     
  5. grambler

    grambler Нуб

    карта 512 Мб Fat16

    сейчас вот такой код:
    Код (C):

    void setup()
    {
      Serial.begin(9600);  
    //  pinMode(senPin, INPUT);  
      myplayer.keyDisable();//keys disable first;
      myplayer.digitalControlEnable();
      myplayer.begin();
      myplayer.setVolume(80);
    //  myplayer.attachDigitOperation(5,playNextSong,HIGH);
      myplayer.attachDigitOperation(5,Play,HIGH);
        Serial.println("begin");
        myplayer.setPlayMode(MODE_NORMAL);
        myplayer.creatPlaylist();
        myplayer.playSong("1.mp3");
    }
    void loop()
    {  
      //delay(400);
    //  Serial.println(myStrings[songN]);
    //  myplayer.playSong(myStrings[songN]);
    //  while(1);
    }

    void Play()//User-defined function
    {
      Serial.println("Play");
      myplayer.opStop();
      delay(1000);
      myplayer.playSong("2.mp3");
      //myplayer.opPlay();
    }
     
    в newSDlib.cpp кстати openFile(char *fileName) не выполняется, выполняется openFile(unsigned int index), добавил лог индекса файла:
    Код (C):

    unsigned char newSD::openFile(unsigned int index)
    {
    Serial.print("try open1 ");
      Serial.println(index);
      if (file.open(index, O_READ)) {
       // Serial.print(index);
      //  Serial.println(" opened");
        return 1;
      }
      else{
        error("open file failed");
        return 0;
      }
    }
     
    ругается:
    begin
    All songs in the root directory:
    1.MP3
    2.MP3
    The song is exist.
    try open1 3
    Song 0 opened
    Play
    The song is exist.
    try open1 11
    error: open file failed
    try open1 13
    error: open file failed

    почему Open вызывается 2 раза ?
    что за странные индексы 11 и 13 ?
     
  6. nailxx

    nailxx Официальный Нерд Администратор

    Ковырялся во внутрях библиотеки. Там немного мясо, но что-то стало понятным:

    myplayer.creatPlaylist();

    бежит по файловой системе и ищет все файлы, давая каждому порядковый номер.

    myplayer.playSong("1.mp3");

    Пытается найти индекс указанного файлового имени в плей-листе и... добавить его в плей-лист ещё раз?! По причине некой баги в библиотеки файл "1.mp3" получает индекс 3, а файлов было всего 2 и попытка его открыть заканчивается провалом.

    Попробуйте вместо:

    myplayer.playSong("1.mp3");

    написать:

    myplayer.playSong(0);
     
  7. grambler

    grambler Нуб

    все равно в обработчике события сигнала песни не открываются, только в loop
     
  8. nailxx

    nailxx Официальный Нерд Администратор

    Хммм… вероятно реализация библиотеки как-то коряво работает с управлением воспроизведением из обработчиков прерываний. Быстрое решение — в обработчике составлять некую очередь заданий, а разбирать и исполнять её — в loop.

    Правильное решение: курить исходники библиотеки.
     
  9. Megakoteyka

    Megakoteyka Оракул Модератор

    Хороший вариант работы с прерыванием - ставить в прерывании флаг и следить за ним в loop.
    Прерывание должно отрабатывать максимально быстро, не задерживая основной код.