This shows you the differences between two versions of the page.
|
pm:prj2026:ciprian.popescu0411:ilinca.tololoi [2026/05/09 22:57] ilinca.tololoi [Descriere generală] |
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 3 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 (PAM8403) si redat prin doua difuzoare de 3W. In plus, pe un ecran LCD 1602 conectat via I2C, sunt 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 8 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 (3 pentru schimbarea octavei intre valorile 1-6, cate doua octave per buton, si 3 pentru selectarea formei de unda: patrat, sine sau triunghi) si 2 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 unda, modularea 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 30: | Line 29: | ||
| Exemplu de schemă bloc: http://www.robs-projects.com/mp3proj/newplayer.html | Exemplu de schemă bloc: http://www.robs-projects.com/mp3proj/newplayer.html | ||
| </note> | </note> | ||
| - | {{:pm:prj2026:ciprian.popescu0411:schema_bloc_enigma_synth.png?600 |}} | + | {{:pm:prj2026:ciprian.popescu0411:schema_bloc_rox.png?600 |}} |
| ===== Hardware Design ===== | ===== Hardware Design ===== | ||
| <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ă | + | * **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 |}} | ||
| + | |||
| + | ===Stadiu hardware fizic:=== | ||
| + | |||
| + | {{:pm:prj2026:ciprian.popescu0411:milestone_hardware_rox.jpeg?600 |}} | ||
| + | |||
| + | **Lipituri necesare:** | ||
| + | |||
| + | * 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 intre modulul I2C (PCF8574) si LCD 1602 | ||
| + | |||
| + | * 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 PC5 → SCL (HW-017, PCF8574, TTP229) | ||
| + | |||
| + | **TTP229:** | ||
| + | |||
| + | VCC → +5V | ||
| + | GND → GND | ||
| + | SCL → PC5 | ||
| + | SDO → PD3 | ||
| + | |||
| + | **HW-017:** | ||
| + | |||
| + | 3.3V → ATmega 3.3V | ||
| + | GND → GND | ||
| + | SDA → PC4 | ||
| + | SCL → PC5 | ||
| + | IRQ → PD2 (INT0) | ||
| + | |||
| + | **PCF8574 + LCD:** | ||
| + | |||
| + | VCC → +5V | ||
| + | GND → GND | ||
| + | SDA → PC4 | ||
| + | SCL → PC5 | ||
| + | 16 pini → LCD 1602 (lipit direct) | ||
| + | |||
| + | **Audio:** | ||
| + | |||
| + | ATmega PB1/OC1A → rezistor 1kΩ → condensator 100nF → PAM8403 IN_L | ||
| + | PAM8403 VIN → +5V | ||
| + | PAM8403 GND → GND | ||
| + | PAM8403 LOUT+ / LOUT- → Difuzor stanga | ||
| + | PAM8403 ROUT+ / ROUT- → Difuzor dreapta | ||
| + | |||
| + | **Butoane (6x):** | ||
| + | |||
| + | Un pin → GND | ||
| + | Celalalt pin → PD4, PD5, PD6, PD7, PB2, PB3 | ||
| + | |||
| + | **Potentiometre (3x):** | ||
| + | |||
| + | Pin stanga → +5V | ||
| + | Pin dreapta → GND | ||
| + | Pin mijloc (wiper) → PA0, PA1, PA2 | ||
| ===== Software Design ===== | ===== Software Design ===== | ||
| Line 58: | 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 65: | 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> | ||