Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2025:rnedelcu:andrei.mitea3011 [2025/05/28 01:34]
andrei.mitea3011 [Software Design]
pm:prj2025:rnedelcu:andrei.mitea3011 [2025/05/28 13:21] (current)
andrei.mitea3011 [Rezultate Obţinute]
Line 26: Line 26:
   * Vizualizare digitală: Pe laptop, un software dedicat procesează datele primite și construiește un heat-map complet, dar și o replică 3D, oferind o reprezentare vizuală detaliată a terenului analizat.   * Vizualizare digitală: Pe laptop, un software dedicat procesează datele primite și construiește un heat-map complet, dar și o replică 3D, oferind o reprezentare vizuală detaliată a terenului analizat.
  
-                   +----------------------+ +  
-                   ​ Sistem de scanare ​  ​+ 
-                   ​| (motoare pas cu pas) | +                           +------------------------------------+ 
-                   ​+---------+------------+ +                           ​        ​Sistem de scanare ​         
-                             ​+                           ​   (axe Ox/Oy + motoare pas cu pas)| 
-                             ​+                           ​+----------------+-------------------+ 
-                   ​+----------------------+ +                                            
-                   ​ Senzor de distanță ​ +                                            
-                   ​+---------+------------+ +                             ​+--------------+--------------+ 
-                             ​+                             ​      ​Senzor de distanță ​   
-                             ​+                             |           ​HC-SR04 ​          | 
-                   ​+-------------------+ +                             +--------------+--------------+ 
-                   ​  ​Microprocesor ​  ​+                                            
-                   ​+---+----------+----+ +                                            
-                       ​         +                                 ​+----------+-----------+ 
-                       ​         +                                 ​    ​Microprocesor ​    ​
-       ​+-----------------+ ​  ​+------------------+ +                                 |     ​Arduino Uno R3    | 
-       ​   Ecran LCD      ​   ​Laptop ​       ​+                                 +----------+------------+ 
-       ​| ​ Afișare ​locală |   ​Afișare digitală ​+                                            | 
-       ​+-----------------+ ​  ​+------------------++                      ​+---------------------+----------------------+ 
 +                                                                 
 +                                                                 
 +         ​+-----------------------------+ ​             +----------------------------+ 
 +         ​        ​Ecran LCD           ​                      ​Conexiune ​        
 +         |       ​(LCD 1602 I2C)        |              |     ​Serială cu Laptop ​     | 
 +         |  Afișare ​poziție și distanță|              ​+------------+---------------+ 
 +         ​+-----------------------------+ ​                          | 
 +                                                                   v 
 +                                             ​+------------------+------------------+ 
 +                                             ​| ​       Laptop cu Python GUI         | 
 +                                             ​| ​ - Citire date serial ​              | 
 +                                             ​| ​ - Salvare fișier .txt              ​
 +                                             |  - Generare heatmap 2D și 3D        | 
 +                                             +------------------+------------------+ 
 +                                                                | 
 +                                                                v 
 +                                               ​+-----------------------------+ 
 +                                               ​| ​      ​Vizualizare grafică ​  ​
 +                                               ​| ​ - Heatmap (matplotlib) ​    | 
 +                                               ​| ​ - 3D Surface (plotly) ​     | 
 +                                               +-----------------------------+
  
  
Line 94: Line 115:
 Componentele electronice,​ precum placa Arduino și breadboard-ul,​ au fost ascunse în spatele unui panou de carton , pe care este montat și afișajul LCD. Acest design asigură un aspect ordonat, oferind totodată protecție componentelor. Placa de dezvoltare este montată într-o carcasă de plexiglas pentru siguranță și vizibilitate parțială. Componentele electronice,​ precum placa Arduino și breadboard-ul,​ au fost ascunse în spatele unui panou de carton , pe care este montat și afișajul LCD. Acest design asigură un aspect ordonat, oferind totodată protecție componentelor. Placa de dezvoltare este montată într-o carcasă de plexiglas pentru siguranță și vizibilitate parțială.
  
 +{{:​pm:​prj2025:​rnedelcu:​20250528_121959.jpg?​nolink&​200|}} {{:​pm:​prj2025:​rnedelcu:​20250528_121948.jpg?​nolink&​200|}} {{:​pm:​prj2025:​rnedelcu:​20250528_121933.jpg?​nolink&​200|}}
  
  
Line 132: Line 153:
 **Funcția loop()** **Funcția loop()**
  
-Parcurgerea ​matricei: +__Parcurgerea ​matricei: 
 +__
   * Se scanează linie cu linie.   * Se scanează linie cu linie.
   * Dacă s-a întrerupt anterior, se reia exact de unde a rămas.   * Dacă s-a întrerupt anterior, se reia exact de unde a rămas.
  
