Differences

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

Link to this comparison view

pm:prj2026:florin.stancu:ianis.opritescu [2026/05/08 17:20]
ianis.opritescu [2.2 Schema Electrică]
pm:prj2026:florin.stancu:ianis.opritescu [2026/05/24 14:32] (current)
ianis.opritescu [Jurnal]
Line 14: Line 14:
  
 ===== 1.3 Ideea de la care am pornit ===== ===== 1.3 Ideea de la care am pornit =====
-Ideea a luat naștere din dorința de a demistifica ​modul în care funcționează sintetizatoarele comerciale scumpe. Am pornit de la conceptul de "​Digital Audio Workstation (DAW) in a box", dorind să transfer controlul sunetului din mediul virtual al mouse-ului într-un mediu tactil, unde fiecare modulație a sunetului este rezultatul unei modificări fizice de tensiune prin potențiometre. A fost o provocare de a optimiza codul "​bare-metal" ​pentru a obține o latență minimă și o fidelitate audio acceptabilă pe un hardware limitat.+Ideea a luat naștere din dorința de a dezvălui ​modul în care funcționează sintetizatoarele comerciale scumpe. Am pornit de la conceptul de "​Digital Audio Workstation (DAW) in a box", dorind să transfer controlul sunetului din mediul virtual al mouse-ului într-un mediu tactil, unde fiecare modulație a sunetului este rezultatul unei modificări fizice de tensiune prin potențiometre. A fost o provocare de a optimiza codul pentru a obține o latență minimă și o fidelitate audio acceptabilă pe un hardware limitat.
  
 ====== 2. Hardware Design ====== ====== 2. Hardware Design ======
Line 24: Line 24:
 ^ Componentă ^ Specificații Tehnice ^ Cantitate ^ Rol în Proiect ^ ^ Componentă ^ Specificații Tehnice ^ Cantitate ^ Rol în Proiect ^
 | **Microcontroler** | ATmega328P | 1 | Creierul sistemului, sinteză DDS | | **Microcontroler** | ATmega328P | 1 | Creierul sistemului, sinteză DDS |
