대화하는 캐릭터들

by 김도현 | 2017-07-03 17:01

재료

  • 캐릭보드 더블박스 1개

오늘은 스마트폰으로 캐릭터들이 대화하는 것을 만들기 전에, 다음 매뉴얼을 따라서 해보았습니다.

여러분들도 따라서 해보세요!



1. 캐릭터 2개 생성

오늘은 대화할 캐릭터 2명을 만듭니다.

저는 노예 미니언과 그의 주인 브라운 사장님을 데리고 둘이 서로 대화를 할 수 있도록 해보겠습니다.

먼저 노예 미니언입니다.

이 친구는 표정이 매우 심드렁하군요. 이 친구가 똑바로 서있을 수 있도록, 박스를 조립해주었습니다.

  

조립을 다 하면 이렇게 완성됩니다.

브라운 사장님도 마찬가지로 조립을 해주시면 됩니다.


박스 조립이 끝났다면 각각의 캐릭보드에 적외선 송신센서 1개, 수신센서 1개를 달아주세요.

저의 경우 노예 미니언이 브라운 사장님의 명령을 들어야하므로 미니언에게 수신 센서, 브라운에게 송신 센서를 달아주었습니다.

모듈은 다음과 같이 생겼습니다.

적외선 송신 센서입니다.

구멍에 머리만 빼꼼 나와있는 모듈이 적외선 수신 센서입니다.



2. 코드 작성

- Slave

먼저 노예 미니언을 2번 포트에 꽂고 다음 프로그램을 업로드 해줍니다.

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
#define PIN 6
#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>
#include <IRremote.h>
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
 
SoftwareSerial mp3Serial(1213);
Adafruit_NeoPixel strip = Adafruit_NeoPixel(5, PIN, NEO_GRB + NEO_KHZ800);
 
int red;
int green;
int blue;
 
//IR
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
boolean checkIR = false;
 
void setup() {
  Serial.begin(9600);
  mp3Serial.begin(9600);
  mp3_set_serial (mp3Serial);
  delay(1);
  mp3_set_volume (5);
  irrecv.enableIRIn();
  strip.begin();
  for (int i = 0; i < 5; i++) { // 노란 불을 켠다
    strip.setPixelColor(i, strip.Color(2552550));
    strip.show();
  }
  Serial.println("Setting...");
}
 
void loop() {
  if (receiveIR(0xa== true) { //0xa 신호를 받으면
    for (int i = 0; i < 5; i++) { // 빨간 불을 켠다
      strip.setPixelColor(i, strip.Color(25500));
      strip.show();
    }
  } else if (receiveIR(0xb== true) { //0xb 신호를 받으면
    for (int i = 0; i < 5; i++) { //파란 불을 켠다
      strip.setPixelColor(i, strip.Color(00255));
      strip.show();
    }
  }
}
 
boolean receiveIR(int hex) {
  checkIR = false;
  if (irrecv.decode(&results)) {
    Serial.print("Result.value = ");
    Serial.println(results.value);
    Serial.print("HEX = ");
    Serial.println(HEX);
    if (results.value == hex) {
      Serial.println("Hello");
      checkIR = true;
    }
    irrecv.resume();
  }
  delay(30);
  return checkIR;
}
cs

코드가 정상적으로 작동이 되면 초기 미니언은 노란색을, 신호를 받으면 빨간색이나 파란색으로 변화합니다.


- Master

그 다음, 브라운 나노보드를 1번 포트에 연결한 후, 다음 코드를 업로드 해줍니다.

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
70
71
72
73
74
75
76
77
78
79
#define BLYNK_PRINT Serial
#define PIN 6
#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>
#include <IRremote.h>
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
 
SoftwareSerial mp3Serial(1213);
 
Adafruit_NeoPixel strip = Adafruit_NeoPixel(5, PIN, NEO_GRB + NEO_KHZ800);
 
//IR Send
IRsend irsend;
 
//IR
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
boolean checkIR = false;
 
int red;
int green;
int blue;
 
void setup()
{
  Serial.begin(9600);
  strip.begin();
  mp3Serial.begin(9600);
  mp3_set_serial (mp3Serial);
  delay(1);
  mp3_set_volume (15);
  Serial.println("Setting...");
}
 
void loop()
{
   for (int i = 0; i < 5; i++) {
    strip.setPixelColor(i, strip.Color(0,255,0));
    strip.show();
  }
  
  if (Serial.available() > 0) {
    char str = Serial.read();
    if (str == '1') { //1을 입력 받으면
      sendIR(0xa); //적외선 신호를 발사
      mp3Serial.listen();
      if (mp3Serial.isListening()) {
        Serial.println("Play1");
        mp3_play(1);
        delay (4000);
        mp3_stop();
      }
    } else if (str == '2') {
      sendIR(0xb); //적외선 신호를 발사
      mp3Serial.listen();
      if (mp3Serial.isListening()) {
        Serial.println("Play2");
        mp3_play(5);
        delay (4000);
        mp3_stop();
      }
    }
  }
}
 
void sendIR(int hex) {
  for (int i = 0 ; i < 3; i++) {
    irsend.sendSony(hex, 20);
    delay(100);
  }
  delay(500);
  Serial.println("IR has been sent");
  Serial.println(hex, HEX);
  irrecv.enableIRIn();
}
cs


그리고 마스터를 업로드 한 상태에서 시리얼 창에 1또는 2를 입력하면 정해진 노래가 나와야 합니다.

그런데 저는 마스터를 업로드하는데 자꾸 컴퓨터가 재부팅 되는 상황이 발생했습니다.


10번 넘게 재부팅을 하다가, 이대로는 안 되겠다 싶어 구글링을 시도해보았어요.


다음과 같은 Apple Support 페이지가 뜹니다,


요약하자면 커널 패닉으로 인한 예상치 못한 재부팅 상태라고 하는군요.

이의 원인으로는 프로그램을 설치중이거나, 연결된 하드웨어의 문제일 수 있다고 합니다.

그래서 반신반의하는 마음으로 보드와 연결된 케이블을 바꾸어 주었습니다.


그랬더니 결과는... 성공입니다!


이건 초기 셋팅이 된 미니언 상태입니다.

이 상태에서 시리얼 창에 1을 입력하면 브라운 사장님이 바나나쏭을 부릅니다.

불쌍한 노예 미니언은 바나나 쏭이 들리면 빨간색으로 몸을 바꿉니다.

(엄밀히 말하면 적외선 0xa 신호를 받아서 빨갛게 변합니다!)



실행시켜보면 다음과 같습니다.

 명령을 잘 수행하는 모습을 확인했습니다!


"미니언, 빨간색으로 변해라. 일해라 핫산!"

"사...사장님..! 나빠요!"




한 가지 난처한 점은 우리 미니언이 한 번에 못 알아들어 몸 색을 2번만에 변경하는 것인데요.

이는 적외선 신호 수신이 느려서 그런 것이 아닌가 추측하고 있습니다.

여러분들도 친구들과 함께 대화하는 캐릭보드를 만들어 보세요!



다음 글 > http://makewith.co/page/project/1080/story/2704/

댓글 1

MADE BY

김도현

프로그래밍