This shows you the differences between two versions of the page.
pm:prj2024:rvirtan:guitar_tuner [2024/04/29 20:56] ioana_calina.pascu created |
pm:prj2024:rvirtan:guitar_tuner [2024/05/27 16:29] (current) ioana_calina.pascu |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Guitar Tuner ====== | ====== Guitar Tuner ====== | ||
+ | <note tip> | ||
+ | * Pascu Ioana-Călina | ||
+ | * 332CD | ||
+ | * Îndrumător: Răzvan Vîrtan | ||
+ | </note> | ||
===== Introducere ===== | ===== Introducere ===== | ||
Proiectul constă în realizarea unui tuner de chitară pentru diferite tipuri de acordare. | Proiectul constă în realizarea unui tuner de chitară pentru diferite tipuri de acordare. | ||
Line 13: | Line 18: | ||
- Se selectează prin intermediul unui buton tipul de acordare \\ | - Se selectează prin intermediul unui buton tipul de acordare \\ | ||
- Programul citește de pe SD frecvențele necesare pentru acordaj \\ | - Programul citește de pe SD frecvențele necesare pentru acordaj \\ | ||
- | - Se selectează prin intermediul unui buton coarda ce urmează să fie acordată \\ | + | - Se iau coardele pe rând de la cea mai mică la cea mare frecvență \\ |
- Utilizatorul ciupește coarda respectivă lângă microfon \\ | - Utilizatorul ciupește coarda respectivă lângă microfon \\ | ||
- Programul compară frecvențele \\ | - Programul compară frecvențele \\ | ||
- Se afișează pe ecranul LCD rezultatul comparației (coarda mai trebuie strânsă/slăbită sau frecvența este corectă) | - Se afișează pe ecranul LCD rezultatul comparației (coarda mai trebuie strânsă/slăbită sau frecvența este corectă) | ||
+ | - Dacă coardele au fost acordate, se afișează un mesaj pe ecran și se trece la ecranul de start \\ | ||
- | ===Schema bloc a modulelor=== | + | ===Schemă bloc a modulelor=== |
- | {{:pm:prj2024:rvirtan:schema_tuner.png?nolink&300|}} | + | {{:pm:prj2024:rvirtan:schema_tuner.png?500|}} |
===== Hardware Design ===== | ===== Hardware Design ===== | ||
<note tip> | <note tip> | ||
- | Aici puneţi tot ce ţine de hardware design: | + | Listă de piese utilizate: |
- | * listă de piese | + | * Arduino UNO3 ATMega328P |
- | * scheme electrice (se pot lua şi de pe Internet şi din datasheet-uri, e.g. http://www.captain.at/electronic-atmega16-mmc-schematic.png) | + | * Breadboard 400 poli |
- | * diagrame de semnal | + | * Cabluri de conexiune |
- | * rezultatele simulării | + | * 2 rezistențe 10k ohmi |
+ | * 2 butoane | ||
+ | * LCD 1602 cu I2C | ||
+ | * amplificator microfon MAX9814 | ||
+ | * modul microSD | ||
</note> | </note> | ||
+ | |||
+ | ===Diagramă de conectare=== | ||
+ | |||
+ | {{:pm:prj2024:rvirtan:schema_gt2.png?700|}} | ||
+ | |||
+ | {{:pm:prj2024:rvirtan:hw_pm_gt.jpg?700|}} | ||
===== Software Design ===== | ===== Software Design ===== | ||
Line 36: | Line 52: | ||
<note tip> | <note tip> | ||
- | Descrierea codului aplicaţiei (firmware): | + | Link pentru repo-ul de Git: https://github.com/ultracln/PM_GUITAR_TUNER |
- | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | + | |
- | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | + | |
- | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | |
- | * (etapa 3) surse şi funcţii implementate | + | |
</note> | </note> | ||
- | ===== Rezultate Obţinute ===== | + | === Mediu de dezvoltare === |
+ | [[https://www.arduino.cc|Arduino IDE]] \\ | ||
- | <note tip> | + | === Biblioteci folosite === |
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | * arduinoFFT.h -> pentru a calcula Transformata Fourier Rapidă (FFT) |
- | </note> | + | * Wire.h, LiquidCrystal_I2C.h -> pentru a comunica și controla un display LCD |
+ | * SD.h, SPI.h -> pentru a comunica cu un card SD | ||
- | ===== Concluzii ===== | + | === Procesul de Transformare a Semnalului Analogic în Frecvență folosind FFT === |
- | ===== Download ===== | + | * Colectarea Datelor de la Microfon |
+ | Semnalul analogic de la microfon este citit în mod repetat pentru a colecta un număr fix de mostre (SAMPLES). Aceste date sunt stocate în vectorul vReal, iar vectorul vImag este inițializat cu zero, deoarece datele inițiale sunt semnale reale fără componentă imaginară. | ||
- | <note warning> | + | '''' |
- | O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-). | + | |
- | Fişierele se încarcă pe wiki folosind facilitatea **Add Images or other files**. Namespace-ul în care se încarcă fişierele este de tipul **:pm:prj20??:c?** sau **:pm:prj20??:c?:nume_student** (dacă este cazul). **Exemplu:** Dumitru Alin, 331CC -> **:pm:prj2009:cc:dumitru_alin**. | + | for (int i = 0; i < SAMPLES; i++) { |
- | </note> | + | microSeconds = micros(); |
+ | vReal[i] = analogRead(micPin); | ||
+ | vImag[i] = 0; | ||
+ | while ((micros() - microSeconds) < samplingPeriod) { | ||
+ | // așteaptă până când trece timpul necesar pentru următoarea mostră | ||
+ | } | ||
+ | microSeconds += samplingPeriod; | ||
+ | } | ||
- | ===== Jurnal ===== | ||
+ | * Aplicarea Ferestrei Hamming | ||
+ | Ferestrele sunt utilizate pentru a reduce efectele marginilor semnalului, care pot produce erori în rezultatele FFT. Fereastra Hamming este aplicată folosind o funcție din librăria FFT. | ||
+ | |||
+ | * Calcularea FFT și determinarea frecvenței dominante | ||
+ | Se calculează FFT pe datele colectate. După ce FFT este calculată, identificăm frecvența cea mai puternică (dominantă) în semnal. Aceasta este frecvența principală a semnalului, care corespunde notei muzicale detectate. | ||
+ | |||
+ | === Utilizarea Rezultatelor FFT pentru Acordare === | ||
+ | În modul de acordare, frecvența calculată este comparată cu frecvența corectă pentru coarda curentă. Mesajele afișate pe LCD informează utilizatorul dacă frecvența este prea joasă, prea înaltă sau corectă. Se trece automat la următoarea coardă odată ce coarda curentă este acordata corect. Când utilizatorul termină de acordat toate coardele, se afișează un mesaj pe LCD și se trece la meniul de start. | ||
+ | |||
+ | === Încărcarea Frecvențelor din Fișiere SD === | ||
+ | Funcția loadTuningFromFile() încarcă frecvențele de acordare dintr-un fișier text de pe cardul SD. Fiecare fișier este de forma "<coardă>,<frecvență>". De exemplu, pentru modul standard: | ||
+ | |||
+ | '''' | ||
+ | E,82.41 | ||
+ | A,110.00 | ||
+ | D,146.83 | ||
+ | G,196.00 | ||
+ | B,246.94 | ||
+ | e,329.63 | ||
+ | |||
+ | ===== Rezultate Obţinute ===== | ||
<note tip> | <note tip> | ||
- | Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | + | În arhiva de mai jos se poate vedea funcționalitatea proiectului pe un exemplu: trec prin cele 6 tipuri de tuning, îl aleg pe cel Standard; în exemplul acesta toate coardele au frecvența corectă, în afară de cea mai înaltă (e), care este dezacordată și are frecvența joasă. Așa cum era de așteptat, pe LCD se afișează mesajul "In tune" când o coardă este acordată, și "Too low"/"Too high" când încerc să acordez "e". |
+ | |||
+ | https://youtu.be/00D2SWCyFtE | ||
</note> | </note> | ||
+ | |||
+ | Codul funcționează cu o marjă de eroare a frecvenței calculate de +- 10Hz, întrucât calculul Transformatei Fourier are uneori rezultate neașteptate din cauza zgomotului. | ||
+ | |||
+ | A trebuit să experimentez cu mai multe valori pentru SAMPLES și SAMPLING_FREQUENCY pentru a găsi o formulă intermediară de calcul a frecvenței finale (adică jumătatea peak-ului), luând în calcul zgomotul. Cu cât valoarea SAMPLES este mai mare, cu atât se obține o medie mai precisă a semnalului în timp, ceea ce ajută la reducerea zgomotului. | ||
+ | |||
+ | Inițial, valorile pentru SAMPLES au fost limitate (multipli de 2, cel mai mare fiind 128) pentru Arduino Uno și se obțineau rezultate foarte depărtate de cele dorite. Cei doi vectori folosiți în calculul FFT ocupau mare parte din capacitatea SRAM a microprocesorului și nu mai rămânea destul spațiu pentru restul variabilelor și a funcțiilor. În punctul acesta, nu era corect nici calculul FFT și nici componentele nu funcționau corespunzător m(. | ||
+ | |||
+ | Deci, am optat pentru un Arduino Mega 2560; cablajul diferă puțin față de cel inițial: | ||
+ | |||
+ | {{:pm:prj2024:rvirtan:starttuning_ex.jpeg?nolink&700|}} | ||
+ | |||
+ | {{:pm:prj2024:rvirtan:tuninga_ex.jpeg?nolink&700|}} | ||
+ | |||
+ | ===== Concluzii ===== | ||
+ | Proiectul a fost destul de dificil din cauza calculului frecvenței folosind transformata Fourier Rapidă, care nici acum nu produce rezultate apropiate de frecvența dorită. Am încercat mai multe metode pentru a analiza semnalul analogic: Zero-Crossing, Autocorrelation, Fast Hartley Transform (asemănătoare cu FFT-ul, dar mai rapidă în teorie), dar nu am avut rezultate mulțumitoare cu niciuna. Deci, o mare parte din timpul alocat proiectului a fost ocupată de găsirea și înțelegerea algoritmilor. Desigur, pot exista erori și din cauza modulului de microfon amplificator, dar și aici am încercat să experimentez cu opțiunile de Gain și Attack/Release, neajungând la un rezultat mai frumos. | ||
+ | |||
+ | În orice caz, proiectul a fost interesant de realizat atât pe partea hardware (fun), cât și pe partea software (not so fun). Sper să pot găsi o soluție pentru îmbunătățirea calculului frecvenței pe viitor, pentru a putea folosi tuner-ul fără probleme. | ||
+ | |||
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
<note> | <note> | ||
- | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | + | * Arduino x MAX9814: https://youtu.be/2waBFdEBZDg?si=32I7n15I-bm2EmID |
+ | * Adresa memoriei LCD: https://youtu.be/CvqHkXeXN3M?si=unwAR5wdvqATehaS | ||
+ | * Utilizare FFT.h pentru detectarea frecvenței în Arduino: https://youtu.be/wbeV0J30LGQ?si=CxhIiYDKvoaHAf0U | ||
</note> | </note> | ||
<html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> |