-''​for (int y = currentY; y < gridSize; y++) {''​+'' ​ for (int y = currentY; y < gridSize; y++) {
  
-''​for (int x = (y == currentY ? currentX : 0); x < gridSize; x++) {''​+  ​for (int x = (y == currentY ? currentX : 0); x < gridSize; x++) {''​
  
 +__Măsurarea distanței:
 +__
 +  * Se trimite un semnal ultrasonic și se măsoară timpul până la recepția ecoului.
 +  * Se calculează distanța în centimetri.
 +
 +'' ​ do {
 +
 +  digitalWrite(trigPin,​ LOW);
 +  ​
 +  delayMicroseconds(2);​
 +  ​
 +  digitalWrite(trigPin,​ HIGH);
 +  ​
 +  delayMicroseconds(10);​
 +  ​
 +  digitalWrite(trigPin,​ LOW);
 +  ​
 +  duration = pulseIn(echoPin,​ HIGH);
 +  ​
 +  distance = duration * 0.034 / 2;''​
 +
 +  * Distanța este recalculată relativ la înălțimea de montare (8 cm), pentru a determina „relieful”.
 +
 +'' ​ real_distance = 8 - distance;
 +'' ​
 +  ​
 +  * Se aplică un prag de schimbare: dacă noua valoare diferă cu <= 1 cm de cea anterioară,​ se consideră aceeași.
 +
 +'' ​ if (lastDistance != 0) {
 +  ​
 +  if (real_distance - lastDistance < 2 && real_distance - lastDistance > -2)
 +  ​
 +    real_distance = lastDistance;​
 +    ​
 +   ​}''​
 +   
 +__Afișarea și trimiterea de date:
 +__
 +  * Se afișează coordonatele și distanța curentă.
 +
 +''​lcd.clear();​
 +lcd.setCursor(0,​ 0);
 +lcd.print("​X:"​);​ lcd.print(x);​
 +lcd.print("​ Y:"); lcd.print(y);​
 +lcd.setCursor(0,​ 1);
 +lcd.print("​Dist:​ "); lcd.print(real_distance);​ lcd.print("​ cm"​);''​
 +
 +  * Se trimit datele în format CSV-like către un fișier de pe laptop prin serial (pentru prelucrare ulterioară în Python).
 +
 +''​Serial.print(x);​ Serial.print("​ ");
 +Serial.print(y);​ Serial.print("​ ");
 +Serial.println(real_distance);''​
 +
 +__Salvarea progresului în EEPROM:
 +__
 +  * După fiecare punct scanat, se salvează poziția următoare în EEPROM, pentru a permite reluarea în caz de resetare.
 +
 +''​EEPROM.put(0,​ x + 1);
 +EEPROM.put(sizeof(int),​ y);
 +''​
 +
 +__Mișcarea senzorului:
 +__
 +  * **motorX.step(-stepPerCellX)** – deplasare spre stânga după fiecare măsurare.
 +
 +La final de rând:
 +
 +  * **motorX.step(stepPerCellX * gridSize)** – revine la începutul rândului.
 +  * **motorY.step(stepPerCellY)** – se deplasează o poziție pe axa Y.
 +
 +__Finalizarea scanării
 +__
 +
 +După finalizarea completă a gridului, se șterg datele salvate în EEPROM și se mută senzorul înapoi în poziția de start (0, 0).
  
 **Python** **Python**
  
-Partea ​de cod scris în Python are ca scop crearea a două diagrame: una 2D care reprezintă un heat-map bazat pe matricea de înălțimi șreplică 3D interactivă care simulează forma terenului ​scanat.+**Configurarea serială** 
 + 
 +  * Se definesc portul serial și rata de transfer pentru comunicarea cu Arduino. GRID_SIZE trebuie să corespundă cu dimensiunea definită ​în codul Arduino. 
 + 
 +''​SERIAL_PORT = '​COM5'​ 
 +BAUD_RATE = 9600 
 +GRID_SIZE = 20''​ 
 + 
 +**Inițializare matrice și conexiune serială** 
 + 
 +  * Se creează o matrice de 20x20 care va fi completată cu valorile măsurate. 
 +  * Se inițializează conexiunea serială. 
 +  * Pauza de 2 secunde permite Arduino-ului să repornească și să fie gata de transmisie. 
 + 
 +**Colectarea datelor de la Arduino** 
 + 
 +  * Se citește fiecare linie trimisă prin Serial.print() de Arduino. 
 +  * Se parsează poziția X, Y și distanța măsurată. 
 +  * Datele sunt stocate în matrice, inversând pozițiile pentru ca linia să corespundă axei Y și coloana axei X. 
 +  * Când poziția (19, 19) este atinsă, se consideră că matricea este completă. 
 + 
 +**Salvarea datelor într-un fișier** 
 + 
 +  * Datele sunt salvate într-un fișier .txt pentru utilizare ulterioară. 
 + 
 +**Vizualizare – Heatmap** 
 + 
 +  * Se convertesc datele în format //NumPy// pentru procesare rapidă. 
 +  * Se „aplatizează” datele pentru a putea fi procesate de funcția //​gaussian_kde()//​ din //​scipy//​. 
 +  * Se folosește o funcție de densitate gaussiană pentru a obține o suprafață netedă ​bazată pe înălțimi: //​weights=z//​ înseamnă că punctele cu înălțime mai mare influențează mai mult forma finală. 
 +  * Se creează două heatmap-uri:​ unul pentru a avea legendă (//cbar//) corectă, altul pentru reprezentarea grafică propriu-zisă. 
 +  * Se adaugă contururi (//​contour//​) pentru claritate. 
 +  * Se inversează axa Y pentru ca (0,0) să fie în colțul stânga-sus. 
 + 
 +**Vizualizare - Reprezentare 3D interactivă** 
 + 
 +  * Se folosește //​plotly.graph_objects//​ pentru a genera ​suprafață 3D
 +  * //​colorscale='​Plasma'//​ menține coerența culorilor cu heatmap-ul 2D. 
 +  * Setările includ titlurile axelor, scalarea și aspectul 3D. 
 +  * Utilizatorul poate roti și mări/mișca suprafața cu mouse-ul. 
 + 
 +În final, după scanarea ​terenului, programul afișează automat cele două grafice ce prezintă schimbările de formă ale terenului țintă.
  
-Heat-map-ul este realizat folosind **numpy** și **matplotlib**,​ iar pentru a forma legenda cu numerele corespunzătoare sunt create două heat-map-uri,​ unul oentru graficul propriu-zis și unul special pentru legendă. 
  
-Replica 3D a terenului este implementată folosind **pyplot**, astfel încât să fie interactiv, utilizatorul putând să se miște în jurul simulării de teren pentru a fi vizualizat din orice unghi. 
 ===== Rezultate Obţinute ===== ===== Rezultate Obţinute =====
  
-<note tip> +În urma implementării și testării sistemului de scanare, rezultatele ​au fost în concordanță cu obiectivele stabilite. Dispozitivul a fost capabil să scaneze o suprafață plană discretizată într-o matrice de 20x20 de puncte, colectând în total 400 de valori de distanță cu ajutorul senzorului HC-SR04. Aceste valori au fost prelucrate și afișate atât local, pe un ecran LCD, cât și transmise prin port serial către un laptop pentru analiză și vizualizare.
-Care au fost rezultatele obţinute ​în urma realizării proiectului vostru. +
-</​note>​+
  
 +Din datele colectate, s-a generat o hartă 2D care reflectă variațiile de înălțime relativă pe suprafața scanată, precum și o reprezentare tridimensională interactivă a terenului. Aceste vizualizări au permis observarea rapidă a eventualelor denivelări,​ dovedind astfel utilitatea sistemului în reprezentarea spațială a unei suprafețe scanate.
 +
 +Pe parcursul testării, sistemul a demonstrat o repetabilitate satisfăcătoare a măsurătorilor,​ iar algoritmul de reluare automată a scanării (prin EEPROM) a funcționat conform așteptărilor,​ permițând reluarea scanării de la ultimul punct în cazul unei întreruperi neprevăzute. Astfel, s-a confirmat că proiectul nu doar captează date relevante, ci și le structurează eficient pentru prelucrare ulterioară.
 ===== Concluzii ===== ===== Concluzii =====
  
 +Proiectul se remarcă printr-o integrare eficientă a componentelor hardware și software, reușind să automatizeze complet procesul de scanare a unei suprafețe printr-un sistem de axe coordonat de motoare pas cu pas. Utilizarea senzorului de distanță HC-SR04 permite măsurători precise la fiecare punct al grilei, iar afișajul LCD oferă feedback vizual în timp real asupra poziției și distanței măsurate. Persistența datelor este asigurată prin salvarea poziției curente în EEPROM, astfel încât întreruperile neașteptate ale alimentării nu afectează progresul scanării. Partea software dezvoltată în Python aduce o valoare adăugată semnificativă prin vizualizările generate. Datele colectate sunt convertite într-un heatmap 2D și o reprezentare 3D interactivă a reliefului, ceea ce face analiza datelor intuitivă și estetică.
 +
 +**Limitări ale proiectului**
 +
 +Cu toate aceste realizări, proiectul întâmpină și unele limitări. Senzorul HC-SR04, deși accesibil și ușor de folosit, are o precizie relativă scăzută în medii instabile sau la suprafețe neregulate, ceea ce poate duce la fluctuații nedorite în măsurători. Algoritmul de filtrare implementat este simplu și nu elimină complet erorile, fiind loc pentru îmbunătățiri prin metode mai avansate. Viteza de scanare este limitată de caracteristicile hardware și de dimensiunea gridului, ceea ce face dificilă extinderea proiectului pe suprafețe mai mari fără optimizări suplimentare.
 ===== Download ===== ===== Download =====
  
-<note warning>​ +[[https://github.com/​andreimitea30/​pmFair|Link cod Github]]
-O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectuluisurse, scheme, etcUn fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-).+
  
-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 Alin331CC -> **:​pm:​prj2009:​cc:​dumitru_alin**. +Pentru ca scriptul din Python să poate prelua datele din Serial Monitor trebuie ca, imediat după încărcarea codului ​pe plăcuță, să fie pornit si fișierul cu cod Python.
-</​note>​+
  
 ===== Jurnal ===== ===== Jurnal =====
pm/prj2025/rnedelcu/andrei.mitea3011.1748385254.txt.gz · Last modified: 2025/05/28 01:34 by andrei.mitea3011
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0