Autorul poate fi contactat la adresa: Login pentru adresa
Tuner-ul va prelua semnalul input de la chitara si il va filtra pentru a elimina zgomotul si frecventele nedorite. Utilizatorul va putea schimba nota curenta folosind butoanele de control. Pe ecranul LCD se va afisa intr-un mod sugestiv cat de “departe” este utilizatorul de nota respectiva.
Schema bloc:
Pentru obtinerea semnalului de la chitara folosesc ADC-ul integrat in AtMega324 in modul diferential cu un gain de 10x. Pentru a elimina zgomotul datorat masurarii semnalului, am conectat la GND-ul placii de paza pinul la care este conectat GND-ul jack-ului de chitara. De asemenea, am adaugat si un filtru trece sus care va elimina frecventele nedorite sub ~70kHz.
Pentru afisaj am folosit un LCD Text 2×16 ce are un controller HD44780 similar celui folosit la laborator.
In urma mai multor testari, am ajuns la concluzia ca este nevoie si de un amplificator pentru semnalul de la chitara. Google nu m-a lasat la greu si am gasit cateva link-uri cu circuite de intrare pentru astfel de situatii. In final, am implementat circuitul de la acest link. Am updatat si lista de piese.
Pentru interfatarea LCD-ului 16 x 2 am pornit de la codul din laboratorul 2, schimband pinii din fisierul .h astfel incat sa se potriveasca cu cei de pe placuta.
Pentru detectia frecventei am implementat algoritmul de la acest link. Am utilizat ADC-ul cu tensiunea de referinta interna de 2.56V, setat pe modul auto-trigger, cu un prescaler de 32 si cu bitii aliniati la stanga (necesar pentru algoritmul de detectie a frecventei):
// Set reference voltage ADMUX |= (1 << REFS1) | (1 << REFS0); // Left align the ADC value // so we can read highest 8 bits from ADCH register only ADMUX |= (1 << ADLAR); // Set ADC clock with 32 prescaler- 16mHz/32=500kHz ADCSRA |= (1 << ADPS2) | (1 << ADPS0);
Algoritmul de detectie este preluat intr-o varianta modificata, urmarind intructiunile din acest tutorial. Algoritmul este implementat in rutina de tratare a intreruperii de ADC si functoneaza numarand timpul dintre 2 treceri ascendente ale semnalului prin punctul de mijloc (2.5V). Algoritmul tine cont si de zgomot si foloseste un buffer de astfel de treceri, pentru a putea determina exact perioada.
Tuner-ul foloseste perioada determinata de algoritm pentru a calcula frecventa. Am folosit un vector in care am retinut frecventele pentru notele din tuning-ul standard. Pe display am afisat nota curenta si pana la 4 sageti (<, >), care sa sugereze directia si distanta pana la acordarea corecta. Daca frecventa corecta este atinsa se afiseaza 'OK!'. Am considerat in afisarea sagetilor mai multe praguri de eroare:
Pentru selectia notei dorite am folosit butonul de pe placuta, conectat la pinul PD6, care selecteaza ciclic urmatoarea nota. Pentru apasarea butonului am folosit o tehnica de debouncing ca cea prezentata la curs:
if (buttonState != ((PIND & (1 << PD6)) == 0)) { // Button debounce --> din curs if (TCNT1 - lastEvent > DELAY) { buttonState = ((PIND & (1 << PD6)) == 0); if (buttonState) { // Toggle led to signal that // the note was changed PORTD ^= (1 << PD7); current_note = (current_note + 1) % NOTES; } lastEvent = TCNT1; } }
Frecventa este determinata corect, deci tuner-ul este complet functional. Pentru testarea acestuia am dezacordat chitara si am reacordat cu tuner-ul, verificand apoi ca notele sunt corecte cu un tuner pe telefon. Am intampinat dificultati la realizarea unui circuit de intrare functional, si nu am mai ramas cu mult timp, asa ca nu am mai adaugat si cele 2 butoane suplimentare pentru selectia notelor(am folosit doar butonul de pe placuta).
Imagini cu proiectul:
Proiectul a fost interesant si am invatat destul de multe despre prelucrarea semnalelor analogice. Algoritmul implementat pentru detectia frecventei si circuitul de amplificare si filtrare au functionat foarte bine (thanks Google), si am ramas cu un tuner pe care chiar il pot folosi.