sound-1

不管你是用哪款手機,應該都有聲控的功能吧,像傑森就偶爾會和Siri聊個天XD。不過Arduino基本上是不會拿來做複雜的語音辨識的,但偵測聲音的大小還是做得到的,這時就必須配合聲音感測模組了。

聲音模組的款式蠻多的,最常見的是這塊紅色板子的,它有類比和數位兩個輸出腳,可以依我們的需要來選擇。雖然這塊便宜好取得,但缺點就是敏感度並不好,聲音要很靠近,並且音量也要夠大,它才會有反應。傑森測過多款百元以下的模組,效果都差不多的。

sound-4

若是需要更高敏感度的聲音模組,傑森建議選擇微雪的版本,採用音頻處理晶片LM386,它可以測得聲音比較細微的變化,但價錢自然就高些囉。

購買微雪聲音感測模組:
https://jason080.easy.co/products/waveshare-sound
sound-5

我們這次的例子以常見的紅色的聲音模組來進行。它的A0類比輸出腳位,可以接到Uno板的類比輸入腳位,A0~A5,我們會依測得的音量大小,得到0~1023的數值。而D0數位輸出腳位,則是依Threshold Value(門檻值),來決定輸出LOW或HIGH,而「門檻值」則可以由板子上的可變電阻來調整:順時針,門檻值提高;逆時針,門檻值降低;調整時可以看綠燈有沒有亮。

sound-3-02-01

處理聲音傑森建議還是用類比的方式來做,會比較有彈性,可以依採集到的數值,進行相對應的處理。

我們先把線接好,很簡單,就3條線而已,除了GND和VCC外,A0腳位我們接到Uno板上的A0。

sound-2

程式就更簡單的,只是單純讀取A0的類比輸入值,我們先讓它顯示在監控視窗裡。這個值每個模組在出廠時都不太一樣,如果需要修改環境音量的起始值,可以透過門檻值的調整電阻,讓它產生變化。

void setup() {
  Serial.begin(9600);  //開始輸出訊息到監控視窗
}

void loop() {
  int sensorValue = analogRead(A0);  //讀取A0的值
  Serial.println(sensorValue);       //在監控視窗顯示讀取的值
  delay(10);
}

其實最重要也就這行了,透過analogRead()我們可以得到聲音感測器給我們的音量大小。

int sensorValue = analogRead(A0);

這時打開監控器視窗,試著大聲說話,或是近距離拍手,就會發現數值會產生變化。

sound-6

再來我們多接一顆LED燈,程式加幾行,當音量大於一定的數值時,燈就亮起來,否則就滅掉。

void setup() {
  Serial.begin(9600);
  pinMode(3,OUTPUT);
}

void loop() {
  int sensorValue = analogRead(A0);
  Serial.println(sensorValue);
  if(sensorValue > 35){   //當音量超過一定數值,這個數值依個別情況修改
    digitalWrite(3,HIGH);  //燈亮
  }else{
    digitalWrite(3,LOW);   //燈滅
  }
  delay(10);
}

sound-7

有興趣的朋友還可以挑戰一下用4顆或5顆燈,依音樂的大小,亮不同的顆數,應該很有趣哦!