2013/04/07

Arduino練習:電容式麥克風與運算放大器LM358

買了一本好書,超圖解Arduino互動設計入門,照著書裡第6章的內容,練習電容式麥克風的用法,因為訊號太微弱,所以需要加上運算放大器(operational amplifier,op-amp),LM358這顆IC裡有兩組,我只用了一組。

我用的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),使電壓保持在一定的數值。


參考資料:

26 comments:

  1. 您好!
    我最近對Arduino產生了興趣,您的blog看起來很不錯,我好想趕快買來動手。

    但我遇到一個問題:
    台灣有不少代理商與網拍賣家都有賣所謂的入門套件組,有些甚至有附上入門說明。
    我想買您提到的"超圖解Arduino互動設計入門"按圖組裝,但我不知道到底我該購買哪個套件?
    相信您也知道,雖然Arduino算是平價的電路板,但如果分散買組件的話,成本會拉高很多的,買套件組應該比較划算。

    我對這個問題蠻苦惱的,不同的套件組馬上可以有幾千元的差價,實在是新生的大問題!
    請問您可以在這個問題上給予我一些個人的想法與建議嗎?謝謝您!

    ReplyDelete
    Replies
    1. 好問題,我沒答案,orz。我是一個一個零件慢慢買的。

      你說的套件組是哪一種?有差到幾千元嗎?

      自己要的只有自己才知道,我建議如果你第一次接觸微控制器這種東西的話,或許買塊Arduino板子,以及一些幾十元的零件,譬如溫度感測、LED矩陣控制IC、光敏電阻、麥克風、等等來玩,加上其他材料,應該不到1500元。

      有了基本認識後,應該就能挑選出自己想要的套件吧。呵呵。

      祝好運。

      Delete
    2. 您好!

      如果是單純只有板子的套件組只有差幾百到1000元,有機器人的就真的有差到幾千元了,我目前看到最貴的機器人是兩萬...!不是捨不得,而是怕自己買了卻沒能力玩,好浪費!

      如果說DIY只能從作中學,那我會問一下賣家的套件組有沒有您提到的這些東西,然後買個2000以下的套件組先玩看看好了!

      謝謝您!

      Delete
    3. 可以上拍賣買,我跟一個學校畢業生買了一整套實習套件總共才600,包含了2塊面包板、2個電錶(數位、類比)、一個lcd、n個7段顯示器、可變電組、電組、電容.......

      畢業季又快到了可以把握機會~

      Delete
    4. 相當不錯,呵。

      Delete
  2. 請問一下讀出來的類比數據
    可以轉換成分貝嗎??

    ReplyDelete
    Replies
    1. 好問題,我不知道耶。

      Delete
    2. 找了一下,arduino+音量+感測,
      有些模組註明「無法提供輸出電壓與分貝的相對關係等參數」,
      沒找到關於分貝的東西耶。

      Delete
  3. 我想請問一下
    我照你的方法接了
    阻值也都一樣(只有把100K換成130K)

    為什麼他讀的值一直是7XX
    而且我加聲音下去 他的值也不會改變

    ReplyDelete
    Replies
    1. 光憑這樣,我也不知道原因。

      但不應該是7xx,有東西沒接對吧,我猜。

      Delete
  4. Anonymous20/1/15 19:27

    我直接output數值
    測試結果只會在757~759
    請問版主的數值變化幅度正常嗎??

    ReplyDelete
    Replies
    1. 正常。
      你的範圍太狹窄了吧?

      Delete
  5. Anonymous3/2/16 06:33

    您好 我想問一下
    這電容式麥克風跟超音波探頭是一樣的嘛?
    http://i.imgur.com/MSzr4s6.jpg
    可否替代使用???

    ReplyDelete
  6. 葉大你好
    我想問一些問題
    我們主要目的就是錄音而已讓錄到的data可以傳到電腦再做辨識分類處理
    辨識的部芬不是我們的任務是我們電機系的

    我們當初的想法是:
    利用柱集體麥克風收音進arduino analog input 再由藍芽模組hc06接收arduino資料 最後再由matlab讀取藍芽資料
    電路的接法即是用上面的圖接的
    目前做到的是已經用麥克風收到analog0~5V訊號由adc轉成digital 0~1023 顯示於視窗序列埠上,

    現在有一些問題
    1.一般來說藍芽如果已經與電腦配對,藍芽的閃燈會轉變成持續亮燈,但是我始終是閃燈,是不是還需要額外宣告已經連結上了?
    2.如果聲音訊號是一個sin wave -5V~+5V 那arduino接收到的訊號會如何表示,因為收到的訊號都是0~1023 轉回類比即是 0~5V ,
    意思是他把負值都砍掉了嗎

    ReplyDelete
    Replies
    1. 你想做的,我沒做過,底下意見僅供參考。

      我這篇裡的電容式麥克風加LM358,通常僅用來偵測音量而已,能不能用來錄音並辨識,我就不知道了。我猜不行,錄到的資料太差了。
      據我所知,要做聲音辨識的話,都是買已作好的模組吧。

      1. 藍牙部分,如果是HC-05,快速閃爍(一秒兩次),代表未連線;連線建立成功的話,應是兩秒閃一次。
      至於如何操控HC-05,請搜尋相關文章。

      2. 根據這篇的電路,負值會被砍掉。

      Delete
    2. 謝謝你
      再問一個小問題
      一般來說arduino收到<0的訊號都會直接砍掉嗎 還是有什麼方式可以保留
      如果都砍掉在聲音還原後一定會失真
      我有找了一下錄音的模組 還在確認是不是單純只是用來收放音 還是可以錄音後做處理

      Delete
    3. > arduino收到<0的訊號都會直接砍掉嗎
      不是Arduino砍掉,而是這篇的電路會濾掉<0的訊號。

      > 還是有什麼方式可以保留
      修改電路吧。

      Delete
  7. This comment has been removed by the author.

    ReplyDelete
  8. HPF, the Fc should be 23Hz

    ReplyDelete
    Replies
    1. 謝謝。
      我確認後再修改。

      Delete
  9. 我想請問如何修改可以使麥克風接收到更小的聲音訊號如震動的聲音,頻率大概在100~2kHz之間

    ReplyDelete
  10. 我想請問如何修改可以使麥克風接收到更小的聲音訊號如震動的聲音,頻率大概在100~2kHz之間

    ReplyDelete
    Replies
    1. 不清楚。
      找找專門的聲音偵測模組。

      Delete