로그인회원등록 내글장바구니주문조회현재접속자
 상품 검색








 게시판 검색





 
 
회원등록 비번분실


온라인 입금계좌
ㆍ기업은행
ㆍ219-043192-01-028
ㆍ이건영

      거래은행 바로가기
 
 Arduino Open Source
아듀이노 함수의 상세설명
작성자 avrtools™        
작성일 2009/10/20
첨부#2 happy_Birthday_pde.zip (81KB) (Down:429)
Link#1 Freqout (Down:216)
ㆍ추천: 0  ㆍ조회: 2656   
  아듀이노의 주파수 출력 함수
제목 : Frequency out
저자 : Paul Badger
 
아듀이노 기판으로 정확한 악기의 음정을 발생하는 함수를 배울 수 있다.
  
구형파로 간단히 단일음(mono poly sound)을 발생하는 함수이다.
아듀이노 기판의 디지털 출력 포트의 주파수을 스피커 혹은 증폭스피커에 연결한다.
예제는 미리보기-표(lookup table)에서 높은 옥타브로 변환하는 함수를 포함한다.

주파수 발생용 아듀이노 스켓치 소스
#include <math.h>  // 부동소수점 연산 라이브러리
#define outpin 4   // 저주파 출력을 스피커나 저주파 증폭기에 연결한다.

int ptime;   // 음정의 시간을 처리하는 변수          
int k, x, dur, freq, t;  // 기타 광역변수들  
int i, j;

float ps; // pow pitchShift 처리용 변수
float noteval;   // 음정의 음높이(note)를 처리하는 변수

// 음정 값은 2 옥타브의 범위이다.
// 다른 옥타브는 2진수의 멱으로 나눈다.
// 영문 대문자 값은 음정값(note) 이며 대입된 숫자는 주파수이다.  
float A = 14080;
float AS = 14917.2;
float B = 15804.3;
float C = 16744;
float CS = 17739.7;
float D = 18794.5;
float DS = 19912.1;
float E = 21096.2;
float F = 22350.6;
float FS = 23679.6;
float G = 25087.7;
float GS = 26579.5;
float A2 = 28160;
float A2S = 29834.5;
float B2 = 31608.5;
float C2 = 33488.1;
float C2S = 35479.4;
float D2 = 37589.1;
float D2S = 39824.3;
float E2 = 42192.3;
float F2 = 44701.2;
float F2S = 47359.3;
float G2 = 50175.4;
float G2S = 53159;
float A3 = 56320;

// 피아노 옥타브에 대응하는 옥타브들의 값 (2진수의 멱)
float oct8 = 4;
float oct7 = 8;
float oct6 = 16;
float oct5 = 32;
float oct4 = 64;
float oct3 = 128;
float oct2 = 256;
float oct1 = 512;
float oct0 = 1024;

// 박자(rhythm ) 값 =즉 음의 발생시간이다.
int wh = 1024;
int h = 512;
int dq = 448;
int q = 256;
int qt = 170;
int de = 192;
int e = 128;
int et = 85;
int dsx = 96;
int sx = 64;
int thx = 32;

// 장조 (major scale)의 음정(note) 변수, 숫자는 옥타브, S가 붙은 변수는 반음이다.
float majScale[] =
{
 A, B, CS, D, E, FS, GS, A2, B2, C2S, D2, E2, F2S, G2S, A3
};

void setup()   // 초기화 함수
{
  Serial.begin(9600);   // 직렬포트를 9600 bps로 설정한다.
}

void loop()    // 아듀이노 스켓치의 주함수 (자동반복하는 main 함수이다)
{
  for(i= 0; i<=11; i++)  // 1번째 반복순환의 시작, i는 0에서 10까지 증가하며 반복된다

    ps = (float)i / 12; // 매 번 새로운 값을 선택한다
    for(x= 0; x<=15; x++)  // 2번째 반복순환의 시작, x는 0부터 14 까지 증가하며 반복된다
    {
     noteval = (majScale[x] / oct4) * pow(2,ps); // 1 옥타브안에서 12개의 음을 선택하여 변환한다
     // 음의 높이를 pow 함수로 발생한다, " * pow(2,ps) " 를 제거한다.
    dur = 100;
    freqout((int)noteval, dur);   // 선택한 음을 발생 주파수와 발생 시간으로 출력한다,
    delay(10);                        // 음 사이의 최소간격 
   }   // 2번째 for의 끝
 }   // 1번째 for의 끝
}  // loop의 끝

