블로그 이미지
조이키트
아두이노, 라즈베리파이, 반도체 센서/모듈 활용

calendar

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

Notice

2020. 8. 7. 00:23 아두이노 활용
728x90
반응형

도트 매트릭스를 음성인식 모듈로 제어하는 예제

준비품 : 아두이노UNO, 음성인식 모듈(SZH-SM001), USB to TTL컨버터 모듈, 도트 매트릭스, 마이크

아두이노UNO
음성인식 모듈(SZH-SM001)

 

USB to TTL
도트매트릭스
마이크

음성인식 모듈은 최대 15개의 음성 명령을 저장할 수 있다.

음성 명령은 3개의 그룹으로 나뉘며, 각 5개의 음성 명령이 저장된다.

먼저 그룹별로 음성 명령어를 모듈에 저장한 후 사용할 그룹을 선택해야 한다.

1) 음성인식 모듈을 PC와 연결하기 위해 USB to TTL 컨버터와 음성인식 모듈을 연결해준다.

음성인식 모듈 USB to TTL 컨버터
VCC 5V
GND GND
RXD TXD
TXD RXD

음성인식 모듈과 USB to TTL 컨버터를 연결한 후 PC의 장치관리자에서 포트 번호를 확인할 수 있다.

여기서 Silicon Labs CP210x USB to UART Bridge(COM4)가 음성인식 모듈을 인식한 결과이다.

다음 AccessPort라는 시리얼 통신 프로그램을 사용하여 음성인식 명령어를 녹음하다.

아래 압축 프로그램을 컴퓨터에 설치하여 실행하면 된다.

AccessPort137.zip
0.46MB

해당 프로그램을 실행시킨 후 왼쪽 상단을 보면 노란색과 초록색의 톱니바퀴 모양의 Configuration아이콘을 눌러준다. 

Options 창에서 USB to TTL 컨버터와 연결된 Port 번호를 입력하고, Baud Rate는 9600으로 맞춰준다. (장치 관리자에서 확인한 포트 번호를 입력해준다. COM4)

Send display는 Hex format으로 Receive display는 Char Format으로 설정해준 후, OK 버튼을 눌러준다. 이 후 Hex 명령어로 ‘AA36’을 Send 버튼을 통해 보내주었을 때, Common Mode라는 답변이 온다면, 제대로 연결된 것이다

Hex 명령어로 ‘AA11’을 보내주시면, 음성 명령어 녹음이 시작된다.

음성인식 모듈의 마이크에 대고 명령어를 녹음해주시면 된다.

각 명령의 길이는 최대 1300ms(1.3초)이므로, 단어로 명령을 넣는 게 좋다.

녹음을 시작하면, 한 그룹의 5가지 음성 명령 녹음을 끝내기 전까지 녹음 과정을 멈출 수 없는 점 유의해 주시기 바란다.

START라는 답변이 오면 명령어를 녹음해주시면 된다.

No Voice, Different등을 통해 이전 녹음과 다른지, 녹음이 되고 있는지 확인 가능하다.

Finish one이 나오면 1개의 명령어가 녹음 되었다는 뜻이다.

순차 적으로 5개 모두 녹음 완료되면, Group 1 finish라고 답변이 온다.

이후 Hex 명령어로 ‘AA21’을 보내주시면, Group1 Imported라는 답변이 온다.

첫 번째 그룹의 5개의 명령어 입력이 끝났다.

첫 번째 그룹의 명령어만 입력 완료해도 5개의 명령어로 제어할 수 있다.

 

명령어 리스트

Common Mode는 음성 명령 값을 ‘Result:11’과 같은 ASCII 코드값으로 전달해 주지만,

Compact Mode는 음성 명령 값을 ‘11’과 같은 Hex 값으로 전달해준다.

따라서 처음 PC와 음성인식 모듈을 연결하여 음성 명령을 녹음할 때는, Common Mode로 녹음 하는게 좋고 아두이노 등의 플랫폼에서 사용할 때는, Compact Mode로 사용해야 한다.

