【2016.12.15.聲明】

會打這篇是因為好玩  但我對Arduino其實不是很了解

可以問問題  但我不知道的我就不會回了XDDDDDDDDDDD

 

IMG_5388.JPG

會打這篇  只是想看看有沒有人看得懂這組程式碼XD(正在研究)

思考期末實習小專題時  不小心估狗到這篇"Arduino播放音樂教程"

看起來不難又唬人  就決定是他了

 

除了老師指定的Uno板  還需要一些哩哩叩叩的小玩意兒

於是就去光華採購了一番  差點燒掉一張小朋友QQ(因為買了一些不必要的東西)

我們需要

1.一塊Arduino的板子  我用的是Uno R3板  原教程是用Mango板

2.杜邦線數條

3.SD卡  規格隨意  據說要大於2G

4.喇叭一枚  用音響也可以

5.SD卡讀寫模組(這是額外加的  原因後述)

 

先轉換音樂成FAM格式  放進SD卡  這個原教程有說明

下載SimpleSDAudio函式庫  擺到Libraries底下  要使用裡面的MostFunctionDemo.ino程式

程式長這樣

/*
 Simple SD Audio example, shows the usage of most functions 
 via terminal at serial communication port.
 
 This example shows how to use the SimpleSDAudio library for audio playback.
 You need: 
 - An Arduino with ATmega168/ATmega368 or better
 - An SD-Card connected to Arduinos SPI port (many shields will do)
   -> copy some converted audio files on freshly formated SD card into root folder
 - A passive loudspeaker and resistor or better: active speakers (then stereo output will be possible)
 
 Audio signal output is at the following pin:
 - Arduino with ATmega168/328   (many non-mega Arduinos): Pin 9
 - Arduino with ATmega1280/2560 (many mega Arduinos)    : Pin 44
 
 Using passive speaker:
    Audio-Pin --- -[100 Ohm resistor]- ---- Speaker ---- GND
    
 Using amplifier / active speaker / line-in etc.:
    Audio-Pin --||--------------[10k resistor]----+----[1k resistor]---- GND
              100nF capacitor                   to amp
 
 See SimpleSDAudio.h or our website for more information:
 
 created  29 Jun 2012 by Lutz Lisseck
 */
#include <SimpleSDAudio.h>
 
// Callback target, prints output to serial
void DirCallback(char *buf) { 
  Serial.println(buf);
}
 
char AudioFileName[16];
 
// Create static buffer 
#define BIGBUFSIZE (2*512)      // bigger than 2*512 is often only possible on Arduino megas!
uint8_t bigbuf[BIGBUFSIZE];
 
// helper function to determine free ram at runtime
int freeRam () {
  extern int __heap_start, *__brkval; 
  int v; 
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); 
}
 
void setup()
{
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  
  Serial.print(F("Free Ram: "));
  Serial.println(freeRam());
  
  // Setting the buffer manually for more flexibility
  SdPlay.setWorkBuffer(bigbuf, BIGBUFSIZE); 
  
  Serial.print(F("\nInitializing SimpleSDAudio V" SSDA_VERSIONSTRING " ..."));  
  
  // If your SD card CS-Pin is not at Pin 4, enable and adapt the following line:
  //SdPlay.setSDCSPin(10);
  
  // Select between SSDA_MODE_FULLRATE or SSDA_MODE_HALFRATE (62.5kHz or 31.25kHz)
  // and the output modes SSDA_MODE_MONO_BRIDGE, SSDA_MODE_MONO or SSDA_MODE_STEREO
  if (!SdPlay.init(SSDA_MODE_FULLRATE | SSDA_MODE_MONO)) {
    Serial.println(F("initialization failed. Things to check:"));
    Serial.println(F("* is a card is inserted?"));
    Serial.println(F("* Is your wiring correct?"));
    Serial.println(F("* maybe you need to change the chipSelect pin to match your shield or module?"));
    Serial.print(F("Error code: "));
    Serial.println(SdPlay.getLastError());
    while(1);
  } else {
    Serial.println(F("Wiring is correct and a card is present.")); 
  }
  
 
}
 
 
void loop(void) {
  uint8_t count=0, c, flag;
  
  Serial.println(F("Files on card:"));
  SdPlay.dir(&DirCallback);
 
ReEnter: 
  count = 0;
  Serial.println(F("\r\nEnter filename (send newline after input):"));
  do {
    while(!Serial.available()) ;
    c = Serial.read();
    if(c > ' ') AudioFileName[count++] = c;
  } while((c != 0x0d) && (c != 0x0a) && (count < 14));
  AudioFileName[count++] = 0;
  
  Serial.print(F("Looking for file... "));
  if(!SdPlay.setFile(AudioFileName)) {
    Serial.println(F(" not found on card! Error code: "));
    Serial.println(SdPlay.getLastError());
    goto ReEnter;
  } else {
   Serial.println(F("found.")); 
  }    
 
  Serial.println(F("Press s for stop, p for play, h for pause, f to select new file, d for deinit, v to view status.")); 
  flag = 1;
  
  while(flag) {
    SdPlay.worker();
    if(Serial.available()) {
      c = Serial.read();
      switch(c) {
         case 's':
           SdPlay.stop();
           Serial.println(F("Stopped."));
           break; 
           
         case 'p':
           SdPlay.play();
           Serial.println(F("Play."));
           break;
           
         case 'h':
           SdPlay.pause();
           Serial.println(F("Pause."));
           break;   
   
         case 'd':
           SdPlay.deInit();
           Serial.println(F("SdPlay deinitialized. You can now safely remove card. System halted."));
           while(1) ;
           break;  
             
         case 'f':
           flag = 0;
           break; 
     
         case 'v':
           Serial.print(F("Status: isStopped="));
           Serial.print(SdPlay.isStopped());
           Serial.print(F(", isPlaying="));
           Serial.print(SdPlay.isPlaying());
           Serial.print(F(", isPaused="));
           Serial.print(SdPlay.isPaused());
           Serial.print(F(", isUnderrunOccured="));
           Serial.print(SdPlay.isUnderrunOccured());
           Serial.print(F(", getLastError="));
           Serial.println(SdPlay.getLastError());
           Serial.print(F("Free RAM: "));
           Serial.println(freeRam());
           break;      
      } 
    }
  }  
}

