작성일 댓글 남기기

Hi Animal (Amazon Alexa)

아이들이 사자, 강아지, 공룡등 다양한 피규어를 갖고 놀면서
‘이건 뭐야?’ 물어보기도 하고 동물 소리를 알려주면 피규어를 갖고 나름 소리를 따라하면서 놀곤 합니다.

문득 아이들에게 실제 동물 소리를 들려주고 싶었습니다.

이왕이면 음성인식 플랫폼을 활용해서 음성으로 대화하듯 물어보고 들려주는 건 어떨까요?
그래서 만들어 보았습니다. Amazon Alexa 플랫폼을 활용해서 ‘Hi Animals’라는 skill을 제작하였습니다.

Amazon skill에 등록했지만, 가이드라인에 부합되지 않은 부분이 있어 승인 불가중입니다.
이유는 ‘아이들에게 해가 될 수 있다’라는 것인데, 보다 구체적인 답변을 요청한 상태입니다.

이번 기회를 통해 skill은 음성인식 앱 서비스로써 철저한 승인단계를 거친다는 사실을 알았습니다.
그리고 개인인증까지 적용하는 서비스로 만들어 질때는 더욱 철저하게 가이드라인을 검토하고 기준에 맞춰 제작이 되는 바 기획단계부터  미리 파악하고 진행하는게 좋겠습니다.

작성일 댓글 남기기

음성인식 플랫폼이 우리의 생활을 바꿀 수 있을까? -육아편 SK NUGU(누구) 사례-

음성인식 플랫폼이 우리의 생활을 바꿀 수 있을까? 라는 질문에 대한 개인적인 의견은
‘충분히 가능하고 생각보다 빠르게 적응할 것이다.’ 이다.

 

  • [목차]
  • SK Nugu 사용사례
  • Amazon의 Alexa다양한 확장 서비스 사례

 

SK Nugu 사용사례

현재 사용중인 디바이스는 sk nugu와 amazon echo dot2 이고, 26개월된 쌍둥이 남매를 키우면서 꽤 유용하게 활용하고 있다.

nugu의 경우 지난 10월에 구매해서 4개월째 사용중이고 덕분에 오디오는 4개월째 휴식중이다.

주로 사용하는 패턴은 다음과 같다.

  • 07:00 ~ 08:30 Nugu를 통해 라디오 청취(mbc 라디오를 들으며 날씨를 확인하고 아침식사 및 출근준비)
  • 17:30 ~ 19:00 Nugu를 통해 동요 혹은 동화 듣기(전래동화, 이솝우화, 동요 천곡 등)
  • 19:00 ~ 21:00 Nugu를 통해 다양한 음악 혹은 OST  듣기(아이들과 놀면서 그때그때 어울리는 음악요청)
  • 21:00 ~ 22:00 Nugu를 통해 자장가 듣기(클래식 잠언곡을 들으며 잠이 들때까지 청취)

이렇게 보면 총6시간으로 가정에서 취침시간 이외에 집에 있는 동안 계속 사용한다고 볼 수 있다.

특히 아이들과 노는 시간에는 주로 책을 읽어주거나 장난감을 함께 갖고 논다.
최근 아이들이 동물과 공룡에 관심을 가지면서 자주 듣는 음악이 …

.

.

.

죠스 ost, 악어때, 생일축하 노래 등이다.

상어모형을 갖고 놀면서 Prague Philharmonic Orchestra의 Jaws를 듣는데, 긴장감 있는 웅장한 사운드가  아이들의 상상의 나래를 펼치는데 그만이다.
어른들이야 옛날 봤던 죠스영화를 떠올리며 그 순간의 기억이 익숙하다 치지만, 3살 아이들이 뭘 알까 싶었다.
하지만, 뚜우~둥! 뚜우~ 둥! 할때마다 아이들의 긴장된 눈빛과 힘이 들어가는 손으로 상어가 어떤 느낌인지 충분히 인지하는 것 같았다.
그 다음 부터는 상어를 갖고 놀때면 상어 음악을 틀어달라고 한다.

