Sebelum kita pindah ke elektronik, penting untuk memahami prinsip di balik pembuatan. Ada 7 not musik utama yang dilambangkan dengan huruf; A, B, C, D, E, F, G dan biasanya berakhir dengan A lain yang selalu pada oktaf lebih tinggi dari A. pertama Dalam musik beberapa versi catatan ini ada seperti A pertama dan A. terakhir Catatan ini masing-masing dibedakan dari variasi mereka dan dari satu sama lain oleh salah satu karakteristik suara yang dikenal sebagai nada. Lapangan didefinisikan sebagai kenyaringan atau rendahnya suara dan ini ditunjukkan oleh frekuensi suara itu. Karena frekuensi nada ini diketahui, bagi kita untuk menentukan apakah gitar disetel atau tidak, kita hanya perlu membandingkan frekuensi nada senar tertentu dengan frekuensi aktual nada yang diwakili oleh senar tersebut.
Frekuensi 7 not musik adalah:
A = 27.50Hz
B =30.87Hz
C = 16,35Hz
D = 18,35Hz
E = 20.60Hz
F = 21.83Hz
G = 24,50 Hz
Setiap variasi dari catatan ini selalu berada di pitch sama dengan FxM di mana F adalah frekuensi dan M adalah bilangan bulat bukan nol. Jadi untuk A terakhir yang seperti dijelaskan sebelumnya, berada pada satu oktaf lebih tinggi dari A pertama, frekuensinya adalah;
27,50 x 2 = 55Hz.
Gitar (gitar Timbal / kotak) biasanya memiliki 6 senar yang dilambangkan dengan nada E, A, D, G, B, E pada senar terbuka. Seperti biasa, E terakhir akan berada pada satu oktaf lebih tinggi dari E. pertama. Kami akan merancang tuner gitar kami untuk membantu menyetel gitar menggunakan frekuensi catatan ini.
Menurut penyetelan gitar standar, nada dan frekuensi masing-masing senar ditampilkan pada tabel di bawah ini.
String
|
Frekuensi
|
Notasi
|
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
|

The aliran proyek cukup sederhana; kami mengubah sinyal suara yang dihasilkan oleh gitar ke frekuensi kemudian membandingkannya dengan nilai frekuensi yang tepat dari senar yang sedang disetel. Gitaris diberitahu menggunakan LED ketika nilainya berkorelasi.
Deteksi / konversi frekuensi melibatkan 3 tahap utama;
Memperkuat
Mengimbangi
Konversi analog ke digital (pengambilan sampel)
Sinyal suara yang diproduksi akan terlalu lemah untuk dikenali oleh ADC Arduino sehingga kita perlu memperkuatsinyal. Setelah amplifikasi, untuk menjaga sinyal dalam rentang yang dikenali oleh ADC Arduino untuk mencegah kliping sinyal, kami mengimbangi tegangan sinyal. Setelah diimbangi, sinyal kemudian diteruskan ke ADC Arduino tempat sampel diambil dan frekuensi bunyi tersebut diperoleh.
Komponen yang diperlukan
Komponen berikut ini diperlukan untuk membangun proyek ini;
Arduino Uno x1
LM386 x1
Kondensor Mic x1
Soket Mikrofon / Audio x1
Potensiometer 10k x1
O.1 uF kapasitor x2
100ohms resistor x4
10ohms resistor x1
10 uF kapasitor x3
5mm LED kuning x2
5mm LED hijau x1
Tombol Push Biasanya Terbuka x6
Kabel pelompat
Papan tempat memotong roti
Skema
Hubungkan komponen seperti yang ditunjukkan pada Diagram Sirkuit Gitar Tuner di bawah ini.

Tombol-tombol push terhubung tanpa resistor tarik ke atas / ke bawah karena resistor pull-in bawaan Arduino akan digunakan. Ini untuk memastikan sirkuit sesederhana mungkin.

