2015年1月15日 星期四

Arduino之玩出名堂 - 聖誕音樂盒

去年(2014)年聖誕節將臨之時,想要做一個特別的聖誕禮物給另一半,首先想到的是聖誕樹;看了Lily Allen版本(原唱是KEANE)的「Somewhere Only We Know」MV幕後製作花序,想說也許可以自己做顆聖誕樹(像2:06開始那樣,自己做樹幹黏上樹枝再著色),但是走了一趟美工材料行,發現要做這個好像搞太大,材料也不好買,所以更改計畫,以聖誕樹為主題,做一個能播放音樂的盒子吧。


Lily Allen版本Somewhere Only We Know

3:22秒可以看到整個場景,聖誕樹跟場景是真的模型,
裡面的角色也是用一張張紙片連拍之後進電腦合成的動作


既然是音樂盒,那就要能播放音樂。Arduino能藉由程式庫來播放SD卡裡的WAV檔,但只支援16kHz, 8bit, Mono的WAV檔案。製作這樣的音樂檔,可由Logic Pro X輸出wav檔之後,改用Audacity來轉換成這樣的格式,只是在這裡有兩個小技巧:
  • 一是更改歌曲取樣頻率時(比如說從44.1kHz -> 16kHz),要改的是專案的取樣頻率而非音軌的取樣頻率,如果改了音軌的取樣頻率,音樂速度會變得更快。
  • 第二是Stereo改Mono時,功能在音軌最左方的下拉選單裡。

當Arduino可以從SD卡讀取WAV檔播放出聲音來之後,第一個可能會遇到的問題就是「聲音太小」。一般的商業音樂(指的是經過錄音室混音之後的版本)音量都盡可能的調很大了,從波型就可以看得出來,波型幾乎都填滿了。但是自己混音的版本就很難混到這麼大聲,這時候就需要「放大器」。

看網頁上有人使用簡單的NPN三極體來放大電流達到加大音量的方法,但是我用了BC546/BC548B都感覺不出有什麼放大效果。又看到有人用LM386晶片做聲音放大器,可有20-200倍增益,照著各網站上不同的電容組合測試,看來各種電路放大效果都差不多,至少配合我手邊的8Ohm/1W或2W的喇叭聽起來都差不多。最後也上網買了個聲音放大模組來用,結果也是大同小異,下次也許就可以用自製的放大器來實作了。

接下來要進行很重要的就是外殼,產品外型常決定了是否能吸引消費者繼續對它有興趣,我用了白色塑膠瓦楞板(就是封冷氣孔常用的那種板子)做外殼,主要是因為它加工較容易以及強度也夠。另外選擇1mm厚紙板作為內部使用,聖誕樹跟前面的人物都是使用美工刀切割出來的。之後想要嘗試使用雷射切割,應該可以提昇精確度以及讓它更美觀。

製作出來的成品:

前面有一塊透明片,內部聖誕樹上的LED會隨機閃爍,後面有喇叭孔以及電源開關跟歌曲播放按鈕,按不同按鈕會播放不同歌曲,歌曲播放時前面LED燈同時會改變閃爍的節奏。後方打開之後可以看到一堆線路糾纏在一起。為了偷懶,Arduino Nano跟SD Card模組是固定在小型麵包板上,用單芯線連結起來。右方一堆線則是LED的線路,我只把接地端焊在小塊萬用板上然後再接入麵包板,供電端則都是製作杜邦公插頭插進麵包板來連結Arduino。前方控制面板也是切割萬用電路板再焊上switch開關以及微動按鈕,左邊則是電源昇壓模組,負責將鋰電池從3.7V升到5V對其他模組供電,裡面還有一塊聲音放大模組,所以盒子裡總共有:
  • Arduino Nano 3.0
  • SD Card模組
  • 電源昇壓模組
  • 聲音放大模組
  • 3.7V鋰電池
  • 8顆紅綠LED
  • 自製控制面板
  • 8Ohm/2W小喇叭