마찬가지로 악어인형을 갖고 놀땐 ‘악어때’, 그림책에 생일장면이 있으면 ‘생일축하 노래’…

아이들과 함께 있을 때, 음성인식 플랫폼이 좋은 점은 스마트폰이나 컴퓨터 조작없이 음성으로 적시에 요청해서 들을 수 있다는 것이 가장 큰 이점이다.
그림을 그릴때도, 책을 볼 때도, 장난감을 갖고 놀 때도 상황에 맞는 음악을 요청해서 듣는 것은 재미를 향상 시키고, 분위기를 만드는데 도움이 된다.

이런상황에서는 어떤 음악이 어울릴까???

필자는 Lion King에 나오는 The Circle of Life를 들려주었다.

여기까지는 Nugu를 육아에 활용하는 실제 사례였고, Nugu보다 2년 먼저 상용서비스를 했던 Amazon Echo 서비스를 살펴보면서 음성인식 기반의 육아 관련 서비스에 대해서 알아보겠다.

 

Amazon Alexa의 다양한 확장 서비스 사례

2014년말 런칭된 Amazon Echo의 경우 음성인식 플랫폼을 활용한 다양한 하드웨어 및 서비스들이 속속 등장하고 있다.

이러한 생태계 기반에는 3rd party가 손쉽게 개발할 수 있는 환경이 잘 조성되어 있다는 점이다.

 

Alexa Skills Kit은 Echo를 활용할 수 있는 다양한 서비스들을 개발할 수 있는 키트이고
Alexa Voice Service는 하드웨어에 Alexa를 적용할 수 있는 서비스이다.

Alexa App을 실행한 후 skills(echo용 앱스토어)를 살펴보면 다양한 카테고리의 음성서비스들이 등록되어 사용자들은 원하는 서비스를 추가해서 사용할 수 있다.

Newest Arrivals를 살펴보니, 등록된 서비스 수가 8,764개가 된다. 하지만, 아직은 생태계 조성중이라 테스트용으로 허접한 서비스도 상당수 있다.

이 중 육아에 활용할만한 서비스를 봤을 때, ‘Short Bedtime Story’가 괜찮았다.

해당 서비스를 enable 시키고, “Alexa, tell Bed Time story to ‘아이 이름'” 이라고 하면, 해당 아이가 짧은 이야기에 주인공이 되어 이야기를 듣고 아이의 잠을 청할 수 있다.
이런 방식의 서비스는 육아에서 다양하게 활용가능하다.
현재 맞춤형 동화로 자녀이름이 주인공이 되어 책으로 출판하는 경우도 있고 꼭 이렇게 까지 하지 않더라도.
보통 책을 읽어 줄때 주인공 이름이 있어도 무시하고 자녀의 이름으로 바꿔서 읽어주기도 한다.

Alexa는 아직 국내 정신 런칭된 서비스가 아니어서 사용상 제약이 다소 있지만, 음성인식 플랫폼이 발전하는데 좋은 롤 모델이라 생각된다.

현재 사무실에서 사용중인 Echo Dot은 미쿡 친구로 친하게 지내면서 좀 더 알아가려고 노력중이다.

 

앞으로 발전해야 할 분야

기술적으로 가능성 여부를 떠나서 사용자로서 발전이 필요하다고 생각되는 분야이다.

  • 음성인식율 향상 : 생각보다 뛰어나지만 인간이 욕심이란… 음성인식 분야에서는 끝없는 도전분야라 생각됨
  • 주사용자의 목소리 감지 : 여러사람이 함께 있을 때 잡음으로 인해 음성서비스 요청이 어렵다. 이 때 주사용자의 목소리가 우선순위가 된다면 음성인식에 도움이 될 것 같다.
  • 맞춤형 TTS :  마치 문서편집기에 폰트 바꾸듯 원하는 톤으로 변경된다면 어떨까? 가령 엄마목소리, 아빠목소리, 또는 좋아하는 인물의 목소리
