Работа с Music Shield

Тема в разделе "Arduino & Shields", создана пользователем Vulf Michael, 4 июл 2014.

  1. Vulf Michael

    Vulf Michael Нуб

    Здравствуйте, работаем с music shield и хотим, чтобы саундтрэки воспроизводились в следующем порядке: "Hi" или "Hello" (раз через раз), затем "PutRub, затем таймер на 5 секунд, затем "Thanks" или "ThankYou" (раз через раз) и затем "SaveTown"(раз через три).

    ПРОБЛЕМА: Проигрывание идёт не в той последовательности, в которой запланировано. Serial Port показывает, что команды выполняются не в той последовательности, в которой запланировано.

    СКЕТЧ:

    Код (Text):

    #include <SD.h>
    #include <SPI.h>
    #include <arduino.h>
    #include <MusicPlayer.h>
      int k = 0;
      int rand1 = 0;
      int time = 0;

    void setup()
    {
      Serial.begin(9600);
      player.begin();  //will initialize the hardware and set default mode to be normal.
      player.setPlayMode (PM_REPEAT_LIST);

    }
    void loop()
    {
    rand1++;
      if ((rand1%2) == 0){
      //___________Проиграть_____________//
       player.addToPlaylist("Hello.mp3");
       player.play();
       delay(1000);
       player.deleteSong("Hello.mp3");
       delay(1000);
       //_________________________________//
    }
    else {
      //___________Проиграть_____________//
       player.addToPlaylist("Hi.mp3");
       player.play();
       delay(1000);
       player.deleteSong("Hi.mp3");
       delay(1000);
       //_________________________________//
    }
      //___________Проиграть_____________//
       player.addToPlaylist("PutRub.mp3");
       player.play();
       delay(1000);
       player.deleteSong("PutRub.mp3");
       delay(1000);
       //_________________________________//
    time = 0;
    while (time <= 5){
    time = time + 1;
    delay(1000);
    }
    if ((rand1%2) == 0){
      //___________Проиграть_____________//
       player.addToPlaylist("Thanks.mp3");
       player.play();
       delay(1000);
       player.deleteSong("Thanks.mp3");
       delay(1000);
       //_________________________________//
    }
    else {
      //___________Проиграть_____________//
       player.addToPlaylist("ThankYou.mp3");
       player.play();
       delay(1000);
       player.deleteSong("ThankYou.mp3");
       delay(1000);
       //_________________________________//
    }
    if ((rand1%4) == 0){
    //___________Проиграть_____________//
       player.addToPlaylist("SaveTown.mp3");
       player.play();
       delay(1000);
       player.deleteSong("SaveTown.mp3");
       delay(1000);
       //_________________________________//
      }

    }
     
    ВТОРОЙ ВОПРОС:
    Как реализовать возможность постоянного сканирования ультразвуковым датчиком при одновременном воспроизведении и таймере?
     
    Последнее редактирование модератором: 4 июл 2014
  2. nailxx

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

    Ничего одновременного процессор делать не может (даже ядро современного процессора). Но процессор можно заставить делать чуть-чуть первую задачу, чуть-чуть вторую. Если на обычном компьютере этим занимается операционная система, то на микроконтроллерах нужно реализовывать это с помощью своего алгоритма.

    Используйте вместо `delay` проверку вида «а прошло ли нужное количество времени с момента старта задачи?». Например, вместо:

    Код (Text):

    player.addToPlaylist("Hello.mp3");
    player.play();
    delay(1000);
    player.deleteSong("Hello.mp3");
     
    Делайте:

    Код (Text):

    player.addToPlaylist("Hello.mp3");
    unsigned long startTime = millis();
    player.play();
    while (millis() < startTime + 1000) {
        doSomeUsefulStuffWhileWaiting();
    }
    player.deleteSong("Hello.mp3");
     
    Тут, в `doSomeUsefulStuffWhileWaiting` вы можете делать какую-то «параллельную» задачу. Например, опрос вашего дальномера. Помните, однако, что эта функция также не должна надолго блокировать процессор, чтобы алгоритм имел физическую возможность пойти дальше.

    Что касается первого вопроса: какая последовательность треков получается на деле? Стабильна ли эта последовательность?
     
  3. Vulf Michael

    Vulf Michael Нуб

    Вот последовательность в первый запуск:

    VS10xx Clock Frq: 0xC000
    Card type: SD2
    Volume type is FAT16
    Playing song Hi.mp3 ...
    Delete song:Hi.mp3
    [done].
    Delete song:putRub.mp3
    Playing song ThankYou.mp3 ...
    Delete song:ThankYou.mp3
    [done].
    Delete song:Hello.mp3
    Playing song PutRub.mp3 ...
    Delete song:putRub.mp3
    [done].
    Delete song:Thanks.mp3
    Playing song Hi.mp3 ...
    Delete song:Hi.mp3
    [done].
    Delete song:putRub.mp3
    Playing song ThankYou.mp3 ...
    Delete song:ThankYou.mp3
    [done].
    Delete song:Hello.mp3
    Playing song PutRub.mp3 ...
    Delete song:putRub.mp3
    [done].
    Delete song:Thanks.mp3
    Playing song SaveTown.mp3 ...
    Delete song:SaveTown.mp3
    Delete song:Hi.mp3
    [done].
    Delete song:putRub.mp3
    Playing song ThankYou.mp3 ...
    Delete song:ThankYou.mp3
    [done].
    Delete song:Hello.mp3
    Playing song PutRub.mp3 ...
    Delete song:putRub.mp3
    итд

    Вот во второй:

    VS10xx Clock Frq: 0xC000
    Card type: SD2
    Volume type is FAT16
    Playing song Hi.mp3 ...
    Delete song:Hi.mp3
    [done].
    Delete song:putRub.mp3
    Playing song ThankYou.mp3 ...
    Delete song:ThankYou.mp3
    [done].
    Delete song:Hello.mp3
    Playing song PutRub.mp3 ...
    Delete song:putRub.mp3
    [done].
    Delete song:Thanks.mp3
    Playing song Hi.mp3 ...
    Delete song:Hi.mp3
    [done].
    Delete song:putRub.mp3
    Playing song ThankYou.mp3 ...
    Delete song:ThankYou.mp3
    [done].
    Delete song:Hello.mp3
    Playing song PutRub.mp3 ...
    Delete song:putRub.mp3
    [done].
    Delete song:Thanks.mp3
    Playing song SaveTown.mp3 ...
    Delete song:SaveTown.mp3
    Delete song:Hi.mp3
    [done].
    Delete song:putRub.mp3
    Playing song ThankYou.mp3 ...
    Delete song:ThankYou.mp3
    [done].
    Delete song:Hello.mp3


    VS10xx Clock Frq: 0xC000
    Card type: SD2
    Volume type is FAT16
    Playing song Hi.mp3 ...
    Delete song:Hi.mp3
    [done].
    Delete song:putRub.mp3
    Playing song ThankYou.mp3 ...
    Delete song:ThankYou.mp3
    [done].
    Delete song:Hello.mp3
    Playing song PutRub.mp3 ...
    Delete song:putRub.mp3
    [done].
    Delete song:Thanks.mp3
    Playing song Hi.mp3 ...
    Delete song:Hi.mp3
    [done].
    Delete song:putRub.mp3
    Playing song ThankYou.mp3 ...
    Delete song:ThankYou.mp3
    [done].
    Delete song:Hello.mp3
    Playing song PutRub.mp3 ...
    Delete song:putRub.mp3
    [done].
    Delete song:Thanks.mp3
    Playing song SaveTown.mp3 ...
    Delete song:SaveTown.mp3
    Delete song:Hi.mp3
    [done].
    Delete song:putRub.mp3
    Playing song ThankYou.mp3 ...
    Delete song:ThankYou.mp3
    [done].
    Delete song:Hello.mp3


    Обращаю внимание на то, что последовательность действий не та, которая запрограммирована!
     
  4. nailxx

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

    Пожалуйста, используйте на форуме BB-тэг CODE для листингов (кнопка «Код» над редактором).

    Похоже, что перемудрили с плей-листами и режимами их проигрывания. Видно, что вам просто нужно в определённый момент играть определённый трек. Используйте специально сделанную для этого функцию `playOne`. См. пример из библиотеки.
     
  5. Vulf Michael

    Vulf Michael Нуб

    Возникает проблема связанная с переключением от одного трека на другой:

    Код (Text):
    #include <SD.h>
    #include <SPI.h>
    #include <arduino.h>
    #include <MusicPlayer.h>

    int k = 0;

    void setup(void)
    {
      Serial.begin(9600);
      player.begin();                      //will initialize the hardware and set default mode to be normal.
      player.setPlayMode(PM_REPEAT_ONE); //set mode to repeat playing a song
      player.playOne("Hello.mp3");          //play a song with its name
    }
    void loop(void)
    {
      player.playOne("Hello.mp3");
      player.play();  //do some leisurely job
      //player.deleteSong("Hello.mp3");//set mode to repeat playing a song
      player.playOne("Hi.mp3");          //play a song with its name
      player.play();  //do some leisurely job
      //player.deleteSong("Hi.mp3");//set mode to repeat playing a song
     
    }
    Пишет следующее:
    Код (Text):

    VS10xx Clock Frq: 0xC000
    Card type: SD2
    Volume type is FAT16
    Hello.mp3 already exists in playlist.
    Playing song Hello.mp3 ...
    Hi.mp3 does not exists.
    Hello.mp3 already exists in playlist.
    Hello.mp3 already exists in playlist.
    Hi.mp3 already exists in playlist.
    Hello.mp3 already exists in playlis
    если вставить delete:

    Код (Text):
    #include <SD.h>
    #include <SPI.h>
    #include <arduino.h>
    #include <MusicPlayer.h>

    int k = 0;

    void setup(void)
    {
      Serial.begin(9600);
      player.begin();                      //will initialize the hardware and set default mode to be normal.
      player.setPlayMode(PM_REPEAT_ONE); //set mode to repeat playing a song
      player.playOne("Hello.mp3");          //play a song with its name
    }
    void loop(void)
    {
      player.playOne("Hello.mp3");
      player.play();  //do some leisurely job
      player.deleteSong("Hello.mp3");//set mode to repeat playing a song
      player.playOne("Hi.mp3");          //play a song with its name
      player.play();  //do some leisurely job
      player.deleteSong("Hi.mp3");//set mode to repeat playing a song
     
    }
    то один раз проиграет первое, а потом кучу раз второе. Как решить эту проблему?
     
  6. nailxx

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

    `player.setPlayMode(PM_REPEAT_ONE);` заставляет играть заново, когда трек закончился. Это ожидаемое поведение. Попробуйте вместо этого:

    player.setPlayMode(MODE_NORMAL);
     
  7. Vulf Michael

    Vulf Michael Нуб

    Теперь проигрывается только первый трек, после чего ничего вообще не проигрывается!
     
  8. acos

    acos Официальный гик Администратор

    Проверьте такой вариант
    Код (Text):
    #include <SD.h>
    #include <SPI.h>
    #include <arduino.h>
    #include <MusicPlayer.h>

    int k = 0;

    void setup(void)
    {
      Serial.begin(9600);
      player.begin();                      //will initialize the hardware and set default mode to be normal.
      player.setPlayMode(PM_NORMAL_PLAY); //set mode to repeat playing a song
      player.playOne("Hello.mp3");          //play a song with its name
    }
    void loop(void)
    {
      player.playOne("Hello.mp3");
      player.play();  //do some leisurely job
      delay(10000);
      player.opStop();
      player.deleteSong("Hello.mp3");//set mode to repeat playing a song

      player.playOne("Hi.mp3");          //play a song with its name
      player.play();  //do some leisurely job
      player.deleteSong("Hi.mp3");//set mode to repeat playing a song
      delay(10000);
      player.opStop();

    }
     
  9. Vulf Michael

    Vulf Michael Нуб

    Нет, данная версия скетча не работает. Производится воспроизведение первого саундрека, после чего воспроизведение полностью прекращается (по порту пишется, что проигрывается первый трэк, а затем поочерёдно начинают удаляться эти трэки без воспроизведения)
     
  10. acos

    acos Официальный гик Администратор

    Вот как-то так.
    Код (Text):

    #include <SD.h>
    #include <SPI.h>
    #include <arduino.h>
    #include <MusicPlayer.h>

    void setup(void)
    {
      Serial.begin(9600);
      player.begin();                      //will initialize the hardware and set default mode to be normal.
      player.setPlayMode(PM_NORMAL_PLAY); //set mode to repeat playing a song
    }
    void loop(void)
    {
      playSong("Hello.mp3");
      delay(1000);
      stopSong("Hello.mp3");//set mode to repeat playing a song

      playSong("Hi.mp3");
      delay(1000);
      stopSong("Hi.mp3");//set mode to repeat playing a song

    }


    void playSong(char *song)
    {
      //player.begin();                      //will initialize the hardware and set default mode to be normal.
    playingState = PS_PRE_PLAY;
      player.playOne(song);

      player.play();
    }

    void stopSong(char *song)
    {
      player.opStop();
      player.deleteSong(song);
      player.play();
    }
     
    Этот скетч точно работает.
     
    Последнее редактирование: 27 авг 2014