IT개발및프로그래밍/아두이노

아두이노 7: 피에조 스피커를 활용한 멜로디 연주

devgodmj 2024. 10. 29. 03:15

피에조 스피커는 전기적 신호를 소리로 변환하는 전자 부품으로, 다양한 크기와 전압에 맞춰 사용할 수 있습니다. 피에조 효과의 원리와, 피에조 스피커를 아두이노와 연결해 간단한 멜로디 연주를 하는 방법에 대해 알아보겠습니다.

1. 피에조 스피커와 피에조 효과란?

 

  • 피에조 효과: 특정 물질에 전기적 신호가 주어질 때 수축하거나 확장하는 특성으로, 스피커는 이 효과를 통해 공기를 진동시켜 소리를 발생시킵니다.
  • 작동 원리: 피에조 스피커 내부의 얇은 판이 전기 신호에 따라 진동하면서 소리를 만듭니다. 사람의 성대나 마이크와 유사하게 공기를 진동시키는 원리입니다.
  • 피에조 스피커: 전기적 신호를 이용해 소리를 내는 전자부품으로 동작하는 전압에 따라 크기가 작은 것부터 큰 것 까지 다양합니다. 

2. 아두이노로 멜로디 연주하기

필요한 준비물:

  • 피에조 스피커 1개
  • 점퍼 와이어 2개
  • 브레드보드 1개
  • 아두이노 보드

연결 방법:

  1. 피에조 스피커의 플러스와 마이너스를 확인하여 브레드보드에 연결합니다.
  2. 아두이노 보드의 그라운드 핀과 스피커의 마이너스를 연결하고, 8번 핀과 스피커의 플러스를 연결합니다.

 

코드 작성:

  • 아두이노의 tone() 함수를 이용해 멜로디를 구현합니다. tone(핀 번호, 헤르츠, 재생 시간) 구조로 사용하며, 핀 번호는 연결된 아두이노 핀을, 헤르츠는 소리의 주파수, 재생 시간은 밀리초 단위로 입력합니다.
  • 예를 들어, 4옥타브 도를 1초간 소리내려면 tone(8, 262, 1000);를 사용합니다.
int melody[] =  {262, 294, 330, 349, 392, 440, 494, 523};

void setup(){
  for(int i=0; i<8; i++){
    tone(8, melody[i]);
    delay(400);
    noTone(8);
  }
}

void loop(){

}

 

tone(): 피에조 스피커로 소리를 내는 함수
- 구조: tone(핀 번호, 헤르츠, 재생 시간)
- 핀 번호: 피에조 스피커가 연결된 핀 번호
- 헤르츠: 소리낼 음의 헤르츠 값
- 재생 시간: 음을 소리내고자 하는 시간. 단위는 밀리초.
- 반환 값: 없음 
tone(8, 262, 1000); // 8번 핀에 연결된 피에조 스피커로 4 옥타브 도(262)를 1초간 소리낸다.

 

noTone(): 피에조 스피커의 소리를 끄는 함수
- 구조: noTone(핀 번호)
- 핀 번호: 피에조 스피커가 연결된 핀 번호
- 반환 값: 없음 
noTone(8); // 8번 핀에 연결된 피에조 스피커의 소리를 끈다.

3. 미니 디지털 피아노 만들기

피에조 스피커와 버튼을 활용해 간단한 디지털 피아노를 만들어 볼 수 있습니다.

 

추가 준비물:

  • 피에조 스피커 1개
  • 버튼 3개
  • 10k 옴 저항 3개
  • 점퍼 와이어 13개
  • 브레드보드 1개
  • 아두이노 보드

설치 및 연결:

  1. 피에조 스피커와 버튼을 브레드보드에 설치합니다.
  2. 각 버튼을 디지털 핀 2, 3, 4번에 연결하고, 피에조 스피커와 함께 브레드보드에 연결합니다.

 

int pins[] = {2,3,4};
int notes[] = {262, 294, 330};
void setup(){

  for(int i =0; i<3; i++){
    pinMode(pins[i], INPUT);
  }
}

void loop(){

  for(int i=0; i<3; i++){
    if(digitalRead(pins[i])== HIGH){
       tone(8, notes[i], 100);
       delay(100);
       noTone(8);
    }
  }



}

  • 모드 설정에 따라 버튼을 눌렀을 때만 연주하기
char data;
boolean mode;
int pins[] = {2,3,4};
int notes[] = {262, 294, 330};
void setup(){

  Serial.begin(9600);
  for(int i =0; i<3; i++){
    pinMode(pins[i], INPUT);
  }
}

void loop(){
 
  if(Serial.available()){
    data = Serial.read();

    if(data == '1'){
      mode = true;
    }else{
      mode = false;
    }
    Serial.println(mode);
  }


  if(mode == true){
    for(int i=0; i<3; i++){
      if(digitalRead(pins[i])== HIGH){
        tone(8, notes[i], 100);
        delay(100);
        noTone(8);
      }
    }
  }
}