This shows you the differences between two versions of the page.
|
pm:prj2025:fstancu:anne.onciulescu [2025/05/28 19:53] 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 40: | Line 38: | ||
| ==== Functii ==== | ==== Functii ==== | ||
| - | === Functie Generica de Rotatie: === | + | |
| + | === Functie Generica de Rotatie === | ||
| Roteste un motor 90 de grade. | Roteste un motor 90 de grade. | ||
| - | void rotateMotor(int stepPin, int dirPin, bool clockwise) { | + | <code cpp> |
| - | digitalWrite(dirPin, clockwise ? HIGH : LOW); | + | void rotateMotor(int stepPin, int dirPin, bool clockwise) { |
| - | for (int i = 0; i < STEPS_PER_90; i++) { | + | digitalWrite(dirPin, clockwise ? HIGH : LOW); |
| - | digitalWrite(stepPin, HIGH); | + | for (int i = 0; i < STEPS_PER_90; i++) { |
| - | delayMicroseconds(STEP_DELAY_US); | + | digitalWrite(stepPin, HIGH); |
| - | digitalWrite(stepPin, LOW); | + | delayMicroseconds(STEP_DELAY_US); |
| - | delayMicroseconds(STEP_DELAY_US); | + | digitalWrite(stepPin, LOW); |
| - | } | + | delayMicroseconds(STEP_DELAY_US); |
| } | } | ||
| - | | + | } |
| - | === Functii de rotatie: === | + | </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> | ||
| - | === Functie Generica de Rotatie Duala: === | + | === Functie Generica de Rotatie Duala === |
| Roteste intreg cubul 90 de grade pe axa L-R. | 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); |
| } | } | ||
| - | | + | } |
| - | === Functii Rotatie Duala: === | + | </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> | ||
| - | void rotateForward() { DualRotateMotors(X_STEP, X_DIR, Y_STEP, Y_DIR, true); } | ||
| - | void rotateBackward() { DualRotateMotors(X_STEP, X_DIR, Y_STEP, Y_DIR, false); } | ||
| - | | ||
| === Functie Translatare Mutari === | === Functie Translatare Mutari === | ||
| - | Translateaza mutarile in rotatii ale motoarelor. | + | Traduce miscarile cubului in rotatii ale motoarelor. |
| + | **'** – miscare CCW | ||
| - | **'** - miscare CCW | + | **2** – rotatie 180 de grade |
| - | **2** - rotatie 180 grade | + | <code cpp> |
| + | void executeMove(String move) { | ||
| + | bool twice = move.endsWith("2"); | ||
| + | bool prime = move.endsWith("'"); | ||
| - | void executeMove(String move) { | + | char face = move.charAt(0); |
| - | bool twice = move.endsWith("2"); | + | int turns = twice ? 2 : 1; |
| - | bool prime = move.endsWith("'"); | + | |
| - | char face = move.charAt(0); | + | for (int i = 0; i < turns; i++) { |
| - | int turns = twice ? 2 : 1; | + | switch (face) { |
| + | case 'R': | ||
| + | if (prime) rotateXCCW(); | ||
| + | else rotateXCW(); | ||
| + | break; | ||
| - | for (int i = 0; i < turns; i++) { | + | case 'L': |
| - | switch (face) { | + | if (prime) rotateYCCW(); |
| - | case 'R': | + | else rotateYCW(); |
| - | if (prime) rotateXCCW(); | + | break; |
| - | else rotateXCW(); | + | |
| - | break; | + | |
| - | case 'L': | + | case 'B': |
| - | if (prime) rotateYCCW(); | + | if (prime) rotateZCCW(); |
| - | else rotateYCW(); | + | else rotateZCW(); |
| - | break; | + | break; |
| - | case 'B': | + | case 'F': |
| - | if (prime) rotateZCCW(); | + | rotateBackward(); |
| - | else rotateZCW(); | + | rotateBackward(); |
| - | break; | + | if (prime) rotateZCCW(); |
| + | else rotateZCW(); | ||
| + | rotateForward(); | ||
| + | rotateForward(); | ||
| + | break; | ||
| - | case 'F': | + | case 'U': |
| - | rotateBackward(); | + | rotateBackward(); |
| - | rotateBackward(); | + | if (prime) rotateZCCW(); |
| - | if (prime) rotateZCCW(); | + | else rotateZCW(); |
| - | else rotateZCW(); | + | rotateForward(); |
| - | rotateForward(); | + | break; |
| - | rotateForward(); | + | |
| - | break; | + | |
| - | case 'U': | + | case 'D': |
| - | rotateBackward(); | + | rotateForward(); |
| - | if (prime) rotateZCCW(); | + | if (prime) rotateZCCW(); |
| - | else rotateZCW(); | + | else rotateZCW(); |
| - | rotateForward(); | + | rotateBackward(); |
| - | break; | + | break; |
| + | } | ||
| + | } | ||
| + | } | ||
| + | </code> | ||
| + | |||
| + | === Bucla Citire Mutari de pe Seriala === | ||
| - | case 'D': | + | <code cpp> |
| - | rotateForward(); | + | String incoming = ""; |
| - | if (prime) rotateZCCW(); | + | |
| - | else rotateZCW(); | + | void loop() { |
| - | rotateBackward(); | + | while (Serial.available()) { |
| - | break; | + | 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; | ||
| } | } | ||
| } | } | ||
| - | | + | } |
| - | inca mai scriu la el, o sa revin asap cu restul detaliilor :)) | + | </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 159: | 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 194: | 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> | ||