Differences

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

Link to this comparison view

pm:prj2026:atoader:stefan.oprea1711 [2026/05/17 00:25]
stefan.oprea1711 [Detalii]
pm:prj2026:atoader:stefan.oprea1711 [2026/05/24 23:12] (current)
stefan.oprea1711 [Software]
Line 81: Line 81:
 | Buck converter | VIN | VBAT (LiPo) | Intrare 3.7V de la baterie | | Buck converter | VIN | VBAT (LiPo) | Intrare 3.7V de la baterie |
 | Buck converter | VOUT | VCC placă | Ieșire 5V pentru partea logică | | Buck converter | VOUT | VCC placă | Ieșire 5V pentru partea logică |
-==== Detalii ==== 
- 
- 
-00:24 
 Pinii PC4 și PC5 au fost aleși pentru MPU6050 deoarece sunt pinii dedicați pentru I2C pe ATmega328PB. Comunicarea se face la 400kHz (fast mode) pentru a minimiza latența citirii datelor IMU. Pinii PC4 și PC5 au fost aleși pentru MPU6050 deoarece sunt pinii dedicați pentru I2C pe ATmega328PB. Comunicarea se face la 400kHz (fast mode) pentru a minimiza latența citirii datelor IMU.
  
Line 96: Line 92:
  
 Direcția de rotație a fiecărui motor este setată o singură dată la inițializare prin pinii de direcție ai driverelor MX1616H, nu prin PWM. Algoritmul PID modifică doar viteza (registrele OCR), nu și direcția — motoarele brushed pe o dronă nu își inversează sensul în zbor normal. Direcția de rotație a fiecărui motor este setată o singură dată la inițializare prin pinii de direcție ai driverelor MX1616H, nu prin PWM. Algoritmul PID modifică doar viteza (registrele OCR), nu și direcția — motoarele brushed pe o dronă nu își inversează sensul în zbor normal.
-===== Software Design ===== 
  
-Mediu de dezvoltare: **PlatformIO** / **Arduino IDE**.+==== Software ====
  
-Librării și surse 3rd-party planificate:​+Am implementat mai multe functionalitati pentru drona si pentru sistemul de control radio.
  
-* **RF24** - pentru gestionarea comunicației cu modulul NRF24L01 +=== Drona ===
-* **Wire** - pentru comunicația I2C cu senzorul MPU6050 +
-* **PID_v2** (sau implementare custom) - pentru calculul buclelor de stabilizare +
-* **MPU6050_light** - pentru filtrarea datelor brute din accelerometru și giroscop+
  
-Algoritmi și structuri planificate:​+  * drona detecteaza inclinarea in timp real prin intermediul senzorului MPU6050 si corecteaza automat pozitia prin controlul individual al celor 4 motoare 
 +  * la pornire, motoarele cresc viteza proportional de la 0 la valorile de hover (227/​235/​245/​255) astfel incat drona sa ramana echilibrata pe toata durata accelerarii 
 +  * daca drona primeste comanda '​x',​ toate motoarele sunt oprite imediat indiferent de starea curenta 
 +  * sistemul de control ruleaza la 100Hz (o iteratie la fiecare 10ms), asigurand corectii rapide ale pozitiei 
 +  * fiecare motor are un trim hardware individual care compenseaza diferentele fizice dintre motoare
  
-* **Filtru Complementar**:​ Combină datele de la giroscop (precis pe termen scurt) cu cele de la accelerometru (precis pe termen lung) pentru a obține unghiul real de înclinație. +=== Telecomanda ===
-* **Bucle PID**: Trei instanțe separate de PID (pentru Roll, Pitch și Yaw). +
-* **Mixer de Motoare**: Algoritm care combină output-ul de Throttle (comanda utilizatorului) cu corecțiile PID pentru a seta valorile finale PWM pe fiecare motor.+
  
-Functii principale planificate:​+  * telecomanda trimite comenzi prin NRF24L01 catre drona sub forma de caractere individuale 
 +  * comanda '​m'​ declanseaza calibrarea MPU6050 (500 de esantioane) dupa care drona este gata de zbor 
 +  * comenzile '​k'​ si '​j'​ cresc sau scad throttle-ul in trepte de 4 unitati 
 +  * comenzile '​w',​ '​a',​ '​s',​ '​d'​ aplica un trim directional pe motoare cu revenire automata la pozitia neutra dupa 200ms de la ultima comanda directionala 
 +  * comanda '​x'​ opreste imediat toate motoarele si reseteaza throttle-ul la 0
  
