[61호]음성으로 제어하는 간접등 만들기
아두이노 DIY 무작정 따라하기 (중·고급편)
음성으로 제어하는 간접등 만들기
음성인식 모듈을 활용하여 내 목소리로 간접등을 끄고 켜고 스마트한 나만의 공간 만들기!
글 | 디바이스마트 정대진, 박진아
스마트 스피커로 집안을 제어하거나, 집안의 전기 사용량, 온·오프 등을 앱으로 관리할 수 있게 만들어주는 사물인터넷, 스마트 홈에 대한 관심이 날로 높아지며 일상생활에 많은 변화를 주고 있습니다.
그렇다면 스마트 홈이란 정확히 무엇일까요? 스마트 홈은 사물인터넷 등을 이용해서 가정 내의 시스템들을 자동/원격으로 조작 가능한 환경을 구축한 것을 의미합니다.
저희는 사무실이라는 공간적 제약이 있었기에 이번 프로젝트는 회의실 화이트보드위에 간접등을 설치하고 음성 인식 모듈을 통해 음성으로 불 켜짐과 꺼짐을 제어해 보았습니다. 집에서 따라하실 분은 신발장 하부나, 책상아래, 주요 장식장 등 원하는 위치에 설치해보고 따라하는 시간을 가져보시기 바랍니다.
1. 음성 제어 간접등 만들기에 필요한 제품소개
필수 준비물 제품은 각 각 한개씩 사용하였으며, 프로젝트에 사용되는 모든 제품은 디바이스마트에서 구매가 가능하오니 디바이스마트 검색창에 상품번호를 입력해보시기 바랍니다.
2. 음성인식 모듈에 명령어 세팅하기
가장 먼저 이번 프로젝트에서 제일 중요한 음성인식 모듈에 간접등을 음성으로 끄고, 켤 수 있도록 음성 명령어를 세팅해주도록 하겠습니다.
2.1. 음성 인식 모듈 연결하기
이번에 사용한 음성 인식 모듈은 최대 15개의 음성 명령어를 저장할 수 있습니다.
음성 명령은 3개의 그룹으로 나뉘며, 각 5개의 음성 명령이 저장되기에 그룹 별로 음성 명령어를 모듈에 저장 한 후, 사용할 그룹을 선택해야 합니다.
음성인식 모듈을 PC와 연결하기 위해서 위와 같이 USB to TTL 컨버터와 모듈을 연결해야 합니다. 이때 Rx와 Tx가 교차되어 연결해야 합니다.
음성 인식 모듈과 USB to TTL 컨버터를 연결한 후 PC USB포트에 USB to TTL 컨버터를 꽂아주면 PC의 장치관리자에서 포트 번호를 확인 할 수 있습니다. 저희는 포트 번호가 COM22입니다.
2.2. 음성인식 모듈에 명령어 저장하기
음성 인식 모듈의 데이터 시트에서는 PC와의 연결 할 때, AccessPort라는 시리얼 통신 프로그램 사용을 권하고 있지만 다른 시리얼 통신 프로그램을 사용해도 가능합니다. 이 프로젝트에서는 음성 인식 모듈의 데이터 시트에 권장하는 AceesPort라는 프로그램을 사용하며 음성 인식 명령어를 녹음하는 방법에 대해 알려드리겠습니다.
프로그램은 http://www.sudt.com/en/ap/download.htm에서 다운로드 받으실 수 있습니다.
프로그램 다운로드 페이지를 보시면 오른쪽 하단에 있는 AccessPort137.zip을 확인할 수 있습니다. 클릭해서 다운받아준 후, 압축을 해제하면 AccessPort.exe파일이 있습니다. 해당 프로그램을 실행시켜줍니다.
AccessPort 프로그램을 실행 시킨 후, 왼쪽 상단에 있는 노란색과 초록색의 톱니바퀴 모양의 Configuration 아이콘을 눌러줍니다.
그럼 Options 창이 뜹니다. 여기서 USB to TTL 컨버터와 연결된 Port 번호를 입력하고, Baud Rate는 9600으로 맞춰줍니다. 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라는 답변이 옵니다.
저희의 경우에는 불켜, 꺼줘, 하나, 둘, 셋 5가지를 녹음한 후 아두이노를 통해 ‘불켜’, ‘꺼줘’ 명령어만 사용하여 간접등을 제어하였습니다. 실제로 하나, 둘, 셋 같은 단어가 인식률이 더 좋았으며 파동을 인식하는 모듈이기에 불켜와 같은 문장을 명령어로 설정할 경우 똑같은 음정으로 명령어를 발음하여야 인식이 더 잘되는점 참고해서 원하는 명령어를 입력해보시기 바랍니다.
이 후 Hex 명령어로 ‘AA21’을 보내주면, Group1 Imported라는 답변이 옵니다. 첫번째 그룹의 5개의 명령어 입력이 끝났습니다.
이 프로그램에서 사용 가능한 명령어 리스트는 아래와 같으며, 이외의 추가적인 명령어는 QR코드에 관련자료 Voice_Recognize_manual.pdf를 참고하시기 바랍니다.
Delete Group 1 – 0xAA01
Delete Group 2 – 0xAA02
Delete Group 3 – 0xAA03
Delete All Groups – 0xAA04
Record Group 1 – 0xAA11
Record Group 2 – 0xAA12
Record Group 3 – 0xAA13
Import Group 1 – 0xAA21
Import Group 2 – 0xAA22
Import Group 3 – 0xAA23
Switch Common Mode – 0xAA36
Switch Compact Mode – 0xAA37
Common Mode는 음성 명령값을 ‘Result:11’과 같은 ASCII 코드 값으로 전달해 주지만, Compact Mode는 음성 명령값을 ‘11’과 같은 Hex값으로 전달해줍니다.
따라서 처음 PC와 음성 인식 모듈을 연결하여, 음성 명령을 녹음 할 때는 Common Mode(AA36)를 사용하여 녹음하고 이후 아두이노등의 플랫폼에서 사용 할때는 Compact Mode(AA37)로 사용해야 합니다.
3. 하드웨어 구성 하기
회로도와 상세연결도식표를 보며 아두이노를 브레드보드, 음성인식 모듈, 릴레이모듈에 연결해줍니다.
저희는 회의실에 실제로 장착하는데 편리하고자 음성 인식 키트를 구매하면 같이 오는 케이스에 구멍을 뚫고 모든 하드웨어를 넣어 정리해주었으나 필수적인 작업은 아닙니다.
전선의 경우, LED 스트립 설치 시 전선길이가 부족했기에 안내해드렸던 추가전선과 LED 스트립선을 납땜, 수축튜브를 활용하여 연결해주었습니다.
작업이 완료된 LED 스트립은 항상 불이 켜져있는 상태가 아닌 아두이노에서 신호를 주었을 때만 불이 들어와야 하기 때문에 중간에 릴레이를 거쳐서 DC잭에 연결하여 줍니다.
DC잭에서 출력되는 전압은 아두이노의 VIN핀, GND로 연결하여 아두이노에 전원을 공급해주고, 또한 릴레이를 거쳐 LED스트립에 전원을 공급해 줍니다. LED스트립의 플러스 선(빨간선)은 다이렉트로 DC잭의 플러스 선으로 연결해주고, LED스트립의 마이너스 선(검정선)은 릴레이의 NO(Normal Open)단자에 연결해줍니다. 또 릴레이의 COM(Common)단자에는 DC잭의 마이너스 선으로 연결해주면 됩니다.
전원 어댑터와 연결된 DC 잭을 통해 아두이노와 LED 스트립에 전원을 공급하게 됩니다. 또 릴레이 모듈과 음성 인식 모듈에도 5V를 인가해줘야 하기 때문에 아두이노의 5V 출력 핀에서 브레드 보드를 통해 전원을 나눠서 공급할 수 있게 연결을 해줬습니다.
저희는 전선처리를 더욱 깔끔하게 하기위해 필수사항은 아니나 DC 잭에 연결하는 전선앞을 펜홀단자로 작업 후에 연결하였습니다.
완성된 모습은 위와 같습니다. 점퍼선들로 복잡해 보이지만 회로도를 보고 따라서 천천히 작업하다보면 쉽게 하실 수 있습니다.
4. 아두이노 설치 및 소스코드 업로드하기
하드웨어까지 완료되었다면 이제 음성으로 LED 스트립이 잘 제어될 수 있게 코딩작업을 진행해보도록 하겠습니다. 앞서 말씀드렸듯이 작업과정에 따라 하드웨어 구성보다 코딩작업이 먼저 진행되어도 무관함합니다.
4.1. 아두이노 통합개발환경(IDE)
아두이노 IDE(Integrated Development Environment)는 아두이노 프로그램을 작성하고 컴파일할 수 있는 통합 개발 환경입니다. 아두이노 공식 홈페이지에서 무료로 제공하고 있어서 편리하게 사용할 수 있습니다.
4.2. 아두이노 통합개발환경(IDE) 설치
아두이노 통합환경은 아두이노 공식 홈페이지(https://www.arduino.cc)에서 다운 받을 수 있습니다.
아두이노 공식 홈페이지에 접속하신 후 SOFTWARE-DOWNLOADS를 클릭해 주세요. Download the Arduino IDE 부분에서 각자 운영체제의 알맞은 버전의 파일을 선택해서 다운받으시면 됩니다. 제가 다운로드 받을 시점에서 최신 버전은 1.8.13입니다.
파일을 선택하시면 아두이노 소프트웨어에 대한 기부를 권하는 창이 뜹니다. 기부를 하지 않으시려면 JUST DOWNLOAD를 클릭하시면 다운로드 됩니다.
4.3. 아두이노 통합개발환경(IDE) 기본 세팅
IDE를 사용하는 방법에 대해 알려드리겠습니다.
IDE 환경에서 아두이노 보드(Board)와 포트(Port)를 맞춰줘야 합니다.
보드를 선택하는 방법은 메뉴바 – 툴 – 보드 – Arduino Uno 보드를 선택해 주면 됩니다.
포트 선택하는 방법은 메뉴바 – 툴 – 포트에서 아두이노에 해당하는 COM 포트를 선택해 주면 됩니다.
4.4. 소스코드 업로드하기
이번 프로젝트에 사용 할 소스코드 전체는 아래와 같습니다.
/*
www.devicemart.co.kr
Voice Recognition Module test
*/
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);
int relay= 7;
byte voice_recogn= 0;
void setup()
{
Serial.begin(9600);
mySerial.begin(9600);
Serial.println(“wait settings are in progress”);
pinMode(relay, OUTPUT);
delay(1000);
mySerial.write(0xAA);
mySerial.write(0×37);
delay(1000);
mySerial.write(0xAA);
mySerial.write(0×12);
Serial.println(“The settings are complete”);
}
void loop()
{
while(mySerial.available())
{
Serial.println(“voice input”);
voice_recogn=mySerial.read();
switch(voice_recogn)
{
case 0×11:
digitalWrite(relay,HIGH);
Serial.println(“relay turn on”);
break;
case 0×12:
digitalWrite(relay,LOW);
Serial.println(“relay turn off”);
break;
case 0×13:
//
break;
case 0×14:
//
break;
case 0×15:
//
break;
}
}
}
업로드 하는 방법은 아두이노 IDE 툴에서 보드와 포트가 정확히 선택되었는지 확인하신 후, 위쪽 오른편에 있는 화살표 모양을 클릭해 주시면 업로드가 진행됩니다.
업로드가 완료되면 아래편에 업로드 완료라고 표시가 됩니다.
소스 코드에 대해 설명드리겠습니다.
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);
int relay= 7;
byte voice_recogn= 0;
음성 인식 모듈과 아두이노를 Serial 통신으로 연결하여 사용하기 위해, 소프트웨어 시리얼 라이브러리를 포함시키고, 디지털 2번핀 3번핀을 각각 Rx핀 Tx핀으로 할당시켜주는 코드입니다. 릴레이를 제어하기 위해 디지털 7번핀에 relay 변수를 선언하고, 음성을 인식하기 위한 변수 voice_recogn를 초기값 0으로 선언해주었습니다.
void setup()
{
Serial.begin(9600);
mySerial.begin(9600);
Serial.println(“wait settings are in progress”);
pinMode(relay, OUTPUT);
delay(1000);
mySerial.write(0xAA);
mySerial.write(0×37);
delay(1000);
mySerial.write(0xAA);
mySerial.write(0×12);
Serial.println(“The settings are complete”);
}
보드에 전원이 들어왔을 때 혹은 리셋 되었을 때 한번만 동작하는 Setup()함수에 작성해야 할 내용입니다. Serial.begin()함수와 mySerial.begin()함수를 9600보오 레이트로 통신 속도로 설정해줍니다. relay 변수를 출력모드로 설정해주고, Serial통신으로 연결된 음성 인식 모듈에 명령어를 넣어 Compact Mode로 설정, Group2에 연결된 명령어를 가져와 줍니다.
void loop()
{
while(mySerial.available())
{
Serial.println(“voice input”);
voice_recogn=mySerial.read();
switch(voice_recogn)
{
case 0×11:
digitalWrite(relay,HIGH);
Serial.println(“relay turn on”);
break;
case 0×12:
digitalWrite(relay,LOW);
Serial.println(“relay turn off”);
break;
case 0×13:
//
break;
case 0×14:
//
break;
case 0×15:
//
break;
}
}
}
loop()함수에 들어가는 내용은 아두이노에 전원이 들어가 있는 한 계속 반복됩니다.
처음 While(mySerial.availble())을 통해 음성 인식 모듈로 음성이 인식되면 voice_recogn변수에 음성 인식 모듈을 통해 읽은 데이터를 저장하고, 저장한 명령어가 맞다면 switch 문을 통해 동작을 제어 할 수 있습니다. 이번 예제에서는 음성 인식 모듈로 릴레이를 on/off만 제어하기 때문에 1번 그룹의 case 0×11(명령어1), case 0×12(명령어2)만 사용하여 릴레이를 on/off하는 동작을 제어하였고, 사용하지 않을 명령어 case 0×13(명령어3), case 0×14(명령어4), case 0×15(명령어5)는 주석처리(//) 하였습니다.
5. 불키고, 끄고 확인하고 완성하기
하드웨어 구성과 코딩작업이 완료된 후에는 LED 스트립은 필요한 장소에 부착합니다.
LED스트립은 원하는 길이 만큼 컷팅이 가능하며 뒷면이 접착식으로 되어 원하는 장소에 부착이 간편합니다. 설치가 완료되고 나면 전원을 공급한 후 입력한 명령어에 따라 불이 켜지고 꺼짐을 확인해봅니다.
완성된 모습입니다. 회의실 한편이 은은한 조명으로 멋스러워졌습니다.
만일 명령어를 말했을때 불이 들어오지 않는다면?
1. LED 스트립과 릴레이가 제대로 동작하는지 확인해 보세요.
음성 인식에 대한 코드는 사용하지 않고, 1초마다 릴레이를 On/Off하는 아래 소스코드를 아두이노에 직접 업로드 해줍니다. 이를 통해 LED가 켜졌다 꺼졌다를 반복하는지를 보며 릴레이와 LED스트립이 제대로 동작하는지 확인할 수 있습니다.
이 코드를 사용해서 릴레이가 제대로 동작하지 않는다면 배선을 다시 한번 점검해보시거나 모듈의 불량을 의심하여 모듈을 교체해줍니다.
2. 음성인식 모듈이 제대로 작동하는지 확인해 보아야합니다.
아두이노와 연결했을 때 아두이노 시리얼 모니터를 통해 음성인식 모듈에 명령어가 제대로 인식되고 있는지 확인 가능합니다.
아두이노 IDE에서 오른쪽 위에 있는 시리얼 모니터 버튼을 클릭해주세요.
아두이노에서 음성 인식 모듈에 명령어를 불러오기가 끝나면 위 화면과 같이 ‘The settings are complete’라고 출력이 됩니다.
음성을 인식해 주면 아래와 같이 ‘voice input’이라는 글자가 출력이 되고, 첫번째와 두번째 명령어를 인식하면 ‘relay turn on/off’로 글자가 출력이 됩니다.
모듈이 제대로 작동하는데도 명령어를 인식하지 못한다면 더쉽고 명확한 단어로 명령어를 변경하시거나 녹음한 음정과 똑같은 음정으로 발음해보시기 바랍니다. 모듈이 제대로 작동하지 않는다면 모듈의 불량을 의심하여 모듈을 교체하기시 바랍니다.
자, 이제 모든 과정이 끝났습니다. 구독자 분들이 이번 프로젝트를 함께하며 음성인식 기능과 사물인터넷에 대해 조금이나마 쉽게 생각할 수 있는 기회가 되셨길 바라며 다음에도 더 쉽고 재미난 프로젝트로 찾아뵙도록 하겠습니다!