This shows you the differences between two versions of the page.
|
pm:prj2025:fstancu:anne.onciulescu [2025/05/28 19:37] 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 39: | Line 37: | ||
| ===== Software Design ===== | ===== Software Design ===== | ||
| - | ==== Functions ==== | + | ==== Functii ==== |
| - | === Generic Rotation Function: === | + | |
| - | Turns a face by 90 degrees. | + | === Functie Generica de Rotatie === |
| - | void rotateMotor(int stepPin, int dirPin, bool clockwise) { | + | Roteste un motor 90 de grade. |
| - | digitalWrite(dirPin, clockwise ? HIGH : LOW); | + | |
| - | for (int i = 0; i < STEPS_PER_90; i++) { | + | <code cpp> |
| - | digitalWrite(stepPin, HIGH); | + | void rotateMotor(int stepPin, int dirPin, bool clockwise) { |
| - | delayMicroseconds(STEP_DELAY_US); | + | digitalWrite(dirPin, clockwise ? HIGH : LOW); |
| - | digitalWrite(stepPin, LOW); | + | for (int i = 0; i < STEPS_PER_90; i++) { |
| - | delayMicroseconds(STEP_DELAY_US); | + | digitalWrite(stepPin, HIGH); |
| - | } | + | delayMicroseconds(STEP_DELAY_US); |
| + | digitalWrite(stepPin, LOW); | ||
| + | delayMicroseconds(STEP_DELAY_US); | ||
| } | } | ||
| - | | + | } |
| - | === Rotation Functions: === | + | </code> |
| - | void rotateXCW() { rotateMotor(X_STEP, X_DIR, true); } | + | === Functii de rotatie === |
| - | void rotateXCCW() { rotateMotor(X_STEP, X_DIR, false); } | + | |
| - | void rotateYCW() { rotateMotor(Y_STEP, Y_DIR, true); } | + | <code cpp> |
| - | void rotateYCCW() { rotateMotor(Y_STEP, Y_DIR, false); } | + | void rotateXCW() { rotateMotor(X_STEP, X_DIR, true); } |
| + | void rotateXCCW() { rotateMotor(X_STEP, X_DIR, false); } | ||
| - | void rotateZCW() { rotateMotor(Z_STEP, Z_DIR, true); } | + | void rotateYCW() { rotateMotor(Y_STEP, Y_DIR, true); } |
| - | void rotateZCCW() { rotateMotor(Z_STEP, Z_DIR, false); } | + | 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> | ||
| - | === Generic Dual Rotation Function: === | + | === Functie Generica de Rotatie Duala === |
| - | Turns the entire cube by 90 degrees around the L-R axis. | + | Roteste intreg cubul 90 de grade pe axa L-R. |
| - | void DualRotateMotors(int stepPin1, int dirPin1, int stepPin2, int dirPin2, bool direction) { | + | <code cpp> |
| - | digitalWrite(dirPin1, direction ? HIGH : LOW); | + | void DualRotateMotors(int stepPin1, int dirPin1, int stepPin2, int dirPin2, bool direction) { |
| - | digitalWrite(dirPin2, direction ? LOW : HIGH); | + | digitalWrite(dirPin1, direction ? HIGH : LOW); |
| - | for (int i = 0; i < STEPS_PER_90; i++) { | + | digitalWrite(dirPin2, direction ? LOW : HIGH); |
| - | digitalWrite(stepPin1, HIGH); | + | for (int i = 0; i < STEPS_PER_90; i++) { |
| - | digitalWrite(stepPin2, HIGH); | + | digitalWrite(stepPin1, HIGH); |
| - | delayMicroseconds(STEP_DELAY_US); | + | digitalWrite(stepPin2, HIGH); |
| - | digitalWrite(stepPin1, LOW); | + | delayMicroseconds(STEP_DELAY_US); |
| - | digitalWrite(stepPin2, LOW); | + | digitalWrite(stepPin1, LOW); |
| - | delayMicroseconds(STEP_DELAY_US); | + | 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; | ||
| } | } | ||
| } | } | ||
| - | | + | } |
| - | === Dual Rotation Functions: === | + | </code> |
| - | void rotateForward() { DualRotateMotors(X_STEP, X_DIR, Y_STEP, Y_DIR, true); } | + | === Bucla Citire Mutari de pe Seriala === |
| - | void rotateBackward() { DualRotateMotors(X_STEP, X_DIR, Y_STEP, Y_DIR, false); } | + | |
| - | + | <code cpp> | |
| - | + | String incoming = ""; | |
| - | inca mai scriu la el, o sa revin asap cu restul detaliilor :)) | + | |
| + | 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 o sa solveuie cubul si dupa trimite pe seriala comenzile ptr motoare. | + | 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 101: | Line 194: | ||
| in imagine se poate vedea in dreapta interfata grafica in care se vaa introduce configuratia initiala a cubului. jos in terminal se vede solutia intoarsa dupa solve and send. in stanga este o solutie de pe un site de solver cub de pe net. se poate observa ca e acelasi raspuns. | in imagine se poate vedea in dreapta interfata grafica in care se vaa introduce configuratia initiala a cubului. jos in terminal se vede solutia intoarsa dupa solve and send. in stanga este o solutie de pe un site de solver cub de pe net. se poate observa ca e acelasi raspuns. | ||
| - | |||
| - | 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?700 |}} | ||
| - | |||
| - | <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 136: | 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> | ||