Introducere

Proiectul consta intr-un tuner de chitara acustica ce are rolul de a usura acordarea acesteia.

Motivul alegerii proiectului este chiar dorinta mea de a avea un asemenea aparat pentru chitara mea.

La prelevarea unei frecvente, aceasta va fi comparata cu 6 valori bine stabilite pentru fiecare coarda (practic va fi un interval de [Frecventa_coarda-E, Frecventa_coarda+E)). In momentul in care frecventa va fi incadrata intr-unul din aceste intervale, se va aprinde led-ul de LOW daca valoarea este mai mica decat valoarea corzii, led-ul de HIGH daca este mai mare decat valoarea de referinta a cozii, respectiv ambele leduri daca este aproximativ egala cu cea de referinta. Modul acesta de acordare presupune ca utilizatorul sa aiba o oarecare ureche muzicala, si nu face de exemplu acordul corzii 2 ca fiind coarda 1 (poate exista si acest caz).

Descriere Generala

Pentru ca frecventa prelevata sa se poate compara cu frecventa unei corzi, se procedeaza astfel: se calculeaza frecventa de baza a microcontroller-ului ca fiind raportul dintre frecventa ceasului si prescaler (define-ul BASE_FREQUENCY), iar pentru a afla frecventele corzilor ce vor fi comparate se impart frecventele bine cunoscute a acestora la BASE_FREQUENCY.

La fiecare pas se fac 32 de esantionari a frecventei venita prin pinul PB1, se calculeaza valoarea medie a acesteia, se itereaza cele 6 intervale ale corzilor. Cand se face match cu unul dintre acestea, se vor aprinde pe rand cele 2 led-uri in functie de starea frecventei.

Flow-ul implementarii este urmatorul:

   Microfon Electrolit -> Circuit Preamplificare -> Microcontroller -> Aprindere Corespunzatoare a led-urilor
   

O imagine cu circuitul final este urmatoarea:

* Initial am vrut sa afisez toate informatiile despre o coarda (frecventa reala, frecventa dorita) pe LCD, insa am avut probleme cu afisarea pe acesta (foarte probabil sa nu fie bun LCD-ul).

Hardware Design

Din punct de vedere hardware, am folosit urmatoarele componente: (neluand in seama ledul si rezistenta deja conectate pentru prima etapa): 1 led, rezistente (1 * 1k, 2 * 10k, 1 * 100k), capacitati: 2 * 0.1 uF, tranzistor 2N3904, microfon electrolit.

Schema circuitului de preamplificare pe care l-am folosit este urmatoarea (conectat la PB1):

Schema in Eagle a restului circuitului este:

Software Design

Pentru dezvoltarea software am folosit Programmers Notepad, iar pentru compilare librariile AVRLib.

Frecventele clasice ale corzilor sunt dupa cum urmeaza :

#define E_STRING	164.81
#define A_STRING	220.00
#define D_STRING	293.66
#define G_STRING	391.99
#define B_STRING	493.88			
#define EH_STRING	659.26

Frecventa microcontroller-ului se calculeaza astfel:

#define F_CPU		  16000000        // dupa Quartz
#define PRESCALER	  64
#define BASE_FREQUENCY  (F_CPU/PRESCALER)

Dupa cum am precizat in sectiunile anterioare, frecventele folosite pentru comparare se calculeaza astfel:

unsigned int String_Frequency[] = 
{ 
  BASE_FREQUENCY/EH_STRING,
  BASE_FREQUENCY/B_STRING,
  BASE_FREQUENCY/G_STRING,
  BASE_FREQUENCY/D_STRING,
  BASE_FREQUENCY/A_STRING,  
  BASE_FREQUENCY/E_STRING,
}; 

Intervalele de decizie a corzii ce a fost ciupita se plaseaza la mijlocul frecventei dintre fiecare doua corzi:

unsigned int String_Interval[] =
{
  BASE_FREQUENCY/(B_STRING+(EH_STRING-B_STRING)/2),
  BASE_FREQUENCY/(G_STRING+(B_STRING-G_STRING)/2),
  BASE_FREQUENCY/(D_STRING+(G_STRING-D_STRING)/2),
  BASE_FREQUENCY/(A_STRING+(D_STRING-A_STRING)/2),
  BASE_FREQUENCY/(E_STRING+(A_STRING-E_STRING)/2),
};

Se foloseste o intrerupere in a carei rutina se incrementeaza un contor care practic va avea valoarea frecventei:

volatile unsigned char count_hi; 
SIGNAL(SIG_OVERFLOW0)	
{
   count_hi++;
}

Dupa cum am precizat mai sus, se fac 32 de esantionari a frecventei de input. Deci, de 32 de ori, contorul count_hi va fi setat ca fiind 0, se va astepta setarea bitului de input, si se va aduna la contorul curent al frecventei. Dupa cei 32 de pasi, contorul curent al frecventei se va imparti la 32 (i se va calcula valoarea medie), se va plasa corespunzator intr-un interval si se vor aprinde in functie de caz ledul de high, low sau ambele.

Rezultate Obtinute & Concluzii

Tunerul functioneaza dupa cum era de asteptat, cu o mica problema la capitolul acuratete. Un lucru ce ar fi putut fi imbunatatit este circuitul de preamplificare, care putea fi un pic mai complex.

Arhiva

ionutparaschiv.zip

*nu am atasat schema Eagle intrucat am folosit o varianta free cu care nu o puteam salva :)

Bibliografie

pm/prj2011/rtataroiu/guitar_tuner.txt · Last modified: 2021/04/14 17:07 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0