앞선 포스트 "DFplayer - 아두이노 사운드 모듈"의 NodeMcu 제어 코드 입니다.

 

NodeMcu + DFplayer + wifi + android App 이용 mp3 플레이어

 

DFplayer를 NodeMcu에 연결하고 NodeMcu가 기본 내장하고 있는 wifi 기능을 이용하여 안드로이드 앱으로 DFplayer를 제어해보자. wifi로 연결하여 제어할 경우 블루투스 연결보다 장거리(10m 이상)에서 제어 할 수 있다는 장점이 있다. 

 

DFplayer            NodeMcu          

VCC         ->     3V3 (3.3V)

RX           ->     D2

TX           ->     D1

GND        ->     GND

 

 

NodeMcu V3

ESP-12E core를 장착하고 4 MB of SPI flash의 저장공간이 특징인 아두이노 IDE 개발환경에서 아두이노와 똑같이 코딩할 수 있는 NodeMcu v1.0의 후속 개발보드이다. NodeMcu는 아두이노 우노에서 사용했던 스케치를 큰 변경없이 사용할 수 있다. 

시리얼 통신 속도와 핀 번호 정도만 변경해 주면 된다. 

 

Version : DevKit v1.0

 

 

Breadboard Friendly

Light Weight and small size.

3.3V operated, can be USB powered.

Uses wireless protocol 802.11b/g/n.

Built-in wireless connectivity capabilities.

Built-in PCB antenna on the ESP-12E chip.

Capable of PWM, I2C, SPI, UART, 1-wire, 1 analog pin.

Uses CP2102 USB Serial Communication interface module.

Arduino IDE compatible (extension board manager required).

Supports Lua (alike node.js) and Arduino C programming language.

 

Version : DevKit v3

 

 

 

NodeMcu v1.0 버전과의 차이점은 USB-TTL chip으로 CP2102대신 CH340G를 사용하고 보드 레이아웃이 약간 다르다. 필자가 사용하는 NodeMcu는 V3 버전이다.

 

 

NodeMcu를 아두이노 IDE 개발환경에서 사용하기 위해서는 ESP8266 아두이노 코어를 설치 해주어야 한다. 

 

아두이노 IDE에 ESP8266 사용 환경 설치하기

https://postpop.tistory.com/14

 

NodeMcu를 컴퓨터 USB와 연결한 뒤 아두이노 IDE의 툴 -> 보드에서 NodeMCU 1.0 (ESP-12E Module)을 선택하고 필자는 Upload Speed를 921600으로 설정하여 스케치를 업로드 하고 있다. 921600 속도가 불안정하다는 얘기도 있으나 115200과의 속도차가 꽤 많이 나고 아직까지는 불편하지 않다. 포트는 NodeMcu가 연결된 포트를 선택해주면 된다. 필자의 경우 아래 그림처럼 COM9번이다. 포트 번호는 NodeMcu를 컴퓨터 USB에 연결할때 마다 달라질 수 있다. 연결할 때 생성되는 포트번호를 사용하자. 

스케치를 업로드 하면 아래와 같이 진행정도가 %와 점선으로 표시된다. 

 

 

NodeMcu의 하드웨어 시리얼 보드레이트는 115200까지 안정적으로 사용할 수 있다. 

 

Serial.begin(115200); // 시리얼 모니터 보드레이트 -> 115200 

 

 

스케치상에 보드레이트를 115200으로 했다면 시리얼 모니터의 보드레이트도 반드시 115200으로 맞춰주자.

 

DFplayer의 시리얼 통신용 보드레이트는 9600이다. DFplayer의 제어를 위해서는 스케치상에 DFplayer용 시리얼 통신 코드에 보드레이트를 9600으로 맞춰주자.

 

dfSerial.begin(9600); // DFplayer Serial baud rate: 9600

 

NodeMcu는 아두이노 우노보다 저장공간, 즉 메모리가 더 클 뿐만아니라 MCU 속도도 더욱 빠르다. 성능 테스트를 위해 아두이노 우노에서 실행했었던 Custom Shuffle용 코드를 실행해 보자.

 

NodeMcu의 아날로그 입력핀을 randomSeed(analogRead(A0)); 코드에 입력하였으나 다섯번 실행중에 2번이 중복되어 아래와 같이 random(0,50) 값을 추가해 주었다. 

 

randomSeed(analogRead(A0)+random(0,50)); // NodeMCU 아날로그 입력 A0

 

아래 스케치를 업로드하고 리셋 버튼을 클릭하면서 확인해 보자.

NodeMcu_shuffle_index.zip
0.00MB

 

