實驗目的
控制蜂鳴器發聲,讓蜂鳴器發出中音 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,如下圖:電路圖
程式碼
說明:
- 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: 隔兩秒鐘後再重新播放
原理
蜂鳴器發聲的原理,其實只是利用 PWM 產生音頻,驅動蜂鳴器,讓空氣產生振動,便能發出聲音。只要適當地改變振動頻率,就可以產生不同音階的聲音。例如,送出 523Hz 的脈波可以產生中音 Do, 587Hz 的脈波可以產生中音 Re, 659Hz 可以產生中音 Mi。如果再搭配不同的節拍,就可以播放一首歌了。這邊要注意不能使用 Arduino 的 analogWrite() 函式產生脈波,因為 analogWrite() 的頻率是固定的(500Hz),沒辦法輸出不同音階的聲音。動動腦
- 以這個範例為基礎,加上幾顆 LED 並修改程式,在播放聲音的同時控制 LED 燈號的變化,讓這支範例變成一個具有聲光效果的程式。
- 試產生救護車的警報聲。提示: 只要讓蜂鳴器不間斷產生中音 Do (523Hz) 和中音 Fa (698Hz) 各約 0.8 秒的聲音,即可模擬救護車的警報聲。
回覆刪除作者 您好:
您的文章寫的很詳細
不好意思,
想跟你請問一下8歐姆蜂鳴器是需要幾伏特的呢?
Thank you
謝謝
回覆刪除3V 到 5V 的蜂鳴器應該都可以用
不過,要詳細看 spec 看它吃的電流還有線圈阻抗,有些可能需要加電阻,可以參考一下這篇:
http://arduino.cc/forum/index.php?topic=130724.0
回覆刪除請問
.h檔案要需要放到那個資料底下呢?
跟 .ino 或 .pde (舊的格式) 放在同一個資料夾底下就可以了
回覆刪除恩~應該沒有錯
回覆刪除我是都放在同一個資料夾內
但好像會找不到
DoReMi.cpp:2:21: error: pitches.h: No such file or directory
你先把 pitches.h 放在一個地方 (不要跟 DoReMi.ino 放在一起),接著點 Sketch > Add File...,選擇 pitches.h,然後再編譯應該就可以了
回覆刪除恩
回覆刪除試出來了~感謝
不客氣
回覆刪除為什麼每個音階都一樣~?
回覆刪除你有把 pitches.h 包進來嗎?
回覆刪除請問 uno 板子 pin8 不是沒有 PWM功能...??? 要3,5,6,9,10,11 才有阿..???
回覆刪除是的 uno 板子只有 3,5,6,9,10,11 才有 PWM
回覆刪除不過 tone() 內部是用 timer 控制的,所以不限定任何 pin