디시인사이드 갤러리

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

갤러리 본문 영역

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

칸타빌레(221.141) 2024.01.05 23:38:54
조회 188 추천 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
등록순정렬 기준선택
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 말머리 제목 글쓴이 작성일 조회 추천
2872 설문 연예인 안됐으면 어쩔 뻔, 누가 봐도 천상 연예인은? 운영자 24/06/17 - -
5530 질문 아두이노에 대해 공부해보고 싶은데 ㅇㅇ(58.233) 04.20 48 0
5529 질문 릴레이 외부전원 SMPS [1] ㅇㅇ(211.234) 04.19 56 0
5528 질문 아두이노 와이파이 이용 해볼려는데 초장부터 막혔습니다 [4] ㅇㅇ(118.235) 04.19 75 0
5527 질문 아두이노 esp32 cam 질문 [4] 그렇습니까기린입니다갤로그로 이동합니다. 04.19 70 0
5526 질문 아두이노 우노보드 [2] ㅇㅇ(115.137) 04.19 83 0
5525 질문 우노보드 gnd질문 [3] ㅇㅇ(49.1) 04.18 50 0
5524 질문 저번에 펀치기계 물어본 학생입니다 [4] 마고생(125.243) 04.18 60 0
5523 질문 미세먼지센서 빵판에 연결하고 싶은데 [2] ㅇㅇ(218.150) 04.17 58 0
5522 질문 모터 드라이버 질문 [1] ㅇㅇ(113.198) 04.17 45 0
5520 일반 너네들은 함부로 usb허브에 멀티미터 찍지마라..지인분 돌아가심.. [7] Emeagt갤로그로 이동합니다. 04.17 89 2
5519 질문 전자산업기사 vs 전기산업기사 (feat. 합격난이도) [1] o o(211.44) 04.17 72 0
5518 질문 L289N 모터드라이버 질문 [5] ㅇㅇ(223.39) 04.17 52 0
5517 질문 아두이노로 배터리 쓰면 안터져? [6] ㅇㅇ(222.232) 04.16 81 0
5516 질문 마고생 졸업작품 펀치기계 도와주세요 형님들ㅠㅠ [3] 마고생(118.235) 04.16 99 0
5515 질문 플로팅현상 내가 잘 이해한거 맞음? [1] ㅇㅇ(106.101) 04.16 48 0
5514 질문 모터드라이버 한채널에 모터두개 [2] ㅇㅇ(223.38) 04.15 43 0
5513 일반 전자산업기사 실기 하고 있는데sy-ld213 주파수 발생기 어케 연결해요 [3] ㅇㅇ(115.139) 04.15 61 0
5512 질문 아두이노 외부 신호 질문 [5] ㅇㅇ(112.76) 04.15 48 0
5510 질문 esp32 dw1000 uwb 코드좀 알려주실분 [1] ㅇㅇ(119.201) 04.14 51 0
5509 질문 아두이노 DC모터로 시간 제어 [3] 풀이싫은초식동물(117.17) 04.13 91 0
5507 질문 아두이노 ide 는 켜지는데 그냥 아두이노는 안켜져 ㅇㅇ(118.42) 04.11 33 0
5506 질문 아두이노로 오르막 내리막 등속도 운동하는 자동차 만들기 가능해? [1] ㅇㅇ(218.154) 04.11 37 0
5505 질문 아두이노 구상도를 기업에 팔아도 돼? [1] ㅇㅇ(1.252) 04.11 65 0
5504 질문 쿨링팬 외부 전원 질문드려요. ㅇㅇ(121.158) 04.10 41 0
5503 질문 AA건전지 8개로 30W짜리 부품 둘릴 수 있어? [7] ㅇㅇ(1.252) 04.09 89 0
5502 질문 시리얼 모니터를 새 창으로 열고싶어요.. [5] (14.43) 04.09 52 0
5501 질문 Ardunio 우노 - 이거 사진에 있는거 chip 차이가 있나? [3] 7G(211.44) 04.09 41 0
5500 질문 아두이노 VS 라즈베리파이 (feat. 스파이칩) [7] 7G(211.44) 04.09 79 0
5499 질문 아두이노 블루투스랑 와이파이 연결 [3] ㅇㅇ(175.200) 04.08 66 0
5498 질문 유선 USB 기기를 블루투스로 컨버전 할 수 있을까? [4] 하유은갤로그로 이동합니다. 04.08 42 0
5497 질문 아두이노 우노에 9v 어댑터 연결하면 서보모터 못쓰나요? [1] ㅇㅇ(39.118) 04.07 57 0
5496 질문 시물레이션 프로그램 있어? [1] ㅇㅇ(1.252) 04.06 45 0
5495 질문 esp32 확장보드? 5v 릴레이가 똑바로 작동 안하는데 점퍼핀은 뭐야? [4] ㅇㅇ(218.146) 04.06 75 0
5494 질문 이렇게 회로 만들면 돌아가? ㅇㅇ(1.252) 04.06 44 0
5493 질문 5v 릴레이에 건전지로 12v 줘도 돼? [3] ㅇㅇ(1.252) 04.06 106 0
5492 질문 광센서 500개 연결 가능? [1] dd(210.125) 04.05 49 0
5490 질문 이더넷을 시리얼로 컨버팅 하려면 무조건 IP나 포트입력이 필요한가요? [2] ㅇㅇ(211.228) 04.05 63 0
5489 질문 선생님들 기초적인 질문입니다. (풀업저항회로) [12] ㅇㅇ(59.16) 04.05 106 0
5488 질문 선생님들, 직렬 연결된 보드들의 데이터를 가져오는 게 가능할까요? [5] 팡이(183.107) 04.04 58 0
5487 일반 mcu코딩은 컴공이 잘하냐 전기전자가 잘하냐 [11] 갤로그로 이동합니다. 04.04 126 0
5486 질문 수압이 0이라도 흐를 수 있는 밸브 있어? [2] ㅇㅇ(1.252) 04.04 57 0
5485 질문 수위센서 1개로 2개의 밸브 제어 가능해? [7] ㅇㅇ(1.252) 04.04 74 0
5484 일반 단순 정수를 전송할때 PWM 사용하는것이 간단한데 b.링크/KQuest갤로그로 이동합니다. 04.04 66 1
5483 질문 아두이노 시리얼 관련 [7] 새싹(211.245) 04.03 57 0
5482 질문 선생님들 SoftwareSerial 통신 질문잇슴다 [9] 정신이상해갤로그로 이동합니다. 04.03 95 0
5481 질문 esp32 핀 질문 [2] ㅇㅇ(118.235) 04.03 44 0
5480 질문 라이다센서 어떤거 써야할지 모르겠습니다. [6] ㅇㅇ갤로그로 이동합니다. 04.01 85 0
5477 질문 아두이노 oled랑 MAX7219 동시에 사용못함? [1] ㅇㅇ(121.154) 03.31 42 0
5475 정보 오래켰을때 불안정한 원인이 시리얼때문 일수도 있음 [4] b.링크/KQuest갤로그로 이동합니다. 03.31 297 5
5474 일반 TFT 디스플레이에 보호필름붙이면 [2] 그복갤로그로 이동합니다. 03.31 31 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2