작성일 댓글 2개

반짝반짝 작은별(블루투스 조명예시)

손목을 돌리며 ‘반짝반짝 작은 별’ 노래를 불러주다 보면,

어느새 손동작을 따라하는 아이들이 기특하기만 합니다.

 

이왕이면 손동작과 함께 하늘에 작은별들이 반짝이고, 별자리 신화를 이야기 해주면 좋겠습니다.

이렇게요~~~

imgTwinkleStar imgTwinkleStarEXam

별자리에는 아이들이 좋아하는 코끼리, 사자도 넣구요.

큰곰자리, 작은곰자리와 함께 북두칠성 별자리 이야기를 들려줍니다.

큰곰자리는 부근의 작은곰자리와 함께 그리스 신화의 칼리스토의 전설과 관련되어 있다. 제우스의 애인인 칼리스토가 제우스의 아내 헤라의 질투로 곰의 모습이 되었는데, 제우스가 이를 별자리로 만들었다는 것이다.  –위키백과 참조– –참고동영상 링크

 

반짝반짝 작은별을 만들기 위해 필요한 준비물은

  • MCU : 아두이노 나노 or UNO
  • 통신 : 블루투스 모듈(HC-06)
  • 전원 : AA 배터리 4개, 스위치달린 배터리팩
  • 출력 : LED(원하는 색으로 여러개 준비)
  • 별자리보드 : 우드락, 별자리 그림이 있는 인쇄물
  • 기타 : 브레드보드, 케이블, 안드로이드 스마트폰, 글루건

 

시스템 구조

시스템구성은 별자리보드, 신호송신기로 구분됩니다.
본 시스템은 블루투스로 부터 특정값을 수신받아 LED를 제어하는 별자리보드와 특정 값을 블루투스로 전송할 수 있는 송신장치로 구성됩니다.
이때 송신장치는 스마트폰을 활용할 수도 있고, 별도의 디바이스르 제작할 수 있습니다.
단, 송신장치는 시스템의 목적과 부합될 수 있도록, 흔들거릴때마다 값을 보내면 됩니다.
별자리보드와 송신장치가 블루투스로 연결되면,
흔들리는 형태에 따라 1, 2, 3과 같은 특정 값을 별자리 보드로 보냅니다.
이 후에는 별자리보드에서 값을 읽고, 해당 값에 따라 LED를 제어합니다.
예를 들어, 1의 값을 받을 때는 Orange색 LED만 서서히 켰다, 껐다 할 수 있고,
2의 값을 받으면 Blue색 LED만 서서히 켰다, 껐다 할 수 있습니다.
그리고 3의 값을 받으면 모든 LED가 반짝일 수 있습니다.

별자리 모양, LED 제어 등은 사용자에 따라 얼마든지 변형해서 이용할 수 있습니다.

imgTwinkleStarSystem

 

회로도

회로도를 그릴 수 있는 Fritzing 도구로 제작한 ‘반짝반짝 작은별’ 제어장치 회로도 입니다.

구조는 매우 간단합니다.
다만, 사용하는 LED 수에 따라 선정리가 관건입니다.
imgTwinkleStarCircuit

 

제작순서

  • 1단계 : 제어장치 심플버전으로 제작 및 테스트
  • 2단계 : 별자리 보드 제작
    • 별자리 인쇄
    • 우드락에 붙이기
      imgTwinkleStarPicture
    • LED 배치
      imgTwinkleStarCircuit
  • 3단계 : 제어장치 연결 및 테스트
    imgTwinkleStarCircuitFinal
    imgTwinkleStarFinal

안드로이드 App

  • ‘반짝반짝 작은별’ App 다운로드 링크
  • 현재 버전은 하단에 4가지 토글버튼으로 각각 다른형태의 LED를 제어할 수 있습니다.

 

