아두이노 부저 소리 키우기 - adu-ino bujeo soli kiugi

아두이노 부저 소리 키우기 - adu-ino bujeo soli kiugi

아두이노로 소리(SOUND) 제어하기: 부저소리내기(실습2-1 )

황제곰2019. 10. 30. 13:42

#아두이노 #아두이노강좌#사운드 #sound #소리 #부저 #강좌 #RGB#RedBoard #레드보드 #tutorial

아두이노로 소리(SOUND) 제어하기

https://learn.sparkfun.com/tutorials/sparkfun-inventors-kit-experiment-guide---v41

프로젝트2 : 소리

프로젝트2에서 여러분들은 버튼과 부저에 대해 학습하고 이를 활용해서 Simon Says Game 이라는 게임을 만들어 보겠습니다. 이 게임은 빨강, 노랑, 파랑 LED가 임의의 패턴대로 깜박이면 게이머가 이를 기억해 뒀다가 일정시간 안에 같은 색의 버튼을 눌러서 패턴을 재생해 내는 게임입니다.

아두이노 부저 소리 키우기 - adu-ino bujeo soli kiugi

프로젝트2 사진

▶ 이번 프로젝트에서 새롭게 학습할 개념

아래의 개념들은 개별 회로를 실습해 보면서 자세히 알아보게 될 것입니다.

1. 배열 (Polarity)

2. 이진수(Binary)

3. 디지털입력(Digital Input)

4. 풀업저항(Pull-up Resistor)

5. For문(For Loops)

6. 일정시간이 지났는지 확인하기(Measuing Elapsed Time)

▶ 이번 프로젝트를 마치고 나면 여러분들은

1. 부저를 사용해서 소리를 만들수 있습니다.

2. 디지털입력 기능을 사용해서 버튼이 눌렸는지 확인할 수 있습니다.

3. 간단한 게임을 스스로 만들 수 있습니다.

이번 실습에서 여러분들은 아두이노(레드보드)와 부저를 사용해서 음악을 만들어 재생시키기 위해 배열을 사용하는 방법을 학습하게 됩니다.

아두이노 부저 소리 키우기 - adu-ino bujeo soli kiugi

이번 실습에서 사용할 회로

【준비물】 :가변저항, 피에조부저, 점퍼와이어 4개

아두이노 부저 소리 키우기 - adu-ino bujeo soli kiugi

【부품설명】

1. 부저 (Buzzer): 부저는 플라스틱케이스 안에 금속판과 자력에 따라 진동하는 자석코일을 넣어 전기 신호가 발생할 때 금속판이 진동하도록 만든 부품입니다. 코일에 전기신호를 보낼 때 다른 주기로 코일을 진동시키면 다른 주파수(피치)의 소리가 생성이 됩니다. 가변저항기를 부저의 출력에 연결하면 부저를 통해 흐르는 전기의 양을 제한할 수 있고 이말은 가변저항기를 결국 볼륨스위치로 작동하게 할 수 있다는 의미입니다.

아두이노 부저 소리 키우기 - adu-ino bujeo soli kiugi

부저 사진

【이번실습에서 새롭게 알아야 할 지식】

1. 리셋버튼(Reset Button): 아두이노(레드보드)는 내장 리셋버튼을 가지고 있는데요. 이 버튼은 보드를 리셋시키고 업로드한 코드를 처음부터 다시 시작하게 하는 기능을 합니다. 코드로 치자면 setup()함수부터 새로 시작하게 됩니다.

아두이노 부저 소리 키우기 - adu-ino bujeo soli kiugi

리셋버튼

2. Tone함수(Tone Function): 부저를 사용하기 위해서 아두이노(레드보드)의 tone 함수를 사용하면 되는데요. 이 함수는 지정된 핀에 특정한 주파수의 주파수를 생성해낸다는 점에서 이점 실습에서 배웠던 pwm과 비슷합니다. 음의 재생을 제어할 수 있도록 주파수와 주기를 tone()함수의 parameter로 전달할 수 있고 완전히 음을 정지시킬 때는 noTone()함수를 사용할 수 있습니다. tone()함수는 pwm과는 다르게 어느 디지털 핀이라도 사용이 가능합니다.

3. 배열(Arrays): 배열은 일종의 변수입니다. 하지만 여러개의 값을 저장할 수 있다는 점에서 일반적인 변수와 차이가 있습니다. 가장 기초적인 형태의 배열은 일렬로 자료를 나열해 놓은 형태입니다. 예를들어 계 이름(도, 레, 미, 파, 솔, 라, 시, 도)에 대한 각 주파수를 저장한다고 생각해 보면 우리는 간단히 7개의 변수를 만들고 그 변수에 각각 주파수를 할당하면 됩니다. 하지만 그것보다 더 간단한 방법은 변수를 사용해서 7개의 주파수를 한번에 같은 변수에 저장하는 것입니다. 배열에서 특정한 계이름 값을 꺼내려면 배열의 색인넘버를 사용하면 되는데요. 배열의 색인넘버는 0부터 시작합니다. 따라서 계이름 배열에서 첫번째 요소인 '도'에 해당하는 주파수를 꺼내려면 array name[0]; 으로 '래'에 해당하는 주파수는 array name[1]; 과 같은 방식을 사용하면 됩니다. 자세한 방법은 아래 표를 참고해 주세요.

