Код (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");, то сигнал вообще не приходит
Не могу найти у себя код, который мог бы выводить `open file failed`. Подскажите, какой версией библиотеки вы пользуетесь?
Можете попробовать в файле `newSDlib.cpp`, перед строкой 94 (которая и печатает `open file failed`) добавить: error(fileName) Это поможет убедиться, что впытается открыться именно тот файл, что и требуется. Дальше можно будет рассуждать. Ещё вот что подумал: какая у вас SD-карта и файловая система на ней? Должны быть не более 2 ГБ (т.е. не SDHC) и отформатированны в FAT32 или FAT16.
карта 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 ?
Ковырялся во внутрях библиотеки. Там немного мясо, но что-то стало понятным: myplayer.creatPlaylist(); бежит по файловой системе и ищет все файлы, давая каждому порядковый номер. myplayer.playSong("1.mp3"); Пытается найти индекс указанного файлового имени в плей-листе и... добавить его в плей-лист ещё раз?! По причине некой баги в библиотеки файл "1.mp3" получает индекс 3, а файлов было всего 2 и попытка его открыть заканчивается провалом. Попробуйте вместо: myplayer.playSong("1.mp3"); написать: myplayer.playSong(0);
Хммм… вероятно реализация библиотеки как-то коряво работает с управлением воспроизведением из обработчиков прерываний. Быстрое решение — в обработчике составлять некую очередь заданий, а разбирать и исполнять её — в loop. Правильное решение: курить исходники библиотеки.
Хороший вариант работы с прерыванием - ставить в прерывании флаг и следить за ним в loop. Прерывание должно отрабатывать максимально быстро, не задерживая основной код.