캐릭보드 - 대화하는 캐릭터들을 만들어보자

by 심형주 | 2017-07-20 17:05

재료

  • 캐릭보드 더블박스 1개

이번에는 두개의 캐릭보드를 이용하여 대화하는 캐릭터들을 만들어 보도록 하겠습니다!



코드를 작성하기 앞서서 먼저 라이브러리를 설치해 주셔야 합니다.

IRremote 라이브러리가 설치되지 않으신 분들은 설치해주세요!

https://github.com/z3t0/Arduino-IRremote <-이쪽에서 라이브러리를 설치하실 수 있습니다.

좀 더 자세한 라이브러리 설치방법이 알고 싶으시다면

이전의 포스트인 캐릭보드 - 빛을 설정해보자 (+ RTC) 를 참고하시면 됩니다.


라이브러리를 설치한 이후에 코드를 입력하고 컴파일을 하려고 보니,  

"'IRsend' does not name a type"라는 오류 문구가 뜨면서 컴파일 오류가 발생했습니다.

그래서 원인을 찾아보니, 라이브러리 폴더 안에 있는 'RobotIRremote'라는 다른 라이브러리와 'IRremote'라이브러리 간에 충돌이 일어나 오류가 발생한 것이였습니다!

'RobotIRremote' 라이브러리를 삭제해 주시면 별다른 오류 없이 컴파일이 완료됩니다~


다음으로 캐릭보드에 모듈을 연결해주셔야 합니다!

다른 모듈들의 연결방법을 원하신다면 이 역시 위에 링크되어 있는 글을 참고해주세요.



① 적외선 발신부 연결 (Master)

② 적외선 수신부 연결 (Slave)


연결 완료된 아두이노 master, slave 모두 케이블 선으로 컴퓨터와 연결해주세요!

(※ 연결된 port의 위치가 어디인지 확인이 필요합니다.
    이것은 내PC오른쪽 마우스 클릭 > 장치 관리자 > 포트(COM & LPT) 에서 확인 가능합니다~)


아두이노 IDE에서 먼저 slave (적외선 수신) 가 연결된 port를 상단의 툴에서 설정하신 뒤에 컴파일 & 업로드 해주세요.

그 다음에 master (적외선 발신) 가 연결된 port를 역시 상단의 툴에서 설정하신 뒤에 컴파일 & 업로드하여 사용하시면 됩니다.

  

다음은 소스코드입니다.  다음 메뉴얼을 참고하셔도 됩니다~

① Master Part (적외선 발신) -> 캐릭터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
80
81
82
83
84
85
86
87
#define BLYNK_PRINT Serial
#define PIN 6
#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>
#include <IRremote.h>
#include <IRremoteInt.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);
}
 
void loop()
{
  if (Serial.available() > 0) {
    char str = Serial.read();
    
    if (str == '1') { //1을 입력 받으면
      sendIR(0xa); //적외선 신호를 발사
      for (int i = 0; i < 5; i++) { // 빨간 불을 켠다
        strip.setPixelColor(i, strip.Color(25500));
        strip.show();
      }
      mp3Serial.listen();
      if (mp3Serial.isListening()) {
        Serial.println("Play");
        mp3_play(1);
        delay (4000);
        mp3_stop();
      }
    } 
    
    else if (str == '2') {
      sendIR(0xb); //적외선 신호를 발사
      for (int i = 0; i < 5; i++) { // 파란 불을 켠다
        strip.setPixelColor(i, strip.Color(00255));
        strip.show();
      }      
      
      mp3Serial.listen();
      if (mp3Serial.isListening()) {
        Serial.println("Play");
        mp3_play(1);
        delay (4000);
        mp3_stop();
      }
    }
  }
}
 
void sendIR(int hex) {
  for (int i = ; i < 3; i++) {
    irsend.sendSony(hex, 20);
    delay(100);
  }
  delay(500);
  Serial.println("IR has been sent");
  Serial.println(hex, HEX);
  irrecv.enableIRIn();
}
cs
cs


저의 경우에는 빅히어로에게 마스터를 맡겼습니다.

마스터께서 적외선 발신기를 손에 쥐고 계십니다^^;;;;





② Slave Part (적외선 수신) -> 캐릭터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
68
69
70
71
72
#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(255255255));
  strip.show();
  }
 
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();
    }
  }
 
  else{
    for (int i = 0; i < 5; i++) {
      strip.setPixelColor(i, strip.Color(000));
      strip.show();
    }
  }
}
 
boolean receiveIR(int hex) {
  checkIR = false;
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    if (results.value == hex) {
      Serial.println("Hello");
      checkIR = true;    
  }
    irrecv.resume();
  }
  delay(30);
  return checkIR;
}
cs


다음은 미니언즈가 slave를 담당하였습니다.

노예를 맡아 적외선 수신기를 들고 마스터의 명령을 기다리고 있네요 ㅎ




master코드까지 업로드를 완료하셨다면, 이제 시리얼 모니터에서 실행해보시면 됩니다.


시리얼 모니터에서 1을 입력하면 'IR has been sent'라고 문구와 함께 master인 빅히어로에서 적외선이 보내지게 되고, 동시에 빨간빛을 내면서 노래를 재생합니다.

그 다음엔 slave가 이 적외선을 수신하여 같은 빨간빛을 내게 됩니다.

2를 입력하게 되면 이번에는 master가 파란빛을 내고, slave또한 이 신호를 받아 같은 파란빛을 내게 됩니다.


적외선의 신호가 약해서 인지 적외선이 전달되지 않는 경우가 많았습니다......... 또르르




나만의 master & slave를 만들어 보세요!


댓글 0

나만의 캐릭보드 구현하기

캐릭보드 - 대화하는 캐릭터들을 만들어보자

by 심형주

MADE BY

캐릭보드 - 대화하는 캐릭터들을 만들어보자현재글 캐릭보드 컨트롤 by 스마트폰 - ② 앱에 기능 넣기 이전글