This is an old revision of the document!
Proiectul constă într-un procesor de efecte audio digital pentru chitară electrică, realizat cu ajutorul unui Arduino UNO (ATmega328), care aplică efecte audio (ex: distorsiune, tremolo, delay) semnalului de la chitară.
Scopul proiectului este de a oferi o soluție accesibilă și personalizabilă pentru chitariști, care le permite să adauge diverse efecte audio chitarii lor folosind un procesor digital realizat cu Arduino. Proiectul își propune să înlocuiască echipamentele de efecte tradiționale costisitoare, oferind un control total asupra parametrilor fiecărui efect.
În plus, proiectul permite extinderea prin adăugarea de noi efecte sau îmbunătățiri, ceea ce îl face o platformă ideală pentru învățare și experimentare continuă.
Chitara se va conecta la procesorul de efecte printr-o mufa Jack 6.3 mm. Procesorul are 3 butoane si 3 LEDs care reprezinta cate un efect:
Deoarece semnalul de la chitara este unul slab, acesta va trece printr-un amplificator LM358. Apoi va trece in convertorul ADC din Arduino, procesat, iar apoi trimis la convertorul DAC MCP4725, apoi se poate alege volumul care trece ca output prin a doua mufa jack 6.3 mm unde va fi conectata o boxa.
1. Intrarea semnalului de chitară (jack intrare)
2. Etajul de amplificare cu LM358 (U1:A și U1:B)
LM358 este un amplificator operațional dual (două canale într-un singur cip). Primul canal este folosit pentru amplificarea semnalului de intrare.
U1:A - Amplificator cu feedback
U1:B - Etaj suplimentar de amplificare
3. Potențiometru volum (RV2 - 10 kΩ)
4. MCP4725 - DAC extern
5. Butoanele și LED-urile
Interfete
Link catre poze si video demonstrativ: aici
Din simplul fapt ca acest proiect lucreaza si proceseaza semnal audio, inseamna ca partea de cod trebuie sa functioneze foarte repede si sa faca masuratori (esantioane) foarte rapid (sample rate). Deci sample rate mare → frecventa mare. Acest lucru nu se pot obtine cu biblioteci Arduino, deci singura solutie a fost de a lucra in PlatformIO in maniera de la laborator.
1. GPIO
Am folosit pini digitali PD2, PD3, PD4 ca intrări cu pull-up pentru butoane și PB2, PB3, PB4 ca ieșiri pentru LED-uri.
2. ADC (Converto Analog-Digital)
Convertirea semnalului audio, adica analog, in digital pentru prelucrare si aplicarea efectelor selectate, apoi pasarea datelor la DAC. De asemnea, este configurat în Free-Running Mode pentru eșantionare continuă la ~10 kHz.
3. Timer(CTC)
Am folosit Timer0 CTC, folosit in tratarea intreruperilor pentru button debounce
4. I2C (TWI)
MCP4725 (DAC) functioneaza prin protocolul I2C, de asemenea este si rapid.
5. Intreruperi (ISR)
Toate interactiunile externe functioneaza cu intreruperi pentru optimizarea codului si a timpului de executie, pentru a nu afecta frecventa pentru sample rate. Am folosit intreruperi pentru:
Rol: Interfața I²C (TWI) generică, folosită pentru a comunica cu DAC-ul MCP4725 la ~400 kHz.
Ce face fiecare functie:
1) twi_init()
TWSR = 0x00;
→ prescaler = 1TWBR = 12;
→ bit-rate generator pentru SCL ≈ 400 kHz la 16 MHzTWCR = (1«TWEN);
→ activează modul TWI (SDA/SCL)
2) twi_start(address)
TWCR = (1«TWSTA)|(1«TWEN)|(1«TWINT);
→ emite condiția START
3) twi_write(data)
TWDR = data;
TWCR = (1«TWEN)|(1«TWINT);
→ începe transmiterea
4) twi_stop()
TWCR = (1«TWSTO)|(1«TWEN);
→ emite STOPRol: : Strat de abstracție peste TWI pentru a scrie rapid valori 12-biți în MCP4725.
Ce fac functiile:
1) dac_init()
twi_init()
2) mcp4725_write(val)
twi_start(addr|0)
→ trimite pe magistrală condiția START, apoi adresa de 7 biți a DAC-ului (0x62) urmată de bitul R/W=0 (scriere).twi_write(0x40)
→ fast-mode commandtwi_write(val»4)
→ cei 8 biți ai codului DAC de 12 biți, adică biții de ordin înalt D11…D4twi_write1)
→ Trimite următorii 4 biți (D3…D0), puși în nibble-ul superior al octetului:
* astfel DAC va primii bitii in felul urmator:
Octet 1 = [ D11 D10 D9 D8 D7 D6 D5 D4 ]
Octet 2 = [ D3 D2 D1 D0 0 0 0 0 ]
*
*
twi_stop() - trimite conditia de STOP si elibereaza magistrala I2C
MCP4725 în fast-mode aşteaptă un octet de comandă, apoi doi octeți de date ce conțin cei 12 biți de nivel pe DAC. Primul transportă biții cei mai semnificativi (MSB), al doilea transportă cei mai puțin semnificativi (LSB) “aliniati” în nibble-ul de sus, pentru ca DAC-ul să știe exact cum să le reasambleze.
=== Efecte ===
Rol: : Procesarea semnalului convertit in digital, aplicand efectele stabilite: distorsiune, tremolo, delay
== Distortion ==
Creaza o forma de unda distorsionata si ascutita, cu tranzitiii rapide pentru un sunet “heavy”.
* Pre-emphasis
Amplifică ușor frecvențele medii și înalte pentru mai mult „bite”
y=x⋅(0.7+0.3⋅∣x∣)
* Soft clipping
Tranziție netedă la limită.
y=tanh(gain⋅y)
* Hard limit
Taie vârfurile peste ±0.8 pentru senzație agresivă.
y=max(min(y,+0.8),−0.8)
Pentru că DAC-ul MCP4725 lucrează cu rezoluţie de 12 biţi (domeniu numeric 0…4095), trebuie să mapăm semnalul nostru normalizat (−1…+1) pe acest interval.
Astfel, pentru un semnal normalizat x∈[−1,1]x∈[−1,1], codul final este
DAC_code=⌊x⋅2047⌋+2048
asigurând conversia corectă pe 12 biţi.
uint16_t apply_distortion(int16_t sample) {float x = sample / 2048.0f; // normalizează x = x * (0.7f + 0.3f * fabsf(x)); // pre-emphasis float d = tanhf(50.0f * x); // soft-clip d = (d > 0.8f ? 0.8f : (d < -0.8f ? -0.8f : d)); int32_t v = (int32_t)(d * 2047.0f); return (uint16_t)(v + 2048); // 0..4095} '' == Tremolo == Acest efect oscileaza volumul semnalului la o frecvență joasă (LFO) pentru „vibrato de volum”. Generăm un LFO sinusoidal pe 16 biți de fază si modulam aplitudinea cu factorul 2 pentru a compensa atenuarea la min(LFO). ===== Rezultate Obţinute =====