我用的Arduino板子是Uno R3,軟體開發環境是1.0.4版。
電路圖與程式碼可到這裡下載。
所需材料:
- 電容式麥克風,1個
- LM358,1個
- 電阻,2.2K歐姆(紅紅紅)、1K歐姆(棕黑紅)、68K歐姆(藍灰橙)、100K歐姆(棕黑黃),各1個
- 電容,0.1μF(104),1個
電路圖如下:
將Arduino板子的5V與GND接到麵包板。
從5V串聯2.2K限流電阻後,接到麥克風的正極。
麥克風負極接地。
麥克風正極,接0.1μF電容後,然後要接到兩個地方,一條接到358的腳位3(非反向輸入);另一條接68K電阻後接地。這裡的電容與電阻形成high-pass filter,只允許23Hz以上的聲音訊號通過。
358的腳位2(反向輸入)接1K電阻後接地。
358的腳位1(輸出),要接到兩個地方,一條接到Arduino的類比輸入腳位A0,我們將從這裡讀取;另一條接100K電阻後接到358的腳位2。
358的腳位8,接5V。
358的腳位4,接地。
358的腳位5、6、7,這是另一組運算放大器,本篇不使用。
看圖接線,應該比較簡單。
照片,還滿亂的。
特寫。
以上是硬體的部份,軟體的部份,我只寫了個簡單的測試程式。
// 類比輸入腳位
int MIC_PIN = A0;
void setup()
{
Serial.begin(115200);
pinMode(MIC_PIN, INPUT);
}
int count = 0; // 計算收到幾次的高音量
void loop()
{
int mic = analogRead(MIC_PIN); // 讀取麥克風輸出
if(mic >= 500){ // 這裡寫死500,您可試試別的值
count++;
Serial.print("mic >= 500, count=");
Serial.println(count);
}
}
然後執行,平時音量低時沒有輸出,若發出噪音或拍手,便會在序列埠監控視窗裡看到輸出。
我拍了一次手,程式偵測到五次。
因為會偵測到好幾次,類似於開關的彈跳(bounce)問題,若想要以拍手來控制LED明滅,就需要解決這個問題,可參考「超圖解Arduino互動設計入門」書裡的作法,我就懶得弄了,哈哈。
書裡還提及,以這個範例而言,訊號的電壓並不會超過5V,所以Arduino針腳可承受,但若想要加入過電壓保護電路,可加入齊納二極體(Zener diode),使電壓保持在一定的數值。
參考資料: