피에조 부저를 이용하여 ESP32에서 곰 세 마리 멜로디를 연주해 보자.

아래 사이트의 아두이노 우노에서의 코드를 ESP32에 맞게 수정해 주었다. 

https://steemit.com/kr-newbie/@codingman/2tqxgv

 

ESP32에서는 아두이노에서 사용하던 tone() 함수를 사용할 수 없다. 

tone() 함수도 PWM을 이용하는데 ESP32의 PWM 적용방법이 다르므로 ESP32에서의 tone() 함수 형식도 변경되게 된다. 

 

또한, 옵션 설정도 일반 PWM 제어 설정과 다르다.

일반 PWM: ledcSetup(pwm_channel, freq, resolution) // 아날로그 채널 설정(freq: 보통 5000, resolution : 보통 8)

tone 설정: ledcSetup(0,1E5,12);  // ESP32 톤 전용 ledcSetup, ledcSetup(channel,1E5,12);

 

다음으로 톤을 출력하는 아래와 같은 두 가지 함수가 있다. 

1. ledcWriteNote(uint8_t channel, note_t note, uint8_t octave)  // 옥타브 값이 필요하다

2. ledcWriteTone(uint8_t channel, note_t note)                      // 1번과 다르게 옥타브 값이 빠져있다. 

 

1번은 기본 음계를 기준으로 옥타브를 적용해주는 코드이고 2번은 옥타브가 적용된 음계를 사용하는 차이점이 있다. 2번을 사용하기 위해서는 옥타브가 포함된 음계를 정의하는 pitches.h 라이브러리를 이용해야 한다. 

 

아래 코드는 1번 함수를 사용하여 곰 세 마리 멜로디를 출력하는 코드이다.

esp32_melody.ino
0.00MB

int beepPin = 4;

note_t melody_note[] = { // 곰세마리 음계
NOTE_C,NOTE_C,NOTE_C,NOTE_C,NOTE_C,               //도도도도도
NOTE_E,NOTE_G,NOTE_G,NOTE_E,NOTE_C,               //미솔솔미도
NOTE_G,NOTE_G,NOTE_E,NOTE_G,NOTE_G,NOTE_E,       //솔솔미솔솔미
NOTE_C,NOTE_C,NOTE_C,                               //도도도
NOTE_G,NOTE_G,NOTE_E,NOTE_C,                       //솔솔미도
NOTE_G,NOTE_G,NOTE_G,                               //솔솔솔
NOTE_G,NOTE_G,NOTE_E,NOTE_C,                       //솔솔미도
NOTE_G,NOTE_G,NOTE_G,                               //솔솔솔
NOTE_G,NOTE_G,NOTE_E,NOTE_C,                       //솔솔미도
NOTE_G,NOTE_G,NOTE_G,NOTE_A,NOTE_G,               //솔솔솔라솔
NOTE_C,NOTE_G,NOTE_C,NOTE_G,                       //도솔도솔
NOTE_E,NOTE_D,NOTE_C                                //미레도
};

uint8_t octave_m[]={ // 멜로디 옥타브
4,4,4,4,4,    //1
4,4,4,4,4,    //2
4,4,4,4,4,4,  //3
4,4,4,        //4
4,4,4,4,      //5
4,4,4,        //6
4,4,4,4,4,    //7
4,4,4,        //8
4,4,4,4,      //9
4,4,4,4,5,    //10
4,5,4,4,      //11
4,4,4,        //12
};

uint8_t noteDurations[]={  // 음의 길이 설정
2000,4,8,8,4,4,    // 처음 진입은 2000/2000 = 1
4,8,8,4,4,    //2
8,8,4,8,8,4,  //3
4,4,2,        //4
4,4,4,4,      //5
4,4,2,        //6
4,4,4,4,      //7
4,4,2,        //8
4,4,4,4,      //9
8,8,8,8,2,    //10
4,4,4,4,      //11
4,4,2         //12
};

uint8_t melody_num = 0;
unsigned long int beepTime = 0;

void setup() {
  Serial.begin(115200);
  ledcSetup(0,1E5,12);  // ESP32 톤전용 ledcSetup: ledcSetup(channel,1E5,12);
  ledcAttachPin(beepPin,0);  // ledcAttachPin(uint8_t pin, uint8_t channel);
}

void loop() {
  if (millis() - beepTime >= 2000/noteDurations[melody_num]) {
    beepTime = millis();
    ledcWrite(0,0); 
    ledcWriteNote(0,melody_note[melody_num],octave_m[melody_num]);  // ledcWriteNote(uint8_t channel, note_t note, uint8_t octave);
    melody_num++;
    if (melody_num == 50) { // 초기화
      ledcWrite(0,0);  //  noTone() - ledcWrite(uint8_t channel, uint32_t duty);
      melody_num = 0; 
      beepTime = 0;
    }
  }
}

아래 코드는 2번 함수를 사용하여 곰 세 마리 멜로디를 출력하는 코드이다.

이 코드를 적용하기 위해서는 아두이노 IDE에 pitches.h 라이브러리를 등록해야 한다.

pitches.zip
0.00MB
esp32_tone.ino
0.00MB

#include "pitches.h"

#define beepPin 4 // GPIO 4
unsigned long previousButtonMillis = 0;

int melody_note[] = { // 곰세마리
NOTE_C5,NOTE_C5,NOTE_C5,NOTE_C5,NOTE_C5,               //도도도도도
NOTE_E5,NOTE_G5,NOTE_G5,NOTE_E5,NOTE_C5,               //미솔솔미도
NOTE_G5,NOTE_G5,NOTE_E5,NOTE_G5,NOTE_G5,NOTE_E5,       //솔솔미솔솔미
NOTE_C5,NOTE_C5,NOTE_C5,                               //도도도
NOTE_G5,NOTE_G5,NOTE_E5,NOTE_C5,                       //솔솔미도
NOTE_G5,NOTE_G5,NOTE_G5,                               //솔솔솔
NOTE_G5,NOTE_G5,NOTE_E5,NOTE_C5,                       //솔솔미도
NOTE_G5,NOTE_G5,NOTE_G5,                               //솔솔솔
NOTE_G5,NOTE_G5,NOTE_E5,NOTE_C5,                       //솔솔미도
NOTE_G5,NOTE_G5,NOTE_G5,NOTE_A5,NOTE_G5,               //솔솔솔라솔
NOTE_C6,NOTE_G5,NOTE_C6,NOTE_G5,                       //도솔도솔
NOTE_E5,NOTE_D5,NOTE_C5                                //미레도
};

uint8_t noteDurations[]={
2000,4,8,8,4,4,    // 2000 = 초기 진입 , 2000/2000 = 1
4,8,8,4,4,    //2
8,8,4,8,8,4,  //3
4,4,2,        //4
4,4,4,4,      //5
4,4,2,        //6
4,4,4,4,      //7
4,4,2,        //8
4,4,4,4,      //9
8,8,8,8,2,    //10
4,4,4,4,      //11
4,4,2         //12
};

uint8_t melody_num = 0;
unsigned long beepTime = 0;

void setup() {
  Serial.begin(115200);
  ledcSetup(0,1E5,12);  // ESP32 톤전용 ledcSetup: ledcSetup(channel,1E5,12);
  ledcAttachPin(beepPin,0);  // ledcAttachPin(uint8_t pin, uint8_t channel);
}

void loop() {
  if (millis() - beepTime >= 2000/noteDurations[melody_num]) {
    beepTime = millis();
    ledcWrite(0,0); 
    ledcWriteTone(0,melody_note[melody_num]);  // ledcWriteTone(uint8_t channel, note_t note);
    melody_num++;
    if (melody_num == 50) { // 초기화
      ledcWrite(0,0);  //  noTone() - ledcWrite(uint8_t channel, uint32_t duty);
      melody_num = 0; 
      beepTime = 0;
    }
  }
}

 

 

아래 코드 들은 인터넷에서 찾은 pitches.h 라이브러리를 이용한 멜로디 코드이다.

슈퍼마리오 메인 테마

int melody_note[] = { 
  NOTE_E7, NOTE_E7, 0, NOTE_E7,
  0, NOTE_C7, NOTE_E7, 0,
  NOTE_G7, 0, 0,  0,
  NOTE_G6, 0, 0, 0,
  NOTE_C7, 0, 0, NOTE_G6,
  0, 0, NOTE_E6, 0,
  0, NOTE_A6, 0, NOTE_B6,
  0, NOTE_AS6, NOTE_A6, 0,
  NOTE_G6, NOTE_E7, NOTE_G7,
  NOTE_A7, 0, NOTE_F7, NOTE_G7,
  0, NOTE_E7, 0, NOTE_C7,
  NOTE_D7, NOTE_B6, 0, 0,
  NOTE_C7, 0, 0, NOTE_G6,
  0, 0, NOTE_E6, 0,
  0, NOTE_A6, 0, NOTE_B6,
  0, NOTE_AS6, NOTE_A6, 0,
  NOTE_G6, NOTE_E7, NOTE_G7,
  NOTE_A7, 0, NOTE_F7, NOTE_G7,
  0, NOTE_E7, 0, NOTE_C7,
  NOTE_D7, NOTE_B6, 0, 0
};

uint8_t noteDurations[]={
2000,  12, 12, 12, 12,
  12, 12, 12, 12,
  12, 12, 12, 12,
  12, 12, 12, 12,
  12, 12, 12, 12,
  12, 12, 12, 12,
  12, 12, 12, 12,
  12, 12, 12, 12,
  9, 9, 9,
  12, 12, 12, 12,
  12, 12, 12, 12,
  12, 12, 12, 12,
  12, 12, 12, 12,
  12, 12, 12, 12,
  12, 12, 12, 12,
  12, 12, 12, 12,
  9, 9, 9,
  12, 12, 12, 12,
  12, 12, 12, 12,
  12, 12, 12, 12,
};

슈퍼마리오 언더월드

int melody_note[] = { 
  NOTE_C4, NOTE_C5, NOTE_A3, NOTE_A4,
  NOTE_AS3, NOTE_AS4, 0,
  0,
  NOTE_C4, NOTE_C5, NOTE_A3, NOTE_A4,
  NOTE_AS3, NOTE_AS4, 0,
  0,
  NOTE_F3, NOTE_F4, NOTE_D3, NOTE_D4,
  NOTE_DS3, NOTE_DS4, 0,
  0,
  NOTE_F3, NOTE_F4, NOTE_D3, NOTE_D4,
  NOTE_DS3, NOTE_DS4, 0,
  0, NOTE_DS4, NOTE_CS4, NOTE_D4,
  NOTE_CS4, NOTE_DS4,
  NOTE_DS4, NOTE_GS3,
  NOTE_G3, NOTE_CS4,
  NOTE_C4, NOTE_FS4, NOTE_F4, NOTE_E3, NOTE_AS4, NOTE_A4,
  NOTE_GS4, NOTE_DS4, NOTE_B3,
  NOTE_AS3, NOTE_A3, NOTE_GS3,
  0, 0, 0
};

uint8_t noteDurations[]={
2000,  12, 12, 12, 12,
  12, 12, 6,
  3,
  12, 12, 12, 12,
  12, 12, 6,
  3,
  12, 12, 12, 12,
  12, 12, 6,
  3,
  12, 12, 12, 12,
  12, 12, 6,
  6, 18, 18, 18,
  6, 6,
  6, 6,
  6, 6,
  18, 18, 18, 18, 18, 18,
  10, 10, 10,
  10, 10, 10,
  3, 3, 3
};

젤다의 전설

int melody_note[] = { 
  NOTE_D4,NOTE_F4,NOTE_D5,
  NOTE_D4,NOTE_F4,NOTE_D5,
  NOTE_E5,NOTE_F5,NOTE_E5,NOTE_F5,
  NOTE_E5,NOTE_C5,NOTE_A4,
  NOTE_A4,NOTE_D4,NOTE_F4,NOTE_G4,
  NOTE_A4,
  NOTE_A4,NOTE_D4,NOTE_F4,NOTE_G4,
  NOTE_E4
};

uint8_t noteDurations[]={
2000, 8,8,2,
  8,8,2,
  3,8,8,8,
  8,8,2,
  4,4,8,8,
  2,
  4,4,8,8,
  2
};

 

[arduino] - 아두이노/ESP32 - 피에조 부저, 악보를 보고 동요 멜로디 코딩하기(동요 겨울밤, 다람쥐, 옹달샘, 작은별)

[arduino] - arduino - Simple Melody 이용 피에조 부저 멜로디 코딩하기, Esp01, EEPROM

[Piezo Buzzer] - 아두이노 - 피에조 부저 멜로디 BTS DNA

[Piezo Buzzer] - 아두이노 - 피에조 부저 멜로디 Hwasa Maria

[Piezo Buzzer] - 아두이노 - 피에조 부저 멜로디 BTS Dynamite

[Piezo Buzzer] - BTS (방탄소년단) - Butter ㅣ piezo buzzer

 

 

 

 

 

 

 

반응형

+ Recent posts