本文旨在補充《超圖解Arduino互動設計入門》第六章「麥克風聲音放大器」單元,書本使用LM358運算放大器自製一個「半波」聲音放大器,並且透過它來製作「拍手聲控」開關。如果不打算自己DIY麥克風聲音放大器,可以選用現成的「聲音偵測」模組。
下圖是筆者選購的兩個聲音偵測模組,左邊是「高感度麥克風傳感器模塊」,在產品說明頁提到它可以檢測聲音的大小、工作電壓5V、增益可調、類比輸出。
右邊那一款是「聲音檢測傳感器模塊」,工作電壓4V~6V,當有聲音時輸出低電位,可用於聲控燈、聲音控制和聲音檢測等場合。
這兩個模組其實是一樣的東西,它們的電路都採用LM393這個「比較器」IC。當此模組偵測到音量大於某個程度時,就輸出低電位、平時則輸出高電位;換句話說,它們用於偵測「有沒有」聲音,而不是放大聲音訊號。
使用Arduino的「序列繪圖家」描繪類比訊號波型
為了清楚比較「聲音偵測」和「聲音放大器」模組的差別,我們可以寫一個簡單的程式碼,把類比輸入腳(A0)輸出到序列埠,並透過Arduino IDE內建的「序列繪圖家(Serial Plotter)」工具描繪出類比資料:
unsigned int snd = 0; void setup() { Serial.begin(9600); } void loop() { snd = analogRead(A0); Serial.println(snd); delay(10); }
把書本的LM358聲音放大器電路的輸出,接在Arduino Uno的類比A0腳,然後在Uno控制板執行上面的程式碼,並選擇IDE裡的「工具→序列繪圖家」指令,呈現的「聲波圖」如下:
同一個程式碼,將「聲音檢測傳感器模塊」的輸出連接在Arduino板的A0腳,呈現的訊號波形像「數位」訊號,幾乎只有高、低電位變化:
製作如書本的「拍手聲控」開關應用,可使用「聲音檢測傳感器模塊」;但如果要製作隨音量大小變化的互動效果,例如,口形隨音量變化的玩偶,或者隨音量變化的燈光效果,上面兩個「聲音檢測」模組就不適合了。
動手做:自製LM386麥克風聲音放大器
市面上的「聲音放大器」模組,大多是採用LM386電路的「全波」放大器。模組的外型跟「聲音檢測器」很像,購買之前請確認模組上面的IC型號,不是LM393。當然,我們也可以自己買零件從頭組裝。
LM386的電路符號和運算放大器相同,但它實際上是聲頻功率放大器,而且輸出端自動偏壓到電源電壓的一半,也就是說,聲頻放大的輸出是全波,不是只有正半波。LM386預設20倍電壓增益,只要外加少許被動元件,即可組成20~200倍增益的放大器。
LM386的特點:
- 工作電壓:4-12V或5-18V(LM386N-4型)
- 靜態功耗(代表「無訊號輸入」)低,約4mA。
- 外圍元件少。
- 電壓增益可調,20-200。
- 低失真度。
底下是LM386的接腳圖:
自製LM386聲音放大器的電路如下,關於LM386與此電路的進一步說明,請參閱下一篇文章。
LM386麥克風聲音放大器的材料清單:
- LM386聲頻放大器IC × 1
- 電阻10Ω(棕黑黑)× 1
- 電阻2.2KΩ(紅紅紅)× 1
- 電容0.056µF (563) × 1
- 電容0.1µF (104) × 2
- 電容10µF × 2
- 電容220µF × 1
電阻採1/4W,電容耐壓要大於6.3V。用麵包板組裝LM386聲音放大電路的示範:
同樣執行上一節的程式碼,連接LM386聲音放大電路所呈現的訊號波形:
喜欢老师制作的精美图片,是使用Animate这个工具制作的吗?
谢谢,是的,我是用Animate之前的Flash CS6制作的。
thanks,
jeffrey
請問可以用聲音檢測,當音量達到條件呼叫語音辨識涵式?
ok,google是這個原理嗎?
不是,google的語音辨識是你在google程式畫面時,它就一直在收音,類似有個僕人一直在你旁邊聽你說話,但是它平常不會搭話,只有在聽到”ok google”關鍵字時,才會回應,跟音量大小無關。
thanks,
jeffrey
你好想請問,如果想及時收發聲,此模組也適用嗎
這個模組在此是作為「音量大小」的感測器,如果要傳送聲音訊號,跟處理器的資源比較相關。
thanks,
jeffrey
想請問如果是想把他的訊號讀值轉換成分貝(db)是有可能的嗎?
如果可以的話那轉換式是?
可以,Arduino分貝計的完整程式碼請參閱iot-decibel-meter。
thanks,
jeffrey
您好,想請問一下有辦法透過這兩個元件來偵測聲音的頻率嗎?
這個元件是放大聲音訊號的振幅,如果要偵測頻率的話,這裡有個使用Arduino Zero板子搭配Audio Frequency Meter Library程式庫的例子。
如果要偵測、計數方波的頻率,可以參考這個使用Arduino Uno板的頻率計數器的例子。
thanks,
jeffrey
老師,不好意思 請教一下兩個問題
1. 您放了一個2.2k的電阻 再Vcc 和 麥克風 之間但spec 是放10k .我查了一下 這個電阻是因為要給電容麥克風電, 並給他一個bias 電壓.
那怎樣的電阻才是適合的呢? 可不可以加個可變電阻 .使得一開始輸出的電壓再固定一個準位呢?
2.輸出到喇叭您是用 220uF, spec上是用250uF. 網路上有的是給100uF 請問這會有甚麼影響嗎?
因為我是電學初學者 所以可能問題有點笨 請多包涵
1. 可以接可變電阻,這個阻值會改變收音的音量。
2. 這個電容用於濾除訊號中的直流成份。
此聲音放大電路用於檢測音量大小,不是用於聆聽或錄音等高傳真視聽設備,所以不必太計較某些被動元件的數值。就像接LED的限流電阻,有人接330Ω, 680Ω, 1KΩ甚至2KΩ,都可以。通常只是因為做實驗時,剛好有某個可用的元件,就用上了。
thanks,
jeffrey
老師您好,我想做一個藍芽麥克風(只需要傳送wav音檔)來連接電腦,想請問一下可以在錄音的時候不連接Arduino板子嗎?
我的想法是把hc-05藍芽模組、x00098錄音模組和電池連接起來使用,這樣是可行的嗎?
HC-05是序列資料傳輸介面,預設速率僅9600bps,除非你自己改寫它的韌體程式,不然一定要接微電腦才能使用。
請教一個關於”電源使用”的問題
我使用圖片中紅色的模組時候,因為板子上的電源輸出滿了(被其他感應器、顯示螢幕占用)
A板子提供VCC & GND=>感測器
感測器的Analog pin=>B板子
這樣子測量不到訊號,請問是因為電路無法導通嗎?
如果遇到供電不足的時候,應該怎麼做比較好呢?
請把A和B板子的接地相連。
在C:\Users\user\Documents\Arduino\libraries\sketch_may09a: no headers files (.h) found in C:\Users\user\Documents\Arduino\libraries\sketch_may09a裡找到無效的程式庫
在執行程式碼時出現這組代碼,請問要安裝甚麼程式庫呢
本文的範例並不需要額外的程式庫
那請問為什麼會跑出這組代碼呢? 有沒有辦法可以解決
那個錯誤訊息代表你的程式引用了某個.h檔,但是IDE找不到它。
Hi 趙老師,
有一個困擾很久的問題,一直無法解決,不知道老師是否可以提供一點方向或建議?
我的想法是做一個聲音監測的功能,想達到的效果是持續的監聽環境聲音,這樣我在程式裡面可以監測當聲音值大於一定的值以後進行後續的處理,我嘗試過透過老師文章裡面的麥克風方式,但是一般試過許多不同的感測器,效果都不夠敏感,無法達到預期的效果,後來參考這篇 https://github.com/s-marley/ESP32_FFT_VU 想說這樣不透過麥克風,而直接從3.5mm audio jack 接入一個輸入到ESP似乎是一個不錯的方式,但仍然遇到偵測聲音不是很準確的問題(因為我需要的是偵測其他設備發出的短警示音,例如說,很短的高頻B聲,而我透過這樣的方式在無聲音時,ESP 所收到的數值本身就會有波動,當偵測到B聲的時候,其變化並沒有明顯大於無聲音的變動值範圍,這也造成了判斷的困難,這真的困擾好久,不知道老師有什麼建議,不管是從硬體上或是軟體上解決的方式呢?非常謝謝.
我猜想是取樣頻率不夠高,或許你可以改用I2S介面的ADC,相關說明請參閱這個Github專案(我還沒仔細看):https://github.com/atomic14/esp32_audio