Arduino Playground is read-only starting December 31st, 2018. For more info please look at this Forum Post

Arduino и Wave шийлд

Този шийлд се продава като комплект за сглобяване и включва всички необходими компоненти. Инструкции за това как да сглобите шийлда ще намерите тук.

Към него има библиотека за Ардуино за лесен контрол, последната версия на която може да изтеглите от тук. От Zip-архива на библиотеката разархивиратe само WaveHC в libraries от "arduino-00xx" директорията.

SD картата трябва да е форматирана единствено под FAT16. За целта под Windows избирате файлова система FAT, но не и FAT32. С форматиране на SD картата се изгубват всички данни върху нея !

Тъй като Wave шийлда възпроизвежда само некомпресирани 22KHz 16-битови, моно *.wav файлове, всеки различен файл е необходимо да се конвертира предварително. Файлът може да се провери през Winamp, като се даде десен бутон на него и се ибере View file info..

Ако файла се различава от посочения по-горе, лесно може да го конвертирате с безплатната програма Audacity, като следвате дадените в сайта на шийлда инструкции.

Голяма колекция от мостри, които можете да използвате на готово в проектите си ще откриете тук. Чрез AT&T Text-to-Speech генератора може да добавите и човешки глас.

Пример

Даденият по-долу код намира определен файл върху SD картата и го възпроизвежда еднократно. За целта му е необходима библиотеката WaveHC, която трябва да инсталирате както е описано по-горе.

Инициализацията на Wave шийлда става в блока Setup(){...} и кодът в него не трябва да се променя. Изходните пинове са дефинирани в библиотеката и трябва да се свържат по същия начин за да не се редактира библиотеката. По подразбиране обменът с карата става със скорост 8Mhz, но при проблеми направете описаните в кода промени за да направите скоростта 4Mhz.

В блока loop(){...} имате свобода да избирате файла за възпроизвеждане или да опишете свой алгоритъм. Блокът playfile(){...} е функцията която възпроизвежда музиката. Това става чрез прекъсвания по 22000 пъти в секунда (22Khz Sample Rate), така че микроконтролерът на Arduino е свободен да се занимава и с други задачи.

В Serial Monitor се извеждат името на файла и статуса му в момента. При възникване на грешки се извеждат съобщения.

Код

/*

 Описание:
 * Изпълнява еднократно определен файл от SD картата
 * Използва библиотеката WaveHC
 * Извежда статуса в Serial Monitor

 Свързване:
 LCS -> pin2
 CLK -> pin3 
 DI  -> pin4
 LAT -> pin5
 CCS -> pin10

 Tihomir Trifonov (01-2012)
 email:tisho@inbox.com

 с подкрепата на Robotev.com

*/

// задължителни библиотеки
#include <FatReader.h>
#include <SdReader.h>
#include <avr/pgmspace.h>
#include "WaveUtil.h"
#include "WaveHC.h"

SdReader card;    // информация за SD картата
FatVolume vol;    // информация за раздела върху карата
FatReader root;   // информация за файловата система
FatReader f;      // информация за файла, който се възпроизвежда
WaveHC wave;      // аудио обект за възпроизвеждане

void setup() { // начални инициализации

   Serial.begin(9600); // серийна комуникация със скорост 9600 
   // изходни пинове 
   pinMode(2, OUTPUT);  // LCS    // дефинирани са във файла..
   pinMode(3, OUTPUT);  // CLK    // WavePinDefs.h на библиотеката..
   pinMode(4, OUTPUT);  // DI     // и зависят от начина на..
   pinMode(5, OUTPUT);  // LAT    // свързване на пиновете ..
   pinMode(10, OUTPUT); // CCS    // LCS, CLK, DI,LAT и CCS 

  //  if (!card.init(true)) { // 4 MHz (в случaй че не сработи на 8Mhz)
  if (!card.init()) {         // 8 MHz скорост по подразбиране 
    Serial.print("Card init. failed!");  // съобщава за възникнала грешка
    while(1);                            // не прави нищо (halt)
  }
  // търси FAT раздел върху картата
  uint8_t part;
  for (part = 0; part < 5; part++) {     1
    if (vol.init(card, part)) // намерен е раздел
      break;                             
  }
  if (part == 5) { // не е намерен FAT раздел                    
    putstring_nl("No valid FAT partition!"); // извежда съобщение .. 
    while(1);                                // не прави нищо (halt)
  }
  // опитва да отвори главната директория
  if (!root.openRoot(vol)) {  // ако не успее
    putstring_nl("Can't open root dir!"); // извежда съобщение ..
    while(1);                             // и не прави нищо (halt)
  }
}

void loop() { // програмен цикъл

      playfile("1.WAV");// възпроизвежда файла "1.WAV"
      while(1);// не прави нищо (halt)      
}

void playfile(char *name) { // възпроизвежда файлове

  // проверява възпроизвежда ли се музика
  if (wave.isplaying) {// aко се възпроизвежда .. 
    wave.stop();       // я спира 
  }
  // търси файла в главанта директория
  if (!f.open(root, name)) { // ако не го намери..
    putstring("Couldn't open file "); // извежда съобщение..
    Serial.print(name); return; // и името на файла
  }
  // прочита файла и създава аудио обект от него
  if (!wave.create(f)) { // ако формата е невалиден..
    putstring_nl("Not a valid WAV");  // извежда съобщение
    return;
  }
  // извежда Playing:"името на файла"
   Serial.print("Playing "); Serial.println(name);

  // започва възпроизвеждане чрез прекъсвания
  wave.play(); 

    while (wave.isplaying) { // докато се възрпоизвежда файла ..
          Serial.print("|"); // добавя | на всеки ..
          delay(100);  // 100 милисекудни
    }
}

Шийлда се включва от потенциометъра, от който се усилва звука. Към стерео жака може да включите слушалки или да свържете директно високоговорител на изхода на усилвателя. Тъй като кода пуска файла само вендъж, с бутона Reset файла се възпроизвежда отново.