-| **Display** | OLED 0.96" I2C (SSD1306) | 1 | Feedback vizual parametri ADSR/Wave | +| **Display**((https://​sigmanortec.ro/​Display-OLED-1-3-Alb-128x64-p136081872)) ​| OLED 0.96" I2C (SSD1306) | 1 | Feedback vizual parametri ADSR/Wave | 
-| **Amplificator** | PAM8403 Stereo 2x3W | 1 | Amplificare semnal audio la nivel de boxe | +| **Amplificator**((https://​sigmanortec.ro/​modul-amplificator-miniatura-pam8403-22-5v)) ​| PAM8403 Stereo 2x3W | 1 | Amplificare semnal audio la nivel de boxe | 
-| **Potențiometre** | 10kΩ Liniare (B10K) | 5 | Control Attack, Decay, Sustain, Release, Pitch | +| **Potențiometre**((https://​sigmanortec.ro/​Potentiometru-1K-5K-10K-20K-50K-100K-p136286400)) ​| 10kΩ Liniare (B10K) | 5 | Control Attack, Decay, Sustain, Release, Pitch | 
-| **Buton** | Momentary Push-Button 16mm | 1 | Selectare formă de undă (Cycle waveforms+| **Difuzoare**((https://​sigmanortec.ro/​Speaker-40mm-3W-p134573662)) | 4Ω, 3W, 40mm | 2 | Redare audio stereo |
-| **Difuzoare** ​| 4Ω, 3W, 40mm | 2 | Redare audio stereo |+
 | **Rezistență** | 1kΩ | 1 | Parte a filtrului Low-Pass (RC) | | **Rezistență** | 1kΩ | 1 | Parte a filtrului Low-Pass (RC) |
 | **Condensator** | 100nF (Ceramic 104) | 1 | Filtrare zgomot PWM (Filtru RC) | | **Condensator** | 100nF (Ceramic 104) | 1 | Filtrare zgomot PWM (Filtru RC) |
 | **Condensator** | 10μF (Electrolitic) | 1 | Cuplaj audio (DC Blocking) | | **Condensator** | 10μF (Electrolitic) | 1 | Cuplaj audio (DC Blocking) |
 | **Condensator** | 1000μF (Electrolitic) | 1 | Stabilizare alimentare amplificator | | **Condensator** | 1000μF (Electrolitic) | 1 | Stabilizare alimentare amplificator |
-| **Switch** | MTS-102 Toggle (Metal) | 1 | Pornire/​Oprire generală | +| **Switch**((https://​sigmanortec.ro/​Intrerupator-3A-250V-Switch-MTS-102-p140901357)) ​| MTS-102 Toggle (Metal) | 1 | Pornire/​Oprire generală | 
-| **PCB** | Prototipare FR4 4x6cm | 2 | Suport ​mecanic și electric componente |+| **PCB**((https://​sigmanortec.ro/​Placa-PCB-prototipare-fata-dubla-4x6cm-p211619088)) ​| Prototipare FR4 4x6cm | 2 | Suport electric componente ​
 +| **Modul convertor USB la TTL**((https://​sigmanortec.ro/​modul-convertor-usb-la-ttl-ch340-msop10-type-c-33-5v)) | CH340 | 1 | Adaptor la alimentare circuit | 
 +| **Modul USB 2.0 la TTL UART**((https://​sigmanortec.ro/​Modul-Convertor-serial-USB-2-0-la-TTL-UART-CP2104-STC-PRGMR-p136248993)) | CP2104 | 1 | Convertor serial ​|
  
-===== 2.2 Schema ​Electrică ===== +===== 2.2 Schema ​Bloc =====
- +
-Designul electric se bazează pe distribuția paralelă a tensiunii de 5V către modulele digitale și analogice.  +
- +
-**Configurația pinilor Arduino Nano:** +
-  * **Pini Analogici (A0 - A3, A6):** Conectați la pinii centrali (Wiper) ai celor 5 potențiometre pentru citirea ADC. +
-  * **Pini I2C (A4 - SDA, A5 - SCL):** Conectați la display-ul OLED. +
-  * **Pin Digital D2:** Intrare pentru buton (folosește întreruperea externă INT0). +
-  * **Pin Digital D9 (PWM):** Ieșirea audio principală către lanțul de filtrare. +
- +
-{{ :​pm:​prj2026:​florin.stancu:​schema_bloc_sintetizator_ianis.jpg?​nolink&​500 |}} +
- +
-===== 2.3 Lanțul de Semnal și Diagrame ​=====+
  
 Sunetul este generat digital prin PWM (Pulse Width Modulation) la o frecvență purtătoare înaltă. Pentru a obține un semnal audio analogic curat, semnalul parcurge următorul traseu: Sunetul este generat digital prin PWM (Pulse Width Modulation) la o frecvență purtătoare înaltă. Pentru a obține un semnal audio analogic curat, semnalul parcurge următorul traseu:
  
-  * **Generare:​** Pinul D9 scoate un semnal PWM cu duty cycle variabil.+  * **Generare:​** Pinul PB1 scoate un semnal PWM cu duty cycle variabil.
   * **Filtrare Low-Pass (RC):** Rezistența de 1kΩ împreună cu condensatorul de 100nF formează un filtru care elimină frecvența purtătoare a PWM-ului.   * **Filtrare Low-Pass (RC):** Rezistența de 1kΩ împreună cu condensatorul de 100nF formează un filtru care elimină frecvența purtătoare a PWM-ului.
   * **DC Blocking:** Condensatorul de 10μF elimină componenta de curent continuu (offset de 2.5V), lăsând să treacă doar unda audio (AC).   * **DC Blocking:** Condensatorul de 10μF elimină componenta de curent continuu (offset de 2.5V), lăsând să treacă doar unda audio (AC).
   * **Amplificare:​** Semnalul filtrat intră în pinii L-IN și R-IN ai PAM8403.   * **Amplificare:​** Semnalul filtrat intră în pinii L-IN și R-IN ai PAM8403.
 +
 +**Configurația pinilor ATmega328P:​**
 +  * **Pini Analogici (PC0 - PC3, ADC6):** Conectați la pinii centrali ai celor 5 potențiometre pentru citirea ADC.
 +  * **Pini I2C (PC4 - SDA, PC5 - SCL):** Conectați la display-ul OLED.
 +  * **Pin PD2:** Intrare pentru buton (folosește întreruperea externă INT0).
 +  * **Pin PB1 (PWM):** Ieșirea audio principală către lanțul de filtrare.
 +
 +{{ :​pm:​prj2026:​florin.stancu:​schema_bloc_sintetizator_ianis1.jpg?​800 |}}
 +
 +===== 2.3 Schema Electrică =====
 +
 +{{ :​pm:​prj2026:​florin.stancu:​schematic-pm-ianis.png?​800 |}}
 +
  
 ===== 2.4 Rezultatele simulării și Calcule ===== ===== 2.4 Rezultatele simulării și Calcule =====
Line 73: Line 75:
 ===== Software Design ===== ===== Software Design =====
  
 +==== Motorul de Sinteza (synth.c / synth.h) ====
 +Nucleul audio foloseste **Direct Digital Synthesis (DDS)** cu un tabel sinus de 256 esantioane stocat in **PROGMEM** (Flash), economisind cei 2 KB de SRAM disponibili. Fiecare din cele 4 voci polifonice utilizeaza un acumulator de faza pe 16 biti, al carui byte superior indexeaza direct tabelul — eliminand orice calcul trigonometric la runtime.
 +Generarea esantioanelor se face in **ISR(TIMER1_OVF_vect)** la 31250 Hz (Fast PWM 9-bit), avand un buget strict de ~512 cicluri CPU. Toata aritmetica foloseste **fixed-point Q8.8** si operatii pe intregi — fara virgula mobila. Mixarea vocilor, aplicarea envelope-ului ADSR si scalarea volumului se reduc la inmultiri si shift-uri pe 16/32 biti, mentinand ISR-ul sub 200 cicluri (~39% din buget).
 +Envelope-ul ADSR este avansat separat la 1 kHz prin **ISR(TIMER2_COMPA_vect)** via ''​adsr_tick_voice()'',​ decupland rata lenta a modulatiei de amplitudine de rata rapida de esantionare.
 +Alocarea vocilor foloseste o strategie in trei pasi: re-trigger daca nota este deja activa, alocare voce libera (IDLE), sau **voice stealing** bazat pe varsta relativa (scadere modulara ''​uint8_t''​).
 +Semnalul PWM porneste centrat la 50% duty (''​PWM_CENTER=255''​),​ generand 0V DC prin condensatorul de cuplaj si eliminand pocniturile la pornire.
 +==== Comunicatia USART (usart.c / usart.h) ====
 +Receptia este **polling non-blocant** (''​USART0_available()''​ + ''​USART0_read()''​),​ evitand overhead-ul unui ISR suplimentar care ar concura cu ISR-urile audio. Transmisia este blocanta per-caracter.
 +==== ADC si Parametri (adc.c / main.c) ====
 +Citirea celor 5 potentiometre (Attack, Decay, Sustain, Release, Volume) se face prin polling la intervale rare, folosind un contor uint8_t cu overflow natural la 256 iteratii — evitand un timer dedicat. Valorile ADC sunt convertite in rate Q8.8 prin ''​calc_rate()''​ si aplicate atomic (cu ''​cli()/​sei()''​).
 +==== Interfata Python (piano.py) ====
 +Scriptul ''​PianoController''​ ruleaza pe Linux fara dependinte grafice, folosind **termios raw mode** pentru detectia tastelor cu latenta minima. Un mecanism de **auto-release cu timere per-nota** (''​_schedule_release()''​) simuleaza key-up din terminal, care nu ofera nativ acest eveniment. Comunicatia seriala este protejata de un ''​threading.Lock'',​ iar un thread daemon dedicat (''​serial_reader_thread()''​) citeste asincron raspunsurile de la ATmega.
  
-<note tip> +<html><a href="​https://github.com/​ianisopritescu/​PM_Soft_Synth">​Repo Github cod</​a>​</html>
-Descrierea codului aplicaţiei (firmware): +
-  * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) +
-  * librării şi surse 3rd-party (e.g. Procyon AVRlib) +
-  * algoritmi şi structuri pe care plănuiţi să le implementaţi +
-  * (etapa 3) surse şi funcţii implementate +
-</note> +
 ===== Rezultate Obţinute ===== ===== Rezultate Obţinute =====
  
Line 98: Line 105:
 </​note>​ </​note>​
  
-===== Jurnal ===== 
- 
-<note tip> 
-Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. 
-</​note>​ 
  
 ===== Bibliografie/​Resurse ===== ===== Bibliografie/​Resurse =====
Line 111: Line 113:
  
 <​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>​
 +
 +<​html><​a href="​https://​ww1.microchip.com/​downloads/​en/​DeviceDoc/​Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf">​Datasheet Atmega328P</​a></​html>​
  
pm/prj2026/florin.stancu/ianis.opritescu.1778250057.txt.gz · Last modified: 2026/05/08 17:20 by ianis.opritescu
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