This shows you the differences between two versions of the page.
|
pm:prj2026:atoader:stefan.oprea1711 [2026/05/09 19:04] stefan.oprea1711 |
pm:prj2026:atoader:stefan.oprea1711 [2026/05/17 01:04] (current) stefan.oprea1711 [Jurnal] |
||
|---|---|---|---|
| Line 3: | Line 3: | ||
| ===== Introducere ===== | ===== Introducere ===== | ||
| - | 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 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. | + | 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. |
| - | + | ||
| - | Ideea a pornit de la provocarea de a stabiliza un sistem instabil într-un mediu tridimensional. Spre deosebire de dronele comerciale, acest proiect pune accent pe implementarea software a controlului de zbor și pe integrarea modulelor de comunicație wireless pentru control de la distanță, folosind o arhitectură simplă dar eficientă. | + | |
| Functionalități principale: | Functionalități principale: | ||
| - | * stabilizarea automată pe axele Pitch, Roll și Yaw folosind giroscopul și accelerometrul | + | * stabilizarea automată pe axele Pitch, Roll și Yaw folosind giroscopul și accelerometrul |
| - | * recepția comenzilor de zbor (throttle, direcție) prin protocol wireless de 2.4GHz | + | * recepția comenzilor de zbor (throttle, direcție) prin protocol wireless de 2.4GHz |
| - | * controlul turației celor 4 motoare prin semnale PWM transmise către punțile H | + | * controlul turației celor 4 motoare prin semnale PWM transmise către punțile H |
| - | * monitorizarea orientării dronei în timp real | + | * monitorizarea orientării dronei în timp real |
| - | * gestionarea energiei pentru a asigura stabilitatea electronicii în timpul căderilor de tensiune ale motoarelor | + | * gestionarea energiei pentru a asigura stabilitatea electronicii în timpul căderilor de tensiune ale motoarelor |
| - | **Laboratoare folosite**: Intreruperi (Lab 2), Timere/PWM (Lab 3), SPI (Lab 5 - NRF24), I2C (Lab 6 - MPU). | + | **Laboratoare folosite**: UART (Lab 1), Intreruperi (Lab 2), Timere/PWM (Lab 3), SPI (Lab 5 - NRF24), I2C (Lab 6 - MPU). |
| ===== Descriere generală ===== | ===== Descriere generală ===== | ||
| - | Sistemul este construit în jurul plăcii de dezvoltare **AtMega 328P**, care acționează ca unitate centrală de procesare (Flight Controller). Aceasta citește constant datele de la modulul **GY-521 (MPU6050)** prin interfața I2C pentru a determina înclinația exactă a dronei. | + | ===Schema Bloc=== |
| + | {{:pm:prj2026:atoader:schema_drona.png?600|}} | ||
| - | Pentru propulsie, sistemul utilizează **4 motoare tip 820 brushed**, controlate în perechi de către două module **DRV8833 (Punte H dublă)**. Microcontrollerul generează semnale PWM pentru a varia puterea motoarelor, permițând astfel corecțiile de poziție necesare stabilizării. Comunicația cu telecomanda este realizată prin modulele **NRF24L01**, asigurând o latență minimă în transmiterea comenzilor. Telecomanda este reprezentata de placa **Arduino Nano V3**, care este conectat la laptop si primeste comenziile din laptop prin protocolul **UART**, care de asemenea este conectata la un modul **NRF24L01**. | ||
| - | Logica de funcționare: | + | **Module si interactiuni:** |
| - | * **Initialization State**: Sistemul calibrează giroscopul (drona trebuie să stea pe o suprafață plană). | + | **Drona:** |
| + | * **ATmega328PB:** unitatea centrală de procesare. Citește datele de orientare de la MPU6050, calculează unghiurile de înclinare, rulează algoritmii PID de stabilizare și ajustează viteza motoarelor în timp real prin semnale PWM. Primește comenzi de la distanță prin modulul NRF24 și gestionează comenziile primite de la remote controller. | ||
| - | * **Disarmed State**: Motoarele sunt oprite. Se verifică conexiunea cu transreceptorul NRF24L01. | + | * **MPU6050:** senzorul IMU (Inertial Measurement Unit) care combină un giroscop pe 3 axe cu un accelerometru pe 3 axe. Giroscopul măsoară viteza unghiulară (grade/secundă), iar accelerometrul măsoară forțele liniare, inclusiv gravitația. La pornire, MCU-ul efectuează o calibrare pe 1000 de eșantioane pentru a elimina offset-urile statice. În zbor, datele brute sunt combinate printr-un filtru complementar: 96% giroscop (precizie pe termen scurt) și 4% accelerometru (corecție drift pe termen lung), rezultând unghiurile de roll, pitch și yaw. Comunicare prin I2C. Timer2 genereaza intreruperi o data la o milisecunda, cand se ruleaza PID-ul pentru a se corecta directia dronei. |
| - | * **Flight/Stabilization Mode**: Algoritmul PID calculează eroarea dintre unghiul dorit (setpoint) și unghiul actual. Corecția rezultată este adunată/scăzută din valoarea de bază a throttle-ului pentru fiecare motor în parte. | + | * **NRF24:** modulul de comunicație wireless care operează pe banda de 2.4GHz. Drona funcționează în modul receptor (listening), așteptând comenzi de la un remote controller. Prima comandă obligatorie este m — aceasta declanșează calibrarea MPU și permite pornirea motoarelor. Ulterior, avem comenzi de urcare, coborare, stanga, dreapta, fata si spate, dar si o comanda pentru oprire instanta a elicelor. Comunicare cu MCU-ul prin SPI. |
| - | * **Signal Loss Protection**: În cazul pierderii semnalului wireless, se incearca aducerea dronei in punctul din care a plecat, unde motoarele se opresc automat pentru siguranță (un fel de bonus, e nevoie si de un modul gps pentru acest lucru). | + | * **Drivere MX1616H (x2):** drivere de motor cu punte H dublă, fiecare controlând câte două motoare brushed. Primesc semnalul PWM de la MCU prin registrele OCR (Output Compare Register) ale timerelor hardware (Timer0 pentru motoarele stânga, Timer1 pentru motoarele dreapta) și translatează comenzile digitale în tensiune aplicată direct pe bobinele motoarelor. Direcția de rotație (CW/CCW) este setată la inițializare prin pinii de direcție ai porturilor C și D. |
| - | {{:pm:prj2026:student:nanodrone_blockdiagram.png?500|Schema bloc NanoDrone Stabilizer}} | + | * **4 motoare brushed:** dispuse în configurație quad — față-stânga (CCW), față-dreapta (CW), spate-stânga (CW), spate-dreapta (CCW). Sensurile alternante de rotație sunt esențiale pentru anularea momentului girroscopic și controlul yaw-ului. Viteza fiecărui motor este ajustată independent de algoritmul de stabilizare, câte 15 unități PWM per pas, clamped între 0 și 255. |
| + | |||
| + | * **LiPo 1S 3.7V:** alimentează direct driverele MX1616H și motoarele. Tensiunea de 3.7V este ridicată la 5V prin buck converter pentru alimentarea MCU-ului, MPU6050 și NRF24. | ||
| + | |||
| + | **Telecomanda:** | ||
| + | * **Arduino Nano V3:** joaca rolul de **Remote controller**, care este conectat la laptop si primeste comenziile din laptop prin protocolul **UART**, care de asemenea este conectata la un modul NRF24. | ||
| ===== Hardware Design ===== | ===== Hardware Design ===== | ||
| - | Sistemul este alimentat de o baterie LiPo de 500mAh (95C), capabilă să furnizeze curentul ridicat necesar motoarelor. Un modul ridicător de tensiune (step-up) asigură o alimentare constantă de 5V pentru Arduino și senzori. | ||
| ==== Lista de piese ==== | ==== Lista de piese ==== | ||
| - | ^ Componenta ^ Descriere ^ Protocol / Pinout ^ | + | ^ Nr. ^ Componentă ^ Cantitate ^ Rol în proiect ^ |
| - | | Arduino Nano v3 (ATmega328P) | Microcontroller principal (Flight Controller) | - | | + | | 1 | **ATmega328PB** | x1 | Flight Controller — unitatea centrală de procesare | |
| - | | Modul GY-521 (MPU6050) | Giroscop și accelerometru pe 3 axe | I2C: SDA, SCL | | + | | 2 | **MPU6050 — GY-521** | x1 | IMU cu giroscop și accelerometru pe 3 axe | |
| - | | 2x Driver DRV8833 | Punte H dublă pentru controlul celor 4 motoare | PWM (4 pini de control) | | + | | 3 | **MX1616H** | x2 | Driver punte H — controlul motoarelor brushed | |
| - | | 4x Motoare 820 Brushed | Motoare de propulsie de mare viteză | Conectate la DRV8833 | | + | | 4 | **Motor brushed 820** | x4 | Propulsie — configurație quad | |
| - | | Modul NRF24L01 | Transreceptor wireless 2.4GHz | SPI: SCK, MISO, MOSI, CE, CSN | | + | | 5 | **NRF24** | x2 | Transreceptor wireless 2.4GHz — primire, transmitere comenzi | |
| - | | Modul Ridicător Tensiune 5V | Stabilizare alimentare pentru partea logică | USB Output / Vin | | + | | 6 | **Buck converter** | x1 | Ridicător tensiune 3.7V → 5V pentru partea logică | |
| - | | Baterie LiPo 500mAh 95C | Sursă principală de energie | Conector PH2.0 | | + | | 7 | **LiPo 1S 3.7V 500mAh 95C** | x1 | Sursă principală de energie | |
| - | | Breadboard 400 puncte | Suport pentru prototipare rapidă | - | | + | | 8 | **Arduino Uno NANO** | x1 | Remote controller | |
| - | | Fire Dupont | Conexiuni între module | - | | + | ==== Schema electrica ==== |
| - | ==== Schema bloc ==== | + | {{:pm:prj2026:atoader/schema_electrica_drona.png?600|Schema electrica a dronei}} |
| - | {{:pm:prj2026:student:nanodrone_schema_electrica.png?600|Schema electrica a dronei}} | + | === Pini folositi === |
| - | ==== Detalii ==== | + | ^ 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. | ||
| - | Deoarece motoarele brushed pot genera zgomot electric semnificativ, alimentarea este separată prin **modulul step-up 5V**, care protejează Arduino Nano de fluctuațiile de tensiune (voltage sags) ce apar atunci când motoarele sunt la turație maximă. | + | 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. |
| - | Modulele **DRV8833** sunt folosite în mod PWM pentru a controla viteza motoarelor. Deși sunt punți H (capabile de inversare), în acest proiect sunt configurate pentru rotație într-un singur sens, optimizând eficiența pentru zbor. | + | 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. |
| - | ===== Software Design ===== | + | 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. |
| - | Mediu de dezvoltare: **PlatformIO** / **Arduino IDE**. | + | 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. |
| - | Librării și surse 3rd-party planificate: | + | 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. |
| - | * **RF24** - pentru gestionarea comunicației cu modulul NRF24L01 | + | ===== Software Design ===== |
| - | * **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. | + | <note tip> |
| - | * **Bucle PID**: Trei instanțe separate de PID (pentru Roll, Pitch și Yaw). | + | Descrierea codului aplicaţiei (firmware): |
| - | * **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. | + | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) |
| + | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | ||
| + | * algoritmi şi structuri pe care plănuiţi să le implementaţi | ||
| + | * (etapa 3) surse şi funcţii implementate | ||
| + | </note> | ||
| - | Functii principale planificate: | + | ===== Rezultate Obţinute ===== |
| - | * ''readIMU()'' - citește și filtrează datele de orientare | + | <note tip> |
| - | * ''computePID()'' - calculează corecția pentru fiecare axă | + | Care au fost rezultatele obţinute în urma realizării proiectului vostru. |
| - | * ''updateMotors()'' - scrie valorile PWM către driverele DRV8833 | + | </note> |
| - | * ''receiveData()'' - verifică dacă au sosit pachete noi de la telecomandă | + | |
| - | * ''failsafeCheck()'' - oprește motoarele dacă nu există semnal radio | + | |
| - | + | ||
| - | ===== Rezultate Obţinute ===== | + | |
| ===== Concluzii ===== | ===== Concluzii ===== | ||
| ===== Download ===== | ===== Download ===== | ||
| + | |||
| + | <note warning> | ||
| + | O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un 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 Alin, 331CC -> **:pm:prj2009:cc:dumitru_alin**. | ||
| + | </note> | ||
| ===== 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> | ||
| + | |||