This shows you the differences between two versions of the page.
pm:prj2025:fstancu:anne.onciulescu [2025/05/28 17:13] anne.onciulescu |
pm:prj2025:fstancu:anne.onciulescu [2025/05/29 20:51] (current) anne.onciulescu |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Rubik's Cube Solver - Onciulescu Dragomir Anne Marie ====== | ====== Rubik's Cube Solver - Onciulescu Dragomir Anne Marie ====== | ||
- | |||
- | !!! pls wait im writing it right now :( | ||
===== Introducere ===== | ===== Introducere ===== | ||
Acest proiect are ca scop dezvoltarea unui dispozitiv capabil sa rezolve un cub Rubik 3x3x3, pornind de la orice configuratie initiala valida. | Acest proiect are ca scop dezvoltarea unui dispozitiv capabil sa rezolve un cub Rubik 3x3x3, pornind de la orice configuratie initiala valida. | ||
Line 13: | Line 11: | ||
- | Pentru a putea executa celelalte miscari, se introduce un nou tip de miscare, rotateBackwards si rotateForward. Acest tip de mutare este realizata prin actionarea simultana a stepperelor laterale. In urma acesteia, cubul va fi rotit cu totul in jurul axei formate de cele doua steppere diametral opuse. (de exemplu, fata Up va ajunge sa fie pozitionata unde se afla anterior fata Back, prin aplicarea unui rotateBackwards sau in urma a 3 miscari rotateForward) | + | Pentru a putea executa celelalte miscari, se introduce un nou tip de miscare, rotateBackward si rotateForward. Acest tip de mutare este realizata prin actionarea simultana a stepperelor laterale. In urma acesteia, cubul va fi rotit cu totul in jurul axei formate de cele doua steppere diametral opuse. (de exemplu, fata Up va ajunge sa fie pozitionata unde se afla anterior fata Back, prin aplicarea unui rotateBackward sau in urma a 3 miscari rotateForward) |
- | {{:pm:prj2025:fstancu:cube_block_diagram.png?600|}} | + | {{ :pm:prj2025:fstancu:cube_block_diagram.png?700 |}} |
- | <note tip> | + | |
- | O schemă bloc cu toate modulele proiectului vostru, atât software cât şi hardware însoţită de o descriere a acestora precum şi a modului în care interacţionează. | + | Procesul incepe prin introducerea intr-o interfacta grafica (pe laptop) a permutarii initiale a cubului. Datele sunt trimise catre un API ce intoarce, in urma aplicarii algoritmului Kociemba, o succesiune de pasi pentru rezolvare. Pasi sunt apoi trimisi catre Arduino pe seriala, unde vor fi transformati in miscari de actionare a stepperelor. Motorul TT este folosit pentru a stabiliza slice ul central al cubului in momentul rotirii individuale a fetelor laterale (altfel se agata). |
- | </note> | + | |
===== Hardware Design ===== | ===== Hardware Design ===== | ||
+ | * Arduino Uno R3 | ||
* 3 x Nema-17 Stepper Motor (17HS4401) | * 3 x Nema-17 Stepper Motor (17HS4401) | ||
- | * Arduino Uno | + | * 3 x DRV8825 (Stepper Motor Driver) |
- | * Custom PCB | + | * CNC Shield V3 |
- | * 3 x DRV8825 (integrate in PCB) | + | * TT Gearbox Motor |
- | * Sursa de alimentare 12V 5A | + | * L298N H-Bridge |
+ | * Sursa de alimentare 12V 5A (pentru Drivere, prin CNC Shield) | ||
+ | * Sursa de alimentare 12V 2A (pentru H-Bridge) | ||
+ | * 2 x Conector Cub-Shaft Motor (3D printed) | ||
+ | * Conector Gheara-Shaft Motor (3D printed) | ||
+ | * <del>Custom PCB</del> (nu am mai avut timp sa il trimit la fabricat, a fost inlocuit de CNC shield) | ||
- | {{:pm:prj2025:fstancu:screenshot_2025-05-18_214923.png?700|}} | + | {{ :pm:prj2025:fstancu:solver_electrical.png?700 |}} |
- | <note tip> | ||
- | Aici puneţi tot ce ţine de hardware design: | ||
- | * listă de piese | ||
- | * scheme electrice (se pot lua şi de pe Internet şi din datasheet-uri, e.g. http://www.captain.at/electronic-atmega16-mmc-schematic.png) | ||
- | * diagrame de semnal | ||
- | * rezultatele simulării | ||
- | </note> | ||
===== Software Design ===== | ===== Software Design ===== | ||
- | inca mai scriu la el, o sa revin asap cu restul detaliilor :)) | ||
+ | ==== Functii ==== | ||
- | asta e interfata grafica din python care o sa solveuie cubul si dupa trimite pe seriala comenzile ptr motoare. | + | === Functie Generica de Rotatie === |
+ | |||
+ | Roteste un motor 90 de grade. | ||
+ | |||
+ | <code cpp> | ||
+ | void rotateMotor(int stepPin, int dirPin, bool clockwise) { | ||
+ | digitalWrite(dirPin, clockwise ? HIGH : LOW); | ||
+ | for (int i = 0; i < STEPS_PER_90; i++) { | ||
+ | digitalWrite(stepPin, HIGH); | ||
+ | delayMicroseconds(STEP_DELAY_US); | ||
+ | digitalWrite(stepPin, LOW); | ||
+ | delayMicroseconds(STEP_DELAY_US); | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | === Functii de rotatie === | ||
+ | |||
+ | <code cpp> | ||
+ | void rotateXCW() { rotateMotor(X_STEP, X_DIR, true); } | ||
+ | void rotateXCCW() { rotateMotor(X_STEP, X_DIR, false); } | ||
+ | |||
+ | void rotateYCW() { rotateMotor(Y_STEP, Y_DIR, true); } | ||
+ | void rotateYCCW() { rotateMotor(Y_STEP, Y_DIR, false); } | ||
+ | |||
+ | void rotateZCW() { rotateMotor(Z_STEP, Z_DIR, true); } | ||
+ | void rotateZCCW() { rotateMotor(Z_STEP, Z_DIR, false); } | ||
+ | </code> | ||
+ | |||
+ | === Functie Generica de Rotatie Duala === | ||
+ | |||
+ | Roteste intreg cubul 90 de grade pe axa L-R. | ||
+ | |||
+ | <code cpp> | ||
+ | void DualRotateMotors(int stepPin1, int dirPin1, int stepPin2, int dirPin2, bool direction) { | ||
+ | digitalWrite(dirPin1, direction ? HIGH : LOW); | ||
+ | digitalWrite(dirPin2, direction ? LOW : HIGH); | ||
+ | for (int i = 0; i < STEPS_PER_90; i++) { | ||
+ | digitalWrite(stepPin1, HIGH); | ||
+ | digitalWrite(stepPin2, HIGH); | ||
+ | delayMicroseconds(STEP_DELAY_US); | ||
+ | digitalWrite(stepPin1, LOW); | ||
+ | digitalWrite(stepPin2, LOW); | ||
+ | delayMicroseconds(STEP_DELAY_US); | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | === Functii Rotatie Duala === | ||
+ | |||
+ | <code cpp> | ||
+ | void rotateForward() { DualRotateMotors(X_STEP, X_DIR, Y_STEP, Y_DIR, true); } | ||
+ | void rotateBackward() { DualRotateMotors(X_STEP, X_DIR, Y_STEP, Y_DIR, false); } | ||
+ | </code> | ||
+ | |||
+ | === Functie Translatare Mutari === | ||
+ | |||
+ | Traduce miscarile cubului in rotatii ale motoarelor. | ||
+ | |||
+ | **'** – miscare CCW | ||
+ | |||
+ | **2** – rotatie 180 de grade | ||
+ | |||
+ | <code cpp> | ||
+ | void executeMove(String move) { | ||
+ | bool twice = move.endsWith("2"); | ||
+ | bool prime = move.endsWith("'"); | ||
+ | |||
+ | char face = move.charAt(0); | ||
+ | int turns = twice ? 2 : 1; | ||
+ | |||
+ | for (int i = 0; i < turns; i++) { | ||
+ | switch (face) { | ||
+ | case 'R': | ||
+ | if (prime) rotateXCCW(); | ||
+ | else rotateXCW(); | ||
+ | break; | ||
+ | |||
+ | case 'L': | ||
+ | if (prime) rotateYCCW(); | ||
+ | else rotateYCW(); | ||
+ | break; | ||
+ | |||
+ | case 'B': | ||
+ | if (prime) rotateZCCW(); | ||
+ | else rotateZCW(); | ||
+ | break; | ||
+ | |||
+ | case 'F': | ||
+ | rotateBackward(); | ||
+ | rotateBackward(); | ||
+ | if (prime) rotateZCCW(); | ||
+ | else rotateZCW(); | ||
+ | rotateForward(); | ||
+ | rotateForward(); | ||
+ | break; | ||
+ | |||
+ | case 'U': | ||
+ | rotateBackward(); | ||
+ | if (prime) rotateZCCW(); | ||
+ | else rotateZCW(); | ||
+ | rotateForward(); | ||
+ | break; | ||
+ | |||
+ | case 'D': | ||
+ | rotateForward(); | ||
+ | if (prime) rotateZCCW(); | ||
+ | else rotateZCW(); | ||
+ | rotateBackward(); | ||
+ | break; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | === Bucla Citire Mutari de pe Seriala === | ||
+ | |||
+ | <code cpp> | ||
+ | String incoming = ""; | ||
+ | |||
+ | void loop() { | ||
+ | while (Serial.available()) { | ||
+ | char c = Serial.read(); | ||
+ | |||
+ | if (c == '\n' || c == '\r') { | ||
+ | incoming.trim(); | ||
+ | if (incoming.length() > 0) { | ||
+ | Serial.print("Received move: "); | ||
+ | Serial.println(incoming); | ||
+ | |||
+ | Serial.print("Executing: "); | ||
+ | Serial.println(incoming); | ||
+ | executeMove(incoming); | ||
+ | |||
+ | Serial.println("OK"); | ||
+ | } | ||
+ | incoming = ""; | ||
+ | } else { | ||
+ | incoming += c; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | sa revin asap cu restul detaliilor :)) | ||
+ | |||
+ | |||
+ | asta e interfata grafica din python care rezolva cubul si dupa trimite pe seriala comenzile ptr motoare. | ||
solutiile de cub vin normal in forma unei liste ordonate de miscari din setul: U (up), D(down), L(left), R(right), F(front), B(back), U'(up reverse), U2(up de 2 ori) etc. | solutiile de cub vin normal in forma unei liste ordonate de miscari din setul: U (up), D(down), L(left), R(right), F(front), B(back), U'(up reverse), U2(up de 2 ori) etc. | ||
Line 53: | Line 195: | ||
- | btw am luat un cnc shield ca daca tot n am mai avut timp de pcb macar sa nu fie cablaraie prea intensa. o sa actualizez cat de curand restul paginii. | ||
- | + | {{ :pm:prj2025:fstancu:screenshot_from_2025-05-26_03-43-47.png?700 |}} | |
- | {{:pm:prj2025:fstancu:screenshot_from_2025-05-26_03-43-47.png?800|}} | + | |
- | + | ||
- | <note tip> | + | |
- | Descrierea codului aplicaţiei (firmware): | + | |
- | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | + | |
- | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | + | |
- | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | |
- | * (etapa 3) surse şi funcţii implementate | + | |
- | </note> | + | |
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
Line 87: | Line 219: | ||
Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | ||
</note> | </note> | ||
- | |||
- | ===== Bibliografie/Resurse ===== | ||
- | |||
- | <note> | ||
- | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | ||
- | </note> | ||
- | |||
- | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | ||