# Ideenfindung
Die Ursprüngliche Idee zu diesem Projekt stammt aus dem Informatikunterricht. Sie basiert auf dem Auftrag einer Projektarbeit. Die Kriterien für das Projekt waren:
- Verwendung von mindestens 2 Sensoren
- Realer Nutzen des Projekts
- Funktionsfähigkeit
- Dokumentation
- Eigenständige Erarbeitung
Am Anfang standen einige Ideen im Raum, ua. eine analoge Uhr oder ein digitaler Medikamentenschrank. Nach einigen Überlegungen entschieden wir uns für einen Zauberwürfellöser, was sich rückblickend als nicht optimal herausstellen sollte. Ein Anhaltspunkt war dabei der [MindCubp3r](https://www.mindcuber.com/mindcub3r/mindcub3r.html), welcher uns bei der Zielsetzung geholfen hat.
![MindCub3r](https://www.mindcuber.com/mindcub3r/mindcub3r-ed.png)
# Entwicklung der Software
Als wir uns endgültig für einen Zauberwürfellöser entschieden hatten, war uns noch nicht klar, wie aufwändig die Programmierung dazu sein würde. Dabei haben wir insbesondere die Menge an Funktionen unterschätzt, welche wir für dieses Projekt benötigen würden. Je näher wir an die Lösung des Würfels mithilfe eines Programms kamen, desto größer wurde dies auch, sodass es gegen Ende über 2000 Blöcke umfasste. Bei dieser Größe traten regelmäßig [Grafikfehller](Bugs-and-Problems.md#renderprobleme--grafikfehler) auf, das Programmm schloss sich von alleine und begann zu ruckeln. Zudem machte die Technische Obergrenze von [31 Stapeln](Bugs-and-Problems.md#limitierte-stapelzahl) eine weitere Entwicklung des Programms nahezu unmöglich.
Uns wurde klar, dass unsere ursprüngliche Idee in Scratch nicht umsetzbar war, sodass wir nach einer Alternative suchten. Auch die begrenze Anzahl an Stapeln in Scratch verhinderte unser Vorgehen.
Unser erstes Programm war so aufgebaut, dass die einzelnen Schritte, welche für das Lösen eines Zauberwürfels nötig sind, in Funktionen und Unterfunktionen eingeteilt waren. Das eigentliche Programm bestand somit nur aus wenigen Blöcken, die Funktionsdefinitionen dafür aber teilweise aus mehreren Hunderten.
## Erste Simplifizierung - Nur die erste Ebene
Wir überlegten uns als Alternative nur die erste Ebene des Zauberwürfels zu lösen, da wir so eine Menge Blöcke aus unserem Programm entfernen konnten. Dabei konnten wir erfolgreich eine [erste Testversion](https://github.com/RedLion8399/EV3_rubiks_cube-solver/releases/tag/v0.1.0-beta) dieses Programms schreiben und veröffentlichen, ohne die maximale Anzahl an Stapeln zu überschreiten. Dadurch, dass das Programm kleiner war, konnten wir das Problem des Ruckelns umgehen, leider ließ sich das Programm grundlos [nicht kompilieren](Bugs-and-Problems.md#kompilier-fehler). Leicht verzweifelt suchten wir nach einer Lösung. Diese ergab sich durch das vollständige Löschen und Wiederherstellen des Programms.
Nun konnte die Programmierung auf dem EV3 Stein ausgeführt und die wichtigsten Fehler behoben werden. Unser Programm war fertig und funktionsfähig, sodass wir die [zweite Testversion ](https://github.com/RedLion8399/EV3_rubiks_cube-solver/releases/tag/v1.0.0-beta)veröffentlichen konnten.
## Zweite Simplifizierung - Verdrehen des Würfels
Leider hatten wir aufgrund all der Softwarefehler unsere Hardware vernachlässigt und bemerkten, dass die Genauigkeit des Roboters sehr dürftig war. Mehrmals ging der Roboter nicht feinfühlig genug mit dem Würfel um, sodass dieser teilweise herausgeworfen wurde. Uns war klar, dass wir dieses Problem nicht schnell genug lösen könnten, sodass wir abermals nach einer Alternative suchten.
So unmittelbar vor der Deadline mussten wir uns etwas verhältnismäßig Einfaches überlegen, damit es rechtzeitig fertig werden würde. Wir griffen daher auch die Idee zurück, dass der Roboter den Würfel nicht lösen, sondern vermischen sollte. Diese Programmierung umfasst nur knapp über hundert Blöcke und konnte in Rekordzeit fertiggestellt werden. Wir hatte nun eine Notlösung, welche auch mit einem sehr ungenauen Roboter zu funktionieren schien. Dadurch, dass der Roboter den Würfel vermischen soll, ist es nicht notwendig, dass jeder Schritt gelingt.
# Entwicklung der Hardware
> [!NOTE]
> Das nachfolgende Kapitel stammt aus Eric's Protokoll. Darum sind die Arbeiten an der Hardware nicht so gut dokumentiert, wie die der Software, wo jede Zeile Code einzeln getrackt und dokumentiert wird. Mangels weiterer Informationen fehlt hier die Inhaltliche Tiefe.
Als Erstes wurde der Teil der Maschine gebaut, der den Zauberwürfel dreht.
Dieser wurde drei Mal gebaut da der erst zu instabil war, die zweite Version ist einfach auseinander gefallen aber die dritte Version hat dann funktioniert.
![IMG_0475](https://github.com/RedLion8399/EV3_rubiks_cube-solver/assets/146088103/789f27e8-4d9d-47ea-a6e9-36062e386edd)
Als Nächstes wurde der Arm zum Einscannen mit dem Farbsensor gebaut.
Als dann auffiel dass dieser das Drehen des Zauberwürfels verhindert, wurde dieser entfernt.
Als Drittes wurde dann der Arm gebaut, welcher den Zauberwürfel kippt.
Zu guter Letzt wurde dann alles zusammengesteckt und mit dem EV3-Stein verkabelt. Dann wurde noch alles stabilisiert und der Roboter war fertig.