Rubik's Cube Solver
Introducere
Proiectul propune realizarea unui robot capabil sa rezolve un cub Rubik de tip 3x3x3, folosind o structura mecanica simpla si procesare externa. Sistemul foloseste puterea de calcul a unui laptop pentru a determina secventa optima de miscari, transmitand ulterior comenzile catre un microcontroler ESP32 care actioneaza motoarele.
Descriere generala
Arhitectura sistemului este de tip Master-Slave:
Laptop (Master): Interfata utilizator unde se introduce configuratia fetelor sub forma de text. Aici ruleaza algoritmul Kociemba pentru a genera solutia.
ESP32 (Slave): Microcontrolerul primeste prin UART (Serial) instructiunile de miscare si le traduce in unghiuri specifice pentru cele doua servomotoare.
Interactiunea modulelor
Utilizatorul introduce pe laptop starea cubului (codificata prin litere pentru culori).
Laptopul calculeaza solutia si trimite prin cablu USB (UART) sirul de comenzi catre ESP32.
ESP32 parseaza comenzile si activeaza:
Servomotorul de baza (Cube Holder): Roteste baza cubului la unghiuri de 90 sau 180 de grade.
Servomotorul superior (Top Cover/Lifter): Basculeaza cubul pentru a schimba fata care urmeaza sa fie rotita.
Schema bloc
Hardware Design
Schema electrica
Componentele utilizate sunt:
ESP32 (30 pini): creierul de executie.
2 x Servomotoare Digitale MG995: ofera cuplul necesar pentru rotirea straturilor cubului (rotatie 180 grade).
2 x Condensatoare de filtrare (220uF, 16V): utilizate pentru decuplarea circuitului de putere, stabilizarea tensiunii și eliminarea zgomotului electric generat de motoare.
Sursa de alimentare externa (5V/2A): pentru a preveni caderile de tensiune la activarea servomotoarelor.
Structura imprimata 3D: include elementele de sustinere, capacul superior, balamaua si sistemul de ridicare.
Conectivitate:
Servomotoarele sunt controlate prin semnale PWM generate de ESP32 pe pinii D22 (baza) si D23 (capac/lifter). Alimentarea motoarelor se face separat de placa ESP32 pentru a evita zgomotul electric si resetarea accidentala a sistemului.
Software Design
Proiectul foloseste doua medii de programare:
Modul de calcul
Este dezvoltat in python si contine urmatoarele etape:
Obtinerea configuratiei initiale a cubului prin intermediul interfatei din terminal unde sunt introduse fetele cubului in oridne
Rezolvare algoritmica a cubului folosind biblioteca kociemba prin care se genereaza o secventa optima de miscari in format sandard Rubik (U,D,F,B,L,R)
Traducerea miscarilor din format Rubik in comenzi fizice. Robotul este limitat din punct de vedere al miscarilor (top servo: closed/open/flip, bottom servo: cw/start/ccw), astfel sunt necesare manevreme intermediare pentru a aduce fetele in pozitiile dorite.
Comunicarea seriala prin intermediul biblotecii pyserial. Se trimit comenzile de executie si se asteapta raspunsul de la ESP32.
Modul ESP32
Acesta asteapta comenzile de la modulul de calcul si le executa. Este scris in c++ foolosind biblioteca Arduino. Contine:
Parsarea comenzilor(open, closed, flip, start, cw, ccw) intr-un loop care monitorizeaza buffer-ul UART
Controlul PWM al servomotoarelor folosind biblioteca ESP32Servo
Cele 2 motoare au urmatoarele stari calibrate in functie de unghi:
Top Cover Servo: gestioneaza pozitia capacului superior in functie de urmatoarele 3 stari: open pozitionat la 70 grade pentru a elibera cubul si a il putea misca liber, closed pozitionat la 115 grade pentru a fixa cubul in momentul rotatiei stratului de jos, flip aflat la 15 grade pentru a rasturna fizic cubul, schimband astfel orientarea sa.
Cube Holder Servo: roteste stratul de la baza cubului. Initial se afla la pozitia start, mentinand baza la pozitia neutra de 90 grade. Pentru miscarile efective se folosesc rotatiile la 90 de grade in cele doua sensuri cw (sensul acelor de ceasornic), respectiv ccw (sens opus acelor de ceasornic). Pentru a nu mentine motorul in tensiune, acesta se roteste la 0 grade si dupa aceea la 5 grade pentru rotatiile de tip ccw (analog 180, 175 grade pentru cw).
Bibliografie