Proiectul Drone Stabilizer reprezintă construcția unei drone (quadcopter), bazată pe motoare cu perii (brushed), capabilă să își mențină echilibrul în aer în mod autonom. Nucleul proiectului din punct de vedere software este implementarea unui algoritm de control de tip PID (Proportional-Integral-Derivative) care procesează datele de la un senzor inerțial pentru a ajusta viteza motoarelor în timp real.
Functionalități principale:
Laboratoare folosite: UART (Lab 1), Intreruperi (Lab 2), Timere/PWM (Lab 3), SPI (Lab 5 - NRF24), I2C (Lab 6 - MPU).
Module si interactiuni:
Drona:
Telecomanda:
| Nr. | Componentă | Cantitate | Rol în proiect |
|---|---|---|---|
| 1 | ATmega328PB | x1 | Flight Controller — unitatea centrală de procesare |
| 2 | MPU6050 — GY-521 | x1 | IMU cu giroscop și accelerometru pe 3 axe |
| 3 | MX1616H | x2 | Driver punte H — controlul motoarelor brushed |
| 4 | Motor brushed 820 | x4 | Propulsie — configurație quad |
| 5 | NRF24 | x2 | Transreceptor wireless 2.4GHz — primire, transmitere comenzi |
| 6 | Buck converter | x1 | Ridicător tensiune 3.7V → 5V pentru partea logică |
| 7 | LiPo 1S 3.7V 500mAh 95C | x1 | Sursă principală de energie |
| 8 | Arduino Uno NANO | x1 | Remote controller |
| Componentă | Pin componentă | Pin ATmega328PB | Explicație |
|---|---|---|---|
| MPU6050 | VCC | 5V | Modulul este alimentat la 5V |
| MPU6050 | GND | GND | Masă comună |
| MPU6050 | SDA | PC4 / SDA | Pin standard pentru date I2C |
| MPU6050 | SCL | PC5 / SCL | Pin standard pentru clock I2C |
| NRF24 | VCC | 3.3V | Modulul necesită alimentare la 3.3V |
| NRF24 | GND | GND | Masă comună |
| NRF24 | CE | PD3 | Chip Enable — activare modul RX/TX |
| NRF24 | CSN | PD7 | Chip Select — selecție SPI |
| NRF24 | SCK | PB5 / SCK | Clock SPI |
| NRF24 | MOSI | PB3 / MOSI | Date SPI master → slave |
| NRF24 | MISO | PB4 / MISO | Date SPI slave → master |
| Motor față-stânga (CCW) | IN1 | PD2 | Control direcție — Driver MX1616H |
| Motor față-stânga (CCW) | IN2 / PWM | PD5 | Semnal PWM — viteză motor |
| Motor față-dreapta (CW) | IN1 | PC0 | Control direcție — Driver MX1616H |
| Motor față-dreapta (CW) | IN2 / PWM | PB1 | Semnal PWM — viteză motor |
| Motor spate-stânga (CW) | IN1 | PD4 | Control direcție — Driver MX1616H |
| Motor spate-stânga (CW) | IN2 / PWM | PD6 | Semnal PWM — viteză motor |
| Motor spate-dreapta (CCW) | IN1 | PC1 | Control direcție — Driver MX1616H |
| Motor spate-dreapta (CCW) | IN2 / PWM | PB2 | Semnal PWM — viteză motor |
| Buck converter | VIN | VBAT (LiPo) | Intrare 3.7V de la baterie |
| Buck converter | VOUT | VCC placă | Ieșire 5V pentru partea logică |
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.
Pentru NRF24L01+ am folosit pinii hardware SPI (PB3, PB4, PB5) deoarece SPI hardware este semnificativ mai rapid decât bit-banging. CE pe PD3 și CSN pe PD7 sunt pini digitali obișnuiți, aleși să nu intre în conflict cu timerele folosite pentru motoare.
Timer2 este configurat în mod CTC cu un prescaler de 64 și OCR2A = 249, ceea ce generează o întrerupere la fiecare 1ms. În ISR-ul acestui timer se incrementează contorul checkMpu. În bucla principală, la fiecare 50 de incrementări (adică la fiecare 50ms) se citesc datele de la MPU6050, se calculează unghiurile prin filtrul complementar și se rulează cei 3 controlleri PID. Timer2 a fost ales pentru această sarcină tocmai pentru că Timer0 și Timer1 sunt ocupați cu PWM-ul motoarelor.
Timer0 este configurat în mod Fast PWM cu prescaler 8, generând semnal PWM pe OC0A (PD6) și OC0B (PD5) — folosiți pentru motoarele din stânga. Registrele OCR0A și OCR0B controlează direct ciclul de lucru, adică viteza fiecărui motor.
Timer1 este configurat similar în mod Fast PWM pe 8 biți cu prescaler 64, generând semnal PWM pe OC1A (PB1) și OC1B (PB2) — folosiți pentru motoarele din dreapta. Registrele OCR1AL și OCR1BL sunt cele scrise de algoritmul de stabilizare la fiecare iterație PID.
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.
Am implementat mai multe functionalitati pentru drona si pentru sistemul de control radio.
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.
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.
Un scurt demo in care prezint functionalitatile proiectului.
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.
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.
GitHub Repo: https://github.com/stefan18-ux/Drone