계이름

주파수 (Hz)

7개의 변수로 만들 경우

배열을 사용할 경우

220

aFrequency

frequency[0]

247

bFrequency

frequency[1]

261

cFrequency

frequency[2]

294

dFrequency

frequency[3]

330

eFrequency

frequency[4]

349

fFrequency

frequency[5]

392

gFrequency

frequency[6]

【회로연결】

부저(buzzer)는 극성이 있는 부품입니다. 부저의 각각의 다리 중 어느쪽이 (+)인지 어느쪽이(-)인지 확인하시려면 부저의 다리가 있는 쪽이 위로 올라오게 반대로 돌려서 가운데에 써있는 표시를 확인해 보시면 됩니다. 부저의 (+)쪽 다리에는 작은 글씨로 (+)라고 써있는 것을 확인하실수 있습니다.

아두이노 부저 소리 키우기 - adu-ino bujeo soli kiugi

아두이노 부저 소리 키우기 - adu-ino bujeo soli kiugi

부저의 극성 확인

볼륨조절(Tone Function)

프로젝트2: 소리 에서 다루는 모든 실습에서는 가변저항기를 볼률조절기로 사용할 것입니다. 따라서 가변저항기의 두 핀만이 이 회로에서 사용될 수 있도록 회로 연결시 확인해 주십시오.이 실습에서 가변저항기는 스피커에 흐르는 전체 전류를 제어하기 때문에 레버를 돌릴는 것에 따라 소리크기를 다르게 만들 수 있습니다. 이는 이전 실습1-1에서 LED의 전류를 제한하기 위해 저항을 사용했던 것과 원리적으로 동일합니다. 다 준비가 되셨다면 직접 연결해 봅시다.

아두이노 부저 소리 키우기 - adu-ino bujeo soli kiugi

실체도

아두이노 부저 소리 키우기 - adu-ino bujeo soli kiugi

회로도

**부품이 복잡해지다보면 실체도보다 회로도로 보시는 것이 편해지는 시점이 옵니다. 회로도 보는 방법을 연습하시길 당부드립니다.

【스케치 파일 업로드하기】

코드를 열기위해서는 파일>예제>SIK_Guide_Code-V_4>Sik_Circuit_2A-Buzzer 을 클릭하시면 됩니다.

아니시면 아래 코드를 그대로 복사하셔서 아두이노의 개발창에 붙여넣으셔도 됩니다. 코드가 준비되셨다면 업로드버튼을 누르고 회로에 어떤 일이 일어나는지 확인해 봅시다.!

/* SparkFun Inventor’s Kit Circuit 2A - Buzzer 10번 핀에 연결된 부저 사용해서 음재생하기 */ int speakerPin = 10; //부저가 연결될 핀 void setup() { pinMode(speakerPin, OUTPUT); //스피커를 출력으로 설정 } void loop() { play('g', 2); //해 play('g', 1); //피 play('a', 4); //벌쓰 play('g', 4); //데이 play('C', 4); //투 play('b', 4); //유 play(' ', 2); //2박자 동안 대기 play('g', 2); //해 play('g', 1); //피 play('a', 4); //벌쓰 play('g', 4); //데이 play('D', 4); //투 play('C', 4); //유 play(' ', 2); //2박자 동안 대기 play('g', 2); //해 play('g', 1); //피 play('G', 4); //벌쓰 play('E', 4); //데이 play('C', 4); //디어 play('b', 4); //유어 play('a', 6); //네임 play(' ', 2); //2박자 동안 대기 play('F', 2); //해 play('F', 1); //피 play('E', 4); //벌쓰 play('C', 4); //데이 play('D', 4); //투 play('C', 6); //유 while(true){} // 노래를 한번만 실행하도록 이 while문을 반복시켜 노래재생을 중시 시킴 } void play( char note, int beats) // 음을 재생하는 함수 생성 { int numNotes = 14; // 우리가 사용할 계이름에 따른 주파수 저장 배열에 사용되는 음의 개수 //이 배열은 악보를 저장하는 용도입니다. char notes[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C', 'D', 'E', 'F', 'G', 'A', 'B', ' '}; //이 배렬은 악보의 음에 해당하는 주파수를 저장하는 변수입니다. 예를 들어 f음은 175입니다. int frequencies[] = {131, 147, 165, 175, 196, 220, 247, 262, 294, 330, 349, 392, 440, 494, 0}; int currentFrequency = 0; //우리가 배열에서 주파수를 찾을 때 사용할 변수 int beatLength = 150; //한박자의 길이(이 숫자를 변경하면 노래의 템포-재생속도를 올리거나 내릴 수 있습니다.) //각 음에 상응하는 주파수 찾기 for (int i = 0; i < numNotes; i++) // 악보에서 색인넘버 0에서 14까지 돌며 { if (notes[i] == note) // 우리가 재생하고자 하는 음과 같은 음을 배열에서 찾아서 { currentFrequency = frequencies[i]; //재생할 주파수를 그 음에 맞는 주파수로 설정 } } //함수에 전달된 박자 수 만큼 현재 설정한 음의 주파수를 재생 tone(speakerPin, currentFrequency, beats * beatLength); delay(beats* beatLength); //재생 박자 만큼 대기했다가 delay(50); //노래가 더 자연스럽게 들리도록 음 재생 사이에 약간의 지연시간을 줌 } /* 계이름에 따른 주파수 표 Note Frequency (Hz) 도 131 래 147 미 165 파 175 솔 196 라 220 시 247 도 262 래 294 미 330 파 349 솔 392 라 440 시 494 */

