Ideea de la care am pornit este aceea de a crea o versiune simpla a unei drone (unica limitare fiind puterea motoarelor, ca rezultat al constrangerilor de buget) pentru a explora nivelul de dificultate a unui astfel de proiect. Astfel, proiectul acesta constituie un “canvas gol” pentru potentiale upgrade-uri care ii pot extinde drastic functionalitatile.
Schema bloc a proiectului:
Schema electrica a proiectului:
Implementare hardware a proiectului:
Pentru comanda motoarelor sunt folosite patru MOSFET-uri low-side legate la pinii D3-D6. ESP8266 genereaza semnal PWM cu rezolutie de zece biti, ridicat la 16 kHz astfel incat zgomotul sa iasa din banda audibila a motoarelor coreless. Pentru a preveni blocarea rotorului la turatii prea mici exista o valoare “idle”; sub acest prag motoarele sunt oprite complet, peste el nu scad niciodata sub aproximativ doisprezece procente din ciclu.
Codul verifica prezenta unui senzor MPU6050 pe magistrala I2C. Daca senzorul raspunde, se face o calibrare scurta a giroscoapelor, iar apoi se ruleaza continuu un filtru complementar care combina giroscopul (98 %) cu accelerometrul (2 %), rezultand unghiurile Pitch si Roll. Daca senzorul nu este detectat programul continua totusi; variabila “mpuOK” ramane falsa si stabilizarea este omisa, drona functionand strict pe comenzile transmise din telefon.
La fiecare iteratie a buclei principale se citesc eventualele unghiuri stabilizate si se aduna cu valorile provenite din slidere. Se obtin astfel trei termeni: pTerm pentru fata-spate, rTerm pentru stanga-dreapta si yTerm pentru rotatie. Acesti termeni se combina cu throttle-ul intr-un mixer clasic de quadcopter: motoarele din spate primesc supliment de turatie cand se inclina in fata, motoarele de pe partea stanga cresc cand se cere deplasare la dreapta, iar perechile de motoare CW si CCW se aduna sau se scad pentru rotatie. Fiecare rezultat este trecut prin functia “mixMotor” care aplica regulile de idle si saturatie, dupa care se trimite catre pinul corespunzator.
Interfata web trimite cereri “fetch” catre doua rute. ”/throttle” modifica puterea principala, iar ”/ctrl” transmite simultan cele trei deviatii Pitch, Roll si Yaw. Logica se executa integral in browser, fara reimprospatarea paginii, iar pachetele HTTP pastreaza conexiunea deschisa pentru latenta minima. In partea de sus a paginii este afisat un mesaj care confirma daca stabilizarea este activa (“MPU OK – stabilisation on”) sau daca zborul este strict manual (“MPU OFFLINE – manual only”).
Auditarile de siguranta sunt simple: lipsa retelei nu blocheaza controlerul, ci pastreaza PWM-ul la ultima valoare; coborarea throttle-ului sub prag aduce toate motoarele la zero; iar esecul initializarii senzorului nu mai conduce la blocarea aplicatiei, doar la dezactivarea filtrului de stabilizare. In ansamblu, firmware-ul inglobeaza patru straturi – retea, senzor, control si hardware – intr-un singur binar capabil sa functioneze indiferent daca MPU-ul este prezent sau nu, facilitand testare rapida, zbor manual si, atunci cand hardware-ul permite, stabilizare automata.
Dintr-un motiv pe care nu mi-l pot explica, odata cu lipirea firelor motoarelor, la primul test, modulul MPU 6050 a cedat, acesta nemaiputand fi detectat de microcontroller. In ciuda unor verificari extinse, a refacerii conexiunilor fizice si a activitatii vizibile ale ledului de la senzor, acesta a ramas inaccesibil de pe microcontroller. Acest lucru m-a determinat sa adaptez codul si la o versiune manuala de control, pentru a putea face un demo chiar si in lipsa stabilizarii.
In cadrul ultimului test, suprins de altfel si intr-unul din videoclipuri, se poate vedea cum un motoras a cedat, iar celalalt cedeaza in timpul filmarii. Asta se dovedeste a fi natura efemera a motoarelor coreless, care tind sa aiba o durata de viata extrem de scurta.