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,只允許2.3Hz以上的聲音訊號通過。

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


參考資料:

20 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