Merhaba arkadaşlar, son haftalarda gitara olan aşkımla yeniden bağlantı kurmaya çalışıyorum. Kutu gitar çalmak, saksafon devralmadan birkaç yıl önce nasıl rahatladım. Gitara geri dönersek, 3 yıl boyunca nadiren bir akor tıngırdattıktan sonra, diğer şeylerin yanı sıra, tellerin her birinin nasıl ses çıkarması gerektiğini artık bilmediğim, arkadaşımın sözleriyle şunu keşfettim, "İşitme duyum artık ayarlanmadı" ve bunun sonucu olarak daha sonra indirdiğim klavye veya mobil uygulama yardımı olmadan gitarı akort edemedim. Haftalar, içimdeki yapımcının motive olduğu ve Arduino tabanlı bir Gitar Akort Aleti yapmaya karar verene kadar birkaç gün önce geçti. Bugünün eğitiminde, kendi DIY Arduino Gitar Tuner'ınızı nasıl oluşturacağınızı paylaşacağım.
Guitar Tuner Nasıl Çalışır?
Elektroniğe geçmeden önce, yapının arkasındaki prensibi anlamak önemlidir. Alfabe ile gösterilen 7 ana müzik notası vardır; A, B, C, D, E, F, G ve genellikle her zaman ilk A'dan bir oktav daha yüksek olan başka bir A ile biter.Müzikte bu notaların birkaç versiyonu ilk A ve son A gibi bulunur. Bu notlar sesin perde olarak bilinen özelliklerinden biri ile her biri kendi varyasyonundan ve birbirinden ayırt edilir. Eğim ses şiddeti ya da düşüklüğü ses ve bu sesin frekansı tarafından belirtilen şekilde tanımlanır. Bu notaların frekansı bilindiğinden, gitarın akort edilip edilmediğini belirlememiz için, yalnızca belirli bir telin notasının frekansını telin temsil ettiği notanın gerçek frekansıyla karşılaştırmamız gerekir.
7 müzik notasının frekansları:
A = 27.50Hz
B = 30,87 Hz
C = 16,35 Hz
D = 18,35 Hz
E = 20.60Hz
F = 21,83 Hz
G = 24.50 Hz
Bu notaların her bir varyasyonu her zaman FxM'ye eşit bir aralıktadır, burada F frekans ve M sıfır olmayan bir tamsayıdır. Böylece, daha önce açıklandığı gibi, ilk A'dan bir oktav daha yüksek olan son A için, frekans;
27.50 x 2 = 55 Hz.
Gitar (Kurşun / kutu gitar) genellikle açık tel üzerinde E, A, D, G, B, E notalarıyla gösterilen 6 tele sahiptir. Her zamanki gibi, son E, ilk E'den bir oktav daha yüksek olacaktır. Gitar akort cihazımızı bu notaların frekanslarını kullanarak gitarı ayarlamaya yardımcı olacak şekilde tasarlayacağız.
Standart gitar akortuna göre, her telin notası ve ilgili frekansı aşağıdaki tabloda gösterilmektedir.
Teller |
Sıklık |
Gösterim |
1 (E) |
329,63 Hz |
E 4 |
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 |
Proje akışı oldukça basittir; Gitarın ürettiği ses sinyalini bir frekansa dönüştürdükten sonra akort edilen telin tam frekans değeri ile karşılaştırıyoruz. Gitarist, değer ilişkili olduğunda bir LED kullanılarak bilgilendirilir.
Frekans algılama / dönüştürme 3 ana aşamayı içerir;
- Geniş olarak açıklama
- Ofsetleme
- Analogdan Dijitale dönüştürme (örnekleme)
Üretilen ses sinyali Arduino'nun ADC'sinin tanıması için çok zayıf olacak, bu yüzden sinyali yükseltmemiz gerekiyor. Amplifikasyondan sonra, sinyalin kesilmesini önlemek için sinyali Arduino'nun ADC'si tarafından tanınabilen aralıkta tutmak için, sinyalin voltajını dengeleriz. Dengelemeden sonra, sinyal daha sonra örneklendiği ve bu sesin frekansı elde edildiği Arduino ADC'ye iletilir.
Gerekli bileşenler
Bu projeyi oluşturmak için aşağıdaki bileşenler gereklidir;
- Arduino Uno x1
- LM386 x1
- Kondenser Mikrofon x1
- Mikrofon / Ses jakı x1
- 10k potansiyometre x1
- O.1 uf kapasitör x2
- 100ohms direnç x4
- 10ohms direnç x1
- 10 uf kapasitör x3
- 5mm sarı LED x2
- 5 mm yeşil LED x1
- Normalde Açık Basma Düğmeleri x6
- Atlama telleri
- Breadboard
Şemalar
Bileşenleri aşağıdaki Gitar Akort Devre Şemasında gösterildiği gibi bağlayın.
Arduino'nun yerleşik pullup dirençleri kullanılacağından, itme düğmeleri yukarı / aşağı çekme dirençleri olmadan bağlanır. Bu, devrenin olabildiğince basit olmasını sağlamak içindir.
Gitar Tuner için Arduino Kodu
Bu Gitar Akort Aleti Projesi kodunun arkasındaki algoritma basittir. Belirli bir dizgiyi akort etmek için, gitarist ilgili basma düğmesine basarak dizeyi seçer ve açık bir dizgiyi çalar. Ses, amplifikasyon aşaması tarafından toplanır ve Arduino ADC'ye aktarılır. Frekansın kodu çözülür ve karşılaştırılır. Diziden giriş frekansı belirtilen frekanstan daha düşük olduğunda, bu dizi için sarı LED'lerden biri dizinin sıkılması gerektiğini belirten yanar. Ölçülen frekans o dizi için öngörülen frekanstan daha büyük olduğunda, başka bir LED yanar. Frekans o tel için öngörülen aralık dahilinde olduğunda, gitaristi yönlendirmek için yeşil LED yanar.
Tam Arduino kodu sonunda verilmiştir, burada kodun önemli kısımlarını kısaca açıkladık.
Anahtarları tutmak için bir dizi oluşturarak başlıyoruz.
int düğme dizisi = {13, 12, 11, 10, 9, 8}; //
Daha sonra, dizelerin her biri için karşılık gelen frekansı tutmak için bir dizi oluşturuyoruz.
float freqarray = {82.41, 110.00, 146.83, 196.00, 246.94, 329.63}; // tümü Hz olarak
Bunu yaptıktan sonra LED'lerin bağlı olduğu pinleri ve ADC'den frekansı elde etmek için kullanılacak diğer değişkenleri açıklıyoruz.
int lowLed = 7; int highLed = 6; int justRight = 5; #define UZUNLUK 512 bayt rawData; int count;
Sonraki void setup () işlevi.
Burada, anahtarların bağlı olduğu pimlerin her biri için Arduino'daki dahili çekişi etkinleştirerek başlıyoruz. Daha sonra LED'lerin bağlandığı pinleri çıkış olarak ayarlıyoruz ve verileri görüntülemek için seri monitörü başlatıyoruz.
void setup () { for (int i = 0; i <= 5; i ++) { pinMode (buttonarray, INPUT_PULLUP); } pinMode (lowerLed, OUTPUT); pinMode (daha yüksekLed, OUTPUT); pinMode (justRight, OUTPUT); Serial.begin (115200); }
Daha sonra, boşluk döngüsü işlevi, frekans algılama ve karşılaştırmayı uygularız.
void döngü () { if (count <LENGTH) { count ++; rawData = analogRead (A0) >> 2; } else { toplam = 0; pd_state = 0; int dönem = 0; for (i = 0; i <len; i ++) { // Otokorelasyon sum_old = toplam; toplam = 0; (k = 0; k <len-i; k ++) toplamı + = (rawData-128) * (rawData-128) / 256; // Serial.println (toplam); // Peak Detect State Machine if (pd_state == 2 && (sum-sum_old) <= 0) { period = i; pd_state = 3; } eğer (pd_state == 1 && (toplam> eşik) && (sum-sum_old)> 0) pd_state = 2; eğer (! i) { eşik = toplam * 0,5; pd_state = 1; } } // Frekans Hz olarak belirlenir ( eşik > 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 - frekans dizisi> 10) { digitalWrite (higherLed, HIGH); } else { digitalWrite (justRight, HIGH); } } } } sayım = 0; } }
Bir tanıtım videosu ile tam kod aşağıda verilmiştir. Kodu Arduino kartınıza yükleyin ve uzaklaşın.