안녕하세요, 지난 몇 주 동안 저는 기타에 대한 제 사랑을 다시 연결하기 위해 노력하고 있습니다. 박스 기타를 연주하는 것은 색소폰이 자리를 잡기 몇 년 전부터 내가 긴장을 푸는 방법이었습니다. 기타로 돌아가서, 3 년 동안 코드를 거의 연주하지 않은 후, 나는 더 이상 각 현이 어떻게 들려야하는지 알지 못하고 친구의 말에 "내 청력이 더 이상 조율되지 않았습니다"라는 말을 썼다는 사실을 발견했습니다. 그 결과 나중에 다운로드 한 키보드 나 모바일 앱 없이는 기타를 튜닝 할 수 없었습니다. 몇 주가 지나서 내 안에있는 제작자가 동기를 부여 받고 Arduino 기반 기타 튜너 를 만들기 로 결정했습니다. 오늘의 튜토리얼에서는 DIY Arduino Guitar Tuner 를 만드는 방법을 공유 할 것 입니다.
기타 튜너의 작동 원리
전자 제품으로 이동하기 전에 빌드의 원리를 이해하는 것이 중요합니다. 알파벳으로 표시된 7 개의 주요 음표가 있습니다. A, B, C, D, E, F, G는 일반적으로 첫 번째 A보다 항상 높은 옥타브에있는 다른 A로 끝납니다. 음악에서 이러한 음표의 여러 버전은 첫 번째 A와 마지막 A처럼 존재합니다.이 음표 피치라고하는 소리의 특성 중 하나에 의해 각각의 변형과 구별됩니다. 피치 는 소리의 크기 또는 낮음으로 정의되며 해당 소리의 주파수로 표시됩니다. 이 음표의 주파수가 알려져 있기 때문에 기타 조율 여부를 결정하기 위해 특정 현의 음표 주파수를 현이 나타내는 음표의 실제 주파수와 비교하기 만하면됩니다.
7 개의 음표의 주파수는 다음과 같습니다.
A = 27.50Hz
B = 30.87Hz
C = 16.35Hz
D = 18.35Hz
E = 20.60Hz
F = 21.83Hz
G = 24.50Hz
이 음표의 각 변형은 항상 FxM과 동일한 피치에 있습니다. 여기서 F는 주파수이고 M은 0이 아닌 정수입니다. 따라서 앞에서 설명한 것처럼 첫 번째 A보다 옥타브 높은 마지막 A의 경우 주파수는 다음과 같습니다.
27.50 x 2 = 55Hz.
기타 (리드 / 박스 기타)에는 일반적으로 열린 현에 E, A, D, G, B, E 음표로 표시된 6 개의 현이 있습니다. 평소와 같이 마지막 E는 첫 번째 E보다 옥타브가 높습니다.이 음표의 주파수를 사용하여 기타를 조율하는 데 도움이되는 기타 튜너를 설계 할 것입니다.
표준 기타 튜닝에 따라 각 현의 음표와 해당 주파수가 아래 표에 나와 있습니다.
문자열 |
회수 |
표기법 |
1 (E) |
329.63Hz |
E4 |
2 (B) |
246.94Hz |
B3 |
3 (G) |
196.00Hz |
G3 |
4 (D) |
146.83Hz |
D3 |
5 (A) |
110.00Hz |
A2 |
6 (E) |
82.41Hz |
E2 |
프로젝트의 흐름은 매우 간단합니다; 기타에서 생성 된 사운드 신호를 주파수로 변환 한 다음 튜닝되는 스트링의 정확한 주파수 값과 비교합니다. 기타리스트는 값이 상관 될 때 LED를 사용하여 알림을받습니다.
주파수 감지 / 변환에는 3 가지 주요 단계가 포함됩니다.
- 증폭
- 상쇄
- 아날로그에서 디지털로 변환 (샘플링)
생성되는 사운드 신호는 Arduino의 ADC가 인식하기에는 너무 약하므로 신호 를 증폭 해야합니다. 증폭 후 신호 클리핑을 방지하기 위해 Arduino의 ADC가 인식 할 수있는 범위 내에서 신호를 유지하기 위해 신호 전압을 오프셋 합니다. 오프셋 후 신호는 Arduino ADC 로 전달되어 샘플링 되고 해당 사운드의 주파수를 얻습니다.
필수 구성 요소
이 프로젝트를 빌드하려면 다음 구성 요소가 필요합니다.
- Arduino Uno x1
- LM386 x1
- 콘덴서 마이크 x1
- 마이크 / 오디오 잭 x1
- 10k 전위차계 x1
- O.1uf 커패시터 x2
- 100ohms 저항 x4
- 10ohms 저항 x1
- 10uf 커패시터 x3
- 5mm 노란색 LED x2
- 5mm 녹색 LED x1
- 일반적으로 열린 푸시 버튼 x6
- 점퍼 와이어
- 브레드 보드
회로도
아래 기타 튜너 회로 다이어그램에 표시된대로 구성품을 연결하십시오.
Arduino의 내장 풀업 저항이 사용되기 때문에 푸시 버튼은 풀업 / 다운 저항없이 연결됩니다. 이것은 회로를 가능한 한 간단하게하기위한 것입니다.
기타 튜너 용 Arduino 코드
이 기타 튜너 프로젝트 의 코드 뒤에있는 알고리즘 은 간단합니다. 특정 현을 튜닝하기 위해 기타리스트는 해당 푸시 버튼을 눌러 현을 선택하고 열린 현을 연주합니다. 소리는 증폭 단계에서 수집되어 Arduino ADC로 전달됩니다. 주파수가 디코딩되고 비교됩니다. 스트링의 입력 주파수가 지정된 주파수보다 낮 으면 해당 스트링에 대해 황색 LED 중 하나가 켜지 며 스트링을 조여야 함을 나타냅니다. 측정 된 주파수가 해당 스트링에 대해 규정 된 주파수보다 크면 다른 LED가 켜집니다. 주파수가 해당 스트링에 대해 규정 된 범위 내에 있으면 기타리스트를 안내하기 위해 녹색 LED가 켜집니다.
마지막에 완전한 Arduino 코드 가 제공되며 여기서는 코드의 중요한 부분을 간략하게 설명했습니다.
스위치를 보관할 어레이를 만드는 것으로 시작합니다.
int buttonarray = {13, 12, 11, 10, 9, 8}; //
다음으로 각 문자열에 해당하는 주파수를 저장할 배열을 만듭니다.
float freqarray = {82.41, 110.00, 146.83, 196.00, 246.94, 329.63}; // 모두 Hz로 표시
이를 통해 LED가 연결되는 핀과 ADC에서 주파수를 얻는 데 사용될 기타 변수를 선언합니다.
int lowerLed = 7; int higherLed = 6; int justRight = 5; #define LENGTH 512 바이트 rawData; 정수 개수;
다음은 void setup () 함수입니다.
여기서는 스위치가 연결된 각 핀에 대해 Arduino의 내부 풀업을 활성화하는 것으로 시작합니다. 그런 다음 LED가 연결된 핀을 출력으로 설정하고 직렬 모니터를 시작하여 데이터를 표시합니다.
void setup () { for (int i = 0; i <= 5; i ++) { pinMode (buttonarray, INPUT_PULLUP); } pinMode (lowerLed, OUTPUT); pinMode (higherLed, OUTPUT); pinMode (justRight, OUTPUT); Serial.begin (115200); }
다음은 void loop 함수로 주파수 감지 및 비교를 구현합니다.
void loop () { if (count <LENGTH) { count ++; rawData = analogRead (A0) >> 2; } else { 합계 = 0; pd_state = 0; int 기간 = 0; for (i = 0; i <len; i ++) { // 자기 상관 sum_old = sum; 합계 = 0; for (k = 0; k <len-i; k ++) 합계 + = (rawData-128) * (rawData-128) / 256; // Serial.println (sum); // 피크 감지 상태 머신 if (pd_state == 2 && (sum-sum_old) <= 0) { period = i; pd_state = 3; } if (pd_state == 1 && (sum> thresh) && (sum-sum_old)> 0) pd_state = 2; if (! i) { thresh = sum * 0.5; pd_state = 1; } } // Hz로 식별되는 주파수 if (thresh> 100) { freq_per = sample_freq / period; Serial.println (freq_per); for (int s = 0; s <= 5; s ++) { if (digitalRead (buttonarray) == HIGH) { if (freq_per-freqarray <0) { digitalWrite (lowerLed, HIGH); } else if (freq_per-freqarray> 10) { digitalWrite (higherLed, HIGH); } else { digitalWrite (justRight, HIGH); } } } } 개수 = 0; } }
데모 비디오 가 포함 된 전체 코드 는 다음과 같습니다. Arduino 보드에 코드를 업로드하고 멀리 떨어지십시오.