Kode Arduino untuk Guitar Tuner
Algoritma di balik kode untuk Proyek Tuner Gitar ini sederhana. Untuk menyetel senar tertentu, gitaris memilih senar dengan menekan tombol yang sesuai dan memetik senar yang dimainkan. Suara dikumpulkan oleh tahap amplifikasi dan diteruskan ke Arduino ADC. Frekuensi diterjemahkan dan dibandingkan. Ketika frekuensi input dari string kurang dari frekuensi yang ditentukan, untuk string itu salah satu LED kuning menyala yang menunjukkan bahwa string harus dikencangkan. Ketika frekuensi yang diukur lebih besar dari frekuensi yang ditentukan untuk string itu, LED lain akan menyala. Ketika frekuensi berada dalam kisaran yang ditentukan untuk string itu, LED hijau menyala untuk memandu gitaris .
Kode Arduino lengkap diberikan di akhir, di sini kami telah menjelaskan secara singkat bagian-bagian penting dari kode.
Kami mulai dengan membuat array untuk menahan sakelar
int buttonarray [] = {13, 12, 11, 10, 9, 8}; // [E2, A2, D3, G3, B3, E4]
Selanjutnya, kita membuat array untuk menahan frekuensi yang sesuai untuk masing-masing string.
float freqarray [] = {82.41, 110.00, 146.83, 196.00, 246.94, 329.63}; // semua dalam Hz
Setelah ini selesai, kami kemudian mendeklarasikan pin yang terhubung dengan LED dan variabel lain yang akan digunakan untuk mendapatkan frekuensi dari ADC.
int lowerLed = 7;
int higherLed = 6;
int justRight = 5;
#define LENGTH 512 byte rawData [LENGTH];
int count;
Berikutnya adalah fungsi pengaturan batal () .
Di sini kita mulai dengan mengaktifkan tarikan internal pada Arduino untuk masing-masing pin yang terhubung dengan sakelar. Setelah itu kami mengatur pin yang terhubung dengan LED sebagai output dan meluncurkan monitor serial untuk menampilkan data.
void setup ()
{
for (int i = 0; i <= 5; i ++)
{
pinMode (buttonarray [i], INPUT_PULLUP);
}
pinMode (lowerLed, OUTPUT);
pinMode (higherLed, OUTPUT);
pinMode (justRight, OUTPUT);
Serial.begin (115200);
}
Berikutnya, adalah fungsi void loop , kami menerapkan deteksi frekuensi dan perbandingan .
void loop ()
{
if (count <LENGTH)
{
count ++;
rawData [count] = analogRead (A0) >> 2;
}
else {
sum = 0;
pd_state = 0;
int periode = 0;
untuk (i = 0; i <len; i ++)
{
// Autocorrelation
sum_old = jumlah;
jumlah = 0;
untuk (k = 0; k <len-i; k ++) jumlah + = (rawData [k] -128) * (rawData [k + i] -128) / 256;
// Serial.println (jumlah);
// Mesin Deteksi Puncak Peak
jika (pd_state == 2 && (sum-sum_old) <= 0)
{
period = i;
pd_state = 3;
}
if (pd_state == 1 && (jumlah> thresh) && (jumlah-jumlah_old)> 0) pd_state = 2;
if (! i) {
thresh = jumlah * 0,5;
pd_state = 1;
}
}
// Frekuensi diidentifikasi dalam Hz
if (thresh> 100) {
freq_per = sample_freq / period;
Serial.println (freq_per);
for (int s = 0; s <= 5; s ++)
{
if (digitalRead (buttonarray [i]) == HIGH)
{
if (freq_per - freqarray [i] <0)
{
digitalWrite (lowerLed, HIGH);
}
lain jika (freq_per - freqarray [i]> 10)
{
digitalWrite (higherLed, HIGH);
}
else
{
digitalWrite (justRight, HIGH);
}
}
}
}
count = 0;
}
}
The kode lengkap dengan video demonstrasi diberikan di bawah ini. Unggah kode itu ke papan Arduino Anda dan pergilah.
Kode
int buttonarray [] = {13, 12, 11, 10, 9, 8}; // [E2, A2, D3, G3, B3, E4]
// masing-masing pin mewakili string gitar
// selanjutnya kita buat dan susun dengan frekuensi yang cocok dengan masing-masing string di atas
// sehingga ketika 13 dipilih freq cocok dengan perhatikan e dipilih).
float freqarray [] = {82.41, 110.00, 146.83, 196.00, 246.94, 329.63};
// masing-masing pin mewakili string gitar
// selanjutnya kita buat dan susun dengan frekuensi yang cocok dengan masing-masing string di atas
// sehingga ketika 13 dipilih freq cocok dengan perhatikan e dipilih).
float freqarray [] = {82.41, 110.00, 146.83, 196.00, 246.94, 329.63};
// sll in Hz
int lowerLed = 7;
int higherLed = 6;
int justRight = 5;
int higherLed = 6;
int justRight = 5;
# tentukan PANJANG 512
byte rawData [LENGTH];
int count = 0;
int count = 0;
// Frekuensi Sampel dalam kHz
const float sample_freq = 8919;
int len = sizeof (rawData);
int i, k;
jumlah panjang, jumlah_banyak;
int thresh = 0;
float freq_per = 0;
byte pd_state = 0;
const float sample_freq = 8919;
int len = sizeof (rawData);
int i, k;
jumlah panjang, jumlah_banyak;
int thresh = 0;
float freq_per = 0;
byte pd_state = 0;
void setup () {
for (int i = 0; i <= 5; i ++)
{
pinMode (buttonarray [i], INPUT_PULLUP);
}
pinMode (lowerLed, OUTPUT);
pinMode (higherLed, OUTPUT);
pinMode (justRight, OUTPUT);
Serial.begin (115200);
}
void loop () {
if (count <LENGTH)
{
count ++;
rawData [count] = analogRead (A0) >> 2;
}
else {
sum = 0;
pd_state = 0;
int periode = 0;
untuk (i = 0; i <len; i ++)
{
// Autocorrelation
sum_old = jumlah;
jumlah = 0;
untuk (k = 0; k <len-i; k ++) jumlah + = (rawData [k] -128) * (rawData [k + i] -128) / 256;
// Serial.println (jumlah);
// Mesin Deteksi Puncak Peak
jika (pd_state == 2 && (sum-sum_old) <= 0)
{
period = i;
pd_state = 3;
}
jika (pd_state == 1 && (jumlah> thresh) && (jumlah-sum_old)> 0) pd_state = 2;
if (! i) {
thresh = jumlah * 0,5;
pd_state = 1;
}
}
// Frekuensi diidentifikasi dalam Hz
if (thresh> 100) {
freq_per = sample_freq / period;
Serial.println (freq_per);
untuk (int s = 0; s <= 5; s ++)
{
if (digitalRead (buttonarray [i]) == HIGH)
{
if (freq_per - freqarray [i] <0)
{
digitalWrite (lowerLed, HIGH);
}
lain jika (freq_per - freqarray [i]> 10)
{
digitalWrite (higherLed, HIGH);
}
else
{
digitalWrite (justRight, HIGH);
}
}
}
}
count = 0;
}
}
for (int i = 0; i <= 5; i ++)
{
pinMode (buttonarray [i], INPUT_PULLUP);
}
pinMode (lowerLed, OUTPUT);
pinMode (higherLed, OUTPUT);
pinMode (justRight, OUTPUT);
Serial.begin (115200);
}
void loop () {
if (count <LENGTH)
{
count ++;
rawData [count] = analogRead (A0) >> 2;
}
else {
sum = 0;
pd_state = 0;
int periode = 0;
untuk (i = 0; i <len; i ++)
{
// Autocorrelation
sum_old = jumlah;
jumlah = 0;
untuk (k = 0; k <len-i; k ++) jumlah + = (rawData [k] -128) * (rawData [k + i] -128) / 256;
// Serial.println (jumlah);
// Mesin Deteksi Puncak Peak
jika (pd_state == 2 && (sum-sum_old) <= 0)
{
period = i;
pd_state = 3;
}
jika (pd_state == 1 && (jumlah> thresh) && (jumlah-sum_old)> 0) pd_state = 2;
if (! i) {
thresh = jumlah * 0,5;
pd_state = 1;
}
}
// Frekuensi diidentifikasi dalam Hz
if (thresh> 100) {
freq_per = sample_freq / period;
Serial.println (freq_per);
untuk (int s = 0; s <= 5; s ++)
{
if (digitalRead (buttonarray [i]) == HIGH)
{
if (freq_per - freqarray [i] <0)
{
digitalWrite (lowerLed, HIGH);
}
lain jika (freq_per - freqarray [i]> 10)
{
digitalWrite (higherLed, HIGH);
}
else
{
digitalWrite (justRight, HIGH);
}
}
}
}
count = 0;
}
}
SEKIAN TUTORIAL DARI SAYA
Komentar
Posting Komentar