Differences

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

Link to this comparison view

pm:prj2026:bianca.popa1106:nicolae.macovei1412 [2026/05/11 23:05]
nicolae.macovei1412
pm:prj2026:bianca.popa1106:nicolae.macovei1412 [2026/05/25 06:20] (current)
nicolae.macovei1412
Line 26: Line 26:
 ===== Hardware Design ===== ===== Hardware Design =====
  
-{{:​pm:​prj2026:​bianca.popa1106:​circuit_cristian_macovei_332ca.png|500}}+{{:​pm:​prj2026:​bianca.popa1106:​circuit_cristian_macovei_332ca.png?500|}}
  
 ===== Software Design ===== ===== Software Design =====
  
-[todo]+==== Mediu de dezvoltare ==== 
 + 
 +Firmware-ul a fost dezvoltat folosind **PlatformIO** (extensie VS Code), cu framework-ul **Arduino** pentru ESP-32. Configuratia proiectului se gaseste in ''​platformio.ini'',​ unde sunt specificate viteza de clock a CPU-ului (80 MHz), viteza flash-ului (40 MHz) si dependintele de biblioteci. 
 + 
 +==== Biblioteci si surse 3rd-party ==== 
 + 
 +  * **Arduino SPI** (built-in) — comunicatie cu accelerometrul ICM-20602; configurat la 1 MHz, MSB first, SPI Mode 3 
 +  * **Arduino Wire** (built-in) — linie IIC disponibila pentru senzorul ToF VL53L0X (neutilizata in implementarea curenta) 
 +  * **ESP32Servo** (''​madhephaestus/​ESP32Servo@^3.0.5''​) — generare semnale PWM pentru controlul ESC-urilor; foloseste timer hardware dedicat si permite setarea perioadei la 50 Hz si a pulsului in microsecunde 
 +  * **INA226** (''​robtillaart/​INA226@^0.5.2''​) — biblioteca pentru senzorul de monitorizare a tensiunii/​curentului de pe magistrala de alimentare; senzorul fizic nu mai este functional, codul aferent este comentat 
 + 
 +==== Algoritmi implementati ==== 
 + 
 +**1. Citirea accelerometrului (SPI burst read)** 
 + 
 +La fiecare iteratie a buclei principale, microcontroller-ul initiaza o tranzactie SPI si citeste in mod secvential 6 octeti incepand de la registrul ''​ACCEL_XOUT_H''​ (0x3B), cu bitul de citire setat (OR 0x80). Cei 6 octeti reprezinta valorile brute pe 16 biti ale acceleratiei pe axele X, Y si Z. 
 + 
 +**2. Calculul unghiurilor de inclinare (pitch si roll)** 
 + 
 +Din valorile brute ale accelerometrului se calculeaza unghiurile de inclinare ale dronei folosind functia ''​atan2'':​ 
 + 
 +<​code>​ 
 +roll  = atan2(ay, az) * 180 / PI 
 +pitch = atan2(-ax, sqrt(ay*ay + az*az)) * 180 / PI 
 +</​code>​ 
 + 
 +Aceste formule ofera o estimare stabila a inclinarii in conditii de acceleratie dominata de gravitatie. 
 + 
 +**3. Algoritm de control proportional (P-controller)** 
 + 
 +Semnalul PWM de baza pentru toate motoarele este de 1300 µs. Fiecare motor primeste o corectie proportionala cu unghiurile de pitch si roll, cu gainul ''​kp = 4.0''​ pe ambele axe. Semnalele sunt calculate astfel incat fiecare motor sa compenseze inclinarea in directia sa: 
 + 
 +^  Motor        ^  Formula semnal PWM                                ^ 
 +| Fata-Stanga ​ | ''​base + kp*(−pitch) + kr*roll'' ​                  | 
 +| Fata-Dreapta | ''​base + kp*(−pitch) + kr*(−roll)'' ​               | 
 +| Spate-Stanga | ''​base + kp*pitch ​   + kr*roll'' ​                  | 
 +| Spate-Dreapta| ''​base + kp*pitch ​   + kr*(−roll)'' ​               | 
 + 
 +Semnalele sunt limitate (clamp) la intervalul ​[1000, 1500µs pentru a nu depasi 50% din turatia maxima in aceasta faza de testare. 
 + 
 +**4. Failsafe** 
 + 
 +Daca unghiul de pitch sau roll depaseste 60°, sistemul intra in modul failsafe si trimite semnal de 1000 µs (oprire) tuturor motoarelor, prevenind un accident in caz de inclinare extrema. 
 + 
 +**5. Sincronizare non-blocking** 
 + 
 +Bucla principala ruleaza fara delay-uri blocante, folosind timestamp-uri (''​millis()''​):​ 
 +  * semnalele PWM catre ESC-uri sunt actualizate la **50 Hz** (la fiecare 20 ms) 
 +  * telemetria seriala (roll, pitch, semnale motoare) este afisata la **5 Hz** (la fiecare 200 ms) 
 + 
 +==== Surse si functii implementate ==== 
 + 
 +  * ''​spi_write(byte reg, byte data)''​ — scrie un octet intr-un registru al IMU-ului prin SPI 
 +  * ''​clip(float raw, float min, float max)''​ — limiteaza o valoare in intervalul [min, max] 
 +  * ''​setup()''​ — initializeaza comunicatia SPI, scoate IMU-ul din sleep (''​PWR_MGMT_1 = 0x00''​),​ configureaza si armeaza cele 4 ESC-uri (semnal 1000 µs timp de 10 secunde pentru procedura de armare) 
 +  * ''​loop()''​ — bucla principala: citeste accelerometrul,​ calculeaza pitch/roll, calculeaza semnalele PWM pentru fiecare motor, scrie semnalele catre ESC-uri si afiseaza telemetria pe UART
  
 ===== Rezultate Obţinute ===== ===== Rezultate Obţinute =====
  
-[todo]+In urma dezvoltarii proiectului,​ zborul propriu-zis nu a putut fi testat din cauza defectarii a doi senzori cheie pe parcursul lucrarilor: senzorul de distanta VL53L0X (ToF) si senzorul de monitorizare a curentului INA226. Fara senzorul ToF, sistemul nu are informatie despre altitudine, deci nu poate stabiliza drona pe verticala. Fara INA226, nu exista protectie la supracurent in software. 
 + 
 +In schimb, a fost realizata si validata o **simulare de zbor pe banc**, in care drona este tinuta fixata si se testeaza raspunsul sistemului de control: 
 + 
 +  * Accelerometrul ICM-20602 citeste corect datele prin SPI si calculeaza unghiurile de pitch si roll in timp real 
 +  * La inclinarea manuala a placii (tilt), motoarele de pe partea ridicata cresc turatia, iar cele de pe partea coborata o reduc, ceea ce reprezinta comportamentul corect al unui controller proportional pentru stabilizare 
 +  * Mecanismul de failsafe functioneaza:​ la inclinari mai mari de 60° pe orice axa, toate motoarele sunt oprite imediat 
 +  * Semnalele PWM sunt generate stabil la 50 Hz catre toate cele 4 ESC-uri 
 +  * Telemetria seriala afiseaza in timp real valorile de roll, pitch si semnalele trimise fiecarui motor
  
 ===== Concluzii ===== ===== Concluzii =====
  
-[todo]+Proiectul a demonstrat ca un controller proportional de baza pentru stabilizarea unei drone poate fi implementat si validat pe un microcontroller ESP-32, chiar si in absenta unui zbor real. Logica de control raspunde corect la variatiile de inclinare, ceea ce confirma ca arhitectura software este functionala.
  
-===== Download =====+Principala lectie invatata este legata de robustetea hardware: senzorii periferici sunt vulnerabili in contextul unui sistem alimentat la 12V cu motoare BLDC, iar izolarea galvanica sau protectia la supratensiune pe liniile de semnal sunt necesare intr-o iteratie viitoare.
  
-O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectuluisurse, scheme, etc. Un fişier README, un ChangeLogun script ​de compilare şi copiere automată ​pe uC crează întotdeauna o impresie bună ;-).+Ca directii de continuare: 
 +  * Inlocuirea senzorilor defecti si validarea zborului real 
 +  * Adaugarea datelor de la giroscop (disponibil tot pe ICM-20602neutilizat momentan) pentru ​un controller PID completcare sa elimine deriva acumulata in timp ce apare la controlul bazat exclusiv pe accelerometru 
 +  * Implementarea controlului ​de altitudine ​pe baza senzorului ToF
  
