Differences

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

Link to this comparison view

pm:prj2026:ciprian.popescu0411:ilinca.tololoi [2026/05/16 23:50]
ilinca.tololoi [Hardware Design]
pm:prj2026:ciprian.popescu0411:ilinca.tololoi [2026/05/25 01:59] (current)
ilinca.tololoi [Afisaj LCD]
Line 12: Line 12:
  
 **Functionalitate:​** **Functionalitate:​**
-Proiectul reprezinta un mini-sintetizator de sunet generat digital de microcontroller-ul ATmega328P. Interfata muzicala este asigurata de un senzor capacitiv tactil cu 16 canale ​(TTP229), care actioneaza ca o tastatura de clape, ​in timp ce un senzor ​tactil ​independent (HW-017) ​declanseaza un efect audio special (stutter). Utilizatorul poate controla parametrii sunetului prin 6 butoane tactile (pentru schimbarea octavei ​sau a formei de unda) si potentiometre citite prin canalele ADC (pentru ​reglarea ​tempoului si modularea frecventei). Generarea semnalului audio se realizeaza prin tehnica PWM (Pulse Width Modulation) ​folosind ​timerele interne ale microcontroller-ului. Semnalul rezultat este curatat printr-un filtru trece-jos RC (rezistente ​de 1kΩ si condensatori ​de 100nF), amplificat de un modul de clasa D (PAM8403si redat prin doua difuzoare de 3W. In plus, pe un ecran LCD 1602 conectat via I2Csunt afisate in timp real nota muzicala curenta ​si frecventa sunetului emis.+Proiectul reprezinta un mini-sintetizator de sunet generat digital de microcontroller-ul ATmega328P. Interfata muzicala ​principala ​este asigurata de un senzor capacitiv tactil ​TTP229 ​cu canale ​functionale, care actioneaza ca o tastatura de clape (Do-Do2)iar un senzor ​capacitiv ​independent ​MPR121 ​(HW-017) ​cu 12 electrozi joaca rolul unui pedale de sustain — la atingerea oricarui electrod, este redata o secventa de note aleatoare. Utilizatorul poate controla parametrii sunetului prin 6 butoane tactile (pentru schimbarea octavei ​intre valorile 1-6, cate doua octave per buton, si 3 pentru selectarea ​formei de unda: patrat, sine sau triunghi) si potentiometre citite prin canalele ADC (PC0 pentru ​controlul ​tempoului ​de sunet si PC1 pentru ​modularea ​globala a frecventei). Generarea semnalului audio se realizeaza prin tehnica PWM folosind ​Timer1 al microcontroller-ului. Semnalul rezultat este curatat printr-un filtru trece-jos RC (rezistenta ​de 1kΩ si condensator ​de 100nF), amplificat de un modul de clasa D PAM8403 si redat prin doua difuzoare de 3W. Pe un ecran LCD 1602 conectat via I2C sunt afisate in timp real nota muzicala curenta, octava, ​frecventa sunetului emis si forma de unda activa.
  
 **Utilitate:​** **Utilitate:​**
-Mini-sintetizatorul este atat un proiect de integrare hardware-software (procesare semnal audio, citire senzori capacitivi, afisare I2C), cat si un instrument de divertisment interactiv. El ofera utilizatorilor posibilitatea de a experimenta cu crearea de sunete electronice ​(sound design), de a intelege cum formele de unda si modularea frecventei afecteaza timbrul muzical si de a canta melodii simple. Poate fi folosit ca material didactic pentru demonstrarea practica a conceptelor de convertoare ADC, filtre pasive, amplificare si generare PWM.+Mini-sintetizatorul este atat un proiect de integrare hardware-software (procesare semnal audio, citire senzori capacitivi ​prin protocoale SPI si I2C, afisare I2C), cat si un instrument de divertisment interactiv. El ofera utilizatorilor posibilitatea de a experimenta cu crearea de sunete electronice,​ de a intelege cum formele de undamodularea frecventei ​si controlul gate-ului ​afecteaza timbrul ​si caracterul ​muzical ​al unui sunet, ​si de a canta melodii simple ​pe o scara de o octava. Poate fi folosit ca material didactic pentru demonstrarea practica a conceptelor de convertoare ADC, filtre pasive, amplificare ​de putere ​si generare PWM.
  
 **Inspiratie:​** **Inspiratie:​**
Line 21: Line 21:
  
 **Scop:** **Scop:**
-Scopul principal al proiectului este de a proiecta, asambla si programa un sistem embedded functional capabil sa genereze si sa proceseze semnal audio in timp real. Din punct de vedere tehnic, proiectul urmareste aprofundarea cunostintelor despre timere, ​intreruperi,​ module ​PWM, comunicare I2C si conversie analog-digitala pe platforma AVR, dar si invatarea designului circuitelor de procesare a semnalelor analogice (filtre Low-Pass si amplificatoare de putere). +Scopul principal al proiectului este de a proiecta, asambla si programa un sistem embedded functional capabil sa genereze si sa proceseze semnal audio in timp real. Din punct de vedere tehnic, proiectul urmareste aprofundarea cunostintelor despre timere, PWM, comunicare I2C si SPI, conversie analog-digitala ​si citirea senzorilor capacitivi ​pe platforma AVR.
 ===== Descriere generală ===== ===== Descriere generală =====
  
Line 34: Line 33:
  
 <note tip> <note tip>
-Aici puneţi ​tot ce ţine de hardware design: +Aici puneti ​tot ce tine de hardware design: 
-  * listă ​de piese +  * lista de piese 
-  * scheme electrice (se pot lua şi de pe Internet ​şi din datasheet-uri,​ e.g. http://​www.captain.at/​electronic-atmega16-mmc-schematic.png)+  * scheme electrice (se pot lua si de pe Internet ​si din datasheet-uri,​ e.g. http://​www.captain.at/​electronic-atmega16-mmc-schematic.png)
   * diagrame de semnal ​   * diagrame de semnal ​
-  * rezultatele ​simulării+  * rezultatele ​simularii
 </​note>​ </​note>​
  
 **Lista de piese:** **Lista de piese:**
 * **Unitate de procesare:​** ATmega328P Xplained Mini * **Unitate de procesare:​** ATmega328P Xplained Mini
-  * **Interfață ​de intrare:** Butoane Tactile 6x6mm, ​Potențiometre ​WH148 10k +  * **Interfata ​de intrare:** Butoane Tactile 6x6mm, ​Potentiometre ​WH148 10k 
-  * **Interfață ​de control:** TTP229 (16-Channel Capacitive Touch Sensor) +  * **Interfata ​de control:** TTP229 (16-Channel Capacitive Touch Sensor) 
-  * **Interfață ​de ieșire:** LCD 1602, Interfață ​I2C (PCF8574) +  * **Interfata ​de iesire:** LCD 1602, Interfata ​I2C (PCF8574)
-  * **Audio:** PAM8403 (Class D Audio Amplifier), Difuzoare 3W 8 ohmi, Filtru Pasiv RC (Low-Pass) (din rezistențe de 1kohm și condensator de 100nF) +
-  * **Conectivitate:​** 2 breadboard-uri de 400 găuri fiecare, fire dupont tată-tată și mamă-tată+
   *    * 
-Schema electrica:+  * **Audio:**  
 + 
 +    - PAM8403 (Class D Audio Amplifier) 
 +    - Difuzoare 3W 8 ohmi 
 +    - Filtru Pasiv RC (Low-Pass) (din rezistenta de 1kohm si condensator de 100nF) 
 + 
 +  * **Conectivitate:​** breadboard, fire dupont tata-tata si mama-tata 
 + 
 +===Schema electrica:===
 {{:​pm:​prj2026:​ciprian.popescu0411:​schema_electrica_rox.png?​900 |}} {{:​pm:​prj2026:​ciprian.popescu0411:​schema_electrica_rox.png?​900 |}}
  
-Stadiu hardware fizic:+===Stadiu hardware fizic:===
  
 {{:​pm:​prj2026:​ciprian.popescu0411:​milestone_hardware_rox.jpeg?​600 |}} {{:​pm:​prj2026:​ciprian.popescu0411:​milestone_hardware_rox.jpeg?​600 |}}
  
-Lipituri necesare:+**Lipituri necesare:**
  
-Bara de pini pe ATmega328P Xplained Mini (PB1 + PD0-PD7+  * Bara de pini pe ATmega328P Xplained Mini (PB1 + PD0-PD7)
-Bara de pini pe PAM8403 (VIN, GND, IN_L, IN_R, LOUT+, LOUT-, ROUT+, ROUT-) +
-Bara de pini pe HW-017 (3.3V, GND, SDA, SCL, ADD, IRQ) +
-Bara de 16 pini între modulul I2C (PCF8574) și LCD 1602 +
-Fire cu capăt dezgolit pe terminalele difuzoarelor (+ și - pe fiecare)+
  
-Conexiuni complete:+  * Bara de pini pe PAM8403 (VIN, GND, IN_L, IN_R, LOUT+, LOUT-, ROUT+, ROUT-)
  
-Alimentare:+  * Bara de pini pe HW-017 (3.3V, GND, SDA, SCL, ADD, IRQ)
  
-ATmega 5V → șina +5V breadboard +  * Bara de 16 pini intre modulul I2C (PCF8574) si LCD 1602
-ATmega GND → șina GND breadboard +
-Șina +5V breadboard 1 → șina +5V breadboard 2 +
-Șina GND breadboard 1 → șina GND breadboard 2+
  
-I²C bus (SDA + SCL):+  * Fire cu capat dezgolit pe terminalele difuzoarelor (+ si - pe fiecare) 
 + 
 +===Conexiuni:​=== 
 + 
 +**Alimentare:​** 
 + 
 +ATmega 5V → sina +5V breadboard 
 +ATmega GND → sina GND breadboard 
 +Sina +5V breadboard 1 → sina +5V breadboard 2 
 +Sina GND breadboard 1 → sina GND breadboard 2 
 + 
 +**I²C bus (SDA + SCL):**
  
 ATmega PC4 → SDA (HW-017, PCF8574) ATmega PC4 → SDA (HW-017, PCF8574)
 ATmega PC5 → SCL (HW-017, PCF8574, TTP229) ATmega PC5 → SCL (HW-017, PCF8574, TTP229)
  
-TTP229:+**TTP229:**
  
 VCC → +5V VCC → +5V
Line 85: Line 94:
 SDO → PD3 SDO → PD3
  
-HW-017:+**HW-017:**
  
 3.3V → ATmega 3.3V 3.3V → ATmega 3.3V
Line 93: Line 102:
 IRQ → PD2 (INT0) IRQ → PD2 (INT0)
  
-PCF8574 + LCD:+**PCF8574 + LCD:**
  
 VCC → +5V VCC → +5V
Line 101: Line 110:
 16 pini → LCD 1602 (lipit direct) 16 pini → LCD 1602 (lipit direct)
  
-Audio:+**Audio:**
  
 ATmega PB1/OC1A → rezistor 1kΩ → condensator 100nF → PAM8403 IN_L ATmega PB1/OC1A → rezistor 1kΩ → condensator 100nF → PAM8403 IN_L
 PAM8403 VIN → +5V PAM8403 VIN → +5V
 PAM8403 GND → GND PAM8403 GND → GND
-PAM8403 LOUT+ / LOUT- → Difuzor ​stânga+PAM8403 LOUT+ / LOUT- → Difuzor ​stanga
 PAM8403 ROUT+ / ROUT- → Difuzor dreapta PAM8403 ROUT+ / ROUT- → Difuzor dreapta
  
-Butoane (6x):+**Butoane (6x):**
  
 Un pin → GND Un pin → GND
-Celălalt ​pin → PD4, PD5, PD6, PD7, PB2, PB3+Celalalt ​pin → PD4, PD5, PD6, PD7, PB2, PB3
  
-Potențiometre ​(3x):+**Potentiometre ​(3x):**
  
-Pin stânga ​→ +5V+Pin stanga ​→ +5V
 Pin dreapta → GND Pin dreapta → GND
 Pin mijloc (wiper) → PA0, PA1, PA2 Pin mijloc (wiper) → PA0, PA1, PA2
 +
  
 ===== Software Design ===== ===== Software Design =====
Line 129: Line 139:
   * (etapa 3) surse şi funcţii implementate   * (etapa 3) surse şi funcţii implementate
 </​note>​ </​note>​
 +
 +=== Mediu de dezvoltare ===
 +
 +PlatformIO integrat in Visual Studio Code, cu framework Arduino pentru AVR. Compilarea si incarcarea codului pe placa se realizeaza prin ''​avrdude''​ cu protocolul ''​xplainedmini_isp'',​ specific placii ATmega328P Xplained Mini.
 +
 +=== Librarii si surse 3rd-party ===
 +
 +
 +
 +| Librarie || Sursa || Rol
 +|-
 +| <​code>​LiquidCrystal_I2C</​code>​ || marcoschwartz || Controlul ecranului LCD 1602 prin interfata I2C via modulul PCF8574
 +|-
 +| <​code>​Adafruit_MPR121</​code>​ || Adafruit (instalata local in /lib) || Citirea senzorului capacitiv MPR121 cu 12 electrozi prin I2C
 +|-
 +| <​code>​Wire.h</​code>​ || Arduino built-in || Comunicare I2C pentru LCD si MPR121
 +|-
 +| <​code>​Arduino.h</​code>​ || Arduino built-in || Functii de baza: tone(), analogRead(),​ digitalRead()
 +|}
 +
 +==== Generare audio PWM ====
 +
 +Sunetul este generat prin configurarea directa a registrelor Timer1 (TCCR1A, TCCR1B, ICR1, OCR1A) in modul Fast PWM cu frecventa variabila. Formula de calcul este:
 +
 + <​code>​top = (16MHz / (2 × frecventa)) - 1</​code>​
 +
 +Duty cycle-ul controlat prin ''​POT_TEMPO (PC0)''​ implementeaza un efect de gate — sunetul este intrerupt ritmic intre 5% si 95% din perioada, creand efecte de la „tic-tic"​ scurt pana la sunet lung continuu.
 +
 +==== Calculul frecventei ====
 +
 +Functia calcFreq() porneste de la frecventele standard Do–Do2 (261.63 Hz – 523.25 Hz), le ajusteaza in functie de octava selectata (1–6, prin inmultire sau impartire repetata cu 2) si aplica un modificator global citit din potentiometrul ''​POT_FREQ (PC1)'',​ mapat intre 0.75× si 1.25×.
 +
 +==== Citire TTP229 ====
 +
 +Protocolul de comunicare cu TTP229 este implementat manual (''​bit-banging''​) pe pinii ''​PB2 (SDO)''​ si ''​PB4 (SCL)'',​ fara a folosi perifericul SPI hardware. Se citesc 8 biti la fiecare apel, fiecare bit fiind esantionat pe frontul crescator al clock-ului cu delayMicroseconds(2).
 +
 +==== Citire MPR121 ====
 +
 +Senzorul MPR121 comunica prin I2C la adresa ''​0x5A''​. Functia mpr121.touched() returneaza un cuvant de 16 biti in care fiecare bit corespunde unui electrod. Cand orice electrod este atins, modulul activeaza functia de ''​sustain''​ — ultima nota cantata pe TTP229 este retinuta in variabila lastKeyboardNote si redata continuu.
 +
 +==== Debounce butoane ====
 +
 +Cele 6 butoane tactile folosesc detectia frontului descrescator (HIGH→LOW) prin compararea starii curente cu starea anterioara retinuta in variabile static, eliminand necesitatea intarzierilor blocking (delay()).
 +
 +==== Afisaj LCD ====
 +
 +Ecranul este actualizat maxim o data la ''​150ms''​ pentru a evita flickerul. Sunt afisate nota curenta (Do/Re/Mi etc.), octava, frecventa in Hz si forma de unda activa. Cand nicio tasta nu este apasata, ecranul afiseaza starea globala a sintetizatorului (octava + unda).
 +
 +=== Surse și funcții implementate ===
 +
 +**readTTP229()**
 +
 +Citește starea celor 8 electrozi ai TTP229 prin bit-banging SPI și returnează un byte cu biții corespunzători tastelor apăsate
 +
 +
 + **getFirstKey()**
 +
 +Parcurge byte-ul returnat de TTP229 și returnează indexul primei taste apăsate (0–7) sau -1 dacă nicio tastă nu e apăsată
 +
 +
 +
 + **calcFreq()**
 +
 +Calculează frecvența finală a notei în funcție de indexul notei, octava curentă și modificatorul de frecvență de la potențiometru
 +
 +
 +
 + **playFreq()**
 +
 +Configurează Timer1 pentru unda pătrat sau apelează tone() pentru celelalte forme de undă; include cache pe ultima frecvență pentru a evita reconfigurări inutile
 +
 +
 +
 + **stopSound()**
 +
 +Oprește orice sunet activ, resetează registrele Timer1 și marchează starea ca inactivă
 +
 +
 +
 + **updateLCD()**
 +
 +Actualizează ecranul LCD cu nota, octava, frecvența și forma de undă curentă, cu throttle de 150ms
 +
 +
 +
 + **setup()** ​
 +
 +Inițializează toți pinii, Timer1, I2C, LCD și MPR121
 +
 +
 +
 + **loop()** 
 +
 + Bucla principală:​ citește butoanele, potențiometrele,​ TTP229, MPR121, calculează nota activă, aplică gate/duty și actualizează LCD-ul
  
  
Line 136: Line 240:
 Care au fost rezultatele obţinute în urma realizării proiectului vostru. Care au fost rezultatele obţinute în urma realizării proiectului vostru.
 </​note>​ </​note>​
 +
 +Aici poate fi observata functionalitatea hardware si software, combinate in stadiul final al proiectului:​
 +
 +https://​imgur.com/​a/​U1WJFZq
  
 ===== Concluzii ===== ===== Concluzii =====
  
 ===== Download ===== ===== Download =====
 +=== Codul sursă ===
 +
 +Codul sursă complet al proiectului,​ împreună cu biblioteca locală ''​Adafruit_MPR121'' ​
 +și fișierul de configurare ''​platformio.ini'',​ sunt disponibile in acest repo pe GitHub:
 +
 +https://​github.com/​roxtastic/​Enigma-Synth
 +
 +Repository-ul conține:
 +
 +
 +- ''​src/​main.cpp''​ — codul principal al sintetizatorului
 +
 +
 +- ''​lib/​Adafruit_MPR121/''​ — biblioteca locală pentru senzorul capacitiv MPR121
 +
 +
 +- ''​platformio.ini''​ — configurarea proiectului PlatformIO (placă, protocol de upload, dependențe)
 +
 +
  
 <note warning> <note warning>
pm/prj2026/ciprian.popescu0411/ilinca.tololoi.1778964622.txt.gz · Last modified: 2026/05/16 23:50 by ilinca.tololoi
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