ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 아두이노 레시피 : 전자피아노 - 기본편
    아두이노 레시피 2025. 2. 28. 15:54

    # Recipe 21. 전자 피아노

    photo by hackster.io

    안녕하세요~ 다시 돌아온 아두이노 셰프입니다!! 저번포스팅에서 꾸준히 한다고 했는데... 요즘 제가 연구에, 수업준비에 정신이 없어서 거의 한 달간 포스팅을 못했네요..ㅠㅠ 앞으로는 꾸준히 올려보도록 할게요!(과연 나는 지킬 수 있을 것인가;;) 메인셰프가 다시 돌아왔습니다. 시작해 볼까요? 한동안은 제가 스케줄이 바빠져서 기초 편 같은 수업형식은 힘들 거 같고, 재미있는 프로젝트 위주로 만들어볼게요. 오늘은 INPUT의 기초를 익힐 수 있는 프로젝트를 해보려고 합니다. 그 주인공은 바로 버튼! 버튼이 쉬운데도, 생각보다 어려워하는 친구들이 많더라고요. 버튼을 이용해서 간단하게 피아노를 만들어볼게요. 이 재료를 완전히 여러 분 걸로 만들어보죠. (이거 키트로도 팔던데.. 키트 한 개당 25,000으로 왜 파는 건지 솔직히 이해 안 되는 1인)

    오늘의 재료 Ingredient


    <메인 재료>

    택트 스위치 (모델명 : DM626)

    피에조 부저[패시브(수동) 부저]

    피에조 부저는 수동부저인 패시브부저와

    능동부저인 액티브부저로 나뉩니다.

    능동부저는 전원만 인가되면 소리가 나는 부저이고

    수동부저는 전원만 인가한다고 해서 소리가 나지 않습니다.

    능동부저는 경보 알림용으로 사용하고

    수동부저는 음계표현할 때에 사용합니다.

    <그 외 재료>

    아두이노 우노

    브레드보드

    4.7kΩ 저항(7개)

    100Ω 저항 (1개)

    수-수 케이블(19개)


    메이킹 방법 Steps

    Step 1. 선 연결하기 Wiring

    a. 택트스위치를 브레드보드에 그림처럼 연결해 줍니다.

    b. 택트스위치의 다리 한쪽은 아두이노의 5V에 연결해 주세요.

    c. 택트스위치의 반대쪽 다리는 4.7kΩ저항을 이용해서 아두이노의 GND와 연결해 주세요.

    d. 저항의 바로 맞은편 다리에 디지털핀을 연결해 주세요.

    (총 7개의 스위치를 연결해 주시면 됩니다.ㅎ)

    (스위치 왼쪽에서부터 11,10,9,8,7,6,5번입니다.)

    e. 피에조 스피커의 -극은 100Ω저항을 이용해서 GND에 연결해 주세요.

    f. 피에조 스피커의 +극은 D12번 핀에 연결해 줍니다.

    (꽤 헷갈리죠..? 그림을 참고해 주세요! )

    - - - - - - - - - -

    Step 2. 아두이노 코드 Code review

    여러분의 요리가 훨씬 간편해질 수 있도록, 숙성이 필요한 코드는 언제나 제가 준비할게요ㅎㅎ

    #define NOTE_C4  262 //'도'에 해당하는 주파수가 262에요.
    #define NOTE_D4  294 //'레'에 해당하는 주파수가 294에요.
    #define NOTE_E4  330 //'미'에 해당하는 주파수가 330에요.
    #define NOTE_F4  349 //'파'에 해당하는 주파수가 349에요.
    #define NOTE_G4  392 //'솔'에 해당하는 주파수가 392에요.
    #define NOTE_A4  440 //'라'에 해당하는 주파수가 440에요.
    #define NOTE_B4  494 //'시'에 해당하는 주파수가 494에요.
    
    void setup()
    {
      for(int x = 5; x<12; x++){ //for 함수를 이용해서 7개의 핀을 모두 INPUT모드로 활성화할게요.
      pinMode(x,INPUT); 
      }
      pinMode(12,OUTPUT); //피에조스피커는 출력을 해야하니 OUTPUT모드로 설정할게요.
    }
    
    void loop()
    {
      // 만약 디지털번핀에서 읽은 디지털신호가 1 즉, HIGH라면 TONE함수를 실행시켜라
      if (digitalRead(11) == HIGH) {
        tone(12, NOTE_C4, 100);
      }
      if (digitalRead(10) == HIGH) {
        tone(12, NOTE_D4, 100);
      }
      if (digitalRead(9) == HIGH) {
        tone(12, NOTE_E4, 100);
      }
      if (digitalRead(8) == HIGH) {
        tone(12, NOTE_F4, 100);
      }
      if (digitalRead(7) == HIGH) {
        tone(12, NOTE_G4, 100);
      }
      if (digitalRead(6) == HIGH) {
        tone(12, NOTE_A4, 100);
      }
      if (digitalRead(5) == HIGH) {
        tone(12, NOTE_B4, 100);
      }
      delay(10); //0.1초만 쉬었다 갈까요?ㅋㅋ
    }

    Step 3. 동작시키기 Working

    ● 코드를 아두이노 우노에 업로드해 주세요.

    ● 스위치를 눌러보세요. 피아노처럼 소리가 나죠?


    코드의 동작 알고리즘

    알고리즘은 쉬운 말로 ‘진행절차’라고 할 수 있습니다.

    코드가 어떻게 동작되는지 알아볼까요?

    구조는 간단합니다.

    버튼을 눌렀을 때

    디지털 신호가 들어온다면

    tone 함수를 이용해서

    피에조 스피커에 소리를 출력한다.

    버튼은 부품만 잘 연결한다면 쉬운 녀석입니다.

    버튼에 대해서 궁금하다면 이전 포스팅,

    풀업저항과 풀다운 편을 참고해 주세요.

    오늘은 tone함수가 처음 등장했네요.

    tone함수는 이름에서도 알 수 있듯이

    소리, 정확히는 주파수를 출력하는 함수입니다.

    각 음계에 해당하는 주파수를

    tone함수를 이용해서 디지털 핀으로 출력합니다.

    tone(디지털핀, 주파수, 시간)

    이렇게 사용하면 됩니다.

    '디지털핀'에는 스피커가 연결된 핀을 입력해 주시고

    '주파수'는 원하는 음역대의 주파수를 입력하면 됩니다.

    저는 조금 더 편하도록

    맨 위에 define으로 음계별 주파수를 미리 정의해 놨습니다.

    그리고 마지막으로 '시간'에는

    소리가 지속될 시간을 설정하면 됩니다.

    밀리세컨드가 단위이기 때문에

    저는 0.1초만 울리게 할 거여서

    '100'으로 지정해 주었습니다.

    알고리즘을 다시 한번 정리하면

    digitalRead로 버튼의 신호를 받고

    IF문을 이용해서, 만약 HIGH신호라면

    TONE함수를 실행시키면 되겠군요.

    버튼 하나당 건반 하나니까

    원하는 건반 수만큼

    코드를 복붙(?) 하면 되겠네요ㅋㅋㅋ

    이렇게 보니까 전자피아노도 별거 아니네요.

Designed by Tistory.