디시인사이드 갤러리

마이너 갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

[일반] 피에조 부저 2개를 이용해서 화음내기

칸타빌레(221.141) 2024.01.05 23:38:54
조회 595 추천 1 댓글 6
														

피에조 수동 부저를 이용해서 tone() 함수로 멜로디 연주하는 예제는 돌려봤지?

tone() 함수로는 하나의 부저(혹은 스피커)만 제어할 수 있어서 화음은 힘들더라.

그래서 tone()을 사용하지 않고 여러음을 동시에 내는 예제를 만들어봤다. 원리는 무한루프를 최대한 빨리 돌면서 주파수만큼 0, 1을 반복하는거.


아두이노 우노에서는 초당 겨우 6000번 정도 루프가 돌아서 좀 둔탁한 소리가 나오는데 새로 나온 아두이노 우노 Rev4에서 실행하면 15만번 정도 돌아서 깨끗하게 화음이 됨.
Rev4에서는 부저를 3개 이상으로 늘려서 더 풍부한 음악도 가능할 것 같음.
25배 정도 성능 차이가 나는건데 long 타입의 나눗셈이 많아서 그 정도로 차이가 벌어진 듯.
 

D3, D4에 300옴 저항이랑 피에조 부저를 각각 하나씩 단 간단한 회로라 회로도는 생략한다.

(피에조 부저나 스피커가 하나 밖에 없으면 D3, D4를 하나의 피에조 부저에 같이 연결해도 동작한다.) 


소스는 아래와 같다.

#include <string.h>


const long NOTE_C4 = 1000000 / 262;
const long NOTE_D4 = 1000000 / 294;
const long NOTE_E4 = 1000000 / 330;
const long NOTE_F4 = 1000000 / 349;
const long NOTE_G4 = 1000000 / 392;
const long NOTE_A4 = 1000000 / 440;
const long NOTE_B4 = 1000000 / 494;
const long NOTE_C5 = 1000000 / 523;
const long NOTE_D5 = 1000000 / 587;
const long NOTE_E5 = 1000000 / 659;
const long NOTE_F5 = 1000000 / 698;
const long NOTE_G5 = 1000000 / 784;
const long NOTE_A5 = 1000000 / 880;
const long NOTE_B5 = 1000000 / 988;

const int SPK1_PIN = 3;
const int SPK2_PIN = 4;
const char* TRACK_1 = "  GGGGAAAAGGGGEEE GGEEDDEECCCCCCC ";
const char* TRACK_2 = "  cgegcafacgegagegcgegfdggcgegccc ";
const size_t TRACK_LENGTH = strlen(TRACK_1);

unsigned long g_ulTempo = 240;
unsigned long g_ulTick = 60000000 / g_ulTempo;
unsigned long g_ulLastSec;
unsigned long g_ulLoopCount;
unsigned long g_ulSecFirstLoopCount;

void setup() {
  Serial.begin(9600);
  while (!Serial) {}
  pinMode(SPK1_PIN, OUTPUT);
  pinMode(SPK2_PIN, OUTPUT);
}
     
