This shows you the differences between two versions of the page.
|
pm:prj2026:theodor_ioan.buliga:ioan.sabou [2026/05/04 14:30] ioan.sabou [Introducere] |
pm:prj2026:theodor_ioan.buliga:ioan.sabou [2026/05/27 01:12] (current) ioan.sabou [Scheme electrice] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Fire Tetris ====== | + | ====== Tamagotchi Circuits ====== |
| ===== Introducere ===== | ===== Introducere ===== | ||
| - | **Fire Tetris** implementează jocul clasic Tetris pe o placă **ATmega328P Xplained Mini**, cu un element inovator: viteza de cădere a pieselor este controlată în timp real de temperatura ambiantă, citită de un senzor analogic **LM35**. Feedback-ul sonor este asigurat de un buzzer pasiv, iar afișarea jocului se face pe un ecran OLED 0.96" prin I2C. | + | Tamagotchi Circuits este un proiect individual care combină embedded cu o interfață hardware interactivă pe ESP32. |
| - | Conceptul de bază — **Thermal Difficulty Scaling** — transformă temperatura mediului într-un parametru de dificultate: cu cât temperatura crește, cu atât piesele cad mai repede. Aceasta face jocul util nu doar ca divertisment, ci și ca o metodă intuitivă (gamificată) de monitorizare a temperaturii în medii casnice sau industriale. | + | Ideea principală: o fantomă (Ghost Boo) afișată pe un ecran OLED devine tristă în timp. Pentru a o menține fericită, utilizatorul trebuie să joace minigame-uri — unele dintre ele implică construirea unor circuite electronice reale pe breadboard, pe care ESP32 le validează și le face graficul pe un al doilea ecran OLED dedicat minigame-urilor. |
| - | **Utilitate:** | + | Scopul proiectului este de a oferi un sistem de recompensă concret (menținem fantoma fericită) prin construirea și înțelegerea unor circuite electronice, învățând astfel concepte de bază din electronică și fizică. |
| - | * Gamificarea monitorizării temperaturii: utilizatorul percepe instinctiv creșterea temperaturii prin creșterea dificultății jocului. | + | |
| - | * Proiect educațional complet, acoperind GPIO, ADC, I2C, Timere și PWM pe un microcontroler AVR. | + | |
| - | {{:pm:prj2026:theodor_ioan.buliga:graphviz.png?200|}} | + | |
| - | ===== Descriere generală ===== | + | |
| - | Proiectul are o componentă fizică importanta: dispozitivul embedded pe ATmega328P. | + | Proiectul este finalizat cu 9 minigame-uri funcționale: potentiometer, RC circuit (6 configurații), voltage divider, diode rectifier, transistor switch, NPN amplifier, deadbeet rhythm, și metronome. |
| - | **Intrări:** | + | |
| - | * 3 butoane tactile (Stânga, Dreapta, Rotație) — citite prin întreruperi externe | + | |
| - | * Senzor de temperatură LM35 — citit prin ADC (semnal analogic 0–1V) | + | |
| - | **Ieșiri:** | + | Abstractizarea generală a conceptului de „circuit minigame" ca struct `minigame_t` este implementată: fiecare minigame expune `init`, `deinit`, `run` și un `mood_reward`, toate înregistrate într-un registry cu progresie liniară. |
| - | * Ecran OLED SSD1306 0.96 — afișarea câmpului de joc, scorului și temperaturii (I2C) | + | |
| - | * Buzzer pasiv — melodii și efecte sonore (PWM) | + | |
| - | Modul în care interacționează modulele: | + | Proiectul este util pentru că stimulează dorința de a învăța electronică și de a construi circuite corecte, într-un mod interactiv și vizual. |
| - | ^ Modul ^ Interfață ^ Rol în sistem ^ | + | ===== Descriere Generală ===== |
| - | | Butoane tactile | GPIO / INT | Control direcție și rotație piese | | + | |
| - | | Senzor LM35 | ADC (analogic) | Citirea temperaturii, scalarea vitezei | | + | |
| - | | Ecran OLED SSD1306 | I2C | Afișarea jocului, scorului, temperaturii | | + | |
| - | | Buzzer pasiv | PWM (Timer) | Muzică de fundal și efecte sonore | | + | |
| - | | Timer1 (AVR intern) | Întrerupere periodică | Gravity — căderea pieselor | | + | |
| - | Concepte din laboratoare utilizate: | + | ==== Minigame-uri ==== |
| - | * **Lab 0 – GPIO:** citirea butoanelor de control (Stânga, Dreapta, Rotație) cu rezistențe pull-up interne | + | ^ # ^ Minigame ^ Descriere ^ GPIO-uri ^ Status ^ |
| - | * **Lab 1 – UART:** log-uri seriale pentru debugging în timpul dezvoltării (afișarea valorilor ADC și stării jocului) | + | | 0 | Potentiometer | Wiperul unui potențiometru; menții zona țintă random 3s | GPIO32 (ADC1 CH4) | ✓ Implementat | |
| - | * **Lab 3 – Timere / Întreruperi:** Timer1 în mod CTC generează întreruperea periodică de "gravity" (căderea pieselor); întreruperi externe INT0/INT1/PCINT pentru butoane, latență garantată sub 50 ms | + | | 1 | RC circuit (6 config.) | Construiești R+C pe breadboard; ESP măsoară τ prin least-squares pe ln(V) | GPIO25 out, GPIO34 ADC | ✓ Implementat | |
| - | * **Lab 4 – ADC:** citirea tensiunii de ieșire a senzorului LM35 (10 mV/°C), convertită în temperatură și mapată la intervalul de viteză al jocului | + | | 2 | Voltage divider | Doi rezistori în serie; ESP validează raportul de tensiune | GPIO25 out, GPIO34 ADC | ✓ Implementat | |
| - | * **Lab 6 – I2C:** comunicarea cu ecranul OLED SSD1306 prin magistrala TWI a ATmega328P (adresă 0x3C, 400 kHz) | + | | 3 | RC low/high-pass filter | R+C; ESP măsoară răspunsul în frecvență la PWM | GPIO25 PWM, GPIO34 ADC | TODO | |
| - | * **PWM:** generarea tonurilor pe buzzer prin modularea frecvenței unui timer în mod Fast PWM | + | | 4 | Diode rectifier | Diodă + condensator pe semnal cosine 200Hz redresat; osciloscop live | GPIO25 DAC, GPIO34 ADC | ✓ Implementat | |
| + | | 5 | Capacitor buffer | Condensatorul menține tensiunea după tăierea GPIO-ului | GPIO25 out, GPIO34 ADC | TODO | | ||
| + | | 6 | Transistor switch | NPN în saturație (1kΩ bază); ESP conduce baza, măsoară Vc la colector | GPIO25 out (bază), GPIO34 ADC (colector) | ✓ Implementat | | ||
| + | | 6b | NPN Amplifier | NPN în regim activ (1MΩ bază); ESP măsoară β real (Ib=2.6µA fix) | GPIO25 out (bază), GPIO34 ADC (colector) | ✓ Implementat | | ||
| + | | 7 | LM-35 temperature | Senzor temperatură extern, output direct pe ADC | GPIO35 (ADC1 CH7) | TODO | | ||
| + | | 8 | Deadbeet rhythm | ESP redă o secvență de LED-uri; utilizatorul o repetă pe butoane colorate | GPIO13/12/14 out (LED), GPIO19/17/16 in (R/G/B) | ✓ Implementat | | ||
| + | | 9 | Metronome | Două potențiometre (BPM + duty cycle) + buzzer pasiv; ține 3s pentru pass | GPIO32, GPIO35 ADC; GPIO23 PWM | ✓ Implementat | | ||
| - | **Element de noutate — Thermal Difficulty Scaling:** | + | Games 1–6b partajează GPIO25 și GPIO34 — circuitul de pe breadboard se schimbă între ele, nu pinii. |
| - | Mecanismul citește temperatura la fiecare 500 ms prin ADC și recalculează perioada Timer1. Formula de mapare: | + | ==== Schema bloc ==== |
| - | <code> | + | {{:pm:prj2026:theodor_Ioan.buliga:tamagotchi.png?600|}} |
| - | perioadă_gravity (ms) = MAX_PERIOD - ((temperatura - TEMP_MIN) / (TEMP_MAX - TEMP_MIN)) * (MAX_PERIOD - MIN_PERIOD) | + | |
| - | Exemplu: TEMP_MIN=15°C → 800ms/tick | TEMP_MAX=40°C → 150ms/tick | + | Modulele principale și interacțiunile dintre ele: |
| - | </code> | + | |
| - | Astfel, la temperaturi ridicate, jocul devine semnificativ mai dificil, fără nicio interacțiune din partea utilizatorului. | + | * **ESP-32 Devkit V1** — nucleul sistemului; orchestrează toate minigame-urile, conduce ambele OLED-uri și perifericele |
| + | * **OLED SH1106 1.3"** — afișează fantoma permanent și starea ei (fericită / tristă / măsurând / celebrând) | ||
| + | * **OLED SSD1306 0.96"** — display dedicat minigame-urilor: instrucțiuni, bare de progres, osciloscop live | ||
| + | * **Buzzer pasiv (PWM)** — folosit în metronome minigame | ||
| + | * **LED-uri RGB** — folosite în deadbeet rhythm game | ||
| + | * **Butoane tactile** — input pentru deadbeet rhythm game + butonul principal BTN_A (GPIO33) | ||
| + | * **ADC GPIO34** — măsurare circuite RC, voltage divider, rectifier, transistor, etc. | ||
| + | * **ADC GPIO35** — senzor temperatură LM-35 / duty cycle metronome | ||
| + | * **ADC GPIO32** — potențiometru minigame / BPM metronome | ||
| ===== Hardware Design ===== | ===== Hardware Design ===== | ||
| - | **Listă de componente:** | + | ==== Pinout ==== |
| - | ^ Componentă ^ Cantitate ^ Rol ^ | + | === Display-uri === |
| - | | ATmega328P Xplained Mini | 1 | Microcontroler principal | | + | |
| - | | Ecran OLED SSD1306 0.96" | 1 | Afișarea jocului (I2C) | | + | |
| - | | Senzor temperatură LM35 | 1 | Citire temperatură ambiantă (ADC) | | + | |
| - | | Buzzer pasiv | 1 | Efecte sonore și muzică (PWM) | | + | |
| - | | Butoane tactile 6mm | 3 | Control: Stânga, Dreapta, Rotație | | + | |
| - | | Rezistențe 10kΩ | 3 | Pull-up extern pentru butoane (opțional, se pot folosi cele interne) | | + | |
| - | | Rezistență 100Ω | 1 | Protecție buzzer | | + | |
| - | | Breadboard + fire dupont | — | Interconectare | | + | |
| - | | Cablu USB | 1 | Alimentare și programare | | + | |
| - | **Conexiuni principale:** | + | ^ Display ^ Diagonală ^ Rol ^ Bus I2C ^ SDA ^ SCL ^ Adresă ^ |
| + | | SH1106 | 1.3" | Ghost — permanent activ | I2C0 (I2C_NUM_0) | GPIO18 | GPIO5 | 0x3C | | ||
| + | | SSD1306 | 0.96" | Minigame support | I2C1 (I2C_NUM_1) | GPIO4 | GPIO15 | 0x3C | | ||
| - | ^ Semnal ^ Pin ATmega328P ^ Observații ^ | + | Ambele display-uri au adresa 0x3C — menținute pe bus-uri separate pentru a evita conflictul. Ambele sunt cablate pe Side 1 al DevKit-ului pentru cablaj curat. |
| - | | OLED SDA | PC4 (SDA) | I2C, adresă 0x3C | | + | |
| - | | OLED SCL | PC5 (SCL) | I2C, 400 kHz | | + | |
| - | | LM35 OUT | PC0 (ADC0) | Semnal analogic 0–500 mV | | + | |
| - | | Buzzer | PB1 (OC1A) | PWM Timer1, rezistență serie 100Ω | | + | |
| - | | Buton Stânga | PD2 (INT0) | Întrerupere externă, pull-up intern | | + | |
| - | | Buton Dreapta | PD3 (INT1) | Întrerupere externă, pull-up intern | | + | |
| - | | Buton Rotație | PB0 (PCINT0) | Pin Change Interrupt | | + | |
| - | **Alimentare:** 5V prin USB (ATmega328P Xplained Mini); OLED-ul acceptă 3.3V–5V. | + | === Pini minigame-uri === |
| + | |||
| + | ^ # ^ Minigame ^ Circuit ^ Pini ^ | ||
| + | | 0 | Potentiometer | Wiper pot la ADC | GPIO32 (ADC1 CH4) | | ||
| + | | 1 | RC circuit | R + C la GND | GPIO25 out, GPIO34 ADC | | ||
| + | | 2 | Voltage divider | Doi rezistori în serie | GPIO25 out, GPIO34 ADC | | ||
| + | | 3 | RC low/high-pass filter | R+C, măsurare răspuns frecvență | GPIO25 PWM, GPIO34 ADC | | ||
| + | | 4 | Diode rectifier | Diodă + cap pe semnal cosine redresat | GPIO25 DAC, GPIO34 ADC | | ||
| + | | 5 | Capacitor buffer | Cap menține tensiunea după GPIO cut | GPIO25 out, GPIO34 ADC | | ||
| + | | 6 | Transistor switch | NPN saturație: 1kΩ bază, LED pe colector | GPIO25 out (bază 1kΩ), GPIO34 ADC (colector) | | ||
| + | | 6b | NPN Amplifier | NPN activ: 1MΩ bază, 1kΩ colector, β real | GPIO25 out (bază 1MΩ), GPIO34 ADC (colector) | | ||
| + | | 7 | Temperature LM-35 | Output LM-35 la ADC | GPIO35 (ADC1 CH7) | | ||
| + | | 8 | Deadbeet rhythm | LED-uri secvență, butoane colorate repetă | GPIO13/12/14 out (R/G/B LED), GPIO19/17/16 in (R/G/B buton) | | ||
| + | | 9 | Metronome | Două pot-uri + buzzer pasiv | GPIO32 ADC (BPM), GPIO35 ADC (duty), GPIO23 PWM | | ||
| + | |||
| + | === Pini ficși === | ||
| + | |||
| + | ^ Pin ^ Rol ^ | ||
| + | | GPIO33 | BTN_A — buton principal (ISR, falling edge, debounce 300ms) | | ||
| + | | GPIO23 | Buzzer PWM (metronome) | | ||
| + | |||
| + | ==== Listă de piese ==== | ||
| + | |||
| + | ^ # ^ Componentă ^ Cantitate ^ Observații ^ | ||
| + | | 1 | ESP-32 Devkit V1 (DOIT) | 1 | Microcontroller principal | | ||
| + | | 2 | Ecran OLED SH1106 1.3", 128×64, I2C | 1 | SDA→GPIO18, SCL→GPIO5; display fantomă | | ||
| + | | 3 | Ecran OLED SSD1306 0.96", 128×64, I2C | 1 | SDA→GPIO4, SCL→GPIO15; display minigame | | ||
| + | | 4 | Senzor temperatură LM-35 | 1 | ADC→GPIO35 | | ||
| + | | 5 | Butoane tactile + set butoane colorate SYB-120 | 4+ | 3× deadbeet rhythm (R/G/B) + 1× BTN_A principal | | ||
| + | | 6 | LED-uri RGB | 3 | Deadbeet rhythm game (R/G/B) | | ||
| + | | 7 | Buzzer pasiv | 1 | Metronome minigame (PWM GPIO23) | | ||
| + | | 8 | Potențiometre | 2+ | 1× potentiometer minigame (GPIO32), 1× metronome duty (GPIO35); potențiometre colorate SYB-120 | | ||
| + | | 9 | Rezistențe, condensatoare, diode | asortate | Pentru circuit minigame-uri (RC, divider, filter, rectifier) | | ||
| + | | 10 | Tranzistoare NPN 2N2222 | 2+ | Transistor switch minigame (1kΩ bază) + NPN amplifier (1MΩ bază) | | ||
| + | | 11 | Kit breadboard SYB-120 (Optimus Digital) | 1 | 4 breadboard-uri, fire, butoane colorate, potențiometre | | ||
| + | | 12 | Fire de breadboard | — | Conectică generală | | ||
| + | |||
| + | ==== Scheme electrice ==== | ||
| + | |||
| + | {{:pm:prj2026:theodor_Ioan.buliga:schema_rc.pdf|Schema hardware placa (PDF)}} | ||
| + | |||
| + | **Voltage divider, RC circuit diode rectifier, transistor switch, NPN amplifier, deadbeet rhythm, metronome:** Vezi caietul cu ecuațiile și schemele pentru referință. | ||
| + | |||
| + | **TODO:** Schemă electrică pentru RC low/high-pass filter | ||
| + | |||
| + | **TODO:** Schemă electrică pentru capacitor buffer | ||
| + | |||
| + | **TODO:** Schemă electrică pentru LM-35 temperature sensor | ||
| + | |||
| + | ==== Diagrame de semnal ==== | ||
| + | |||
| + | Vezi caietul cu ecuațiile și schemele pentru referință. | ||
| ===== Software Design ===== | ===== Software Design ===== | ||
| - | Firmware-ul este scris în **C pur**, compilat cu **avr-gcc** și flashat cu **avr-dude** prin interfața EDBG a plăcii Xplained Mini. Editarea se face în **VS Code** cu extensia AVR. | + | ==== Mediu de dezvoltare ==== |
| - | **Librării și surse third-party:** | + | * PlatformIO + ESP-IDF v5.x (framework-espidf) |
| - | * [[https://github.com/lexus2k/ssd1306|ssd1306 (lexus2k)]] — driver I2C pentru OLED, portată și adaptată pentru AVR | + | * Toolchain: xtensa-esp-elf |
| - | * Rutine ADC și Timer proprii, scrise direct pe registre AVR (fără Arduino HAL) | + | * Librării third-party: niciuna — drivere custom pentru SH1106 și SSD1306, ADC oneshot (ESP-IDF built-in) |
| - | **Structura modulară a codului:** | + | ==== Arhitectură ==== |
| - | <code> | + | **Două task-uri FreeRTOS:** |
| - | fire_tetris/ | + | * `ghost_task` — 8KB stack, rulează permanent la 50ms tick; gestionează animațiile fantomei, decayul de mood și spawn-ul minigame_task |
| - | ├── main.c — inițializare și buclă principală | + | * `minigame_task` — 4KB stack, spawnat on-demand la apăsarea butonului; distrus la finalul minigame-ului |
| - | ├── tetris.c / .h — logica jocului (piese, coliziuni, linii complete) | + | |
| - | ├── display.c / .h — randarea câmpului pe OLED prin driver SSD1306 | + | **Abstractizare minigame (`minigame_t`):** |
| - | ├── adc.c / .h — citire LM35, conversie în temperatură, mapare viteză | + | <code c> |
| - | ├── timer.c / .h — configurare Timer1 (gravity), Timer2 (PWM buzzer) | + | typedef struct { |
| - | ├── buttons.c / .h — configurare întreruperi INT0, INT1, PCINT0 | + | const char *name; // afișat pe SH1106 „NEXT:" |
| - | └── music.c / .h — tabele de note și redare melodii pe buzzer | + | esp_err_t (*init)(void); // configurare GPIO/ADC |
| + | void (*deinit)(void); // restaurare GPIO safe state | ||
| + | bool (*run)(void); // loop blocant; true = pass | ||
| + | uint8_t mood_reward; // puncte mood la PASS | ||
| + | } minigame_t; | ||
| </code> | </code> | ||
| - | **Algoritmi cheie:** | + | **Registry (`minigame_registry.c`):** progresie liniară; `registry_advance()` apelat indiferent de rezultat (pass sau abort). |
| - | * **Logica Tetris:** reprezentarea câmpului ca matrice uint8_t[20][10]; detecție coliziuni bit cu bit; rotație piese prin matrici precalculate (4 orientări × 7 piese). | + | **Ghost state machine:** 5 stări — NEUTRAL, SAD, HAPPY, CELEBRATING, MEASURING. Decay de mood dependent de bandă (mai rapid la mood scăzut). Animații 2-frame per stare pe SH1106. |
| - | * **Gravity prin Timer1 (CTC):** la fiecare overflow ISR, piesa curentă coboară un rând. Perioada se recalculează după fiecare citire ADC. | + | |
| - | * **Citire ADC cu oversamplig:** media a 8 conversii consecutive → reducerea zgomotului la ±0.5°C. | + | |
| - | * **PWM buzzer:** Timer2 în Fast PWM, frecvența modificată prin registrul OCR2A pentru fiecare notă; durata notelor controlată de Timer0. | + | |
| - | **Utilizarea registrelor pentru performanță:** | + | **Buton (`g_minigame_btn`):** ISR pe GPIO33 (falling edge, debounce 300ms). Când un minigame este activ, apăsările sunt rutate prin `g_minigame_btn` — fiecare minigame își gestionează propria logică de stop/avans. |
| - | Toate configurările periferice se fac direct pe registre (TCCR1B, ADMUX, TWBR etc.) — fără overhead de librărie. ISR-urile sunt minimale: setează un flag atomic, logica se execută în bucla principală (pattern producer–consumer). | + | ==== RC Minigame — detalii algoritm ==== |
| - | **Metrici de performanță țintă:** | + | 6 configurații modulare, toți parametrii derivați din `tau_ms`: |
| - | ^ Metrică ^ Țintă ^ Metodă de măsurare ^ | + | ^ Config ^ R ^ C ^ τ ^ Concept ^ |
| - | | Latența buton → reacție piesă | < 50 ms | Osciloscop pe pin GPIO + log UART | | + | | RC 100ms | 1kΩ | 100µF | 100ms | Rezistență mică → descărcare rapidă | |
| - | | Precizia citirii temperaturii | ± 1°C | Comparație cu termometru de referință | | + | | RC 200ms | 2kΩ | 100µF | 200ms | R dublu → τ dublu | |
| - | | Timp randare cadru OLED | < 30 ms | Timestamp UART înainte/după transfer I2C | | + | | RC 500ms | 10kΩ | 2×100µF serie | 500ms | C serie reduce capacitatea | |
| - | | Perioadă gravity minimă | 150 ms | Verificare cu osciloscop pe pin debug | | + | | RC 1s | 10kΩ | 100µF | 1s | Configurație de bază | |
| - | | Consum memorie SRAM | < 1.5 KB | Raport avr-size după compilare | | + | | RC 2s | 10kΩ | 2×100µF paralel | 2s | C paralel dublează capacitatea | |
| + | | RC 4s | 20kΩ (2× serie) | 2×100µF paralel | 4s | Compus — τ = R×C scalează cu ambii | | ||
| - | ===== Rezultate Obținute ===== | + | * `charge_ms = 6 × τ` (încărcare la 99.75% din Vs) |
| + | * `sample_interval_ms = 5τ / 128` (128 sample-uri acoperă 5τ) | ||
| + | * τ ≥ 500ms → osciloscop live (flush per sample); τ < 500ms → batch (toate sample-urile, un singur flush) | ||
| + | * τ calculat prin least-squares pe ln(V(t)) cu timestamps reale (`esp_timer_get_time()`) | ||
| + | * Toleranță ±35% pentru a acomoda toleranța componentelor electronice (condensatoare ±20%) | ||
| - | <note tip> | + | ==== TODO Software ==== |
| - | Secțiunea va fi completată după finalizarea și testarea hardware-ului. Vor fi incluse: capturi video ale jocului funcțional, grafice ale răspunsului termic, măsurători de latență și precizie ADC. | + | |
| - | </note> | + | |
| - | Stadiu curent: | + | * RC low/high-pass filter minigame |
| - | * Logica jocului Tetris — implementată și testată în simulator | + | * Capacitor buffer minigame |
| - | * Driver OLED I2C — funcțional, randare la ~28 ms/cadru (măsurat prin UART) | + | * LM-35 temperature minigame |
| - | * Citire ADC LM35 — funcțional, precizie ±1.2°C față de referință | + | |
| - | * Integrare Thermal Difficulty Scaling — în curs de testare pe hardware | + | |
| ===== Concluzii ===== | ===== Concluzii ===== | ||
| - | <note tip> | + | Proiectul a atins obiectivul principal: 9 minigame-uri funcționale, fiecare cerând utilizatorului să construiască un circuit real pe breadboard și să îl valideze cu ESP32. |
| - | Concluziile vor fi redactate după finalizarea proiectului și a testelor complete. | + | |
| - | </note> | + | |
| - | Proiectul demonstrează că un microcontroler AVR de complexitate medie (ATmega328P) poate rula un joc cu logică non-trivială, grafică pe OLED și feedback termic în timp real, folosind exclusiv periferice hardware (timere, ADC, I2C, PWM) fără sistem de operare. Mecanismul **Thermal Difficulty Scaling** reprezintă un exemplu concret de îmbinare a senzorilor analogici cu logica aplicației. | + | Abstractizarea `minigame_t` s-a dovedit robustă — fiecare joc nou a necesitat modificări în exact 3 fișiere (minigame nou, `minigame_registry.c`, `minigame_rewards.h`), fără a atinge codul existent. |
| + | |||
| + | Cea mai complexă măsurătoare: RC τ prin least-squares pe ln(V) cu timestamps reale, toleranță ±35% pentru componente reale. Cea mai vizuală: diode rectifier cu osciloscop live pe SSD1306 — 128 sample-uri la 200Hz, 2 cicluri complete pe ecran. | ||
| + | |||
| + | GPIO25 și GPIO34 sunt partajate de 7 jocuri (RC, voltage divider, rectifier, transistor switch, NPN amplifier) — breadboard-ul se schimbă între minigame-uri, pinii nu. Aceasta a simplificat semnificativ cablajul permanent. | ||
| + | |||
| + | Remaparea display-urilor pe Side 1 al DevKit-ului (SSD1306→GPIO4/15, SH1106→GPIO18/5) a eliminat firele lungi care traversau breadboard-ul. | ||
| + | |||
| + | Rămân de implementat: RC filter, capacitor buffer și LM-35 — fiecare necesită aproximativ aceeași structură ca jocurile existente. | ||
| ===== Download ===== | ===== Download ===== | ||
| - | <note warning> | + | **TODO:** Arhivă cu sursele finale, README și instrucțiuni de compilare/flash. |
| - | Codul sursă, schemele electrice și resursele proiectului sunt disponibile pe GitLab. Repository-ul include un fișier README cu instrucțiuni de compilare și flashare, un ChangeLog cu evoluția proiectului și un Makefile pentru build automat cu avr-gcc + avr-dude. | + | |
| - | </note> | + | |
| ===== Jurnal ===== | ===== Jurnal ===== | ||
| - | **Intrări jurnal:** | + | * **11 aprilie** — prima comandă: breadboard, SSD1306 (OLED 0.96" I2C), LM-35 |
| - | + | * **6 mai** — a doua comandă: ESP-32, SH1106 (OLED 1.3" I2C) | |
| - | * **5 aprilie 2026** — comandă componente (OLED, LM35, butoane, buzzer) | + | * **10 mai** — primul demo funcțional: fantoma animată pe OLED, circuit RC pe breadboard, grafic al curbei de descărcare afișat pe ecran |
| - | * **4 mai 2026** — scris functionalitate docuwiki | + | * **16 mai** — sistem complet de abstractizare minigame (minigame_t, registry, două task-uri FreeRTOS); potentiometer minigame funcțional; RC circuit minigame: osciloscop live pe SSD1306, τ prin least-squares, 6 configurații modulare |
| + | * **18 mai** — deadbeet rhythm minigame implementat: secvență LED R/G/B generată de ESP, utilizatorul repetă pe 3 butoane | ||
| + | * **20 mai** — achiziție kit SYB-120 (4 breadboard-uri, butoane colorate, potențiometre) de la Optimus Digital | ||
| + | * **23 mai** — voltage divider minigame implementat | ||
| + | * **23 mai** — remapare display-uri pe Side 1: SSD1306→GPIO4/GPIO15, SH1106→GPIO18/GPIO5; butoane deadbeet remapate pe GPIO19/17/16 | ||
| + | * **23 mai** — metronome minigame implementat: două potențiometre (BPM + duty cycle) + buzzer pasiv, hold 3s pentru pass | ||
| + | * **23 mai** — diode rectifier minigame implementat: DAC cosine 200Hz pe GPIO25, osciloscop live SSD1306, validare prin std dev < 100mV | ||
| + | * **24 mai** — NPN transistor switch minigame implementat (1kΩ bază, LED pe colector, pass dacă Vc/Vcc < 0.15); adăugat NPN_THEORY.md cu pinout 2N2222 | ||
| + | * **26 mai** — NPN amplifier variant implementat: 1MΩ bază (Ib=2.6µA), SSD1306 afișează Vc, Ic și β real; pass dacă 20 ≤ β ≤ 800 | ||
| ===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
| - | **Resurse Hardware:** | + | * Datasheet ESP32 — [[https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf]] |
| - | * [[https://www.microchip.com/en-us/product/atmega328p|Datasheet ATmega328P — Microchip]] | + | * Datasheet SH1106 — [[https://www.displayfuture.com/Display/datasheet/controller/SH1106.pdf]] |
| - | * [[https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf|Datasheet SSD1306 OLED Controller]] | + | * Datasheet SSD1306 — [[https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf]] |
| - | * [[https://www.ti.com/lit/ds/symlink/lm35.pdf|Datasheet LM35 — Texas Instruments]] | + | * Datasheet LM-35 — [[https://www.ti.com/lit/ds/symlink/lm35.pdf]] |
| - | * Datasheet ATmega328P Xplained Mini (Microchip) | + | * Datasheet 2N2222 — [[https://www.onsemi.com/pdf/datasheet/p2n2222a-d.pdf]] |
| - | + | * ESP-IDF v5 I2C Master docs — [[https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/i2c.html]] | |
| - | **Resurse Software:** | + | * ESP-IDF v5 ADC Oneshot docs — [[https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/adc_oneshot.html]] |
| - | * [[https://github.com/lexus2k/ssd1306|Driver SSD1306 pentru AVR (lexus2k/ssd1306)]] | + | * ESP-IDF v5 DAC Cosine docs — [[https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/dac.html]] |
| - | * Documentația oficială avr-libc | + | * ESP-IDF v5 FreeRTOS docs — [[https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/freertos.html]] |
| - | * Materiale de laborator PM — GPIO, ADC, I2C, Timere, PWM | + | |
| <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | ||
| + | |||