프로젝트

나도 메이커! 메이커스 여러분들의 작품/프로젝트를 공유하는 공간입니다.

음성인식으로 서랍장 열기

2014-11-28 08:52:16

개요

개요

이번 프로젝트에서는 KocoaFab님이 도움을 주셨습니다!
여러 부품으로 무언가를 만들다보면 책상은 여러가지 부품들로 난장판이 되는 일은 필연적이다.
우리들조차 센서나 LED, 쉴드, 저항 등 여러가지 부품을 가지고 있기 때문에 작업하다 보면 책상은 항상 난장판이다.
그런 부품들을 정리하기 위해 부품 서랍장을 구매하게 되는데 알다싶이 부품 서랍장은 서랍의 개수가 상당히 많다.

<보기만 해도 어지러운 부품함>



태그를 붙여놨다 하더라도 한눈에 들어오지 않는 경우가 많고 바쁠때는 하나하나 보는일조차 성가신일로 여겨진다.
(우리들은 실제로도 부품을 찾기위해 여러 서랍장을 열어보는 경우가 다반사이다......)

그래서 여기서 아이디어를 착안하여 즉흥적으로 음성으로 원하는 서랍장을 열어보면 어떨까 해서 한번 만들어보게 되었다.
말은 거창해 보이지만 실질적으로 2-3시간안에 제작을 끝냈으며 Kocoafab의 튜토리얼을 참조하면(부품이 있다는 전제하에) 문제없이 제작이 가능한 프로젝트이다.
장점이 될 수도 있고 단점이 될 수도 있지만 만들 때 쓰는 부가적인 부품들은 생활에서 쉽게 구할 수 있는 제품으로 만든다.
외형으로 드러나는 멋은 없더라도 프로토타입형으로 봐주셨으면 한다.




만들면서 아쉬운점은 뒤쪽에 벨트가 짧아 모든 서랍을 커버하지 못한다는 점이 아쉽다. 충분히 큰 레일만 구할 수 있다면 멋진 프로젝트가 될 수 있다고 생각한다.

동영상


필요한 사전 지식

모터연동 가변저항 - http://kocoafab.cc/view/tutorials/241
Voico Recognition - http://kocoafab.cc/view/tutorials/297

부품 목록

NO 부품명 수량 상세설명
1 아두이노 1 오렌지보드
2 voice recognition v2 1 음성인식
2 모터연동 가변저항  2 모터연동 가변저항
3 모터 쉴드 1 모터 쉴드
4 12-24v 외부 전원  1 외부 전원
5 서보모터 1 서보모터
6 점퍼케이블 10~15 '암-수' 핀 점퍼케이블 필요
부품명 오렌지 보드 voice recognition v2 모터 쉴드 모터 연동 가변저항 12-24v 외부 전원 
파트  
부품명 서보모터 점퍼케이블
파트

하드웨어 making

브레드 보드



전자 회로도



확대 사진

각각의 가변저항 DC모터는 글루건을 통해 가로축에 세로축을 고정하였다.
가로축은 서랍과 테이프로 고정하였다.
(여기서는 테이프로 임시로 고정하였지만 고정할때는 떨어지지 않고 서랍장에 잘 붙어있게 고정시켜야 서랍장을 힘있게 밀어낼 수 있다.)




움직이는 부분과 서보모터는 글루건을 통해 붙였고, 서보모터의 날개에는 아이스크림 막대(스틱)를 고정시켜 서랍장을 잘 밀도록 하였다.



소프트웨어 coding

/*www.kocoafab.cc*/

#include <Servo.h>