void loop() {
  unsigned long ulMicro = micros();
  unsigned long ulTicks = ulMicro / g_ulTick;

  if (ulTicks < TRACK_LENGTH) {
    unsigned long ulTiming = ulMicro % g_ulTick;
    unsigned long ulSec = ulMicro / 1000000;

    g_ulLoopCount++;
    if (g_ulLastSec != ulSec) {
      Serial.print(g_ulLastSec);
      Serial.print(": ");
      Serial.print(g_ulLoopCount - g_ulSecFirstLoopCount);
      Serial.println(" ticks / microSec.");

      g_ulLastSec = ulSec;
      g_ulSecFirstLoopCount = g_ulLoopCount;
    }

    char c1 = TRACK_1[ulTicks];
    char c2 = TRACK_2[ulTicks];
    unsigned long ulPitch1 = 0;
    unsigned long ulPitch2 = 0;

    switch (c1) {
      case 'C': ulPitch1 = NOTE_C5; break;
      case 'D': ulPitch1 = NOTE_D5; break;
      case 'E': ulPitch1 = NOTE_E5; break;
      case 'F': ulPitch1 = NOTE_F5; break;
      case 'G': ulPitch1 = NOTE_G5; break;
      case 'A': ulPitch1 = NOTE_A5; break;
      case 'B': ulPitch1 = NOTE_B5; break;
    }
    switch (c2) {
      case 'c': ulPitch2 = NOTE_C4; break;
      case 'd': ulPitch2 = NOTE_D4; break;
      case 'e': ulPitch2 = NOTE_E4; break;
      case 'f': ulPitch2 = NOTE_F4; break;
      case 'g': ulPitch2 = NOTE_G4; break;
      case 'a': ulPitch2 = NOTE_A4; break;
      case 'b': ulPitch2 = NOTE_B4; break;
    }
    if (ulPitch1 == 0) {
      digitalWrite(SPK1_PIN, LOW);
    } else {
      if ((ulTiming % ulPitch1) < (ulPitch1 / 2)) {
        digitalWrite(SPK1_PIN, HIGH);
      } else {
        digitalWrite(SPK1_PIN, LOW);
      }
    }
    if (ulPitch2 == 0) {
      digitalWrite(SPK2_PIN, LOW);
    } else {
      if ((ulTiming % ulPitch2) < (ulPitch2 / 2)) {
        digitalWrite(SPK2_PIN, HIGH);
      } else {
        digitalWrite(SPK2_PIN, LOW);
      }
    }
  } else {
    delay(1000);
  }
}


추천 비추천

1

