こんにちはみんな、ここ数週間、私はギターへの愛との再接続に取り組んできました。ボックスギターを弾くことは、サックスが引き継がれる数年前に私がリラックスする方法でした。ギターに戻って、3年間めったにコードをかき鳴らさなかった後、私はとりわけ、弦のそれぞれがどのように聞こえるかわからなくなったことを発見しました。その結果、後でダウンロードしたキーボードやモバイルアプリを使わずにギターをかき鳴らすことができませんでした。数週間が経ち、数日前に私のメーカーがやる気になり、Arduinoベースのギターチューナーを作ることにしました。今日のチュートリアルでは、独自のDIYArduinoギターチューナーを作成する方法を共有します。
ギターチューナーのしくみ
電子機器に移る前に、ビルドの背後にある原理を理解することが重要です。アルファベットで示された7つの主要な音符があります。 A、B、C、D、E、F、Gで、通常は最初のAよりも常に1オクターブ高い別のAで終わります。音楽では、最初のAと最後のAのように、これらの音のいくつかのバージョンが存在します。これらの音ピッチと呼ばれる音の特徴の1つによって、それぞれのバリエーションと相互に区別されます。ピッチは、音の大きさまたは低さとして定義され、その音の周波数によって示されます。これらの音の周波数はわかっているので、ギターがチューニングされているかどうかを判断するには、特定の弦の音の周波数を、弦が表す音の実際の周波数と比較するだけで済みます。
7つの音符の周波数は次のとおりです。
A = 27.50Hz
B = 30.87Hz
C = 16.35Hz
D = 18.35Hz
E = 20.60Hz
F = 21.83Hz
G = 24.50 Hz
これらのノートの各バリエーションは、常にFxMに等しいピッチにあります。ここで、Fは周波数、Mはゼロ以外の整数です。したがって、前述のように、最初のAより1オクターブ高い最後のAの場合、周波数は次のようになります。
27.50 x 2 = 55Hz。
ギター(リード/ボックスギター)には通常、開いた弦にE、A、D、G、B、Eの音符で示される6本の弦があります。いつものように、最後のEは最初のEより1オクターブ高くなります。これらの音の周波数を使用してギターをチューニングできるようにギターチューナーを設計します。
標準的なギターのチューニングに従って、各弦の音符と対応する周波数を次の表に示します。
文字列 |
周波数 |
表記 |
1(E) |
329.63 Hz |
E4 |
2(B) |
246.94 Hz |
B3 |
3(G) |
196.00 Hz |
G3 |
4(D) |
146.83 Hz |
D3 |
5(A) |
110.00 Hz |
A2 |
6(E) |
82.41 Hz |
E2 |
プロジェクトの流れは非常に簡単です。ギターによって生成された音信号を周波数に変換してから、チューニングされている弦の正確な周波数値と比較します。値が相関すると、ギタリストはLEDを使用して通知されます。
周波数の検出/変換には、3つの主要な段階があります。
- 増幅
- オフセット
- アナログ-デジタル変換(サンプリング)
生成される音声信号は、ArduinoのADCが認識するには弱すぎるため、信号を増幅する必要があります。増幅後、ArduinoのADCが認識できる範囲内に信号を保持して信号のクリッピングを防ぐために、信号の電圧をオフセットします。オフセット後、信号はArduino ADCに渡され、そこでサンプリングされ、その音の周波数が取得されます。
必要なコンポーネント
このプロジェクトをビルドするには、次のコンポーネントが必要です。
- Arduino Uno x1
- LM386 x1
- コンデンサーマイクx1
- マイク/オーディオジャックx1
- 10kポテンショメータx1
- O.1ufコンデンサx2
- 100オームの抵抗x4
- 10オームの抵抗x1
- 10ufコンデンサx3
- 5mm黄色LEDx2
- 5mm緑色LEDx1
- ノーマルオープンプッシュボタンx6
- ジャンパー線
- ブレッドボード
回路図
以下のギターチューナー回路図に示すようにコンポーネントを接続します。
Arduinoの内蔵プルアップ抵抗が使用されるため、プッシュボタンはプルアップ/ダウン抵抗なしで接続されます。これは、回路が可能な限り単純になるようにするためです。
ギターチューナーのArduinoコード
このため、コードの背後にあるアルゴリズムギターチューナープロジェクトが簡単です。特定の弦をチューニングするには、ギタリストは対応するプッシュボタンを押して弦を選択し、開いた弦をかき鳴らします。サウンドは増幅ステージによって収集され、ArduinoADCに渡されます。周波数がデコードされ、比較されます。弦からの入力周波数が指定された周波数よりも低い場合、その弦の黄色のLEDの1つが点灯し、弦を締める必要があることを示します。測定された周波数がそのストリングの規定された周波数よりも高い場合、別の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; inthigherLed = 6; int justRight = 5; #define LENGTH512 バイトのrawData; intカウント;
次は voidsetup() 関数です。
ここでは、スイッチが接続されている各ピンの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(){ 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 ++)sum + =(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); } } } } count = 0; } }
デモビデオとの完全なコードは以下のとおりです。コードをArduinoボードにアップロードして、かき鳴らします。