//모터 핀번호 선언. 방향을 제어할때 사용 int motor1 = 12; int motor2 = 13;
//속도를 제어하는 핀번호 선언. int speed1= 3; int speed2 = 11; Servo myservo; byte com = 0; //음성인식에 필요한 변수 void setup(){ Serial.begin(9600); //시리얼 통신 설정
//모든 핀모드를 OUTPUT으로 설정 pinMode(motor1, OUTPUT); pinMode(motor2, OUTPUT); pinMode(speed1, OUTPUT); pinMode(speed2, OUTPUT);
//compact모드 전환 Serial.write(0xAA); Serial.write(0x37); delay(1000);
//특정 그룹 사용준비 Serial.write(0xAA); Serial.write(0x22); delay(1000);
//서보모터의 핀번호 설정. 초기각도를 0도로 설정 myservo.attach(4); myservo.write(0); } void loop(){ com = Serial.read(); //음성 인식을 통해 Switch문으로 여러 분기로 나눈다
//음성 인식의 종류에 따라 setMotor의 인자값이 바뀌게된다. switch (com) { case 0x21: //6인식 Serial.println("6"); setMotors(0,255, 0,61 ); break; case 0x22: //7인식 Serial.println("7"); setMotors(255,255,200, 61); break; case 0x23: //8인식 Serial.println("8"); setMotors(0,255, 0, 35); break; case 0x24: //9인식 Serial.println("9"); setMotors(255,255, 200, 35); break; case 0x25: //10인식 Serial.println("10"); setMotors(0,0, 0, 0); break; } }
//모터의 움직이는 방향, 속도를 제어하는 함수
//velo값은 속도를 나타내고, delay값을 통해 모터의 움직임을 제한한다.
//delay가 클수록 모터는 많이 움직이게 되고, 짧을 수록 적은 거리를 이동하게 된다. void setMotors(int velo1,int velo2, int delay1, int delay2) { //motor1 제어 digitalWrite(motor1, LOW); analogWrite(speed1, velo1); delay(delay1); analogWrite(speed1, 0); delay(100); //motor2 제어 digitalWrite(motor2, LOW); analogWrite(speed2, velo2); delay(delay2); analogWrite(speed2, 0); delay(500); turn(); returnSet(); } void returnSet() //다시 제자리로 돌아가는 함수 { digitalWrite(motor1, HIGH); analogWrite(speed1, 255); digitalWrite(motor2, HIGH); analogWrite(speed2, 255); delay(1000); analogWrite(speed1, 0); analogWrite(speed2, 0); } void turn() //서보모터를 움직여 서랍을 밀어내는 함수 { myservo.write(100); //서보모터의 각도를 100도로 지정 delay(1000); myservo.write(0); //1초뒤 다시 0도로 지정 }

소스의 내용을 보면 튜토리얼 부분의 Voice Recognition과 많이 유사하다. 
음성인식을 통해 여러 갈래로 나뉘게 되고 각각 분기에서는 지정한 만큼 DC모터가 레일을 통해 움직이게 된다.

만약 만드실 의향이 있다면 이 소스를 그냥 쓰면 안되고 setMotors()안의 매개변수들을 조절해서 사용할 서랍장에 맞춰주어야 한다.
setMotors()를 보면 setMotors(velo1, velo2, delay1, delay2)가 존재하는데
velo1과 velo2는 각각 모터의 속도를 나타낸다. 여기서는 최대 속도(255)로 모두 지정하였다.
delay1과 delay2는 모터에게 움직임 명령을 주고 난뒤 얼마동안 움직이게 할것인지에 대한 delay값을 지정한다.
delay값이 길어지게 되면 모터를 움직이는 명령을 전달하고 난 뒤에 다음 명령을 실행하는 시간이 길어지므로 그 만큼 모터는 많은 거리를 움직이게 된다.
delay값이 짧을수록 적은 거리를 움직이게 되고, delay값이 길어질수록 많은 거리를 움직이게 된다.

turn()함수는 DC모터를 움직이고 난 뒤에 서보모터를 움직여서 서랍장을 열게하는 역할을 하게 되고
returnSet()함수는 모든 작업을 수행하고 난 뒤 다음 작업을 위해 다시 처음위치로 돌아가게 하는 역할을 하게 된다.

수박쨈

아두이노, voice recognition v2, DC모터,