This shows you the differences between two versions of the page.
pm:prj2025:aluca:vlad_andrei.muntean [2025/05/11 12:06] vlad_andrei.muntean |
pm:prj2025:aluca:vlad_andrei.muntean [2025/05/24 18:16] (current) vlad_andrei.muntean |
||
---|---|---|---|
Line 14: | Line 14: | ||
</note> | </note> | ||
- | Schema proiectului este urmatoarea: | + | Schema bloc a proiectului este urmatoarea: |
{{:pm:prj2025:aluca:schemabloc1.png?600|}} | {{:pm:prj2025:aluca:schemabloc1.png?600|}} | ||
Line 26: | Line 26: | ||
* Senzor Piezo | * Senzor Piezo | ||
* Breadboard | * Breadboard | ||
- | * Rezistente (in cazul lipsei de divizor de tensiune) | ||
</note> | </note> | ||
+ | |||
+ | Partea de hardware a acestui proiect se bazeaza intens pe functionalitatile microcontrollerului si a senzorului piezo electric. Prin intermediul pinului 0 (Analog 0), controllerul citeste o valoarea analogica de la iesirea tip signal a modulului de piezo. Rezultatul este printat pe ecranul LCD comunicand prin I2C. Pentru a evita proleme de conflict cu intrariile esp-ului (pin 8 shared pentru led builtin si pin 9 folosit pentru bootstrapping) am decis sa renunt la pinii default pentru I2C si sa folosesc pinii GPIO 14 si 15. Atat senzorul, cat si display-ul sunt alimentate prin intermediul placutei folosind pin-ul de 3V3. Configuratia bluetooth se va face prin intermediu software, deci nu este relevant sa mentionez comunicarea in aceasta sectiune. Nicio alta sursa nu este folosita de-a lungul proiectului. | ||
+ | |||
+ | Configuratia functioneaza cum trebuie, senzorul piezo trebuie bine prins de pragusul chitarei si in momentul lovirii unei corzi citeste o frecventa aproximativa si o printeaza. Se poate vedea comunicarea intre senzor si display (in cazul de mai jos, nicio frecventa relevanta nu este citita) aici: | ||
+ | |||
+ | {{:pm:prj2025:aluca:piezo_setup.jpg?300|}} | ||
+ | |||
+ | Schema electrica: | ||
+ | |||
+ | |||
+ | {{:pm:prj2025:aluca:piezo.png?600|}} | ||
+ | |||
+ | Bill of materials: | ||
+ | * [[https://ardushop.ro/ro/plci-de-dezvoltare/2511-placa-de-dezvoltare-esp32-c6-super-mini-6427854038241.html?gad_source=1&gad_campaignid=22058879462&gbraid=0AAAAADlKU-70EdchhEz-0EDDtvWV1XHs1&gclid=CjwKCAjwuIbBBhBvEiwAsNypvTsdStOrgC1Sf6xmVZx0_i1hSfM51jZgqZ7t_R1lWeBkO5HtfFx9EBoCM6gQAvD_BwE|ESP32 C6 super mini]] | ||
+ | * [[https://ardushop.ro/ro/display-uri-si-led-uri/2348-lcd-display-1602-verde-adaptor-i2c-6427854000996.html|LCD I2C]] | ||
+ | * [[https://ardushop.ro/ro/senzori/816-senzor-vibratii-ceramic-6427854010612.html|Senzor piezo]] | ||
+ | * [[https://www.emag.ro/kit-wireless-super-starter-cu-esp8266-programabil-cu-arduino-ide-x0012yt7g9/pd/DN82W2MBM/|Breadboard 830 de puncte (inclus in kit plusivo)]] | ||
===== 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 ===== |