아두이노 소스코드

GitHub 주소 : https://github.com/forearth/arduino-learning-sample/tree/master/TwinkleStarNormalLED

#include <SoftwareSerial.h>
SoftwareSerial mySerial(2,3); //RX, TX


#define fadeStar1 9
#define fadeStar2 10
#define fadeStar3 11

void setup() {
 // put your setup code here, to run once:
 Serial.begin(9600);
 while (!Serial) {
 ; // wait for serial port to connect. Needed for native USB port only
 }

 mySerial.begin(9600);

}

void loop() {
 if (mySerial.available()) {
 byte data=mySerial.read();
 Serial.write(data);

 switch(data){
 case '1':
 star1();
 break;
 case '2':
 star2();
 break;
 case '3':
 star3();
 break;
 case '4':
 star4();
 break;
 default:
 return;
 }

 }
 if (Serial.available()) {
 mySerial.write(Serial.read());
 }

}

void star1(){
 for(int fadeValue=0; fadeValue<=255; fadeValue+=5){
 analogWrite(fadeStar1, fadeValue);
 delay(30);
 }
 for(int fadeValue=255; fadeValue>=0; fadeValue-=5){
 analogWrite(fadeStar1, fadeValue);
 delay(30);
 } 
}

void star2(){
 for(int fadeValue=0; fadeValue<=255; fadeValue+=5){
 analogWrite(fadeStar2, fadeValue);
 delay(30);
 }
 for(int fadeValue=255; fadeValue>=0; fadeValue-=5){
 analogWrite(fadeStar2, fadeValue);
 delay(30);
 } 
}

void star3(){
 for(int fadeValue=0; fadeValue<=255; fadeValue+=5){
 analogWrite(fadeStar3, fadeValue);
 delay(30);
 }
 for(int fadeValue=255; fadeValue>=0; fadeValue-=5){
 analogWrite(fadeStar3, fadeValue);
 delay(30);
 } 
}


void star4(){
 for(int fadeValue=0; fadeValue<=255; fadeValue+=5){
 analogWrite(fadeStar1, fadeValue);
 analogWrite(fadeStar2, fadeValue);
 analogWrite(fadeStar3, fadeValue);
 delay(30);
 }
 for(int fadeValue=255; fadeValue>=0; fadeValue-=5){
 analogWrite(fadeStar1, fadeValue);
 analogWrite(fadeStar2, fadeValue);
 analogWrite(fadeStar3, fadeValue);
 delay(30);
 } 
}

작성일 댓글 2개

달려라 뿡뿡이!!!

아이들 장난감을 지인에게 물려 받았습니다.
그중에는 RC카도 있었습니다. 외관은 괜찮지만, 문제는 조정기도 없고 배터리도 문제가 있었습니다. ㅜㅜ
아이들이 그냥 갖고 노는 것도 좋지만, 조정해서 달리는 걸 보여주고 싶었습니다.
그래서 ‘달려라 뿡뿡이!’ 프로젝트를 진행했습니다.

 

우리 뿡뿡이를 움직이기 위해 블루투스카로 개조했습니다.

imgMCBluetoothCar

이때 필요한 준비물은

  • MCU : 아두이노 나노 or UNO
  • 모터구동 : l298n(듀얼 모터드라이버)
  • 통신 : 블루투스 모듈(HC-06)
  • 전원 : 스위치 있는 12v 배터리팩, AA 배터리 8개
  • 기타 : 브레드보드, 케이블, 안드로이드 스마트폰

뿡뿡이에게 필요한 주요 부품과 App은 크게 3가지 입니다.

  1. 뿡뿡이와 스마트폰과 통신하기 위한 Bluetooth(블루투스) 모듈
  2. 2개의 모터 제어를 위한 모터드라이버(L298N) 모듈
  3. 자동차 조정을 위한 App(Arduino Bluetooth RC Car)

 

