Functionalitate: 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: 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: Ideea proiectului a pornit de la nostalgia pentru muzica electronica a anilor '90, in special pentru peisajele sonore ambientale ale proiectului muzical Enigma. Dorinta de a recrea, macar conceptual, experienta utilizarii unui sintetizator hardware clasic, a dus la decizia de a transforma placa de dezvoltare ATmega328P Xplained Mini intr-un instrument muzical retro-futurist, tactil si complet autonom.
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, PWM, comunicare I2C si SPI, conversie analog-digitala si citirea senzorilor capacitivi pe platforma AVR.
Exemplu de schemă bloc: http://www.robs-projects.com/mp3proj/newplayer.html
Lista de piese: * Unitate de procesare: ATmega328P Xplained Mini
Lipituri necesare:
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
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.
| Librarie | Sursa | ||
LiquidCrystal_I2C | marcoschwartz | ||
Adafruit_MPR121 | Adafruit (instalata local in /lib) | ||
Wire.h | Arduino built-in | ||
Arduino.h | Arduino built-in | ||
Sunetul este generat prin configurarea directa a registrelor Timer1 (TCCR1A, TCCR1B, ICR1, OCR1A) in modul Fast PWM cu frecventa variabila. Formula de calcul este:
top = (16MHz / (2 × frecventa)) - 1
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.
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×.
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).
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.
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()).
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).
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
Aici poate fi observata functionalitatea hardware si software, combinate in stadiul final al proiectului:
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)
Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.