Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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 sonorebypass, overdrive, tremolo și reverb.
  
-Am dezvoltat componenta software ​poriectului in Arduino IDE, care s-a demonstrat util datorita usurintei de utilizare. +Structura principală ​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 arduinounde 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 (distorsiunetremolo, 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>​
  
pm/prj2025/rnedelcu/dan_andrei.cretu03.1748342568.txt.gz · Last modified: 2025/05/27 13:42 by dan_andrei.cretu03
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0