Autorul poate fi contactat la adresa: Login pentru adresa
Guitar Tuner - despre
Proiectul constă în realizarea unui tuner care va permite utilizatorului să își acordeze chitara. Principiul de funcționare este același cu al oricărui alt tuner: acesta se plasează pe/lângă chitară, iar după lovirea corzii și preluarea sunetului produs de aceasta, va indica pe ecranul LCD cum trebuie ajustată coarda.
Guitar Tuner - motivație
Am ales acest proiect deoarece mereu m-a fascinat chitara și orice ține de ea: de la cum o simplă lovire a corzilor poate produce un sunet deosebit până la modul de funcționare al echipamentului implicat (amplificatoare, acordoare etc). Am decis așadar că un tuner de chitară este proiectul cel mai potrivit pentru mine.
Modul de funcționare este descris prin următoarea schemă bloc: Microfonul va prelua sunetul de la chitară. Acesta va fi analizat în cadrul programului software, iar pe ecranul LCD se vor afișa detalii despre cum trebuie acordată chitara.
LISTĂ PIESE
Componentă | Număr |
---|---|
LCD Text 16×2 - RAYSTAR OPTRONICS RC1602B-GHY-CSXD | 1 |
Microfon | 1 |
Rezistență 10k | 2 |
Rezistență 100k | 1 |
Tranzistor 2N3904 | 1 |
Condensator 0.1uF | 2 |
Elemente de conectică | - |
SCHEMĂ ELECTRICĂ
Pentru realizarea proiectului am folosit avr-gcc instalat pe Linux, iar codul a fost editat în Notepad++ pe Windows, unde am rulat și HIDBootFlash v.1.0
Pentru implementare, am folosit sursele din laboratorul 1 (lab1) pentru LCD pe care le-am modificat pentru a se potrivi.
Software-ul este realizat astfel încât șă permită utilizatorului să selecteze ce coardă (notă) dorește sa acordeze. Acest lucru se face în funcția move_n_select
prin utilizarea butonului care va selecta de pe afișor nota. Ideea aceasta mi-a venit după ce m-am uitat peste câteva din proiectele realizate în anii trecuți.
Ca implementare, am plasat cursorul pe rândul în cauză și l-am deplasat (prin scrierea unui șir vid în locul aferent notei). Pentru a facilita selecția, între note s-a lăsat un spațiu.
LCD_printAt(LINE2_START, "E A D G B EH :) "); LCD_printAt(LINE2_START + note * 2, "" );
În funcție de nota selectată, de la pin-ul de input (PA0) se va prelua semnal și se vor număra întreruperile. Se calculează apoi diferența dintre numărul înregistrat și numărul corect, aferent notei alese, iar în funcție de valoarea diferenței, se afișează pe ecran un mesaj corespunzător.
ISR (PCINT0_vect) { if ((PINA & (1 << PA0)) == 0) { counter++; } }
diff = counter - frecv[note];
Frecvențele de refetință sunt cele de pe Wikipedia:
#define E 164.81 #define A 220.00 #define D 293.66 #define G 391.99 #define B 493.88 #define EH 659.26
O altă funcție implementată este start_lcd
care va afișa un mesaj de întâmpinare.
Această implementare nu este foarte precisă, motiv pentru care am încercat și o implementare folosind un ADC de la care preluam semnal, îl transformam și număram fronturile crescătoare. Din cauză că m-am apucat târziu de implementarea acestei idei, nu am putut sa o duc la bun sfârșit. În arhivă se găsește și această implementare. Pentru a încerca această rezolvare, am folosit API-ul din laboratorul 5 (lab6)
În stadiul actual, proiectul este funcțional, însă nu are o foarte mare acuratețe. Am modificat circuitul de intrare cu unul achiziționat și am reușit să-l fac să capteze semnalul ok. Mi-aș fi dorit însă să reușesc să termin implementarea cu ADC, deoarece ar fi fost mult mai precisă, însă dându-mi seama foarte târziu, nu am reușit sa o finalizez.
A fost un proiect interesant, la care m-am bucurat ca am avut ocazia să lucrez. Dacă ar fi să îl iau de la început, aș aborda cea de-a doua idee de implementare.
Arhiva: tda_tuner.zip
Conține:
Things done | |
---|---|
Milestone 1 | alegere temă; schema bloc |
Milestone 2 | placa de bază |
Milestone 3 | lista de piese |
Milestone 4 | schema electrică |
Milestone 5 | realizarea proiectului |
Au urmat apoi: