Un acordor de chitara acustica pe baza de senzor piezoelectric. Acesta va da feedback pentru fiecare coarda prin intermediul unui display LCD ce comunica prin I2C cu un microcontroller ESP32 C6. Acest acordor va citi informatia cu senzorul direct de pe suprafata instrumentului si va fi configurat pentru acordajul standard (Standard E tuning). Conectivitate bluetooth va fi incorporata pentru a trimite datele primite la un terminal pe telefon/calculator.
Schema bloc a proiectului este urmatoarea:
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:
Schema electrica:
Bill of materials:
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:
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.
Demo-ul proiectului:
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.