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).
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).
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:
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.
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.
*nu am atasat schema Eagle intrucat am folosit o varianta free cu care nu o puteam salva :)
Datasheet
Laboratorul de intreruperi
http://www.reconnsworld.com/audio_simplepreamp.html
http://www.myplace.nu/avr/gtuner/index.htm