시스템 구조

시스템구성은 자동차, 조정기로 구분됩니다.
자동차는 무선통신을 수신받는 수신부와 제어장치로 구성됩니다.
자동차와 조정기가 블루투스로 연결되면,
조정기에서는 전진은 F, 후진은 B, 우회전 R 과 같은 문자열을 자동차의 수신기로 보냅니다.
그럼 제어장치에서는 신호는 받아 모터를 제어합니다.
만약 F와 같은 문자열을 받으면, 추진모터를 정방향으로 갈 수 있도록 전기를 보냅니다.
자동차의 구성과 제어장치에 따라 얼마든지 개조가 가능합니다.
LED를 부착해서 전진시 해드라이트를 켤수도 있고, 초음파 센서를 장착해서 장애물이 있으면 자동으로 멈출 수 있습니다.

조정기의 경우도 얼마든지 다른 형태로 응용 가능합니다. 자이로센서와 블루투스 모듈을 활용해서 장갑모양과 같은 특별한 형태의 조정기로도 제작이 가능합니다.

imgBluetoothCarSystem

회로도

회로도를 그릴 수 있는 Fritzing 도구로 제작한 뿡뿡이 제어장치 회로도 입니다.
일부 모듈이 없어서 유사한 모듈로 대체하여 사용하였습니다.

bluetoothCar 회로도

제작순서

  • 1단계 : 자동차 분해
  • 2단계 : 제어장치 제작
    • 부품결합
    • 아두이노 소스 업로드
    • 블루투스 테스트
  • 3단계 : 자동차와 제어장치 연결
  • 4단계 : 스마트폰App과 자동차 블루투스 연결 및 제어장치 작동여부 확인

 

아두이노 소스코드

GitHub 주소 : https://github.com/forearth/arduino-learning-sample/tree/master/BluetoothCar

#include SoftwareSerial BTSerial(2, 3); // 소프트웨어 시리얼 설정(* RX, TX 보드에 연결할때는 반대)

//모터A 컨트롤
int motorA1=7;
int motorA2=6;
int speedPinA=9;
 
//모터B 컨트롤
int motorB1=5;
int motorB2=4;
int speedPinB=10;
int vSpeed=255;     // Default speed, from 0 to 255


void setup() {
  Serial.begin(9600);
  BTSerial.begin(9600);
    pinMode(motorA1, OUTPUT);
    pinMode(motorA2, OUTPUT);
    pinMode(motorB1, OUTPUT);
    pinMode(motorB2, OUTPUT);
    
  motorStop();
}

void loop() { // run over and over
  if (BTSerial.available()) {  //블루투스로 데이터 수신
    
    byte data=BTSerial.read(); //수신 받은 데이터 저장
    Serial.write(data);  //수신된 데이터 출력

    analogWrite(speedPinA, vSpeed);
    analogWrite(speedPinB, vSpeed);

  switch(data){
    case 'F':
      motorGo();
      break;
    case 'B':
      motorBack();
      break;
    case 'G':
      motorRightGo();
      break;
    case 'I':
      motorLeftGo();
      break;
    case 'H':
      motorRightBack();
      break;
    case 'J':
      motorLeftBack();
      break;
    case 'S':
      motorStop();
      break;
    default:
      return;
    }
  }
}

  void motorGo() {
    digitalWrite(motorA1, HIGH); 
    digitalWrite(motorA2, LOW);
    digitalWrite(motorB1, LOW);
    digitalWrite(motorB2, LOW); 
}
void motorBack() {
    digitalWrite(motorA1, LOW); 
    digitalWrite(motorA2, HIGH);
    digitalWrite(motorB1, LOW);
    digitalWrite(motorB2, LOW); 
}
void motorRightGo() {
    digitalWrite(motorA1, HIGH); 
    digitalWrite(motorA2, LOW);
    digitalWrite(motorB1, HIGH);
    digitalWrite(motorB2, LOW); 
}
void motorLeftGo() {
    digitalWrite(motorA1, HIGH); 
    digitalWrite(motorA2, LOW);
    digitalWrite(motorB1, LOW);
    digitalWrite(motorB2, HIGH); 
}
void motorRightBack() {
    digitalWrite(motorA1, LOW); 
    digitalWrite(motorA2, HIGH);
    digitalWrite(motorB1, HIGH);
    digitalWrite(motorB2, LOW); 
}
void motorLeftBack() {
    digitalWrite(motorA1, LOW); 
    digitalWrite(motorA2, HIGH);
    digitalWrite(motorB1, LOW);
    digitalWrite(motorB2, HIGH); 
}
void motorStop() {
    digitalWrite(motorA1, LOW); 
    digitalWrite(motorA2, LOW);
    digitalWrite(motorB1, LOW);
    digitalWrite(motorB2, LOW); 
}

 

