This shows you the differences between two versions of the page.
|
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> | ||