-* ''​readIMU()''​ - citește și filtrează datele de orientare +=== Biblioteci si Headere folosite ===
-* ''​computePID()''​ - calculează corecția pentru fiecare axă +
-* ''​updateMotors()''​ - scrie valorile PWM către driverele DRV8833 +
-* ''​receiveData()''​ - verifică dacă au sosit pachete noi de la telecomandă +
-* ''​failsafeCheck()''​ - oprește motoarele dacă nu există semnal radio+
  
-===== Rezultate Obţinute =====+  * **Wire.h** - biblioteca Arduino folosita pentru initializarea comunicatiei I2C cu senzorul MPU6050 
 +  * **SPI.h** - biblioteca Arduino folosita pentru comunicatia SPI cu modulul radio NRF24L01 
 +  * **nrf24/​RF24** - biblioteca clasica folosita pentru initializarea,​ trimiterea si receptia de informatii prin modulul radio NRF24L01 
 +  * **jrowberg/​MPU6050** - biblioteca folosita pentru initializarea senzorului inertial si citirea datelor brute de acceleratie si giroscop prin getMotion6() 
 +  * **stdint.h** - folosita pentru tipuri de date cu dimensiunea in biti specificata (ex: int32_t, uint8_t) 
 +  * **avr/​interrupt.h** - folosita pentru definirea ISR-urilor si controlul intreruperilor hardware
  
 +=== Element inedit ===
 +
 +Drona foloseste un controler PID implementat exclusiv cu aritmetica in virgula fixa (fixed-point integer), eliminand complet operatiile float din bucla de control. Pe ATmega328P, care nu dispune de FPU hardware, fiecare operatie float consuma 20-100 de cicli de ceas, in timp ce operatiile pe int32_t consuma 2-4 cicli. Aceasta optimizare permite rularea buclei de control la 100Hz in loc de 20Hz, imbunatatind semnificativ stabilitatea dronei.
 +
 +O alta noutate fata de implementarile clasice este rampa proportionala la pornire: fiecare motor porneste de la o valoare mica si creste cu o rata diferita, calculata astfel incat toate cele 4 motoare sa ajunga la valoarea lor de hover exact simultan, mentinand drona echilibrata pe toata durata accelerarii.
 +
 +=== Functionalitati din laborator ===
 +
 +  * folosesc Timer2 in mod CTC cu prescaler 64 pentru a genera o intrerupere la fiecare 1ms, implementand un systick global folosit pentru masurarea intervalului dintre iteratiile buclei de control
 +  * PWM-ul motoarelor este implementat manual folosind Timer0 (Fast PWM 8-bit pe OCR0A si OCR0B) si Timer1 (Fast PWM 8-bit pe OCR1AL si OCR1BL)
 +  * directia de rotatie a fiecarui motor (CW/CCW) este setata direct prin registrii DDR si PORT la nivel hardware
 +  * modulele folosite comunica prin SPI (NRF24L01) si I2C (MPU6050)
 +  * dt-ul real dintre iteratii este masurat folosind contorul incrementat de ISR, astfel PID-ul este precis chiar daca bucla variaza ca durata
 +
 +=== Scheletul proiectului ===
 +
 +Proiectul este structurat pe 4 niveluri: main.cpp gestioneaza bucla principala, comenzile radio si masurarea timpului; Drone.cpp orchestreaza logica de zbor, mixarea motoarelor si apelul PID; Engine.cpp abstractizeaza fiecare motor individual cu suport pentru directii diferite de rotatie; PID.cpp implementeaza controlul in feedback cu termenii P, I si D.
 +
 +Interactiunea dintre module: ISR-ul Timer2 incrementeaza un contor la fiecare 1ms; bucla principala verifica daca au trecut 10ms si apeleaza computeAngles() urmat de stabilize();​ stabilize() ruleaza PID pentru roll si pitch, aplica trimurile hardware si trimite valorile finale la fiecare motor prin setSpeed().
 +
 +Mai multe detalii sunt disponibile in codul sursa al proiectului.
 +
 +=== Demo video ===
 +
 +Un scurt demo in care prezint functionalitatile proiectului.
 +
 +{{https://​youtube.com/​shorts/​7ig5vDZfT6g?​feature=share}}
 +
 +=== Calibrare senzoristica ===
 +
 +  * pentru a obtine valori precise de roll si pitch, se realizeaza o calibrare automata la pornire prin medierea a 500 de esantioane cu drona complet nemiscata pe o suprafata plana; valorile mediate reprezinta offset-ul sistematic al senzorului si sunt scazute din toate masuratorile ulterioare
 +  * pe axa az se scade suplimentar valoarea de 1.0f reprezentand acceleratia gravitationala,​ astfel incat axa verticala sa fie referentiata corect
 +  * filtrul complementar combina giroscopul (98%) cu accelerometrul (2%) pentru a elimina drift-ul pe termen lung al giroscopului si zgomotul accelerometrului
 +  * antenele NRF24L01 sunt initializate in modul RF24_PA_LOW pentru a reduce consumul si interferentele la distante scurte de test
 +
 +=== Optimizari ===
 +
 +  * PID-ul foloseste exclusiv aritmetica int32_t cu gainuri scalate cu factorul 100, eliminand toate operatiile float din bucla critica de control
 +  * filtrul complementar foloseste aproximarea ay/az in loc de atan2() si sqrt(), eliminand functiile transcendentale costisitoare pe AVR
 +  * derivata PID este calculata pe masurare si nu pe eroare, prevenind spike-urile la schimbarea brusca a setpoint-ului
 +  * integratorului i se aplica anti-windup prin limitare la +/-5000, prevenind acumularea excesiva cand motoarele sunt saturate
 +  * trimurile hardware per motor sunt aplicate inaintea corectiei PID, astfel incat PID-ul opereaza in jurul unui punct de echilibru real si nu trebuie sa compenseze dezechilibre mecanice
 +===== Rezultate Obtinute =====
 +
 +Am obtinut o drona capabila sa decoleze si sa zboare controlata prin comenzi radio, cu un sistem de corectie in timp real bazat pe datele furnizate de senzorul inertial MPU6050. Comunicatia radio functioneaza stabil, motoarele raspund corect la comenzi iar filtrul complementar produce valori corecte de roll si pitch validate prin Serial.
 +
 +Nu am reusit sa finalizez calibrarea gainurilor PID pentru un zbor complet stabil. PID tuning-ul este un proces dificil in absenta unei structuri rigide de testare: fara un cadru care sa tina drona pe loc si sa permita observarea comportamentului la fiecare modificare de gain, este aproape imposibil sa izolezi efectul unui singur parametru. Principalele bottleneck-uri intampinate au fost: motoarele nu sunt identice si introduc dezechilibre greu de compensat doar software, vibratiile motoarelor introduc zgomot in datele IMU afectand termenul D al PID-ului, iar fiecare test necesita resetarea intregului sistem ceea ce ingreuneaza iteratia rapida asupra gainurilor.
 +
 +Implementarea software actuala este functionala ca platforma, iar o posibila imbunatatire ar putea aduce un zbor complet autonom stabil. As putea spune ca am creat o platforma hardware capabila care ar putea fi extinsa cu filtre mai avansate (ex. Kalman), autotunare PID sau chiar control de altitudine prin barometru, daca s-ar investi timp suplimentar in calibrare si testare.
 ===== Concluzii ===== ===== Concluzii =====
  
 +Proiectul a fost foarte antrenant si am invatat foarte multe lucruri noi pe parcursul acestuia. A fost prima mea experienta cu constructia unui sistem embedded complex cu mai multe module care interactioneaza in timp real, dar si prima incercare de a implementa un controler PID pe hardware real, unde am realizat ca diferenta dintre teorie si practica este semnificativa.
 +
 +Timpul a fost destul de limitat, iar PID tuning-ul s-a dovedit a fi cel mai mare obstacol al proiectului. Fara o structura de testare dedicata si fara motoare identice, gasirea gainurilor corecte devine un proces iterativ foarte lent. Daca as relua proiectul, as investi mai mult timp in alegerea unor motoare mai bine matchuite si as construi un cadru de testare fix inainte de a incerca primul zbor liber.
 +
 +In ciuda faptului ca nu am atins zborul complet stabil, consider ca am construit o platforma hardware si software solida, pe care o inteleg in profunzime, si care poate fi imbunatatita in continuare.
 ===== Download ===== ===== Download =====
 +
 +GitHub Repo: [[https://​github.com/​stefan18-ux/​Drone]]
  
 ===== Jurnal ===== ===== Jurnal =====
  
-===== Bibliografie/​Resurse =====+==Etapa 1 de Hardware== 
 +  * Am lipit pe o placa de prototipare buck converterul si driverele ca sa aibe gnd si vcc comun de la baterie. 
 +  * Am lipit pini pe o placa de prototipare pe care am bagat-o in placuta pentru a putea lipi in continuare fire. 
 +  * Am terminat de lipit tot ce era acolo dupa aproximativ 30 ore oneste de munca. 
 +  * Am reusit sa ansamblez drona si sa cuprind tot inauntrul ei. 
 +  * Momentan am reusit sa setez elicele in sensurile bune, deci se ridica de la sol, dar nu pentru mult timp, trebuie reglata software mult.
  
-==== Resurse Hardware ====+{{:​pm:​prj2026:​atoader:​da.jpeg?​500|}} 
 +{{:​pm:​prj2026:​atoader:​smek.jpeg?​500|}}
  
-* [[[https://​www.ti.com/​lit/​ds/​symlink/​drv8833.pdf](https://​www.ti.com/​lit/​ds/​symlink/​drv8833.pdf)|Datasheet DRV8833]] 
-* [[[https://​invensense.tdk.com/​wp-content/​uploads/​2015/​02/​MPU-6000-Datasheet1.pdf](https://​invensense.tdk.com/​wp-content/​uploads/​2015/​02/​MPU-6000-Datasheet1.pdf)|Datasheet MPU6050]] 
-* [[[https://​www.nordicsemi.com/​products/​nrf24l01](https://​www.google.com/​search?​q=https://​www.nordicsemi.com/​products/​nrf24l01)|Info NRF24L01]] 
  
-==== Resurse Software ==== 
  
-[[[https://github.com/nRF24/RF24](https://github.com/nRF24/​RF24)|Biblioteca RF24]] +===== Bibliografie/​Resurse ===== 
-[[[https://ocw.cs.pub.ro/courses/​pm/​lab/lab3-2023-2024](https://ocw.cs.pub.ro/courses/pm/lab/lab3-2023-2024)|PM Lab 3 PWM pentru control motoare]] + 
-[[[https://ocw.cs.pub.ro/courses/pm/lab/lab4-2023-2024](https://ocw.cs.pub.ro/courses/pm/lab/lab4-2023-2024)|PM Lab 4 I2C pentru IMU]]+==== Resurse hardware ==== 
 + 
 +  ​**ATmega328PB Xplained Mini** documentatie Microchip: ​https://www.microchip.com/en-us/development-tool/​ATMEGA328PB-XMINI 
 +  * **Modul GY-521 ​(MPU6050)**: ​https://sigmanortec.ro/Modul-giroscopic-si-accelerometru-3-axe-GY-521-p126016326 
 +  **Driver MX1616H**: De la Victor din laborator 
 +  * **Motor coreless 8x20mm 3.7V**: ​https://sigmanortec.ro/en/mini-coreless-motor-20x85-1mm-shaft-50000rpm-37v 
 +  * **Modul NRF24**: ​https://www.sigmanortec.ro/en/nrf24l01-24ghz-wireless-transceiver-module 
 +  **Modul ridicător tensiune 3.7V → 5V**: https://sigmanortec.ro/​en/​step-up-modules 
 +  * **Baterie LiPo 3.7V 95C 500mah**: https://​www.emag.ro/baterie-r-line-gens-ace-tattu-500-mah-3-7-v-95-c-multicolor-taa5001s95jsl/pd/DP84FRMBM/ 
 +==== Resurse software / scheme ==== 
 + 
 +  * EasyEDA ​realizare schema electrica: ​https://easyeda.com/ 
 +  * Arduino - citire accurate a sezorilor: https://forum.arduino.cc/​t/mpu6050-gyroscope-readings-are-drifting/​1113217/​10
  
 <​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>​
 +
pm/prj2026/atoader/stefan.oprea1711.1778966700.txt.gz · Last modified: 2026/05/17 00:25 by stefan.oprea1711
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