[아두이노 강좌] 10. 소리 만들어 음악 연주하기

이번 게시글에서는 아두이노를 가지고 소리를 만들어 내는 법에 대해 살펴보 겠습니다. 먼저 아두이노가 음계를 연주하도록 만든 다음에 이것을 포토셀과 결합하여 조도에 따라 음을 연주하도록 만들어 보겠습니다.

overview.jpg

음계 연주하기

음계를 연주하기 위해서 피에조 버저하나를 준비하고 브레드보드에 피에조 버저를 꼽은 다음 피에조버저의 핀 하나를 GND에 연결하고 다른 하나를 디지털 핀 12에 연결합니다.

just_sounder.jpg
fritzing.jpg

위의 그림 참조

  1. int speakerPin = 12;
  2. int numTones = 10;
  3. int tones[] = {261, 277, 294, 311, 330, 349, 370, 392, 415, 440};
  4. // mid C C# D D# E F F# G G# A
  5. void setup()
  6. {
  7. for (int i = 0; i < numTones; i++)
  8. {
  9. tone(speakerPin, tones[i]);
  10. delay(500);
  11. }
  12. noTone(speakerPin);
  13. }
  14. void loop()
  15. {
  16. }

특정 음을 연주하기 위해서는 주파수를 정해 주어야 합니다. 각각의 음은 서로 다른 주파수를 가지고 있고 배열에 저장이 되어 있습니다. 배열에 있는 음을 순서대로 연수하면 음계를 연주할 수 있습니다.

for loop문에서 각각의 음은 tone[i]를 사용하여 연주합니다. 아두이노 함수 tone()은 두 개의 파라메터를 가지는데 처음 값은 음을 플리이할 스피커핀이며, 다른 것은 플레이할 음의 주파수 입니다.

모든 음이 연주가 되면 noTone함수가 연주되고 있는 음을 멈추게 됩니다.

for loop는 메인 loop문 안에 위치하여도 되지만 setup함수안에 위치시켜 한번만 플레이 되게 만들어 놓았습니다. 또 한번 연주되는 음을 듣고 싶으면 아두이노의 리셋버튼을 누르십시오.

소리

소리파동은 공기압의 진동입니다. 진동의 속도가 소리를 만들게 되는 것이죠. 높은 주파수의 진동이 더 높은 피치를 내게 됩니다.

sound.png

C 음은 보통 277Hz로 정의 되어 있습니다. 디지털 출력을 277번 on/off 시키면 C음을 얻을 수 있는데 이 소리를 들을려면 전기적인 신호를 파동으로 바꾸어주는 무언가를 연결해야 합니다. 이것이 스피커 혹은 피에조 버저가 됩니다.

비에조 버저는 전기적인 신호에 늘어났다 줄어드는 특별한 크리스탈을 사용하여 우리가 들을 수 있는 소리를 만들어 냅니다.

빛에 따라 연주하는 아두이노

아래와 같이 브레드 보드를 셋업합니다.

fritzing2.jpg

아두이노 코드

다음의 아두이노 코드를 업로드합니다.

  1. int speakerPin = 12;
  2. int photocellPin = 0;
  3. void setup()
  4. {
  5. }
  6. void loop()
  7. {
  8. int reading = analogRead(photocellPin);
  9. int pitch = 200 + reading / 4;
  10. tone(speakerPin, pitch);
  11. }

이 스케치 코드는 매우 간단합니다. 단순히 A0에서 조도값인 아날로그 값(0~700)을 읽어서 4로 나눈뒤 200을 더하여 제일 낮은 주파수를 200Hz로 만들고 플레이 시키는 코드입니다. 주파수대역은 200Hz~370Hz가 되게 됩니다. 포토셀앞에서 손을 흔들어 음악을 플레이하여 보십시오.

 

Comments