This shows you the differences between two versions of the page.
pm:prj2025:rnedelcu:dan_andrei.cretu03 [2025/05/27 13:42] dan_andrei.cretu03 [Hardware Design] |
pm:prj2025:rnedelcu:dan_andrei.cretu03 [2025/05/28 14:57] (current) dan_andrei.cretu03 [Rezultate Obţinute] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | Pedală de efect pentru chitară electrică | + | ===== Pedală de efect pentru chitară electrică ===== |
- | ===== Introducere ===== | + | |
<note tip> | <note tip> | ||
Line 52: | Line 51: | ||
Fire | Fire | ||
+ | |||
+ | Rezistenta de 5k legata la masa creeaza un divizor de tensiune, stabilizand semnalul ce vine de la chitara. | ||
+ | |||
+ | Condensatorul de 0.47 µF de la intrare protejeaza restul componentelor de tensiuni nedorite si pastreaza numai variatiile audio utile. (cel putin in teorie) | ||
+ | |||
+ | Filtrul trece jos de la iesire elimina zgomotele nedorite. | ||
{{:pm:prj2025:rnedelcu:hardware_pedala.jpeg?600|}} | {{:pm:prj2025:rnedelcu:hardware_pedala.jpeg?600|}} | ||
Line 60: | Line 65: | ||
<note tip> | <note tip> | ||
- | Descrierea codului aplicaţiei (firmware): | + | Software-ul este scris în limbajul Arduino și rulează pe un microcontroller Arduino UNO R3. Acesta procesează semnalul audio de la o chitară electrică în timp real și aplică unul dintre cele cinci efecte sonore: bypass, overdrive, tremolo și reverb. |
- | Am dezvoltat componenta software a poriectului in Arduino IDE, care s-a demonstrat util datorita usurintei de utilizare. | + | Structura principală a programului include: |
- | In procesul de adaptare a hardware-ului la nevoile proiectului a fost foarte utila optiunea de plotting din aceasta aplicatie, deoarece m-a ajutat sa aleg cele mai bune valori pentru condensatori si rezistente (din partea de prelucrare a semnalului din hardware). | + | |
- | In ceea ce priveste implementarea efectului de overdrive, acesta este activat de apasarea unui buton ce modifica o variabila in cod ce marcheaza folosirea efectului de overdrive. | + | Citirea semnalului audio analogic de la chitară (pin A0). |
- | Semnalul de la portul jack de input este aduc la o frecventa mai prietenoasa pentru arduino, unde este apoi prelucrat. | + | <code c++> |
- | Pentru prelucrarea semnalului in sine am folosit intreruperi, iar pentru transmiterea semnalului procesat mai departe spre portul de output am folosit PWM. | + | lastButtonState = buttonState; |
+ | |||
+ | unsigned int raw = analogRead(ADC_PIN); | ||
+ | raw = (raw + 1) / 4 - 1; | ||
+ | |||
+ | unsigned int out = applyEffect(((float)raw) / SIGNAL_MAX) * SIGNAL_MAX; | ||
+ | </code> | ||
+ | |||
+ | Prelucrarea semnalului prin funcții specifice fiecărui efect audio (distorsiune, tremolo, reverb etc.). | ||
+ | |||
+ | * Tremolo | ||
+ | |||
+ | <code c++> | ||
+ | |||
+ | int index = 0; | ||
+ | float applyTremolo(float x) { | ||
+ | // version 1 | ||
+ | index++; | ||
+ | |||
+ | float Fs = TIMER / 8.0f; | ||
+ | float Fx = 5.0f; | ||
+ | float alpha = 0.25f; | ||
+ | float trem = (1.1f + alpha * sin(2.0f * M_PI * index * (Fx / Fs))); | ||
+ | |||
+ | return trem * x * 2.0f; | ||
+ | } | ||
+ | |||
+ | </code> | ||
+ | |||
+ | |||
+ | * Overdirve | ||
+ | |||
+ | <code c++> | ||
+ | float applyDistortion(float x) { | ||
+ | x *= 1.75f; | ||
+ | |||
+ | if (x > 1.0f) x = 1.0f; | ||
+ | if (x < 0.0f) x = 0.0f; | ||
+ | |||
+ | float y; | ||
+ | if (x < 0.2f) | ||
+ | y = 0.0f; | ||
+ | else if (x > 0.7f) | ||
+ | y = 1.0f; | ||
+ | else | ||
+ | y = x * x * (3 - 2 * x); // Smooth curve in between | ||
+ | |||
+ | return y; | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | * Reverb | ||
+ | |||
+ | <code c++> | ||
+ | uint8_t reverbBuffer[REVERB_BUFFER_SIZE]; | ||
+ | int reverbIndex = 0; | ||
+ | float applyReverb(float x) { | ||
+ | // Read the delayed sample from buffer | ||
+ | int delayedIndex = (reverbIndex - REVERB_DELAY + REVERB_BUFFER_SIZE) % REVERB_BUFFER_SIZE; | ||
+ | float delayedSample = reverbBuffer[delayedIndex] / 255.0f; | ||
+ | |||
+ | // Mix current input with decayed delayed sample | ||
+ | float out = x + REVERB_DECAY * delayedSample; | ||
+ | |||
+ | // Store current output in the buffer | ||
+ | reverbBuffer[reverbIndex] = (uint8_t)(adjustAmplitude(out) * 255); | ||
+ | reverbIndex = (reverbIndex + 1) % REVERB_BUFFER_SIZE; | ||
+ | |||
+ | return adjustAmplitude(out); | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | Scrierea semnalului procesat pe un DAC extern (PCF8591) pentru ieșirea audio analogică. | ||
+ | |||
+ | Controlul efectului activ printr-un buton fizic conectat la pinul A1 – fiecare apăsare schimbă efectul curent. | ||
+ | |||
+ | <code c++> | ||
+ | int buttonState = digitalRead(BUTTON); | ||
+ | |||
+ | if (lastButtonState == HIGH && buttonState == LOW) { | ||
+ | currentEffect = (currentEffect + 1) % MAX_EFFECT; // Next effect | ||
+ | Serial.println(currentEffect); | ||
+ | delay(200); // Debounce simplu | ||
+ | } | ||
+ | |||
+ | lastButtonState = buttonState; | ||
+ | </code> | ||
+ | |||
+ | Algoritmi de procesare audio implementați în funcții dedicate fiecărui efect, folosind formule matematice simple și buffer circular (pentru reverb). | ||
+ | |||
+ | <code c++> | ||
+ | #define ADC_PIN A0 // Analog input from guitar signal | ||
+ | #define BUTTON A1 | ||
+ | #define SIGNAL_MAX 255 | ||
+ | |||
+ | #define TIMER 15625 | ||
+ | |||
+ | #define REVERB_BUFFER_SIZE 1000 // Adjust based on available RAM | ||
+ | #define REVERB_DECAY 0.75f // How much of the echo is preserved | ||
+ | #define REVERB_DELAY 800 // How far back in time (in samples) the echo is | ||
+ | |||
+ | #define MAX_EFFECT 5 | ||
+ | </code> | ||
+ | |||
+ | Acest software permite utilizatorului să comute dinamic între efecte și să obțină sunete expresive folosind doar hardware minim și procesare digitală în timp real. | ||
- | In functia ce prelucreaza semnalul folosesc niste constante pentru gain si boostul semnalului, care sunt apoi aplicate fie pe semnalul cu efect de overdrive, fie pe semnalul curat. | ||
</note> | </note> | ||
Line 76: | Line 183: | ||
<note tip> | <note tip> | ||
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | Dupa multe incercari, am reusit sa ajung la o versiune finala. |
+ | |||
+ | Partea de hardware ramas mai simpla decat ce mi-as fi dorit, fara valori reglate prin potentiometru. | ||
+ | |||
+ | Am experimentat cu mai multe efecte, cele mai reusite fiind cel de distors, tremolo si reverb. | ||
+ | |||
+ | Nu am reusit sa filtrez suficient de bine semnalul astfel incat semnalul ajuns la amplificator sa fie curat. | ||
+ | |||
+ | * ADC - analogRead() | ||
+ | |||
+ | * I2C - comunicarea cu DAC-ul | ||
+ | |||
+ | * GPIO - pinMode | ||
+ | |||
+ | * timere pentru tremolo | ||
</note> | </note> | ||
===== Concluzii ===== | ===== Concluzii ===== | ||
- | ===== Download ===== | + | Nu am. |
+ | }===== Download ===== | ||
<note warning> | <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ă ;-). | + | {{:pm:prj2025:rnedelcu:proiect_hau.zip|}} |
- | + | ||
- | 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**. | + | |
</note> | </note> | ||