2010年12月24日 星期五

Arduino 筆記 – Lab6 控制蜂鳴器發聲

實驗目的
控制蜂鳴器發聲,讓蜂鳴器發出中音 Do(523Hz), Re (587Hz), Mi(659Hz), Fa(698Hz), So(784Hz), La(880Hz), Si(988Hz) 到高音 Do (1047Hz) 這八個不同音階的聲音,每個音階響 0.5 秒鐘。
材料
  • Arduino 主板 x 1
  • 8 歐姆蜂鳴器 x 1
  • 單心線 x n
接線
把蜂鳴器接到 Arduino 板子上,紅線(正極)接到 pin8,黑線(負極)接到 GND,如下圖:
image
電路圖
image
程式碼

DoReMi.pde


說明:
  • L04~L05: 定義中音 Do, Re, Mi, So, La, Si 及高音 Do 等 8 個音階的頻率,各個音階的頻率已經定義在 pitches.h 檔裏,所以只要找出這八個音階的常數並儲存在 melody 陣列即可。
  • L06: 定義 duration 變數,代表每個音階響一次持續的時間,因為要讓每個音階響 0.5 秒,所以把 duration 設為 500 (單位是 milisecond)
  • L13~L19: 讓蜂鳴器發出中音 Do(523Hz), Re (587Hz), Mi(659Hz), Fa(698Hz), So(784Hz), La(880Hz), Si(988Hz) 到高音 Do (1047Hz) 這八個不同音階的聲音,每個音階響 0.5 秒鐘
  • L22: 隔兩秒鐘後再重新播放
pitches.h 檔的內容:
原理
蜂鳴器發聲的原理,其實只是利用 PWM 產生音頻,驅動蜂鳴器,讓空氣產生振動,便能發出聲音。只要適當地改變振動頻率,就可以產生不同音階的聲音。例如,送出 523Hz 的脈波可以產生中音 Do, 587Hz 的脈波可以產生中音 Re, 659Hz 可以產生中音 Mi。如果再搭配不同的節拍,就可以播放一首歌了。這邊要注意不能使用 Arduino 的 analogWrite() 函式產生脈波,因為 analogWrite() 的頻率是固定的(500Hz),沒辦法輸出不同音階的聲音。
動動腦
  1. 以這個範例為基礎,加上幾顆 LED 並修改程式,在播放聲音的同時控制 LED 燈號的變化,讓這支範例變成一個具有聲光效果的程式。
  2. 試產生救護車的警報聲。提示: 只要讓蜂鳴器不間斷產生中音 Do (523Hz) 和中音 Fa (698Hz) 各約 0.8 秒的聲音,即可模擬救護車的警報聲。
延伸閱讀

12 意見:

Chris 提到...


作者 您好:

您的文章寫的很詳細
不好意思,
想跟你請問一下8歐姆蜂鳴器是需要幾伏特的呢?

Thank you

Cooper Maa 提到...

謝謝

3V 到 5V 的蜂鳴器應該都可以用
不過,要詳細看 spec 看它吃的電流還有線圈阻抗,有些可能需要加電阻,可以參考一下這篇:
http://arduino.cc/forum/index.php?topic=130724.0

Chris 提到...


請問

.h檔案要需要放到那個資料底下呢?

Cooper Maa 提到...

跟 .ino 或 .pde (舊的格式) 放在同一個資料夾底下就可以了

Chris 提到...

恩~應該沒有錯
我是都放在同一個資料夾內
但好像會找不到
DoReMi.cpp:2:21: error: pitches.h: No such file or directory

Cooper Maa 提到...

你先把 pitches.h 放在一個地方 (不要跟 DoReMi.ino 放在一起),接著點 Sketch > Add File...,選擇 pitches.h,然後再編譯應該就可以了

Chris 提到...


試出來了~感謝

Cooper Maa 提到...

不客氣

左人 提到...

為什麼每個音階都一樣~?

Cooper Maa 提到...

你有把 pitches.h 包進來嗎?

Dario pizza 提到...

請問 uno 板子 pin8 不是沒有 PWM功能...??? 要3,5,6,9,10,11 才有阿..???

Cooper Maa 提到...

是的 uno 板子只有 3,5,6,9,10,11 才有 PWM
不過 tone() 內部是用 timer 控制的,所以不限定任何 pin