This shows you the differences between two versions of the page.
pm:prj2025:rnedelcu:cosmin.croitoriu [2025/05/27 23:44] cosmin.croitoriu |
pm:prj2025:rnedelcu:cosmin.croitoriu [2025/05/28 15:56] (current) cosmin.croitoriu |
||
---|---|---|---|
Line 85: | Line 85: | ||
Dar dacă dorim să creștem frecvența tremolo-ului (adică să facem vibrația volumului mai rapidă), avem două opțiuni: | Dar dacă dorim să creștem frecvența tremolo-ului (adică să facem vibrația volumului mai rapidă), avem două opțiuni: | ||
- | - Scădem timpul între eșantioane (frecvența cu care se face sample++) (rate) | + | * Scădem timpul între eșantioane (frecvența cu care se face sample++) (rate) |
- | - Parcurgem mai rapid vectorul – adică sări peste eșantioane: sample += tremoloStepSize | + | * Parcurgem mai rapid vectorul – adică sări peste eșantioane: sample += tremoloStepSize |
<code> | <code> | ||
int tremoloEffect(int input) { | int tremoloEffect(int input) { | ||
Line 109: | Line 109: | ||
</code> | </code> | ||
- | - **BitCrusher**: Efectul bitcrusher constă în scăderea rezoluției semnalului audio, adică în reducerea numărului de biți folosiți pentru a reprezenta fiecare eșantion. În loc de un semnal fluid de 10 biți (0–1023, pe Arduino), semnalul este „zdrobit” în trepte mari, ceea ce duce la un sunet digital, agresiv. În proiect am folosit folsit între 4 și 64 de nivele. | + | * **BitCrusher**: Efectul bitcrusher constă în scăderea rezoluției semnalului audio, adică în reducerea numărului de biți folosiți pentru a reprezenta fiecare eșantion. În loc de un semnal fluid de 10 biți (0–1023, pe Arduino), semnalul este „zdrobit” în trepte mari, ceea ce duce la un sunet digital, agresiv. În proiect am folosit folsit între 4 și 64 de nivele. |
<code> | <code> | ||
int bitcrusherEffect(int input) { | int bitcrusherEffect(int input) { | ||
Line 128: | Line 128: | ||
Pentru un răspuns rapid și a elimina overhead-ul, am utilizat întreruperi: | Pentru un răspuns rapid și a elimina overhead-ul, am utilizat întreruperi: | ||
Trei butoane sunt folosite: | Trei butoane sunt folosite: | ||
- | - D4: schimbă efectul (prin întrerupere PCINT): Folosim PCINT, deoarce D4 nu are întrerupere INT. Astfel, avem nevoie de o condiție suplimentară pentru a nu se activa întreruperea pe ambele fronturi. | + | * D4: schimbă efectul (prin întrerupere **PCINT**): Folosim PCINT, deoarce D4 nu are întrerupere INT. Astfel, avem nevoie de o condiție suplimentară pentru a nu se activa întreruperea pe ambele fronturi. |
<code> | <code> | ||
// Enable la PCINTs | // Enable la PCINTs | ||
Line 136: | Line 136: | ||
PCMSK2 |= (1 << PCINT20); | PCMSK2 |= (1 << PCINT20); | ||
</code> | </code> | ||
- | - D2: scade intensitatea (prin întrerupere INT0): Întreruperea este activată pe frontul negativ HIGH to LOW. | + | * D2: scade intensitatea (prin întrerupere **INT0**): Întreruperea este activată pe frontul negativ HIGH to LOW. |
- | - D3 crește intensitatea (prin întrerupere INT1) Întreruperea este activată pe frontul negativ HIGH to LOW. | + | * D3 crește intensitatea (prin întrerupere **INT1**) Întreruperea este activată pe frontul negativ HIGH to LOW. |
În toate cazurile am folosit o măsură de a evita debounce-ul folosind niște variabile care rețin timestamp-ul ultimei schimbări. | În toate cazurile am folosit o măsură de a evita debounce-ul folosind niște variabile care rețin timestamp-ul ultimei schimbări. | ||
- | **Conversia Digital-Analog**: Semnalele procesate sunt trimise la DAC-ul MCP4725, care are implicit adresa 0x60, și care funcționează pe protocolul I2C. Valoarea de 10 biți este transformată într-una de 12 biți prin shiftare la stânga. | + | **Conversia Analog-Digital**: Pentru prelucrarea semnalului de la chitară, am folosit convertorul analog-digital intern al Arduino-ului, configurat manual pentru a controla mai precis performanța și viteza de eșantionare. |
+ | Inițializarea se face în funcția setupADC() prin care se se setează referința la AVcc, se activează ADC-ul și se se setează prescaler-ul la 64. | ||
+ | <code> | ||
+ | void setupADC() { | ||
+ | // AVcc ca referinta si calanalul 0 by default | ||
+ | ADMUX = (1 << REFS0); | ||
+ | |||
+ | // Enable la ADC su Prescaler 64 | ||
+ | ADCSRA = (1 << ADEN) | ||
+ | | (1 << ADPS2) | (1 << ADPS1); | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | Pentru citire în bucla de loop, se schimbă canalul între A0 și A1 (folosim A1 pentru fotorezistor), iar apoi se porneste conversia și se asteaptă terminarea. | ||
+ | <code> | ||
+ | uint16_t readADC(uint8_t pin) { | ||
+ | // Setam canalul, 0 sau 1. | ||
+ | ADMUX = (ADMUX & 0xF0) | (pin & 0x0F); | ||
+ | |||
+ | // Start conversie | ||
+ | ADCSRA |= (1 << ADSC); | ||
+ | |||
+ | // Se asteapta pana conversia este terminata | ||
+ | while (ADCSRA & (1 << ADSC)); | ||
+ | |||
+ | return ADC; | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | |||
+ | **Conversia Digital-Analog**: Semnalele procesate sunt trimise la DAC-ul **MCP4725**, care are implicit adresa 0x60, și care funcționează pe **protocolul I2C**. Valoarea de 10 biți este transformată într-una de 12 biți prin shiftare la stânga. | ||
<code> | <code> | ||
Line 166: | Line 196: | ||
* 12.4.2025: Am facut partea de output doar cu un singur filtru trece jos, pentru a testa sunetul. Deoarece sunetul nu era grozav, am decvis să folosesc filtrul Sallen Key. | * 12.4.2025: Am facut partea de output doar cu un singur filtru trece jos, pentru a testa sunetul. Deoarece sunetul nu era grozav, am decvis să folosesc filtrul Sallen Key. | ||
* 14.4.2025: Am făcut output stage-ul, folosind filtrul Sallen Key. Drept amplificator am folosit TL972, pe care l-am pus pe PCB cu ajutorul unui adaptor SMD, după **multe ore de chin** pentru a-l lipi. Neașteptat, chiar a funcționat! | * 14.4.2025: Am făcut output stage-ul, folosind filtrul Sallen Key. Drept amplificator am folosit TL972, pe care l-am pus pe PCB cu ajutorul unui adaptor SMD, după **multe ore de chin** pentru a-l lipi. Neașteptat, chiar a funcționat! | ||
+ | {{:pm:prj2025:rnedelcu:adaptor.png?200|}} | ||
* 16.4.2025: Am implementat primele versiuni ale distorsion-ului si al tremolo-ului. Observ ca sunetul este destul de "muffled", probabil din cauza filtrelor de 5kHz. | * 16.4.2025: Am implementat primele versiuni ale distorsion-ului si al tremolo-ului. Observ ca sunetul este destul de "muffled", probabil din cauza filtrelor de 5kHz. | ||
* 18.4.2025: Adaugare a butoanelor care modifica intensitatea efectului si a fotorezistorului. | * 18.4.2025: Adaugare a butoanelor care modifica intensitatea efectului si a fotorezistorului. | ||
Line 181: | Line 212: | ||
[[https://ocw.cs.pub.ro/courses/pm/prj2017/ddragomir/cmihalache|Proiect inspiratie]] | [[https://ocw.cs.pub.ro/courses/pm/prj2017/ddragomir/cmihalache|Proiect inspiratie]] | ||
+ | |||
+ | {{:pm:prj2025:rnedelcu:cosmin_proiect_pm.zip|Arhiva cod}} | ||
<html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | ||