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/24 16:24]
ilinca.tololoi [Introducere]
pm:prj2026:ciprian.popescu0411:ilinca.tololoi [2026/05/25 01:59] (current)
ilinca.tololoi [Afisaj LCD]
Line 33: 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 84: Line 94:
 SDO → PD3 SDO → PD3
  
-HW-017:+**HW-017:**
  
 3.3V → ATmega 3.3V 3.3V → ATmega 3.3V
Line 92: Line 102:
 IRQ → PD2 (INT0) IRQ → PD2 (INT0)
  
-PCF8574 + LCD:+**PCF8574 + LCD:**
  
 VCC → +5V VCC → +5V
Line 100: 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 128: 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 135: 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.1779629049.txt.gz · Last modified: 2026/05/24 16:24 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