CubeMaster este un sistem automat de rezolvare al unui cub rubik ce va consta intr-un sistem de inregistrare al fetelor cubului, generarea unui numar optim de pasi pentru generarea unei solutii, si manipularea cubului prin intermediul unui mecanism simpu de gestionare al rotiriii celor 6 fete pentru rezolvarea acestuia
CubeMaster este un sistem automat de rezolvare al unui cub Rubik. Scopul său este de a rezolva cubul în cel mai scurt timp posibil, eliminând necesitatea unei intervenții umane pentru rezolvare. Ideea a pornit de la dorința de a automatiza procesul de rezolvare a Cubului Rubik și de a demonstra abilitățile tehnice în domeniul programării și ingineriei electrice. Acest proiect este util atât pentru pasionații de Cub Rubik, care vor aprecia eficiența și precizia sistemului, cât și pentru cei interesați de dezvoltarea de sisteme de control automat și roboți.
Descriere Module:
PC: Realizeaza preprocesarea necesara rezolvarii cubului: interfata grafica pentru inputul fetelor, rezolvarea cubului (in miscari U F R L B D), translatarea in miscari posibile cu 2 motoare (D, I, J) si transmiterea seriala catre modulul bluetooth.
Modul Bluetooth: Realizeaza conexiunea intre PC si arduino prin protocolul bluetooth, realizeaza transferul digital de date.
Senzor Ultrasonic: Realizeaza detectarea prezentei cubului pe dispozitiv cu rol in pornirea sitemului de rezolvare al cubului sau a functiei de shuffle.
Buton: Facilitează interacțiunea dintre utilizator și dispozitiv pentru alegerea starii dorite, rezolvarea sau amestecarea cubului.
Driver Stepper Motor + Stepper Motor: Detine in totalitate controlul standului pe care este situat cubul rubik si cu ajutorul caruia poate executa rotirea cubului in procesul de efectuare al miscarilor D, J.
LCD: Afisarea numarului ramas de miscari + configuratia actuala primita de la interfata grafica.
Servo Motor: Detine in totalitate controlul bratului care poate executa rotirea cubului in procesul de efectuare al miscarilor D, I.
PC:
Rol: Preprocesarea. Prin intermediul unei interfate grafice (Vreau sa folosesc camera dar algoritmul de culori nu coopereaza) utilizatorul poate introduce fetele cubului. Cu acestea in memorie se genereaza o solutie si se translateaza in mutari de 6 tipuri pentru fiecare fata (F R L U B D) in miscari de 3 tipuri (D, I, J) apoi se trimite serial la arduino.
D - isi pastreaza scopul, invarte fata inferioara a cubului
I - reprezinta miscarea de rotire al intregului cub dupa cercul F → U → B → D → F unde R si L raman pe loc.
J - reprezinta miscarea de rotire al intregului cub dupa cercul F → L → B → R → F unde U si D raman pe loc.
În cadrul acestui proiect, am utilizat două medii de dezvoltare distincte: Visual Studio Code pentru partea de Python și Arduino IDE pentru partea de microcontroler. Am ales aceste medii datorită flexibilității și suportului extensiv pentru diverse biblioteci și extensii necesare proiectului si in plus integrarea cu Git pentru inregistrarea progresului software.
Visual Studio Code (VSCode)
Pentru acest proiect, am creat un mediu virtual Python în care am instalat următoarele biblioteci esențiale:
Arduino IDE
Python:
În programul scris în Python, scopul principal este de a genera o interfață grafică pentru utilizator și de a preprocesa datele necesare pentru rezolvarea cubului Rubik. Funcțiile implementate în Python sunt, în mare parte, pentru gestionarea butoanelor din interfața tkinter, comunicarea serială și conversia soluțiilor de mutare standard în mutări compatibile cu brațul controlat de servomotor și stand-ul controlat de motorul pas cu pas. Dintre aceste funcții, cea pentru conversia soluțiilor este cea mai importantă și cea mai complexă.
Generarea Interfeței Grafice cu Tkinter:
Crearea ferestrei principale și configurarea layout-ului pentru afișarea fețelor cubului Rubik.
Implementarea funcției schimba_culoare pentru a permite utilizatorului să modifice culoarea pătratelor printr-un simplu click.
Implementarea funcției salveaza_culori pentru a salva configurația culorilor într-un fișier text și a construi configurația finală pentru rezolvare.
Implementarea funcției rezolva_cub pentru a apela algoritmul de rezolvare kociemba și a converti soluția într-o formă compatibilă cu hardware-ul.
Comunicarea Serială cu Arduino:
Funcția write_read pentru a trimite date către Arduino și a primi răspunsuri.
Funcția send_to_ard_but pentru a trimite soluția calculată la Arduino.
Transformarea Soluțiilor de Mutare:
Preprocesare:
Funcția modify_string pentru a transforma soluțiile de mutare standard într-un format specific utilizat de hardware-ul controlat de servomotor și motorul pas cu pas.
Arduino:
Codul scris pentru Arduino gestionează controlul motoarelor pas cu pas și a servomotorului pentru a efectua mișcările necesare rezolvării cubului Rubik. De asemenea, include funcții pentru afișarea mesajelor pe un ecran OLED, citirea distanței folosind un senzor ultrasonic și gestionarea intrărilor de la un buton.
Inițializarea Componentelor:
Configurarea ecranului OLED, a senzorului ultrasonic, a servomotorului și a motorului pas cu pas.
Atribuirea unui buton pentru a porni secvența de rezolvare.
Funcțiile pentru Rotiri:
Funcții dedicate pentru rotirea fețelor cubului (rotateD, rotateDi, rotateI, rotateJ, rotateJi), fiecare realizând mișcări precise ale motorului pas cu pas și ale servomotorului.
Gestionarea Afisajului OLED:
Funcții pentru afișarea diferitelor mesaje și stări pe ecranul OLED (waittt, doneee, testdrawstyles).
Secvența Principală de Rezolvare:
Funcția loop care așteaptă apăsarea butonului pentru a începe rezolvarea, citește secvența de mișcări de la Python, și apoi efectuează fiecare mișcare în ordine, actualizând ecranul OLED și verificând distanța pentru siguranță.
Funcția de Shuffle:
Generarea unei secvențe de mișcări aleatorii pentru amestecarea cubului Rubik.
E greu sa faci un robot care rezolva un cub Rubik fara o imprimanta 3D
5 Mai Activitate: Inițierea Proiectului CubeMaster Detalii: Am stabilit obiectivele proiectului și am început planificarea inițială a componentelor necesare. Am realizat cercetări preliminare privind algoritmii de rezolvare a Cubului Rubik și mecanismele automate de manipulare a cubului.
7 Mai Activitate: Construcția bazei pentru CubeMaster Detalii: Am început să construiesc baza fizică a CubeMaster. Am creat un cadru robust pentru a susține cubul Rubik și mecanismele de manipulare. Am discutat designul general și am decis să folosesc un servomotor și un motor pas cu pas pentru manipularea cubului.
8 Mai Activitate: Preprocesare cu OpenCV Detalii: Am început dezvoltarea componentei de preprocesare pentru captarea fețelor cubului Rubik utilizând biblioteca OpenCV. Am configurat camera și am scris codul inițial pentru capturarea și identificarea culorilor fetelor cubului. Din păcate, am întâmpinat probleme cu calitatea camerei, culorile fiind dificil de distins. Galbenul apărea alb în imagini, ceea ce făcea recunoașterea culorilor ineficientă. Am decis să schimb abordarea și să mă concentrez pe alte părți ale proiectului.
19 Mai Activitate: Dezvoltarea interfeței grafice Detalii: Am creat interfața grafică utilizând tkinter pentru inputul manual al configurației fetelor cubului. Am adăugat butoane pentru a facilita introducerea culorilor și pentru a trimite datele către algoritmul de rezolvare. Am integrat biblioteca kociemba pentru generarea soluției optime de rezolvare a cubului Rubik. Am implementat funcții pentru preprocesarea stringurilor și conversia acestora în mutări specifice (D, I, J) pentru mecanismul CubeMaster.
20 Mai Activitate: Recepcionarea componentelor hardware și asamblare Detalii: Am primit servomotorul și alte componente hardware necesare. Am început asamblarea brațului robotic și a mecanismului de rezolvare. Am scris codul Arduino pentru controlul servomotorului și motorului pas cu pas. Am creat scheme electrice detaliate.
27 Mai Activitate: Testarea finală și optimizarea sistemului Detalii: Am realizat testele finale pentru sistemul CubeMaster. Am testat rotirea cubului și am rafinat mișcările pentru a asigura acuratețea și am închis toate componentele într-o cutie de siguranțe pentru a proteja și organiza hardware-ul. Am ajustat componentele și codul pentru a îmbunătăți funcționarea generală. De asemenea, am testat mecanismul de rezolvare pentru a ne asigura că toate mișcările sunt executate corect și eficient.