Andrei-Valentin CIUPITU (78557) - Electric Guitar Tuner with LCD

Autorul poate fi contactat la adresa: Login pentru adresa

Introducere

  • Un tuner pentru acordarea standard a chitarii electrice.
  • O chitara electrica neamplificata este greu de acordat folosind tunere cu microfon datorita volumului redus.
  • Folosind acest tuner, acordarea chitarii se poate face rapid, nefiind nevoie de un amplificator sau alte dispozitive.

Descriere generală

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:

Hardware Design

Lista de piese:

  • Placa de baza - 1
  • Mufa Jack 6.3mm mama - 1
  • LCD Text 2 x 16 Hitachi 44780 - 1
  • Butoane pentru control - 2
  • Rezistente 47kΩ - 1, 3kΩ - 1, 1MΩ - 3
  • Condensatoare 1uF - 1, 470nF - 1, 15nF - 1, 100nF - 1
  • LM358 op-amp

Schema electrica:

Intrare

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.

Afisare

Pentru afisaj am folosit un LCD Text 2×16 ce are un controller HD44780 similar celui folosit la laborator.

Control

Pentru navigarea prin lista de note voi adauga 2 butoane conectate la pinii PB1 si PB2.

Later edit

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.

Software Design

Interfatare LCD

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.

Folosire ADC si algoritmul de detectie a frecventei

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.

Logica tuner si afisare pe LCD

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:

  • delta < 1Hz → chitara este potrivit acordata
  • 1 ⇐ delta < 2.5Hz → se afiseaza o sageata in directia corespunzatoare
  • 2.5 ⇐ delta < 5Hz → 2 sageti
  • 5 ⇐ delta < 10 Hz → 3 sageti
  • delta >= 10 Hz → 4 sageti (coarda respectiva este complet dezacordata)

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;
	}
}

Rezultate Obţinute

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:

Concluzii

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.

Download

Jurnal

Bibliografie/Resurse

pm/prj2018/avoinescu/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