Proiectul consta in realizarea unui brat robotic de aproximativ 30 cm lungime, cu cinci grade de libertate, controlat wireless prin intermediul unui modul Bluetooth de pe un dispozitiv mobil sau calculator. Bratul poate executa miscari de rotatie pe axa verticala (yaw) la baza, flexie in articulatia umarului, flexie in articulatia cotului, rotatie a incheieturii si deschidere-inchidere a unui gripper. Scopul principal al proiectului este integrarea mai multor tipuri de actuatoare intr-un sistem embedded functional, acoperind atat lantul de alimentare, cat si comunicatia wireless si controlul in bucla deschisa al motoarelor. Ideea a pornit de la dorinta de a construi un manipulator compact care sa poata fi folosit ca platforma de experimentare pentru algoritmi de cinematica si control. Proiectul este util ca punct de plecare pentru oricine doreste sa inteleaga cum se integreaza un microcontroller cu drivere de servomotoare, drivere de motoare DC cu encoder si comunicatie seriala fara fir, intr-un proiect mecatronic complet.
Sistemul este compus din patru subsisteme principale care interactioneaza intre ele: subsistemul de alimentare, subsistemul de control, subsistemul de comunicatie si subsistemul de actionare. Subsistemul de alimentare furnizeaza energia intregului sistem. Trei acumulatori 18650 conectati in serie formeaza un pachet 3S de 11,1V. Un modul BMS asigura protectia la supradescarcare, supradescarcare si scurtcircuit. Un buck converter regleaza tensiunea de la 11,1V la 6V pentru alimentarea servomotoarelor. Un regulator LM7805 coboara ulterior tensiunea la 5V pentru microcontroller. Incarcarea pachetului se face prin intermediul unui modul USB Type-C cu balansare. Subsistemul de control este reprezentat de un microcontroller ATmega328p care coordoneaza toate celelalte module. El comunica cu driverul de servomotoare prin I2C, cu driverul de motor DC prin linii GPIO/PWM si cu modulul Bluetooth prin interfata UART. Subsistemul de comunicatie consta in modulul HC-05, care primeste comenzi de pozitie de la un host extern si le transmite microcontrollerului prin UART. Subsistemul de actionare include driverul PCA9685, care genereaza semnale PWM pentru cele cinci servomotoare (trei MG995 si doua MG90S), si driverul TB6612FNG, care controleaza motorul DC cu encoder responsabil de rotatia bazei.
Schema bloc
+---------------------------+
| SURSA DE ALIMENTARE |
| Baterii 18650 3S |
| (11.1V) |
+-------------+-------------+
|
+-------------v-------------+
| BMS |
| (protectie baterie 3S) |
+------+------------+-------+
| |
+--------------v--+ +----v--------------------+
| Buck Converter | | Modul Incarcare |
| 11.1V -> 6V | | USB Type-C 3S |
+--------+--------+ +-------------------------+
|
+--------+--------+
| |
+-------v------+ +------v------+
| LM7805 | | Iesire 6V |
| (5V, 1.5A) | | (Servos) |
+-------+------+ +------+------+
| |
+-------v-----------------v-------+
| |
| ATmega328p |
| (microcontroller) |
| |
| UART I2C GPIO/PWM |
+-----+----------+----------+----+
| | |
+------v---+ +---v------+ +v-----------+
| HC-05 | | PCA9685 | | TB6612FNG |
|Bluetooth | | Servo | | Motor |
| (UART) | | Driver | | Driver |
+----------+ +----+-----+ +-----+------+
| |
+----------+--------+ |
| | v
+------v------+ +--------v-+ +-v-----------+
| MG995 x2 | | MG90S | | Motor DC + |
| (Umar, | | (Gripper,| | Encoder |
| Cot, | | Mana) | | (Yaw baza) |
| Incheiet.)| +----------+ +-------------+
+-------------+
Lista de componente:
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:
[env:ATmega328P_Xplained_Mini] platform = atmelavr board = ATmega328P_Xplained_Mini framework = arduino upload_protocol = xplainedmini lib_deps = arduino-libraries/Servo
Serial, digitalWrite,
analogWrite, pinMode si primitivele de temporizare.
arduino-libraries/Servo) - genereaza semnalul PWM de 50 Hzpentru comanda servomotoarelor. Biblioteca foloseste Timer1 pentru a produce
trenul de impulsuri, permitand comanda servomotoarelor direct de la pinii GPIO ai microcontrollerului.
impulsurilor de comanda a servomotoarelor.
analogWrite() pentru generarea semnalului PWMde viteza catre driverul de motor.
liniile de semnal pentru servomotoare.
encoderului in cuadratura al motorului de la baza.
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 pentrumotor.
processCommand(const char *cmd) - interpreteaza o comanda si actioneazaarticulatia corespunzatoare.
setup() - initializeaza UART, obiectele Servo si pinii de comanda aimotorului.
loop() - memoreaza intr-un buffer datele primite pe UART si dispecerizacomenzile complete.
individual prin comenzi seriale.
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.