This shows you the differences between two versions of the page.
|
pm:prj2026:bianca.popa1106:andrei_traian.dobrescu [2026/05/10 00:36] andrei.dobrescu2402 |
pm:prj2026:bianca.popa1106:andrei_traian.dobrescu [2026/05/27 10:34] (current) andrei.dobrescu2402 |
||
|---|---|---|---|
| Line 77: | Line 77: | ||
| * Breadboard 400 puncte — 2 bucati. Utilizate pentru prototiparea circuitelor de control si conexiunile electronice. | * Breadboard 400 puncte — 2 bucati. Utilizate pentru prototiparea circuitelor de control si conexiunile electronice. | ||
| * Componente mecanice | * Componente mecanice | ||
| + | |||
| + | ===== Software Design ===== | ||
| + | |||
| + | ==== Mediu de dezvoltare ==== | ||
| + | |||
| + | Firmware-ul a fost dezvoltat in **PlatformIO**, rulat in interiorul editorului | ||
| + | **Visual Studio Code**, folosind **framework-ul Arduino** pentru ATmega328p. | ||
| + | |||
| + | PlatformIO a fost ales dupa incercari initiale cu Arduino IDE, care a intampinat | ||
| + | dificultati repetate in comunicarea cu programatorul mEDBG integrat. | ||
| + | |||
| + | Configuratia ''platformio.ini'' folosita: | ||
| + | |||
| + | <code ini> | ||
| + | [env:ATmega328P_Xplained_Mini] | ||
| + | platform = atmelavr | ||
| + | board = ATmega328P_Xplained_Mini | ||
| + | framework = arduino | ||
| + | upload_protocol = xplainedmini | ||
| + | lib_deps = | ||
| + | arduino-libraries/Servo | ||
| + | </code> | ||
| + | |||
| + | |||
| + | ==== Biblioteci si surse 3rd-party ==== | ||
| + | |||
| + | * **Arduino core for AVR** - ofera ''Serial'', ''digitalWrite'', | ||
| + | ''analogWrite'', ''pinMode'' si primitivele de temporizare. | ||
| + | * **Servo** (''arduino-libraries/Servo'') - genereaza semnalul PWM de 50 Hz | ||
| + | pentru comanda servomotoarelor. Biblioteca foloseste Timer1 pentru a produce | ||
| + | trenul de impulsuri, permitand comanda servomotoarelor direct de la pinii | ||
| + | GPIO ai microcontrollerului. | ||
| + | |||
| + | ==== Periferice si resurse utilizate ==== | ||
| + | |||
| + | * **UART** - comunicatia cu modulul Bluetooth HC-05 la 9600 baud. | ||
| + | * **Timer1** - utilizat intern de biblioteca Servo pentru generarea | ||
| + | impulsurilor de comanda a servomotoarelor. | ||
| + | * **Timer0** - utilizat de ''analogWrite()'' pentru generarea semnalului PWM | ||
| + | de viteza catre driverul de motor. | ||
| + | * **GPIO** - liniile de directie si standby pentru TB6612FNG, precum si | ||
| + | liniile de semnal pentru servomotoare. | ||
| + | * **Intreruperi externe INT0/INT1** (pinii PD2/PD3) - rezervate pentru citirea | ||
| + | encoderului in cuadratura al motorului de la baza. | ||
| + | |||
| + | |||
| + | ==== Algoritmi si implementare ==== | ||
| + | |||
| + | Firmware-ul implementeaza un **interpretor de comenzi in bucla deschisa**. | ||
| + | Comenzile sunt primite pe UART (de la HC-05) sub forma ''<litera><valoare>'': | ||
| + | |||
| + | ^ Comanda ^ Tinta ^ Interval valoare ^ | ||
| + | | s | Servo umar | 0 - 180 (grade) | | ||
| + | | e | Servo cot | 0 - 180 (grade) | | ||
| + | | c | Servo gripper | 0 - 180 (grade) | | ||
| + | | y | Motor DC yaw | -255 .. 255 (PWM cu semn) | | ||
| + | |||
| + | **Interpretarea comenzilor.** Bucla principala asambleaza caracterele primite | ||
| + | intr-un buffer pana cand fie se primeste un terminator de linie, fie expira un | ||
| + | scurt timeout intre caractere. Acest mecanism face interpretorul robust | ||
| + | indiferent daca terminalul adauga sau nu un caracter de linie noua. Sirul | ||
| + | complet este transmis functiei ''processCommand()'', care extrage litera | ||
| + | articulatiei si valoarea intreaga cu ''atoi()''. | ||
| + | |||
| + | **Comanda servomotoarelor.** Fiecare articulatie este reprezentata de un obiect | ||
| + | ''Servo'' atasat pinului sau de semnal. O comanda scrie direct unghiul cerut | ||
| + | prin ''Servo::write()''. Pozitia comandata este mentinuta timp de o secunda | ||
| + | inainte de procesarea urmatoarei comenzi. | ||
| + | |||
| + | **Comanda motorului DC.** Motorul de la baza (yaw) este comandat prin puntea H | ||
| + | TB6612FNG: | ||
| + | * ''applyMotor(speed)'' seteaza pinii de directie (AIN1/AIN2) si factorul de | ||
| + | umplere PWM (PWMA) in functie de semnul si modulul valorii ''speed''. | ||
| + | * ''setMotorSpeed(target)'' realizeaza o **rampa controlata** de viteza. | ||
| + | Datasheet-ul motorului avertizeaza ca schimbarea sensului de rotatie in timp | ||
| + | ce motorul este inca in miscare il poate defecta; de aceea functia coboara | ||
| + | intotdeauna viteza pana la zero, face o pauza, si abia apoi creste viteza in | ||
| + | noul sens. Astfel se evita varful mare de curent asociat inversarii bruste | ||
| + | de sens. | ||
| + | |||
| + | **Functii implementate:** | ||
| + | * ''applyMotor(int speed)'' - driver de nivel jos pentru puntea H. | ||
| + | * ''setMotorSpeed(int target)'' - control de viteza cu rampa, sigur pentru | ||
| + | motor. | ||
| + | * ''processCommand(const char *cmd)'' - interpreteaza o comanda si actioneaza | ||
| + | articulatia corespunzatoare. | ||
| + | * ''setup()'' - initializeaza UART, obiectele Servo si pinii de comanda ai | ||
| + | motorului. | ||
| + | * ''loop()'' - memoreaza intr-un buffer datele primite pe UART si dispeceriza | ||
| + | comenzile complete. | ||
| + | |||
| + | |||
| + | ===== Rezultate Obtinute ===== | ||
| + | |||
| + | * Cele trei articulatii cu servomotor (umar, cot, gripper) pot fi pozitionate | ||
| + | individual prin comenzi seriale. | ||
| + | * Motorul DC de la baza poate fi actionat in ambele sensuri, cu viteza | ||
| + | reglabila, prin driverul TB6612FNG, cu o accelerare in rampa care protejeaza | ||
| + | motorul la schimbarile de sens. | ||
| + | * Controlul wireless a fost realizat: comenzile trimise dintr-o aplicatie de | ||
| + | terminal Bluetooth de pe telefon sunt primite de ATmega328p prin modulul | ||
| + | HC-05 si actioneaza corect articulatiile. | ||
| + | * Subsistemul de alimentare (pachet 3S 18650, BMS, buck converter si modul de | ||
| + | incarcare USB-C) a fost asamblat si validat. | ||
| + | | ||
| + | ===== Concluzii ===== | ||
| + | |||
| + | Proiectul a demonstrat integrarea mai multor tipuri de actuatoare - | ||
| + | servomotoare hobby si un motor DC cu reductor si encoder - intr-un singur | ||
| + | sistem embedded controlat wireless. | ||
| + | |||
| + | Cele mai valoroase lectii au venit din partile proiectului care nu au tinut | ||
| + | strict de software: | ||
| + | **Lant de instrumente (toolchain).** | ||
| + | Trecerea de la Arduino IDE la | ||
| + | PlatformIO a eliminat o categorie larga de probleme legate de programator si | ||
| + | drivere ale placii Xplained Mini. | ||
| + | **Electronica de putere.** | ||
| + | Rutarea corecta a modulului de incarcare, a | ||
| + | BMS-ului si a buck converterului este critica: incarcatorul trebuie conectat | ||
| + | direct la bornele bateriilor, iar masele de semnal si cele de curent mare | ||
| + | trebuie sa se intalneasca intr-un singur punct stea. | ||
| + | **Particularitatile placii.** | ||
| + | Placa ATmega328p Xplained Mini nu dispune de | ||
| + | un pin VIN regulat de tip Arduino - alimentarea externa trebuie furnizata | ||
| + | direct pe linia VCC. | ||
| + | **Adaptarea nivelelor logice.** | ||
| + | Un simplu divizor rezistiv pe linia RX a | ||
| + | modulului HC-05 s-a dovedit a fi la limita in practica; un translator de | ||
| + | nivel logic dedicat este solutia mai fiabila. | ||
| + | |||
| + | Posibile imbunatatiri viitoare includ controlul in bucla inchisa al bazei | ||
| + | folosind feedback-ul de la encoder, inlocuirea cablajului pe breadboard cu un | ||
| + | cablaj imprimat dedicat si adaugarea cinematicii inverse, astfel incat bratul sa | ||
| + | poata fi comandat in coordonate carteziene. | ||
| + | |||