음성 명령어는 녹음할 때 사용자의 목소리 위주로 인식하기 때문에, 다른 사람이 명령어를 넣으면 제대로 작동하지 않을 수 있다.

 

다음 아두이노와 음성인식 모듈, 도트매트릭스를 아래와 같이 연결한다.

 

아두이노 음성인식 모듈 도트매트릭스 모듈
5V VCC VCC
GND GND GND
D2 TxD  
D3 RxD  
D5    
D10   CS
D11   CLK
D12   DIN

 

다음 아두이노IDE를 실행하여 다음과 같이 코딩한다.

#include "LedControl.h" // 라이브러리 사용 선언
#include <SoftwareSerial.h> // 소프트웨어 Serial 통신 라이브러리 사용
// Serial 통신핀으로 D11번핀을 Rx로, D10번핀을 Tx로 선언
SoftwareSerial mySerial(2, 3); // 모듈 TX=11번핀 , RX=10번핀 연결
// Din 핀을 12번, ClK핀을 11번 CS핀을 10번에 연결
// 매트릭스는 1개를 사용 선언
LedControl lc=LedControl(12,11,10,1);
int voice_recogn=0;
byte data[5][8]=
{
// 숫자 1 출력
{
B11111111,
B10000001,
B10100101,
B10000001,
B10000001,
B10111101,
B10000001,
B11111111
},
// 숫자 2 출력
{
B11111111,
B10000001,
B10100101,
B10000001,
B10100101,
B10111101,
B10000001,
B11111111
},

// 숫자 3 출력
{
B00011000,
B00011000,
B00011000,
B11111111,
B11111111,
B00011000,
B00011000,
B00011000
},
// 숫자 4 출력
{
B00000000,
B01100110,
B11111111,
B11111111,
B11111111,
B01111110,
B00111100,
B00011000
},
// 숫자 5 출력
{
B00111100,
B01000010,
B10100101,
B10000001,
B10100101,
B10011001,
B01000010,
B00111100
}
};
void setup()
{
Serial.begin(9600); // 통신 속도 9600bps로 PC와 시리얼 통신 시작
mySerial.begin(9600); // 통신 속도 9600bps로 모듈과 시리얼 통신 시작
lc.shutdown(0,false); // 0~3번까지 매트릭스 절전모드 해제
lc.setIntensity(0,8); // 매트릭스의 밝기 선언 0~15의 수
lc.clearDisplay(0); // 매트릭스 led를 초기화
Serial.println("wait settings are in progress");
delay(1000);
mySerial.write(0xAA); // compact mode 사용
mySerial.write(0x37);
delay(1000);
mySerial.write(0xAA); // 그룹1 음성 명령어 imported
mySerial.write(0x21);
Serial.println("The settings are complete");
}
void loop()
{
while(mySerial.available())
{
Serial.println("voice input");
voice_recogn=mySerial.read();
switch(voice_recogn)
{
case 0x11:
for(int j=0; j<8; j++)
{
lc.setRow(0,j,data[0][j]); // 숫자 1 출력
}
Serial.println("숫자 1 출력");
break;
case 0x12:
for(int j=0; j<8; j++)
{
lc.setRow(0,j,data[1][j]); // 숫자 2 출력
}
Serial.println("숫자 2 출력");
break;
case 0x13:
for(int j=0; j<8; j++)
{
lc.setRow(0,j,data[2][j]); // 숫자 3 출력
}
Serial.println("숫자 3 출력");
break;
case 0x14:
for(int j=0; j<8; j++)
{
lc.setRow(0,j,data[3][j]); // 숫자 4 출력
}
Serial.println("숫자 4 출력");
break;
case 0x15:
for(int j=0; j<8; j++)
{
lc.setRow(0,j,data[4][j]); // 숫자 5 출력
}
Serial.println("숫자 5 출력");
break;
}
}
}
 

 

다음 아래와 같이 음성명령에 따라 토트매트릭스에 숫자가 출력되는 것을 볼 수 있다.

 

728x90
반응형

'아두이노 활용' 카테고리의 다른 글

128x64 LCD를 활용한 디지털 시계 및 온도계  (0) 2023.07.11
posted by 조이키트