무턱대고 만들어보는 음성인식 도전기!

by 강종구 | 2017-07-25 15:09
나노 아두이노 음성 음성인식 캐릭보드

사실 이 프로젝트는 포기하려고 했지만... 다시한번 힘을 내서 도전해 봅니다.

아두이노 나노를 이용해서 블루투스와 스마트폰을 가지고 무작정 음성인식 기능을 사용하려 했는데

계속 실패하고 실패해서 이 프로젝트를 날려버리려고 했거든요. 그런데 실패작도 한번 올려봅니다!!!


1. 준비물

아두이노 나노, 네오 픽셀 모듈, 블루투스 모듈(HC-06), 스마트폰


2. 모듈 연결

우선 네오픽셀 모듈과 블루투스 모듈을 아두이노 캐릭보드에 연결해줍니다.


1) 네오픽셀 모듈 연결

2) 블루투스 모듈 연결

그림에는 BLE 모듈인데, HC-06 모듈도 뒤에 보시면 TX, RX, GND, 5V 라고 쓰여 있는데 각각에 맞게 꽂아주시면 됩니다.

- 실제 블루투스 모듈 연결 방법(점퍼선 색에 맞게 연결)


3) 연결이 완료된 캐릭보드의 모습




3. 음성인식 어플리케이션 설치

이제 음성인식 어플리케이션을 설치해주어야 합니다.

아래의 어플은 앱스토어나 Google Play에서 검색해주세요.


이를 다운 받아서 설치해줍니다. 그리고 HC-06을 검색해서 연결해줍니다.

(우측 상단을 클릭해서 connect Blooth를 클릭하면 아래와 같이 검색 결과가 나타납니다)


연결 성공!!


4. 소스 코드

자 그럼 이제 음성인식을 하기 위해서 소스코드를 아두이노에 업로드 해야 합니다!


Instructables나 Hackster.io에 돌아다니는 코드를 보면 Blooth pin을 12, 13번을 지정해서 사용하는 경우가 많은데, 아두이노 나노 캐릭보드는 7, 8번 핀을 사용합니다(이걸 몰라서,,, 하루를 날려버린)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <SoftwareSerial.h>
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
 
#endif 
 
#define PIN 6 
SoftwareSerial bt(78); // 디지털 7에 Rx, 디지털 8에 Tx를 지정한다
Adafruit_NeoPixel strip = Adafruit_NeoPixel(5, PIN, NEO_GRB + NEO_KHZ800); 
int red = 0;
int green = 0;
int blue = 0
int led =13;
 
void setup()
{
  strip.begin();
  Serial.begin(9600); // 컴퓨터와 시리얼 통신을 위해 초기화 및 속도 지정
  bt.begin(9600); // 블루투스와 시리얼 통신을 위해 초기화 및 속도 지정
}
 
void loop()
{
  int i;
  int j;
  String voice = ""// 블루투스 문자열 선언 및 초기화
 
  while(bt.available()) // 블루투스에 입력된 문자열이 있다면
  {
    delay(10);
    char c = bt.read(); // 값을 입력 받아서
    if(c=='#'// 아무것도 없다면 break
    {
      break;
    }
    voice += c;  // 입력받은 값을 추가
  }
  if(voice.length() > 0// 문자열 값이 추가되었다면
  {
    Serial.println(voice);
    if(voice=="*불 켜#")
    {
      red = 255;
      green = 255;
      blue = 255;
      for(i=0; i<5; i++)
      {
        strip.setPixelColor(i, strip.Color(red, green, blue));
        strip.show();
       }
 
 
    }
    else if(voice=="*불 꺼#")
    {
      red = 0;
      green = 0;
      blue = 0;
      for(i=0; i<5; i++)
      {
        strip.setPixelColor(i, strip.Color(red, green, blue));
        strip.show();
       }
 
    }
    voice=""; // 사용을 마친 후 다시 초기화
  }
}
cs


5. 작동 테스트

작동 테스트를 해봅시다.

불켜 라고 이야기 합니다. 잘 인식되는 군요!


시리얼 모니터를 켜서 입력이 되는지 봅시다.

소스에 Serial.printIn을 넣어주었기에 모니터에서 어떻게 명령어가 넘어오는지를 볼 수 있습니다.


발음의 띄어쓰기까지 구분 될 정도로 정확하게 들어오네요.


6. 문제점

그런데 이상하게 문자열이 넘어오는 것까지는 잘 되는데,,, 네오픽셀에는 아무런 변화가 없네요?


코드는 맞게 짰다고 생각하는데 말이죠?? 뭐가 문제일까요?

댓글 0

HELP ME!

코드는 맞는 것 같고, 명령어도 잘 블루투스를 통해서 넘어오는데... 네오픽셀에 변화는 없네요?? 뭐가 잘못된거죠?

답하기