This shows you the differences between two versions of the page.
|
pm:prj2025:mdinica:alin_ioan.alexandru [2025/05/27 22:37] alin_ioan.alexandru |
pm:prj2025:mdinica:alin_ioan.alexandru [2025/05/28 13:27] (current) alin_ioan.alexandru [Software Design] |
||
|---|---|---|---|
| Line 10: | Line 10: | ||
| - | Schema bloc: | + | ===Schema bloc:=== |
| {{:pm:prj2025:mdinica:alin_ioan.alexandru:schema_bloc_sah_big.png?400|}} | {{:pm:prj2025:mdinica:alin_ioan.alexandru:schema_bloc_sah_big.png?400|}} | ||
| - | Module hardware: | + | ===Module hardware:=== |
| * Tabla de șah fizică: 64 de senzori Reed Switch (câte unul pentru fiecare pătrățel), care detectează prezența pieselor. | * Tabla de șah fizică: 64 de senzori Reed Switch (câte unul pentru fiecare pătrățel), care detectează prezența pieselor. | ||
| * Multiplexoare: utilizate pentru a reduce numărul de pini necesari pe microcontroller pentru citirea celor 64 de senzori. | * Multiplexoare: utilizate pentru a reduce numărul de pini necesari pe microcontroller pentru citirea celor 64 de senzori. | ||
| Line 20: | Line 20: | ||
| * LCD și butoane: interfață de utilizator pentru afișarea informațiilor și controlul meniului. | * LCD și butoane: interfață de utilizator pentru afișarea informațiilor și controlul meniului. | ||
| - | Module Software: | + | ===Module Software:=== |
| * ESP32: citirea senzorilor, detectarea mutărilor, comunicarea cu aplicația Android și afișarea informațiilor pe LCD. | * ESP32: citirea senzorilor, detectarea mutărilor, comunicarea cu aplicația Android și afișarea informațiilor pe LCD. | ||
| * Android: afișarea tablei în format digital, transmiterea controlului jocului către ESP32, recepționarea stării tablei de la ESP32. | * Android: afișarea tablei în format digital, transmiterea controlului jocului către ESP32, recepționarea stării tablei de la ESP32. | ||
| - | Interacțiune între module: | + | ===Interacțiune între module:=== |
| * Când jucătorul mută o piesă, senzorii Reed detectează poziția inițială și finală a mutării. | * Când jucătorul mută o piesă, senzorii Reed detectează poziția inițială și finală a mutării. | ||
| * Jucătorul apasă pe buton pentru a confirma mutarea. Starea tablei este salvată de ESP32. | * Jucătorul apasă pe buton pentru a confirma mutarea. Starea tablei este salvată de ESP32. | ||
| Line 32: | Line 32: | ||
| ===== Hardware Design ===== | ===== Hardware Design ===== | ||
| - | Listă de piese: | + | ===Listă de piese:=== |
| * ESP32 | * ESP32 | ||
| * 64x Reed Switch | * 64x Reed Switch | ||
| - | * 4x Multiplexor 16:1 | + | * 4x Multiplexor 16:1 cd74hc4067 |
| - | * LCD | + | * LCD cu modul I2C |
| - | * Butoane | + | * Buton |
| + | * Sursă 3.3V | ||
| + | * Breadboard | ||
| + | * Fire de legatură | ||
| - | <note tip> | + | ===Schema electrică:=== |
| - | Aici puneţi tot ce ţine de hardware design: | + | |
| - | * listă de piese | + | {{:pm:prj2025:mdinica:alin_ioan.alexandru:schema_electrica.png?700|}} |
| - | * scheme electrice (se pot lua şi de pe Internet şi din datasheet-uri, e.g. http://www.captain.at/electronic-atmega16-mmc-schematic.png) | + | |
| - | * diagrame de semnal | + | <note> |
| - | * rezultatele simulării | + | **Multiplexor 16:1 cd74hc4067** |
| + | * Pentru a reduce drastic numărul de pini necesari la ESP32 pentru scanarea celor 64 de senzori. | ||
| + | * Multiplexoarele sunt conectate similar. Mai jos este un exemplu pentru unul dintre ele. | ||
| + | * Pinii I0 - I15 (canalele multiplexorului) sunt conectati la switch-urile Reed. | ||
| + | |||
| + | ^ Pin ^ Pin ESP32 ^ Descriere ^ | ||
| + | | VCC | 3V3 | Alimentare | | ||
| + | | GND | GND | Ground | | ||
| + | | EN | GND | Enambel mux | | ||
| + | | SIG | GPIO4 | Outputul MUX-ului | | ||
| + | | S0 | GPIO5 | Selectie | | ||
| + | | S1 | GPIO8 | Selectie | | ||
| + | | S2 | GPIO27 | Selectie | | ||
| + | | S3 | GPIO28 | Selectie | | ||
| + | </note> | ||
| + | |||
| + | <note> | ||
| + | **LCD Cu modul I2C** | ||
| + | * Ecranul va fi folosit pentru afișarea timpului rămas pentru fiecare jucător. | ||
| + | |||
| + | ^ Pin ^ Pin ESP32 ^ Descriere ^ | ||
| + | | VCC | 3V3 | Alimentare ecran | | ||
| + | | GND | GND | GND pentru ecran | | ||
| + | | SDA| GPIO7 | Linia de date | | ||
| + | | SCL| GPIO14| Linia ceasului | | ||
| </note> | </note> | ||
| ===== Software Design ===== | ===== Software Design ===== | ||
| + | Mediu de dezvoltare: PlatformIO, Android Studio | ||
| + | |||
| + | Biblioteci: | ||
| + | * Arduino.h: Biblioteca de bază pentru programarea microcontroller-ului. | ||
| + | * LiquidCrystal_I2C: pentru controlul LCD-ului | ||
| + | * BluetoothSerial.h: pentru comunicarea cu aplicația Android. | ||
| + | * Wire.h: pentru interfațarea I2C cu LCD-ul. | ||
| + | * Ticker.h: pentru gestionarea temporizărilor. | ||
| + | |||
| + | Funcționalități din laborator: | ||
| + | * GPIO: Conectarea MUX-urilor. | ||
| + | * Întreruperi: Pentru înregistrarea unei mutări odată cu apăsarea butonului. | ||
| + | * Timere: pentru ceasul folosit în jocul de șah. | ||
| + | * I2C: Pentru conectarea ecranului LCD. | ||
| + | |||
| + | Funcționalități implementate pe ESP32: | ||
| + | |||
| + | <note> | ||
| + | Inițializarea componentelor: | ||
| + | * LCD, multiplexoare, butoane, Bluetooth. | ||
| + | * Configurarea întreruperii pentru butonul de confirmare mutare. | ||
| + | |||
| + | Scanarea tablei: | ||
| + | * Prin multiplexoare 16:1, se scanează în mod secvențial toți cei 64 de senzori Reed. | ||
| + | * Se detectează pozițiile în care s-au făcut modificări (piese ridicate sau plasate). | ||
| + | |||
| + | Detectarea mutărilor: | ||
| + | * Se compară starea anterioară și cea curentă a tablei. | ||
| + | * Se extrage perechea (poziție inițială, poziție finală) care corespunde mutării efectuate. | ||
| + | |||
| + | Confirmarea mutării: | ||
| + | * Mutarea este validată și înregistrată doar după apăsarea butonului fizic. | ||
| + | * Se activează o întrerupere pe pinul butonului, care declanșează salvarea mutării. | ||
| + | |||
| + | Comunicarea cu aplicația Android: | ||
| + | * Starea actualizată a tablei este trimisă prin Bluetooth către aplicație. | ||
| + | * ESP32 ascultă și comenzile primite (start, reset joc, schimbare mod, etc.). | ||
| + | |||
| + | Afișarea informațiilor pe LCD: | ||
| + | * Timpul rămas pentru fiecare jucător este afișat și actualizat la fiecare mutare. | ||
| + | * Se pot adăuga mesaje de status sau indicații pentru jucători. | ||
| + | |||
| + | Gestionarea timpului (timer digital): | ||
| + | * Se folosește o funcție periodică pe bază de timer (Ticker) care scade timpul rămas la fiecare secundă. | ||
| + | * Timerul se oprește și se pornește în funcție de mutarea jucătorului. | ||
| - | <note tip> | ||
| - | Descrierea codului aplicaţiei (firmware): | ||
| - | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | ||
| - | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | ||
| - | * algoritmi şi structuri pe care plănuiţi să le implementaţi | ||
| - | * (etapa 3) surse şi funcţii implementate | ||
| </note> | </note> | ||
| - | ===== Rezultate Obţinute ===== | + | Funcționalități aplicație Android: |
| + | |||
| + | <note> | ||
| + | Interfață grafică a tablei: | ||
| + | * Afișează în timp real poziția pieselor pe tabla virtuală. | ||
| + | *Simulează tabla fizică pe ecranul telefonului. | ||
| + | |||
| + | |||
| + | Comunicare Bluetooth: | ||
| + | * Aplicația primește datele de la ESP32 (poziții piesă, mutări, ceas). | ||
| + | * Poate trimite comenzi precum: start, reset joc. | ||
| + | |||
| + | |||
| + | Istoric mutări: | ||
| + | * Se salvează într-o listă vizibilă în aplicație toate mutările efectuate. | ||
| + | |||
| + | |||
| + | Notificări și feedback: | ||
| + | * Notificare final joc (mat, remiză, abandon). | ||
| - | <note tip> | ||
| - | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | ||
| </note> | </note> | ||
| + | |||
| + | Citire canal multiplexor: | ||
| + | |||
| + | <code cpp> | ||
| + | |||
| + | int readMuxChannel(int channel) { | ||
| + | // Set the address lines (S0 to S3) | ||
| + | for (int i = 0; i < 4; i++) { | ||
| + | digitalWrite(selectPins[i], (channel >> i) & 0x01); | ||
| + | } | ||
| + | |||
| + | delayMicroseconds(10); // Small delay to allow settling | ||
| + | |||
| + | // Read the value from the selected MUX channel | ||
| + | return digitalRead(sigPin); | ||
| + | } | ||
| + | |||
| + | </code> | ||
| + | |||
| + | Timer: | ||
| + | |||
| + | <code cpp> | ||
| + | |||
| + | volatile int timeRemaining = 0; // Init when game starts | ||
| + | volatile bool updateLCD = false; | ||
| + | |||
| + | void tick() { | ||
| + | if (timeRemaining > 0) { | ||
| + | timeRemaining--; | ||
| + | updateLCD = true; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | void startTimer(int secunde) { | ||
| + | timeRemaining = secunde; | ||
| + | timerTicker.attach(1.0, tick); | ||
| + | } | ||
| + | |||
| + | void stopTimer() { | ||
| + | timerTicker.detach(); | ||
| + | timeRemaining = 0; | ||
| + | updateLCD = true; | ||
| + | } | ||
| + | |||
| + | </code> | ||
| + | |||
| + | Comunicare prin bluetooth: | ||
| + | |||
| + | <code cpp> | ||
| + | |||
| + | if (SerialBT.available()) { | ||
| + | String mesaj = SerialBT.readStringUntil('\n'); | ||
| + | mesaj.trim(); | ||
| + | mesaj.toLowerCase(); | ||
| + | |||
| + | if (mesaj == "start") { | ||
| + | startTimer(5 * 60); // 5 minute | ||
| + | SerialBT.println("Timer pornit"); | ||
| + | } else if (mesaj == "reset") { | ||
| + | stopTimer(); | ||
| + | SerialBT.println("Timer oprit/resetat"); | ||
| + | } else { | ||
| + | SerialBT.println("Comanda necunoscuta"); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | </code> | ||
| + | |||
| + | ===== Rezultate Obţinute ===== | ||
| + | |||
| + | Funcționalități implementate cu succes: | ||
| + | * Detectarea mutărilor pe tabla de șah | ||
| + | * Interfață LCD funcțională pentru afișarea timpului | ||
| + | * Mod de joc 1v1 complet operațional | ||
| + | * Salvarea mutărilor în format digital | ||
| + | |||
| + | Limitări: | ||
| + | * Nu se detectează automat promovarea piesei – necesită intervenție de la utilizator | ||
| ===== Concluzii ===== | ===== Concluzii ===== | ||