Arduino 聲控開關-語音辨識
這是聲控開關的第二部,上次用到的技術是利用Mic回饋的電壓,判斷拍手的動作.
進而去控制開關的動作.
這次的比較簡單,是利用語音IC模組,直接辨識語音.做出判斷,進而去控制開關的動作.
準備材料
1. Arduino Mega2560x1
2. LD3320語音識別模組
3. 繼電器模組
4. BEEP
5. LED
聲控開關-線路圖
由於太簡單了就直接分析語法吧...哈
|
#include "ld3320.h" // 使用LD3320的Lib
// Lib微雪課堂下載,裡面的講解也可看看
// 網址如下
// http://www.waveshare.net/study/article-11-1.html
#define RELAYON 0 // 定義RELAYON為"0", 以下依此類推 #define RELAYOFF 1 #define JIAWEISI 2 #define READFAIL -1 #define BEEP A7
#define BEEPGND A9 #define SLED 14 #define SLEDGND 15 #define RELAYPIN1 A0 #define RELAYPIN2 A1 VoiceRecognition Voice; // 宣告語音辨識含式庫VoiceRecognition
// 關鍵字為Voice void setup() { Serial.begin(115200); // 用來偵錯的, Serial port的速率, 設為115200bps pinMode(SLED,OUTPUT); // 設定SLED為輸出腳 pinMode(SLEDGND,OUTPUT); // 設定SLEDGND為輸出腳, 做低電位腳用 pinMode(BEEP, OUTPUT); // 設定BEEP為輸出腳 pinMode(BEEPGND, OUTPUT); // 設定BEEP為輸出腳, 做低電位腳用 pinMode(RELAYPIN1, OUTPUT); // 設定RELAYIN1為輸出腳 pinMode(RELAYPIN2, OUTPUT); // 設定RELAYIN2為輸出腳 digitalWrite(SLED, LOW); // SLED輸出低電位
digitalWrite(SLEDGND, LOW); // SLEDGND輸出低電位 digitalWrite(BEEP, LOW); // BEEP輸出低電位 digitalWrite(BEEPGND, LOW); // BEEPGND輸出低電位 digitalWrite(RELAYPIN1, HIGH); // RELAYPIN1輸出高電位 digitalWrite(RELAYPIN2, HIGH); // RELAYPIN1輸出高電位 Voice.init(); // 初始化Voice模組
Voice.addCommand("jia wei si", JIAWEISI); // 加入語音辨識關鍵字"賈維斯" // 這邊使用的是羅馬拼音 // 如果你有看鋼鐵人的話 // 應該會猜到我為何叫它賈維斯 Voice.addCommand("kai deng", RELAYON); // 加入語音辨識關鍵字"開燈" Voice.addCommand("guan deng", RELAYOFF); // 加入語音辨識關鍵字"關燈" Voice.start(); // 開始識別 Serial.println("Test Start"); // 用來偵錯的 for (int i = 0; i < 5; i++) // 開機聲 { digitalWrite(SLED, HIGH); tone(BEEP, 1000); delay(50); digitalWrite(SLED, LOW); noTone(BEEP); delay(50); } } void loop()
{ int iJIAWEISITime; switch (Voice.read()) // 語音識別含式
{ case JIAWEISI: Serial.println("Jia Wei Si"); // 用來偵錯的 for (int i = 0; i < 2; i++) // 辨識到賈維斯後, 回應BEEP聲 { // 兼LED閃爍 digitalWrite(SLED, HIGH); tone(BEEP, 1000); delay(50); digitalWrite(SLED, LOW); noTone(BEEP); delay(50); } //--- 開關可識別區 --------------------------------------------------------------------------
iJIAWEISITime = 0; while (iJIAWEISITime < 3000) // 開始計時約 3second { switch (Voice.read()) // 語音識別含式 { case RELAYON: Serial.println("ON"); // 用來偵錯的 digitalWrite(RELAYPIN1, LOW); // 繼電器1開啟 digitalWrite(RELAYPIN2, LOW); // 繼電器2開啟 iJIAWEISITime = 0; // 計時計數歸0 break; case RELAYOFF: Serial.println("OFF"); // 用來偵錯的 digitalWrite(RELAYPIN1, HIGH); // 繼電器1關閉 digitalWrite(RELAYPIN2, HIGH); // 繼電器1關閉 iJIAWEISITime = 0; // 計時計數歸0 break; default: break; } if ((iJIAWEISITime % 200) == 0) // LED閃爍代表目前在開關可識別區 { digitalWrite(SLED, HIGH); } if ((iJIAWEISITime % 200) == 100) { digitalWrite(SLED, LOW); } iJIAWEISITime++; // 計時計數加1 delay(1); // 計時計數單位1msec, 計數3000次, 大約等於3秒 } //--- 開關可識別區 -------------------------------------------------------------------------- // 開關可識別區,算是這次使用的小技巧 // 因為這款語音識別模組,有誤判的機率 // 所以為了防止誤判造成開關異常動作 // 一樣採用了28開關的複雜指命法,來控制開關 // 蝦米!不知道28開關!!!請參考我的另一篇Arduino聲控開關.
// // 首先,先幫聲控開關起個名子. // 這範例,我用的是"賈維斯"這個名子 // 當我說"賈維斯"時,若語音辨識系統有聽到 // 則系統會回應嗶嗶聲兼閃爍LED // 然後進入"開關可識別區" // 在開關可識別區內若無偵測到開關燈指令 // 則離開開關可識別區 // 若在開關可識別區內,說"開燈"則開關打開,並重新計時 // 若在開關可識別區內,說"關燈"則開關關閉,並重新計時 // // 開關可識別區為何指令是開關燈,因為我是將開關用在燈上 // 你可以依據你的需求更改 // break; default: //Serial.println("Not define!"); // 用來偵錯的 break; } } |
Designed by 30sec studio in Taiwan
Arduino聲控開關-語音辨識由Peng Yi Hsing製作,以創用CC 姓名標示-非商業性-相同方式分享 3.0 台灣 授權條款釋出。
此作品衍生自30sec studio。
文章標籤
全站熱搜

你好,想請教您開發環境是?windows還是linux arduino內部要做任何設定嗎 我適用windows10 arduino1.6.5 裝置都跟您一樣 程式碼也一樣 卻一直出現timeout的錯誤訊息 初學者一個 拜託你了!!
你好.我使用的環境是,Windows10,Arduino1.6.8. 基本上會出現timeout.是屬於硬體的問體,你可以檢查一下,USB裝置,是否有順利的出現在裝置管理員.若無則要查一下驅動程式是否有安裝,若有則檢查一下Arduino 軟體裡的工具\序列埠.要選對.
版主您好,我使用的是pro mini,但程式一直無法順利執行,LD3320是不是沒辦法直接套用?看網路上使用這塊聲控板的幾乎都使用mega或uno......
pro mini 有分5V跟3.3V, 你要先確認你的pro mini是否為5V的.
我的是5v的,所以有另外加降壓模塊供給LD3320 3.3v電壓
另外我使用的是微雪課堂的Lib, 以裡面的PinMap來看, 有支援到mega328的IC, 不過引腳也要對應到才行.
嗨~親愛的部落客與同好夥伴們,看到大家在部落格中互動留言,真是太開心啦~ 痞客邦有個追新留言小祕技tip要偷偷告訴你喲! 只要運用簡單的小撇步,在喜愛的部落格文章中,按下【+關注】按鈕,就能在自己的興趣牆上快速追蹤各種最新動態,即時和部落客與同好夥伴們留言互動,還能探索發掘更多你可能喜歡的興趣社群新鮮事喔! >>去看看怎麼運用【+關注】https://goo.gl/xfxB4o 也歡迎大家多多關注痞客邦官方帳號,獲得更多新消息! >>去關注【痞客邦】https://goo.gl/2sEzuL >>去關注【PIXstyleMe】https://goo.gl/PBGd69
能給ld3320的函式庫
我使用的是微雪課堂的函式庫, http://www.waveshare.net/study/article-11-1.html 可以在這網址找到.
版主您好 請問使用UNO也能用您所使用的函式庫嗎? 使用UNO的話程式碼除了腳位以外,還有哪裡需要修改? 另外,請問你使用的繼電器的型號是什麼?用KY0019 5V的繼電器行嗎?
您好,因為我沒用過UNO,所以無法回答. 不過我在微雪網站有看到UNO的範例,你可以參考看看. http://www.waveshare.net/wiki/LD3320_Board 另外我的繼電器型號是SRD-05VDC-SL-C 基本上,只要是5V的繼電器,應該都可以工作.
Libraries不能用 寫說"含有不合法的子目錄" 請問該如何解決 我在微雪的教學網站問過並未得到答覆
請至微雪下載VoiceLED.zip的檔案 解壓縮後將裡面的ld3320.cpp, ld3320.h, PinMap.h跟你寫的*.ino放在同一資料夾中. 你寫的*.ino有 #include "ld3320.h" 即可. 你也可以參考壓縮檔中的VoiceLED.ino範例.
您好,想請問我看費雪課程的程式範例寫入,但為何都會延遲16~21秒左右才會動作呢?例如我講:開燈 大概會經過16~21秒 LED才會亮燈 想請問這是為什麼呢?
語音分析是透過LD3320語音識別模組來做分析 基本上不太可能造成延遲. 有可能是現場環境音複雜, 或音源離LD3320語音識別模組太遠. 造成分析上的困難, 以至於解析時間拉長, 又或者是自身程式哪部分沒注意到造成的時間延長. 你可以試著盡量將程式縮小, 建議你可僅留簡單的語音部份去測試,去分析.
還是一樣會延遲耶,產品內容有提到:可動態編輯的識別關鍵字列表:只需要把識別的關鍵字以字串的形式傳送進晶片,即可以在下次識別中立即生效。比如,用戶在51等MCU的編程中,簡單地通過設置晶片的寄存器,把諸如"你好"這樣的識別關鍵字的內容動態地傳入晶片中,晶片就可以識別這樣設定的關鍵字語了。 是我缺少這個步驟嗎? 這個步驟該如何做呢 ?
動態更換識別字應該跟速度沒有關係
我是利用語音控制伺服馬達轉動,程式如下: #include <ld3320.h> VoiceRecognition Voice; //聲明一個語音辨識物件 #include <Servo.h> Servo myservo1; Servo myservo2; void setup() { Serial.begin(9600); myservo1.attach(3); myservo2.attach(5); Serial.print("Uart Start"); Voice.init(); //初始化 Voice.addCommand("bing gan",00); Voice.addCommand("ni hao",01); Voice.addCommand("kai deng",02); Voice.addCommand("guan deng",03); Voice.start(); //開始識別 myservo1.write(180); delay(15); myservo2.write(180); delay(15); } void loop(){ switch(Voice.read()) { case 00: Serial.println("bing gan"); myservo1.write(180); delay(3000); myservo1.write(0); delay(15); break; case 01: Serial.println("ni hao"); myservo1.write(180); delay(3000); myservo1.write(0); delay(15); break; case 02: Serial.println("kai deng"); myservo1.write(180); delay(3000); myservo1.write(0); delay(15); break; case 03: Serial.println("guan deng"); myservo1.write(180); delay(3000); myservo1.write(0); delay(15); break; default: break; } } 語音內容是隨便測試的,能請版主幫我看看有哪裡出現問題嗎? 動作都可以 只是會延遲20秒左右伺服馬達才會動作。
因為我已經沒有這些硬體, 所以無法trace你的問題. 不過你可以注意一下Voice.read()的回傳值.
我想問假如要連續播放到下一首該怎麼辦,因為目前都只播完一首之後久停下來了