정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

음성인식 모듈과 RF 송수신 모듈연동에 대한 질문입니다.
이병권 | 2015-04-28

/**
  ******************************************************************************
  * @file    vr_sample_control_led.ino
  * @author  JiapengLi
  * @brief   This file provides a demostration on 
              how to control led by using VoiceRecognitionModule
  ******************************************************************************
  * @note:
        voice control led
  ******************************************************************************
  * @section  HISTORY
    
    2013/06/13    Initial version.
  */
  
#include <SoftwareSerial.h>
#include "VoiceRecognitionV3.h"
#include <VirtualWire.h>       //본 스케치는 VirtualWire 라이브러리를 사용합니다.
#include <Bounce2.h>             //바운싱 현상을 방지하기 위해 이 라이브러리를 사용합니다.
  
  boolean oneTimeFlag = false;        

 Bounce bouncer = Bounce();    
 

/**        
  Connection
  Arduino    VoiceRecognitionModule
   2   ------->     TX
   3   ------->     RX
*/
VR myVR(2,3);    // 2:RX 3:TX, you can choose your favourite pins.

uint8_t records[7]; // save record
uint8_t buf[64];

int led = 13;

#define onRecord    (0)
#define offRecord   (1) 

/**
  @brief   Print signature, if the character is invisible, 
           print hexible value instead.
  @param   buf     --> command length
           len     --> number of parameters
*/
void printSignature(uint8_t *buf, int len)
{
  int i;
  for(i=0; i<len; i++){
    if(buf[i]>0x19 && buf[i]<0x7F){
      Serial.write(buf[i]);
    }
    else{
      Serial.print("[");
      Serial.print(buf[i], HEX);
      Serial.print("]");
    }
  }
}

/**
  @brief   Print signature, if the character is invisible, 
           print hexible value instead.
  @param   buf  -->  VR module return value when voice is recognized.
             buf[0]  -->  Group mode(FF: None Group, 0x8n: User, 0x0n:System
             buf[1]  -->  number of record which is recognized. 
             buf[2]  -->  Recognizer index(position) value of the recognized record.
             buf[3]  -->  Signature length
             buf[4]~buf[n] --> Signature
*/
void printVR(uint8_t *buf)
{
  Serial.println("VR Index\tGroup\tRecordNum\tSignature");

  Serial.print(buf[2], DEC);
  Serial.print("\t\t");

  if(buf[0] == 0xFF){
    Serial.print("NONE");
  }
  else if(buf[0]&0x80){
    Serial.print("UG ");
    Serial.print(buf[0]&(~0x80), DEC);
  }
  else{
    Serial.print("SG ");
    Serial.print(buf[0], DEC);
  }
  Serial.print("\t");

  Serial.print(buf[1], DEC);
  Serial.print("\t\t");
  if(buf[3]>0){
    printSignature(buf+4, buf[3]);
  }
  else{
    Serial.print("NONE");
  }
  Serial.println("\r\n");
}

void setup()
{
  /** initialize */
  myVR.begin(9600);
  
  Serial.begin(115200);
  Serial.println("Elechouse Voice Recognition V3 Module\r\nControl LED sample");
  
  pinMode(led, OUTPUT);
    
  if(myVR.clear() == 0){
    Serial.println("Recognizer cleared.");
  }else{
    Serial.println("Not find VoiceRecognitionModule.");
    Serial.println("Please check connection and restart Arduino.");
    while(1);
  }
  
  if(myVR.load((uint8_t)onRecord) >= 0){
    Serial.println("onRecord loaded");
  }
  
  if(myVR.load((uint8_t)offRecord) >= 0){
    Serial.println("offRecord loaded");
  }  
   vw_setup(2000);             //라이브러리 사용하기 위한 세팅 및 초기화
    vw_set_tx_pin(4);           //송신 핀 설정

}

void loop()
{
  int ret;
  ret = myVR.recognize(buf, 50);
  if(ret>0){
    switch(buf[1]){
      case onRecord:
        /** turn on LED */
        digitalWrite(led, HIGH);
        delay(2000);
        digitalWrite(led, LOW);
        sendMessage("1", "1");                            //명령 1 전송(on)

        break;
      default:
        Serial.println("Record function undefined");
        break;
    }
    /** voice recognized */
    printVR(buf);
  }
}
  void sendMessage(char* pinCode, char *data) {
     if (strlen(data) > 0) {           //data(command)가 있다면

      int msgSize = (strlen(data) + strlen(pinCode) + 1);  //송신 메세지의 전체 길이를 구하고
      char packetData[msgSize];                            //구한 길이를 바탕으로 메세지 저장할 문자배열변수 선언
      strcat(packetData, pinCode);                         //문자열 합치는 함수를 이용해 전송할 메세지 만듬
      strcat(packetData, ".");
      strcat(packetData, data);
 
      vw_send((uint8_t *)packetData, msgSize);             //메세지 전송
      vw_wait_tx();                                        //메세지 전송 완료시 까지 기다림

    }  
  }

 

 

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

저희가 사용하고 있는 송신기 소스 입니다. 진하게 표시된곳이 기존의 음성인식모듈소스에서 포함된 rf송신소스입니다.

지금 기존에 사이트에 올라와있는 음성인식모듈 예제는 voice recognition v2 인데 저희가 사용하고있는 음성인식모듈은 voice recognition v3 라서 다른 매뉴얼에 있는 소스를 참조한거라 기존의 소스와는 완전 다른거 같습니다..

rf 송신,수신 소스는 사이트에 올라온 예제인 http://kocoafab.cc/tutorial/view/218 송신수신 소스를 그대로 이용하였습니다

 저희가 하고자하는것 이 음성인식 모듈을 통해 음성을 인식한후에 rf송신기에 신호를 줘서 무선으로 연결된 rf수신기와 아두이노에 연결된 led에 불이 들어오게 하는 실험을 하고있는데

일단은 하나의 음성이 인식 되면 led가 2초간만 켜졌다가 다시 꺼지는 소스로 만들었습니다/

음성인식모듈따로, rf무선통신 따로 했을때는 작동이 되는데 소스를 합쳐서 위에있는 소스로 실험을 하니 10번 넘게 시도하면 한번 될까 말까 합니다..

뭐가 문제인지..  알려주시면 감사하겠습니다. ㅠㅠ 항상 친절한 답변 감사합니다.

이전글   |    아두이노 화분 제작 질문 2015-04-28
다음글   |    굉장히 유용한 정보가 많네요^^ 2015-04-29