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 ===== |