// shuffle 변수

uint16_t shuffle[650] = {0, };  // 450: 동적 메모리 54% 사용, 650: 73%

uint16_t shuffle_tracks = 650;  // 셔플용 트랙수

unsigned long int atime;  // shuffle_num 함수 실행시간 확인 변수

 

void shuffle_num() {

  uint16_t track_count = 0;

  uint16_t sh_count = 0;

  uint16_t track_num = 0;

  while (track_count < shuffle_tracks) {

    uint16_t temp = track_count + 1;

    shuffle[track_count] = temp;

    track_count++;

  }

  while (sh_count < shuffle_tracks) {

    uint16_t index1 = random(0, shuffle_tracks);

    uint16_t index2 = random(0, shuffle_tracks);

    while (index1 == index2) {

      index1 = random(0, shuffle_tracks);

      index2 = random(0, shuffle_tracks);

    }

    uint16_t temp1 = shuffle[index1];

    uint16_t temp2 = shuffle[index2];

    shuffle[index1] = temp2;

    shuffle[index2] = temp1;

    sh_count++;

  }

}

 

void setup() {

  Serial.begin(115200);

  randomSeed(analogRead(A0)+random(0,50)); // NodeMCU 아날로그 입력 A0

  atime = micros();

  shuffle_num();

  Serial.println(micros() - atime);

  Serial.println("shuffle");

  for (int i = 0; i < shuffle_tracks; i++) {

    Serial.print(shuffle[i]); Serial.print(",");

  }

}

 

void loop() {

  // put your main code here, to run repeatedly:

}

 

NodeMcu 결과

uint16_t shuffle_tracks = 650;  // 트랙수: 650, 동적메모리 34%

6231 = 6.231 밀리초 = 0.006초

6229

6234

6219

6249

 

아두이노 우노 결과

uint16_t shuffle_tracks = 650;  // 트랙수: 650, 동적메모리 73%

118840 = 118.840 밀리초 = 0.12초

118452

118688

118488

118688

 

NodeMcu 배열 3000개 결과

uint16_t shuffle_tracks = 3000;  // 트랙수: 3000, 동적메모리 40%

 

27478 = 27.478 밀리초 = 0.03초

 

27429

 

27440

27457
27445
 
아두이노 우노와 NodeMcu사이의 성능 차이가 상당함을 확인 할수 있었고 특히 메모리 부분에 여유가 생겨 DFplayer 권장 최대 트랙수인 3000개도 Custom Shuffle로 사용하는데 문제가 없게 되었다.  사실 트랙 300개만 되어도 트랙하나당 3분정도로 보면 모두 재생되는데는 15시간이 소요된다. 
 

아래코드는 이전 강좌 "DFplayer - 아두이노 사운드 모듈"에서 사용한 와이파이 이용 원격제어코드에 상기의 블루투스 제어용 코드를 접목시킨 것이다. 와이파이를 이용한 제어용 통신은 블루투스의 제어용 통신과는 약간 다르게 되는데 블루투스를 이용한 시리얼 통신에서는 데이터가 1바이트 단위의 값이었다면 와이파이 이용 제어용 통신에서 주고 받는 데이터는 스트링값이 된다. 따라서 데이터 송 수신부 코드가 블루투스와 달라지게 되는데 그것에 관해서는 이전 강좌를 살펴보기 바란다. 

DFplayer_esp8266.zip
0.00MB

 

블루투스로 제어할 때와 마찬가지로 폴더내 특정 파일 재생할 경우 "f폴더,파일번호"를 텍스트 입력란에 입력하여 전송하면 된다.

예) f1,15 -> 1폴더의 "015 풀벌레,새소리.mp3" 파일 재생

 

ADVERT 폴더 파일 재생시 텍스트 입력란에 숫자만 입력하면 된다. 

 

관련 글

[arduino] - DFplayer - 아두이노 사운드 모듈

[arduino] - NodeMcu(ESP8266)에서 DFplayer를 제어하는 코드

[arduino] - ESP32(DevKit)로 DFplayer 제어하기

[arduino] - 안드로이드 앱 DFcontroller를 이용하여 DFplayer 제어

[arduino] - 아두이노시계 예제, ESP01 WiFi 이용 시간 동기화 하기

[arduino] - 아두이노 말하는알람시계 예제 - DFPlayer

[arduino] - 말하는알람시계 - 블루투스 연결 및 시간 동기화, DFPlayer 제어

[arduino] - NodeMcu - 말하는 알람시계, wifi이용 시간 동기화 및 DFPlayer 원격제어

 

 

 

 

반응형

+ Recent posts