This is an old revision of the document!
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.
Mediu de dezvoltare: PlatformIO / Arduino IDE.
Librării și surse 3rd-party planificate:
* RF24 - pentru gestionarea comunicației cu modulul NRF24L01 * 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:
* 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. * 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:
* readIMU() - citește și filtrează datele de orientare
* 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