-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**.+===== Download ===== 
 + 
 +[[https://​static.cristimacovei.dev/​pm-musca.zip|pm-musca.zip]] — arhiva cu sursele firmware ​(''​src/​main.cpp''​''​platformio.ini''​) si schemele hardware ale proiectului.
  
 ===== Jurnal ===== ===== Jurnal =====
  
-[todo]+  * **Saptamana 1 (28 apr – 4 mai)**: Sosirea componentelor,​ documentare datasheet-uri,​ definirea arhitecturii generale a sistemului. 
 + 
 +  * **Saptamana 2 (5 – 11 mai)**: Primul test hardware: un motor conectat la un ESC, motorul a pornit si a raspuns corect la semnal PWM. Conectarea IMU-ului (ICM-20602) prin SPI, verificarea datelor brute prin monitor serial. Tentativa de conectare a senzorului ToF (VL53L0X) — defectat in urma unei conexiuni gresite de alimentare. 
 + 
 +  * **Saptamana 3 (12 – 18 mai)**: Montarea tuturor celor 4 motoare pe cadru. Conectarea ESC-urilor si a senzorului de curent INA226; sistemul functional, senzorul raporta date corecte. Defectarea INA226 prin descarcare electrostatica (ESD) la atingerea cu mana neizolata — codul aferent comentat. Dezvoltarea algoritmului de control proportional. 
 + 
 +  * **Saptamana 4 (19 – 25 mai)**: Implementarea failsafe-ului si a sincronizarii non-blocking. Teste de simulare pe banc: tilt al IMU-ului si observarea raspunsului diferentiat al motoarelor. Ajustarea gainurilor. Finalizare firmware si documentatie.
  
 ===== Bibliografie/​Resurse ===== ===== Bibliografie/​Resurse =====
  
 - datasheet motor A2212: [[https://​cdn.robotshop.com/​rbm/​a00a7635-653b-4220-aac9-b0c23c5c5e2c/​5/​520795f9-301f-4e66-a0a3-019811d1f78b/​222c434c_a2212-brushless-motor.pdf]] - datasheet motor A2212: [[https://​cdn.robotshop.com/​rbm/​a00a7635-653b-4220-aac9-b0c23c5c5e2c/​5/​520795f9-301f-4e66-a0a3-019811d1f78b/​222c434c_a2212-brushless-motor.pdf]]
 +
 - datasheet accelerometru:​ [[https://​bluerobotics.com/​wp-content/​uploads/​2022/​05/​ICM20602-DATASHEET.pdf]] - datasheet accelerometru:​ [[https://​bluerobotics.com/​wp-content/​uploads/​2022/​05/​ICM20602-DATASHEET.pdf]]
 +
 - datasheet senzor ToF: [[https://​cdn-learn.adafruit.com/​downloads/​pdf/​adafruit-vl53l0x-micro-lidar-distance-sensor-breakout.pdf]] - datasheet senzor ToF: [[https://​cdn-learn.adafruit.com/​downloads/​pdf/​adafruit-vl53l0x-micro-lidar-distance-sensor-breakout.pdf]]
  
pm/prj2026/bianca.popa1106/nicolae.macovei1412.1778529907.txt.gz · Last modified: 2026/05/11 23:05 by nicolae.macovei1412
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