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> | ||