【실행결과】

프로그램이 시작되면 부저에서 생일축하노래가 한번 재생되게 됩니다. 다시 노래를 듣고 싶으시면 아두이노(레드보드)에 있는 리셋버튼을 누르시면 됩니다. 볼륨도 가변저항기를 사용해 조절할 수 있습니다.

아두이노 부저 소리 키우기 - adu-ino bujeo soli kiugi

노래가 나오는 모습

【프로그램(소스코드)】

위 소스코드에서 실행하고자 하는 명령어는 다음과 같습니다.

1. play()함수를 사용해서 첫번째음을 해당 박자로 재생하라. (이때 play()함수 내부에서는 해당하는 음을 계이름 배열에서 찾고 그에 해당하는 주파수 값을 주파수 배열에서 찾아서 현재 재생할 주파수 변수에 할당한다. 그리고 나서 tone함수로 해당하는 주파수와 박자를 재생)

2. play()함수를 사용해서 첫번째 음을 해당 박자로 재생하라.

---- 반복 -----

코드

Description

Character Variables: 문자형변수

void play( char note, int beats)

문자형(char)변수는 문자형 자료를 저장할 수 있는 변수입니다. 예들들어 이번 스케치에서 play함수는 두개의 변수를 매개변수로 선언했는데요. 두개의 변수는 각각 재생할 음과 박자였습니다. 이 중 재생할 음은 문자형 변수로 재생할 음을 전달받아서 해당하는 음의 주파수를 배열에서 찾도록 코드를 작성했습니다.

Tone Function: 톤 함수

tone(pin, frequency, duration);

톤 함수는 지정한 핀에 특정한 펄스의 신호를 출력하는 기능입니다. 두번째 인수인 duration은 그 주파수에 해당하는 음을 얼마나 오랬동안 출력할지를 지정합니다. Tone함수는 디지털 핀 모두에 사용할 수 있는 기능입니다.

Declaring an Array: 배열선언하기

배열이름[배열사이즈]; 또는 배열이름[]={배열값}

arrray_name[array_size]; or arrray_name[] = {array elements};

배열을 선언하기 위해서는, 이름을 먼저 쓰고 얼마나 많은 갯수의 자료를 저장할지 숫자로 적거나 배열이름을 쓰고 실제 저장할 배열을 {}안에 콤마(,)로 구분해서 나열하면 됩니다.

Calling an Array: 배열 사용하기

배열이름[색인넘버]

array_name[index #];

배열을 사용하려면 배열에 저장된 값을 색인넘버을 넣어서 원하는 위치의 값을 거내면 되는데요. 배열이름[] 에서 []안에 원하는 위치를 숫자로 입력해 주면 됩니다. 이때 배열의 첫번째 값의 색인넘버가 1이 아니라 0으로 시작된다는 점에 유의해 주세요(배열이름[0];)

【실습과제-더 연습해보기】

§ 노래의 템포(재생속도)를 변경해 보세요.

beatLength변수의 값을 조절해서 전체 노래의 템포를 빠르게 해보고 또 느리게도 해보세요.

§ 새로운 노래로 악보를 만들어서 재생해 보세요.

악보 변수에 새로운 계이름을 넣어서 새로운 노래를 재생하면 됩니다. 음 사이에 음을 재생하지 않는 구간이 필요하시면 악보변수에 있는 ' ' 를 활용하시면 됩니다.

【문제해결】

§ 노래소리가 너무 작거나 너무 커요.

가변저항을 돌려서 소리크기를 조절해 보세요.

§ 어떤 소리도 안들려요.

아두이노(레드보드)의 리셋버튼을 눌러보세요. 그래도 소리가 안들리면 부저를 제대로 연결했는지, 다른 연결에 이상은 없는지 확인해 보세요.