想學會寫程式嗎? 請參考 "如何成為程式設計師?"

Arduino 聲控開關-語音辨識

這是聲控開關的第二部,上次用到的技術是利用Mic回饋的電壓,判斷拍手的動作.
進而去控制開關的動作.

這次的比較簡單,是利用語音IC模組,直接辨識語音.做出判斷,進而去控制開關的動作.

準備材料
1. Arduino Mega2560x1
2. LD3320語音識別模組
3. 繼電器模組
4. BEEP
5. LED
 

聲控開關-線路圖

線路圖.jpg

 

 

由於太簡單了就直接分析語法吧...哈

#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

創用 CC 授權條款
Arduino聲控開關-語音辨識Peng Yi Hsing製作,以創用CC 姓名標示-非商業性-相同方式分享 3.0 台灣 授權條款釋出。
此作品衍生自30sec studio

arrow
arrow

    30sec 發表在 痞客邦 留言(11) 人氣()