不管你是用哪款手機,應該都有聲控的功能吧,像傑森就偶爾會和Siri聊個天XD。不過Arduino基本上是不會拿來做複雜的語音辨識的,但偵測聲音的大小還是做得到的,這時就必須配合聲音感測模組了。
聲音模組的款式蠻多的,最常見的是這塊紅色板子的,它有類比和數位兩個輸出腳,可以依我們的需要來選擇。雖然這塊便宜好取得,但缺點就是敏感度並不好,聲音要很靠近,並且音量也要夠大,它才會有反應。傑森測過多款百元以下的模組,效果都差不多的。
若是需要更高敏感度的聲音模組,傑森建議選擇微雪的版本,採用音頻處理晶片LM386,它可以測得聲音比較細微的變化,但價錢自然就高些囉。
購買微雪聲音感測模組:
https://jason080.easy.co/products/waveshare-sound
我們這次的例子以常見的紅色的聲音模組來進行。它的A0類比輸出腳位,可以接到Uno板的類比輸入腳位,A0~A5,我們會依測得的音量大小,得到0~1023的數值。而D0數位輸出腳位,則是依Threshold Value(門檻值),來決定輸出LOW或HIGH,而「門檻值」則可以由板子上的可變電阻來調整:順時針,門檻值提高;逆時針,門檻值降低;調整時可以看綠燈有沒有亮。
處理聲音傑森建議還是用類比的方式來做,會比較有彈性,可以依採集到的數值,進行相對應的處理。
我們先把線接好,很簡單,就3條線而已,除了GND和VCC外,A0腳位我們接到Uno板上的A0。
程式就更簡單的,只是單純讀取A0的類比輸入值,我們先讓它顯示在監控視窗裡。這個值每個模組在出廠時都不太一樣,如果需要修改環境音量的起始值,可以透過門檻值的調整電阻,讓它產生變化。
void setup() {
Serial.begin(9600); //開始輸出訊息到監控視窗
}
void loop() {
int sensorValue = analogRead(A0); //讀取A0的值
Serial.println(sensorValue); //在監控視窗顯示讀取的值
delay(10);
}
其實最重要也就這行了,透過analogRead()我們可以得到聲音感測器給我們的音量大小。
int sensorValue = analogRead(A0);
這時打開監控器視窗,試著大聲說話,或是近距離拍手,就會發現數值會產生變化。
再來我們多接一顆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);
}
有興趣的朋友還可以挑戰一下用4顆或5顆燈,依音樂的大小,亮不同的顆數,應該很有趣哦!