挖看沒有啊  求高手寫說明@@

 

最麻煩的一步----接線!!!!!!

原本我照原教程的接  還把雙排長針彎來又扭去  結果一直跑出錯誤

好吧  估計是接法出了問題(因為原本接法對應的是Mango板)  於是陸續估狗了幾種接法

試了不下五種接法  都一直出錯

很好  不是接法仍然錯誤  就是用雙排長針對應的pin腳沒有搞清楚

於是又訂了一個SD卡讀寫模組  打算改天再試

 

結果一試就成功@@(這張SD卡被我抽出來拍照)

IMG_5394.JPG 

+5接+5

CS接4

MOSI接11

SCK接13

MISO接12

 

GND接上排GND

喇叭一端接地(POWER)  一端接9

IMG_5393.JPG 

接法其實大同小異  所以我覺得應該是SD卡對應的pin腳搞混了

 

最後讓程式實行  用監視窗口輸入播放文件名稱"再多打一行字"  就可以按P播放了

文章標籤
創作者介紹

燁之華

Xinye 發表在 痞客邦 PIXNET 留言(6) 人氣()


留言列表 (6)

發表留言
  • s15124113@stu.edu.tw
  • 你好
    請問一下音樂要怎麼轉成 FAM
  • DOG
  • 想請問一下 我照著步驟做
    但是編譯的時候就是會有error
    想請問一下解決辦法 謝謝~
    Arduino:1.6.2 (Windows 7), 板子:"Arduino Uno"

    MostFunctionDemo.ino:28:27: fatal error: SimpleSDAudio.h: No such file or directory

    compilation terminated.

    編譯時發生錯誤

  • Neil
  • 你好,這程式不是只有如此,很多都是呼叫出來的函數功能,所以你如果要了解的話,可能要連lib裡面的標頭檔一起讀過一遍才能知道。

    回樓上的問題:
    請問有將SimpleSDAudio的資料放進程式lib裡面嗎?
    這個訊息是因為找不到標頭檔或是程式中的函數的原因。
  • 我對Arduino不是真的很了解 所以都沒有回應XD 謝謝你

    Xinye 於 2016/08/30 16:16 回覆

  • Noel
  • 請教一下,我看您影片中似乎是使用外接喇叭,也就是一般的3.5 mm接頭的喇叭,想請教您是如何連接文章當中所說的一端接9和一端接地?謝謝!
  • 老實說我有點忘了XD
    只記得一端是喇叭後面的音源孔給他戳進去...

    Xinye 於 2016/12/15 17:34 回覆

  • 可憐的學生
  • 我是媒體傳達設計的學生 卻被迫做裝置藝術要自己弄懂arduino
    想請問如果要用RFID 感應卡 感應不同卡片時播放不同的音樂 應該要怎麼做
    或許這個問題會很笨
    但是希望可以求解.....
  • 123
  • Free Ram: 694

    Initializing SimpleSDAudio V1.02 ...initialization failed. Things to check:
    * is a card is inserted?
    * Is your wiring correct?
    * maybe you need to change the chipSelect pin to match your shield or module?
    Error code: 1
    解求
找更多相關文章與討論