고정닉 1

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 말머리 제목 글쓴이 작성일 조회 추천
- 설문 이번주 설문은 탈모 걱정 없어 보이는 머리숱 금수저 스타는? 운영자 25/07/14 - -
- AD 휴대폰 액세서리 SALE 운영자 25/07/15 - -
6265 일반 아두이노 uno R4 배터리 어떤거 써요?? [2] ㅇㅇ(218.235) 03.18 117 0
6264 질문 종합설계 때문에 장치 질문 드립니다 [2] 위잉(223.39) 03.18 91 0
6263 일반 간단한 아두이노 질문좀 드려도 될까요? [7] ㅇㅇ(118.235) 03.17 165 0
6262 일반 학교 동아리 활동때 쓸 아두이노 추천좀...(뭘 만들진 본문참조) [5] 니가생각나는밤갤로그로 이동합니다. 03.16 130 0
6261 일반 PDLC에 관해 oracle/SPARC갤로그로 이동합니다. 03.15 141 2
6260 질문 PDLC 써본 사람 있나? [2] ㅇㅇ(59.17) 03.15 146 0
6258 일반 아두이노로 뭐 만들려고 하는데 도움좀 [2] ㅇㅇ갤로그로 이동합니다. 03.14 104 1
6257 일반 아두이노로 벅컨버터 전압을 조절하는 방법 [4] oracle/SPARC갤로그로 이동합니다. 03.14 138 4
6256 일반 보드 완성 [2] oracle/SPARC갤로그로 이동합니다. 03.13 102 1
6255 질문 휴대용배터리로 아두이노 전원을 빼려고 했는대 실패했습니다. (수정) [4] 캬루우라라갤로그로 이동합니다. 03.12 131 0
6254 질문 입문자인데 처음 시작을 어떻게 하면 좋을까요? [3] ㅇㅇ(118.235) 03.12 167 0
6253 질문 PC에서 코딩후 업로드하는 방법? [1] 아두이노초보(223.38) 03.12 69 0
6252 질문 ac 서보모터 구동 초보질문 리갤러1646갤로그로 이동합니다. 03.11 55 0
6251 질문 아두이노로 12.6V를 6~8.4V(3~5A)로 전압을 콘트롤 [3] 꼼지락(220.85) 03.11 86 0
6250 일반 멍청하게 암호를 평문으로 저장하던 시대에서 벗어남 oracle/SPARC갤로그로 이동합니다. 03.11 112 1
6249 일반 아두이노 서보모토로 스위치봇 만들기 (질문) [2] 왕초보(218.156) 03.11 108 0
6248 질문 아두이노 공부하기 전에 c언어를 공부하는게 좋을까? [2] Oo(106.101) 03.10 155 0
6247 질문 아두이노 디스코드 강의? [2] oo(61.43) 03.09 99 0
6245 질문 이런 제품들 있을까요 [4] 0000(59.8) 03.05 109 0
6244 질문 아두이노를 이용해 감지 센서를 만들고 싶은데 신박한 주제 있을까여?? [2] ㅇㅇ(117.111) 03.05 111 0
6243 일반 아두이노 제발 한번만 도와주세요 [1] ㅇㅇ(118.235) 03.03 144 0
6242 일반 esp32 카메라 화면 opencv로 불러오기 [1] ㅋㄱ(61.76) 03.03 115 0
6241 일반 esp32 배터리 뭐 사야 하나요? [2] ㅇㅇ(118.39) 03.03 172 0
6240 일반 요청받아서 PCB 제작중... [4] oracle/SPARC갤로그로 이동합니다. 03.02 152 4
6239 질문 마우스 드라이버 인식을 못하는데 어캄? [1] a(220.79) 03.02 83 0
6238 일반 마우스 먹통 문제해결한듯한데 ㅇㅇ(112.167) 02.26 76 1
6237 일반 포트에는 뜨는데 마우스 직접움직이는게 먹통 ㅇㅇ(112.167) 02.26 63 0
6236 일반 그래도 유튜브 보면서 이것저것 시도해보니까 리갤러1646갤로그로 이동합니다. 02.25 58 0
6235 질문 아두이노 개초보 도와주십시오 앱인벤터와 hc06 [1] ㅇㅇ(106.101) 02.25 117 0
6234 일반 코드가 없는 아두이노? [8] oracle/SPARC갤로그로 이동합니다. 02.25 595 9
6233 질문 아두이노 초보 질문 ㅇㅇ(118.39) 02.24 60 0
6231 일반 아두이노 호환보드 r3 업로드 오류 [2] 아두이누누(58.228) 02.24 108 0
6230 일반 혹시 mp3 모듈을 강서, 또는 서울에서 주말 중 구매 가능할까요 [2] 봉종(39.7) 02.22 62 0
6229 일반 이거 왜 안되는 거임 [3] ㅇㅇ갤로그로 이동합니다. 02.22 114 0
6228 질문 로드셀 관련해서 질문드립니다 [4] ㅇㅇ(119.65) 02.20 84 0
6226 질문 아두이노 블루투스 핸드폰 연결 안됨 [6] 용산특급갤로그로 이동합니다. 02.19 194 0
6225 일반 입문자가 볼 만한 아두이노 책 추천좀 해주세요 [2] ㅇㅇ(118.39) 02.19 183 0
6224 일반 무코드 아두이노 [5] 안해요갤로그로 이동합니다. 02.18 98 0
6223 일반 님들아 지금 20일에 예비소집가는 중 1의 무코드 아두이노 작품이 [6] 안해요갤로그로 이동합니다. 02.18 86 0
6222 일반 아두이노 무코드로 코딩 [8] 안해요갤로그로 이동합니다. 02.18 158 0
6221 일반 납땜장소 질문 [5] ㅇㅇ(182.227) 02.16 144 0
6220 질문 서버시간 받아오는 방법 [6] ㅇㅇ(49.246) 02.14 86 0
6219 일반 근데 임베디드하는입장에서는 코딩 강의같은거 [3] ㅇㅇ(117.111) 02.07 183 0
6218 일반 아두이노 메가로 작곡기계 만들어보고 있어요 [3] newkinisdev갤로그로 이동합니다. 02.04 110 1
6217 질문 여기다 pcb 물어봐도 되나...? [7] ㅇㅇ(211.235) 02.03 156 0
6216 질문 레오나르도 최저가로 구하려면 어디서 얼마에 사야하나요 [2] ㅇㅇ(118.235) 02.03 111 0
6215 일반 아두이노는 아니지만 간간히 보고있는 재밌을만한것 b.링크/KQuest갤로그로 이동합니다. 02.01 116 0
6213 일반 형들 esp입문해서 만들고 싶은게 있는데 가능할까? [12] ㅇㅇ(220.86) 02.01 188 0
6212 일반 esp32 cam 또오류 나는데 어떻게 하면 되나요 [3] 인터스텔라갤로그로 이동합니다. 01.27 93 0
6211 질문 esp33 cam이거 왜이래요 도와주세요 [22] 인터스텔라갤로그로 이동합니다. 01.26 184 0
뉴스 '에스콰이어' 김재홍 감독 X 박미현 작가가 밝힌 작품을 향한 애정! 디시트렌드 07.14
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2