說到鋰電池,原本我是使用方形9V乾電池供電,結果發現它的蓄電量太小(好像才100多mAh),竟然LED閃久一點就沒電了,使用6個1.2V充電電池(7.2V)也太占空間,所以才改用900mAh鋰電池,尺寸比SD卡模組稍大一些,放進去盒子去空間還算寬裕。

這是實際操作影片:


Arduino程式碼可從這裡下載

27 則留言:

  1. 天啊...這真是我看過最浪漫的聖誕禮物!好感人!做的真好!搜尋“arduino 供電” 意外逛到貴網誌 很棒!

    回覆刪除
    回覆
    1. 謝謝你的讚美,希望分享的這些資訊能吸引更多人進入 Maker 的風潮裡。

      刪除
  2. 作者已經移除這則留言。

    回覆刪除
  3. 我對arduino還滿有興趣的,可是目前還只是個初學者,覺得你的音樂盒做得好漂亮喔,也想自己做一個玩玩,不知道你方不方便提供詳細的教學呢?

    回覆刪除
    回覆
    1. 內殼用1mm硬紙板加美工刀刻出聖誕樹(前後2片)跟熊的形狀,聖誕樹挖洞將LED用熱融膠黏在紙板上,將正負級跟焊點用熱縮膜套起來以免短路。所有的線拉出來將正負級集中,自己切一塊小洞洞板將他們焊接起來,再接上Arduino。這幾個動作最麻煩,要有耐心跟巧手。
      至於外殼用美工刀切割冷氣機隔板(特力屋有賣)還蠻簡單的,只是要丈量清楚才能組合成一個盒子。
      玩Arduino做做實驗網路上很多教學,但是要組合成一個看起來像成品的作品,花的功夫是比較多些。Good Luck!

      刪除
  4. 不是電子相關科系的,畫電路圖對我來說還有點學習曲線呢。
    電路圖其實很簡單,SD讀卡機跟聲音放大模組接Arduino Nona的方法可參考網路上參考資訊,怎麼接跟你買的模組相關。電源升壓模組讓鋰電池從3.7V升5V供Arduino電。自製的控制面板是把兩個微動開關跟電源開關焊到一個洞洞板上方便安裝在盒子後面。另外8個紅綠LED是把陰極全部焊成一條線接地,另外8個針腳接Arduino不同腳,至於腳位可以參考程式碼裡面都有註明。

    回覆刪除
  5. 想請問在您的程式碼中 TMRpcm tmrpcm 是什麼功用呢?
    我複製您完整的程式碼到arduino開發平台上都是 tmrpcm這部分出現錯誤而已
    另外想請問您是否方便附上arduino與SD卡與喇叭的完整接線圖呢
    非常想要自己做一個相關的音樂盒
    最後非常感謝您提供相關程式以及範例 感謝

    回覆刪除
    回覆
    1. TMRpcm的Library是讓Arduino可以直接從SD卡上播放wav檔(也就是PCM無壓縮的格式),沒有這個程式庫,一般就需要音訊晶片來做這件事了,所以它能播放的wav檔格式是有限制的:8-32kHz, 8bit mono檔案。

      Arduino接SD讀卡機可以參考這篇
      http://gogoprivateryan.blogspot.tw/2014/08/microsd-arduino-microsd.html
      或這篇
      http://scout-jj.blogspot.tw/2014/09/arduinosd.html

      刪除
  6. 請問聲音放大模組跟電源升壓是必須要有的嗎?
    目前我有喇叭 SD卡 Arduino-UNO板 還有按鈕
    因為我實驗出來喇叭沒有聲音
    若是必須要以上兩樣 可否提供你所使用產品的附圖和實品接線呢?
    謝謝你

    回覆刪除
  7. Arduino Uno的pin腳輸出功率太小,無法推動2W的小喇叭,要用聲音放大模組如LM386等才能推的動。比如http://shop.cpu.com.tw/product/48238/info/

    電源升壓是讓3.7V鋰電池升壓至5V,如果你沒要用鋰電池,用一般的行動電源供電也可以。
    升壓模組在這裡有介紹http://blog.ddt.idv.tw/2014/10/arduino_10.html

    至於喇叭,一般光華商場賣電子零件的都有賣。我用的是8歐姆2W的小喇叭,大聲不到哪兒去,應該是聲音放大模組放大功率有限,有些D類放大模組效果可能好些,但價格貴了非常多。

    回覆刪除
  8. 你好,請教一下,程式需要發出聲音在特定情況從SD卡讀出,那我引用你的程式:
    #include
    m.speakerPin = 9; // set speaker pin for tmrpcm
    tmrpc tmrpcm.play("song2.wav");
    這三行而已(宣告跟SET跟需要發出聲音位置)結果是發不出聲音(SD卡模組我原本程式就需要,只是裡面有文字檔,請問你有額外開啟SD卡嗎?因為我SD裡有WAV及TXT,我要開TXT會類似有這語法myFile = SD.open("state.txt", FILE_WRITE);可是看你好像沒有)
    那另外是我只有喇叭接在MEGA版上而已還需要其他聲音擴大或是其他模組?

    回覆刪除
    回覆
    1. 另外是蜂鳴器程式我有試過聲音是滿大的 還是此程式跟蜂鳴器不同

      刪除
    2. TMRpcm程式庫可直接讀取SD卡內的wav檔。此外,蜂鳴器並不能發出wav檔的聲音,它只能發出有音階的BB聲。
      關於Arduino接喇叭的問題,在上一個留言中有回答了,簡單的說一定要買個聲音放大模組,否則Arduino輸出電流太小,驅動不了喇叭。

      刪除
    3. 謝謝,我成功有聲音了,只是很小聲,目前有購入聲音放大模組,只是有個小問題,就是播放出來聲音先不論大聲,聲音有點模糊以及比原本速度慢,這些問題會在聲音模組裝上後解決嗎?

      刪除
    4. 文章裡有提到,這個Library只支援16kHz, 8bit, Mono的WAV檔案。所以播放太慢表示也許你的wav檔取樣頻率是8kHz? 或者是你的檔案是立體聲,只播放出單聲道讓你覺得變模糊了。
      買個音效卡(模組)能支援更多的聲音格式,更高取樣頻率的音源自然能播出更好的聲音,甚至能播mp3。

      刪除
  9. 請問SD卡有需要格式化嗎?

    回覆刪除
    回覆
    1. 要格式化是有工具可以做,在Mac上用SDFormatter。

      刪除
    2. 那可以請教聲音放大模組怎麼接的?是買哪種呢?

      刪除
    3. 上淘寶搜尋音頻放大器,我用的是LM386晶片,號稱放大200倍,不過聲音也放不大聲。有種D類放大器的也許效果較好。
      這種類比的放大器接法很簡單,就供電VCC以及接地GND,然後把音頻輸出訊號直接接上去,另一邊接喇叭即可。

      刪除
    4. 請教什麼是把音頻輸出訊號直接接上去呢?
      是直接接上麵包板,還是要接誰的pIN腳呢?

      刪除
  10. 不好意思!可以跟你要程式碼(C++)嗎?

    回覆刪除
  11. 不好意思!可以跟你要程式碼(C++)嗎?

    回覆刪除
    回覆
    1. 文章最後一行有Github的連結啊。
      https://github.com/TerenceHub/Musicbox

      刪除
  12. 請問一下 Arduino Nano 3.0 改成 Arduino UNO可以嗎?

    回覆刪除
  13. 可以呀,只是音樂盒體積會變大、而且接腳容易鬆脫喔。
    (Uno是用杜邦端子暫時接上、用焊錫牢靠多了)

    回覆刪除
  14. 你好請問我的arduino sd可以跑cardinfo 但其他不行,在Initializing的時候就失敗了,請問有遇過這樣的情況嗎

    回覆刪除