This shows you the differences between two versions of the page.
pm:prj2025:aluca:vlad_andrei.muntean [2025/05/17 15:00] vlad_andrei.muntean |
pm:prj2025:aluca:vlad_andrei.muntean [2025/05/24 18:16] (current) vlad_andrei.muntean |
||
---|---|---|---|
Line 47: | Line 47: | ||
===== Software Design ===== | ===== Software Design ===== | ||
+ | Codul din spatele acestui proiect are la baza citiri repetate de pe pin-ul analog al placii si procesarii intrarii. Fiind un acordor de chitara, nu este intuitiv sau util sa folosim valoarea returnata de analogRead (intreg 0-4095). Pentru a transforma tensiunea citita, este utilizat algoritmul de **Fast Fourier Transform**, cu care putem extrage o frecventa. Pentru a efectua aceasta transformare, la fiecare interval de timp se extrage un batch de sample-uri de tensiune (256 numarul optim) la o frecventa prestabilita (5 kHz), fiecare sample fiind salvat intr-o lista. Asupra listei se face descompunerea rezultata transformarii. Semnalul citit are un DC offset care este extras din fiecare componenta astfel: | ||
+ | |||
+ | ''vReal[i] -= medie vReal / 256'' | ||
+ | |||
+ | Rezultatul este supus transformarii Fourier, iar frecventa corzii este data de peak frequency. | ||
+ | |||
+ | Pentru a interfata in mod placut frecventa, este folosit un vector de frecvente pentru fiecare coarda, alaturi de un vector cu numele corzilor. se va calcula minimul distantei intre frecventa gasita si toate elementele vectorului. Pozitia gasita ne va da coarda dorita. Daca o frecventa se regaseste la o distanta de -+ 3Hz este considerata acordata. Altfel, este indicata directia de acordare (higher/lower). Frecventele sub 62Hz sau peste 440Hz sunt considerate zgomot si nu vor fi considerate in procesul de cautare. | ||
+ | |||
+ | Rezultatul este afisat prin I2C catre un ecran LCD. | ||
+ | |||
+ | In cazul in care dorim sa facem debugging pe tuner sau sa intelegem mai bine frecventele in joc, esp32 genereaza un server de BLE prin care utilizatorul se poate conecta remote prin telefon sau laptop. Cu ajutorul unui terminal fiecare frecventa va fi printata la momentul ciupirii unei corzi. Se poate observa comunicarea aici: | ||
+ | |||
+ | {{:pm:prj2025:aluca:ble_freq.jpg?300|}} | ||
+ | |||
+ | Acest lucru se realizeaza prin generarea unui server folosind modulul incorporat din placa pentru a transmite datele in mod eficient si rezonabil din punct de vedere al consumului. Comunicarea este realizata prin UART, datele fiind transmise doar in cazul conexiunii unui utilizator. Comunicarea este unidirectionala, am restrictionat trimiterea de mesaje catre placuta din partea observatorilor. | ||
<note tip> | <note tip> | ||
- | Descrierea codului aplicaţiei (firmware): | + | Aceasta etapa a fost implementata folosind urmatoarele biblioteci si resurse: |
- | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | + | * [[https://github.com/kosme/arduinoFFT|ArduinoFFT Library]] |
- | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | + | * [[https://github.com/johnrickman/LiquidCrystal_I2C|I2C Liquid Crystal Display Library]] |
- | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | * [[https://forum.arduino.cc/t/how-to-send-data-from-client-to-uart-ble-server/1272255|ESP32 BLE UART Communication]] |
- | * (etapa 3) surse şi funcţii implementate | + | |
</note> | </note> | ||
+ | |||
+ | |||
+ | Demo-ul proiectului: | ||
+ | |||
+ | <html> | ||
+ | <iframe width="560" height="315" | ||
+ | src="https://www.youtube.com/embed/EwQxJyeBTtw" | ||
+ | title="YouTube video player" | ||
+ | frameborder="0" | ||
+ | allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" | ||
+ | allowfullscreen> | ||
+ | </iframe> | ||
+ | </html> | ||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== |