작성일 댓글 남기기

문살살!!!

아이를 키우는 어뭉님들의 공통된 고민,

화장실을 문을 열어놀까? 말까?

 

어디만 가면 어느세 쪼르르…

인기척이 없어 방심한 순간, 어머!!!

언제 거기 있었니? ㅜㅜ

imgCheckDoorIntro

 

그래서 만들었습니다.

‘문 살살 표지판’

 

문앞에 아이가 있는지 없는지를 확인해서 어뭉님에게 알려줍니다.

초음파 센서를 통해 문앞 70cm 내에 누군가가 있다면, 빨강색 LED 등이 켜지고, 그렇치 않으면 초록색 LED가 켜집니다.

imgCheckDoorInside

 

문밖에 현실은… ㄷㄷㄷ

imgCheckDoorOutside

 

‘문살살 표지판’에 필요한 준비물은

  • MCU : 아두이노 나노 or UNO
  • 전원 : 9v 스냅, 9v 배터리
  • 출력 : RGB LED
  • 외관 : 다이소에서 구입한 2000원짜리 LED 터치등
  • 기타 : 스위치, 브레드보드, 케이블

 

회로도

회로도를 그릴 수 있는 Fritzing 도구로 제작한 ‘문살살’ 회로도 입니다.

CheckDoorRGBLed

 

제작순서

  • 1단계 : 부품결합
  • 2단계 : 아두이노 소스 코딩
  • 3단계 : 코드 업로드
  • 4단계 : 테스트

 

아두이노 소스코드

GitHub 주소 : https://github.com/forearth/arduino-learning-sample/tree/master/CheckDoor

//변수설정
int TRIG = 2;
int ECHO = 3;
int redPin = 11;
int greenPin = 10;
int bluePin = 9;

void setup() {
 //set serial
 Serial.begin(9600);

 //set led
 pinMode(redPin, OUTPUT);
 pinMode(greenPin, OUTPUT);
 pinMode(bluePin, OUTPUT); 
 
 //set ultrasonic
 pinMode(TRIG, OUTPUT);
 pinMode(ECHO, INPUT); 
}

void loop() {
 //초음파 발사 코드
 digitalWrite(TRIG, LOW);
 delayMicroseconds(2);
 digitalWrite(TRIG, HIGH);
 delayMicroseconds(10);
 digitalWrite(TRIG, LOW);
 //pulseIn 명령어를 통해 Echo핀에 초음파가 들어오는 시간계산
 //pulseIn에서 반환된 값에 58.2를 나눈이유는 시간을 cm로 변화하기 위해서임
 //음파속도가 340m/s 정도임
 long distance=pulseIn(ECHO, HIGH)/58.2;

 if(distance <70){
 setColor(255, 0, 0); // red
 } else{
 setColor(0, 255, 0); // green
 }
}

void setColor(int red, int green, int blue)
{
 analogWrite(redPin, 255-red);
 analogWrite(greenPin, 255-green);
 analogWrite(bluePin, 255-blue); 
}