// 주함수에서 음의 주파수와 연주시간을 가지고 음을 발생하는 이 함수를 호출해야 한다. 
void freqout(int freq, int t) // 함수로  들어오는 변수는 음높이 주파수 freq는 Hz이며, 음길이 t 는 ms 이다.
{
  int hperiod; // 1/2 주기의 시간 (us) 즉, 하나의 주파수는 2개의 +와 - 파형으로 만든다. 
  long cycles, i;
  pinMode(outpin, OUTPUT); // 출력을 켠다 (+ 파형 출력) 
  hperiod = (500000 / freq) - 7; // 함수처리시간 7us을 보상하기 위해 미리 뺀다
  cycles = ((long)freq * (long)t) / 1000; // 몇번 돌 것인지 계산한다
  // Serial.print(freq);      // 디버그 함수 앞부분의 //를 제거하면 통신포트에서 변수값을 본다.  
  // Serial.print((char)9); // ascii 9는 TAB 이다. (당신의 PC에서도 TAB값이 맞는지 확인하라)
  // Serial.print(hperiod);
  // Serial.print((char)9);
  // Serial.println(cycles);

  for (i=0; i<= cycles; i++) // 음 높이(note)는 us, 음길이는 ms 이다. 
  { 
   digitalWrite(outpin, HIGH);
   delayMicroseconds(hperiod);
   digitalWrite(outpin, LOW);
   delayMicroseconds(hperiod - 1); // 디지털 포트의 오차 1 us을 뺀다
  }
  pinMode(outpin, INPUT); // 다른 작동 잡을믈 제거하기 위해 출력핀을 끈다
}

지속시간의 확장방법
위의 예제에 부분적인 수정을 추가한다.
기본적으로, 지속시간을 갖는 array로 변경하고 마침표 감시를 추가햇다.
함수의 상세한 설명은 없다, 따라서 해 보면 알게 된다.

float EIGHTH = 1;     // 8분 음표
float QUARTER = 2;   // 4분 음표
float DOTTED_QUARTER =3;   // 4 1/2 음표 
float HALF = 4;   // 2분 음표
float ETERNITY =-1;   // 온 음표

float TEMPO = 150;

float majScale[] =
{
  A,QUARTER, B,QUARTER, CS,QUARTER, D,QUARTER, E,QUARTER, FS,QUARTER, GS,QUARTER,
  A2,QUARTER, B2,QUARTER, C2S,QUARTER, D2,QUARTER, E2,QUARTER, F2S,QUARTER,
  G2S,QUARTER, A3,QUARTER, REST,ETERNITY
};

float odeToJoy[] =
{
 F2S,QUARTER, F2S,QUARTER, G2,QUARTER, A3,QUARTER, A3,QUARTER, G2,QUARTER, F2S,QUARTER,
 E2,QUARTER, D2,QUARTER, D2,QUARTER, E2,QUARTER, F2S,QUARTER, F2S,DOTTED_QUARTER, E2,EIGHTH,
 E2,HALF, F2S,QUARTER, F2S,QUARTER,  G2,QUARTER, A3,QUARTER, A3,QUARTER, G2,QUARTER,
 F2S,QUARTER, E2,QUARTER, D2,QUARTER, D2,QUARTER, E2,QUARTER, F2S,QUARTER, E2,DOTTED_QUARTER,
 D2,EIGHTH, D2,HALF, E2,QUARTER, E2,QUARTER, F2S,QUARTER, D2,QUARTER, E2,QUARTER, F2S,EIGHTH, 
 G2,EIGHTH, F2S,QUARTER, D2,QUARTER, E2,QUARTER, F2S,EIGHTH, G2,EIGHTH, F2S,QUARTER, E2,QUARTER,
 D2,QUARTER, E2,QUARTER, A,QUARTER, REST,ETERNITY
};

