MP3 무드등 만들기

by 강종구 | 2017-07-04 17:03
LED 아두이노 아두이노 led 캐릭보드

이번에는 MP3 기능을 캐릭보드에 추가해봅시다!!

그래서 조금 더 멋진 무드등으로 만들어 봅시다.


준비물

캐릭보드, 아두이노 NANO, 아두이노 나노 케이블, 네오픽셀, mp3모듈, 스피커, 캐릭터


1. 라이브러리 설치

이서희양의 프로젝트를 보시면 라이브러리 설치에 대해 잘 설명되어 있습니다. 이를 참조하세요!

사실 전체적인 내용은 별 차이가 다르지 않다는... 사실?


2. 모듈 연결하기

기존의 네오픽셀이 연결된 캐릭보드에 mp3모듈과 스피커만 연결하면 됩니다!


이를 완료해보면! 이렇게 됩니다.



3. SD 카드에 노래 넣기

SD 리더기를 통해 SD카드에 노래를 넣습니다. 이동식 디스크에 SD카드가 인식되면 mp3 폴더를 만들고 거기에 노래를 넣습니다. 단, 노래의 파일명이 000X로 시작되어야 순서를 지정할 수 있습니다.


4. 아두이노IDE를 실행한 뒤 프로그래밍을 한다.

아두이노IDE를 실행한 뒤 아래와 같이 프로그램을 합니다. 기존의 코드에서 SoftwareSerial.h, DFPlayer_Mini_Mp3.h 두개의 새로운 헤더 파일을 추가해서 mp3를 사용합시다.


그리고  SoftwareSerial mp3Serial(1213)를 삽입하여 mp3Serial이라는 변수를 만들어준 뒤, 12번, 13번 핀을 이용하는 스피커를 설정해줍니다.


저는 1번 트랙을 듣고 싶어서 mp3_play(1)로 설정해 주었고, delay(3000000)을 통해 300초가량 플레이되도록 하였습니다. 만약 이 부분에서 for문이나 여러 문법을 사용한다면, 차례대로 mp3를 플레이할 수 있겠죠?


그리고 mp3의 볼륨은 mp3_set_volume(20)이라는 함수를 통해 20으로 최대로 놓았습니다. 0-20 사이로 설정이 가능합니다.


아래는 전체적인 코드이구요.
이를 통해 완성된 mp3 무드등을 만들었습니다.

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
88
89
90
#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>
#include <Adafruit_NeoPixel.h>
 
#ifdef __AVR__
#include <avr/power.h>
#endif
 
#define PIN 6
SoftwareSerial mp3Serial(1213);
Adafruit_NeoPixel strip = Adafruit_NeoPixel(5, PIN, NEO_GRB + NEO_KHZ800);
 
int red = 0;
int green = 0;
int blue = 0;
 
void setup() {
  strip.begin(); 
  strip.show(); 
  Serial.begin(9600);
  mp3Serial.begin(9600);
  mp3_set_serial (mp3Serial);
  delay(1);
  mp3_set_volume (20);  
 
}
void randcolor()
{
  red = random(256);
  green = random(256);
  blue = random(256);
}
void loop() {
  
  randcolor();
  lightChase(strip.Color(red, green, blue));
  rainbow();
 
  mp3Serial.listen();
  if (mp3Serial.isListening()) {
    Serial.println("Play");
    mp3_play(1);  
    delay (300000); 
    mp3_stop();
  }
}
 
void rainbow() {
  uint16_t i, j, k;
  for(k=0; k<5; k++){
    for(j=0; j<256; j++){ 
      for(i=0; i< 5; i++){
        strip.setPixelColor(i, rainbowcolor(((i * 256 / 5+ j*k) & 255));
      }
      strip.show();
      delay(10);
    }
  }
}
 
void lightChase(uint32_t c) 
{
  for (int j=0; j<50; j++) {
    for (int q=0; q < 3; q++) {
      for (int i=0; i < 5; i=i+3) {
        strip.setPixelColor(i+q, c);   
      }
      
      strip.show();
      delay(10);
 
      for (int i=0; i < 5; i=i+3) {
        strip.setPixelColor(i+q, 0);   
      }
    }
  }
}
 
uint32_t rainbowcolor(byte Pos) {
  if(Pos < 85) {
   return strip.Color(Pos * 3255 - Pos * 30);
  } else if(Pos < 170) {
   Pos -= 85;
   return strip.Color(255 - Pos * 30, Pos * 3);
  } else {
   Pos -= 170;
   return strip.Color(0, Pos * 3255 - Pos * 3);
  }
}
 
cs


아래의 영상은 시연한 영상이구요.

제 캐릭터가 화난 새이길래... 뭔지 잘 몰라서.. 그냥 앵그리버드ost를 플레이하였습니다.

이 코드의 문제가 있다면, mp3를 플레이할 동안은 네오픽셀의 값이 변화하지 않아서(loop함수를 보시면), 함수가 순차적으로 실행되는 것을 볼 수 있는데요. 이를 해결할 방법을 한번 생각해봐야할 것 같습니다!

그럼 오늘은 이만!! 다음에는 새로운 걸 가지고 돌아오겠습니다. 뿅!

댓글 0