void play(float song[])
{
   for(x= 0; x<10000; x=x+2) 
  {
    noteval = (song[x] / 64);
    dur = TEMPO * song[x+1];
    if(dur < 0) break;
    freqout((int)noteval, dur);
    delay(10);
 }
}

이 프로그램은 무료 소프트웨어로, 신체와 재산 상의 어떤 위험과 손해를 보상하지 않습니다.
이 프로그램은 GNU 무료 소프트웨어 배포규정을 따릅니다.
Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA

AVRTOOLS™
 
   
  0
9999
윗글 아듀이노 스위치와 LED점등
아래글 One Button Switch Library
    N         제목    글쓴이 작성일 조회 추천
판매상품의 사용설명서는 다른 자료실에,,, avrtools™ 2011/08/30 (화) 1413 0
23 LCD 문자표시 (신형) avrtools™ 2012/04/12 (목) 2028 0
22 아듀이노 멜로디 연주 avrtools™ 2008/08/22 (금) 3376 0
21 아듀이노 4비트 LCD (구형) avrtools™ 2008/09/02 (화) 4218 0
20 아듀이노 가변저항 avrtools™ 2008/08/26 (화) 3029 0
19 직렬 데이터 이동(shift) 출력 avrtools™ 2012/04/10 (화) 1653 0
18 디지털 신호의 펄스폭을 측정하는 함수 avrtools™ 2012/04/10 (화) 1899 0
17 EEPROM 읽기, 쓰기 함수 avrtools™ 2012/04/10 (화) 2203 0
16 변수의 크기 avrtools™ 2012/04/10 (화) 1547 0
15 플레시 메모리에 상수를 저장하고 읽는 함수 avrtools™ 2012/04/10 (화) 1803 0
14 소프트웨어 Serial 함수 avrtools™ 2012/04/10 (화) 1736 0
13 아듀이노 터치스위치 [3] avrtools™ 2008/08/11 (월) 4042 0
12 아듀이노 shiftOut avrtools™ 2008/09/10 (수) 3276 0
11 아듀이노 스위치와 LED점등 avrtools™ 2008/08/13 (수) 4508 0
10 아듀이노의 주파수 출력 함수 avrtools™ 2009/10/20 (화) 2656 0
9 One Button Switch Library avrtools™ 2012/03/09 (금) 1776 0
8 아듀이노 논리연산 avrtools™ 2008/08/26 (화) 2915 0
7 아듀이노 PS2 키보드 읽기 avrtools™ 2008/09/10 (수) 3965 0
6 아듀이노 가로채기 함수 avrtools™ 2008/08/23 (토) 3091 0
5 아듀이노 전용명령 avrtools™ 2008/09/16 (화) 3857 0
4 아듀이노 PWM 출력과 타이머1 전용명령 avrtools™ 2008/08/19 (화) 3475 0
3 8비트 포트의 단일비트 조작방법 avrtools™ 2010/10/30 (토) 2295 0
2 직렬포트에서 문자를 받아 숫자 int로 저장 avrtools™ 2012/04/08 (일) 1628 0
1 직렬통신포트의 초기화 avrtools™ 2012/04/06 (금) 1416 0
1

바구니 : 0
 보관함 : 0
오늘뷰 : 0
HOME   |   회사소개   |   제휴안내   |   회사위치   |   서비스이용 약관   |   개인정보 보호정책   |   사이트맵
17015 경기도 용인시 기흥구 동백중앙로16번길 16-25, 508호. 전화 : 031-282-3310
사업자 등록번호 : 697-47-00075 / 대표 : 이건영 / 업태 : 제조업 / 종목 : LED조명, LED전원, 제어장치.
개인정보 관리책임자 : 홈페이지 관리자 . Copyright ⓒ2016 아크레즈 (ACLEDS INC.)
HOME TOP PREVNEXT 0 0 0