Dieses Projekt wurde im Rahmen der Vorlesung Embedded Systems (143303) entwickelt. Es handelt sich um eine Useless-Box, die sowohl Hardware als auch Software umfasst. Mit dem Ziel, eine scheinbar "sinnlose" Interaktion zu erzeugen, reagiert die Box humorvoll auf Eingaben: Wird ein Schalter betätigt, bewegt sich ein Arm, der den Schalter wieder zurücksetzt – und das in verschiedenen "Attitüden", die auch auf einen integrierten Annäherungssensor reagieren.
- Bild der fertigen Useless-Box
- Links zu Präsentationen
- Beteiligte Personen
- Hardware
- Schaltplan
- Assembly Guide
- Getting Started Guide
- Build Befehle
- CI/CD Pipeline
- Aktueller Status
| Member | Kürzel |
|---|---|
| Cedric Gottschalk | cg103 |
| Kathrin Keubler | kk156 |
| Thea Roller | tr094 |
| Simon Wimmer | sw250 |
| Rasmus Wrobel | rw062 |
| Komponente | Menge | Beschreibung | Bezugslink |
|---|---|---|---|
| Arduino Uno R3 | 1 | Microcontroller-Board mit ATMega328P zur Steuerung der Useless-Box | Link |
| 12g Analoger Servo 5V (für den Arm) | 1 | Dient zur Bewegung des mechanischen Arms | Link |
| 9g Analoger Servo 5V (für den Deckel) | 1 | Steuert die Bewegung des Deckels | Link |
| Kippschalter/Hebelschalter | 1 | Zum Auslösen der Aktion | Link |
| APDS-9960 Annäherungssensor | 1 | Erkennt Annäherungen und triggert alternative Reaktionen | Link |
| 1k Ohm Widerstand | 1 | Für Signalstabilisierung in der Schaltung | Link |
| Kabel (z.B. Steckbrückenkabel) | x | Verbindungskomponenten | Link |
| Komponente | Menge | Beschreibung | Bezugslink |
|---|---|---|---|
| Für Batteriebetrieb (optional): | |||
| Hohlstecker | 1 | Anschluss der Batterie an den Arduino | Link |
| Wippenschalter | 1 | Zum Ein- bzw. Ausschalten der Stromzufuhr | Link |
| Batteriehalter | 1 | Befestigung der Batterie | Link |
| 9V Blockbatterie | 1 | Energiequelle für den Batteriebetrieb | Link |
| Zum Testen (optional): | |||
| Breadboard | 1 | Zum schnellen Prototyping und Testen der Schaltung | Link |
| Für eine ansprechende Box: (optional) | |||
| 3D-gedruckte Box | 1 | Gehäuse für die Useless-Box | 3D-Files |
| M3 Gewindeeinsätze | 4 | Für die Befestigung des fest fixierten Deckels der Box | Link |
| M3 Senkkopfschrauben | 6 | Für die Befestigung des fest fixierten Deckels der Box | Link |
| Stück dicker Metalldraht | 1 | Verbindungselement zwischen Deckel und Servo | - |
| Mehrere kleine selbstschneidende Schrauben | x | Zum befestigen der Sevos und des Arduinos in der Box | Link |
| Zusätzlich benötigt: | |||
| Lötkolben | 1 | Für dauerhafte elektrische Verbindungen | - |
| USB Typ A auf USB Typ B Kabel | 1 | Für die Verbindung des Arduino mit dem Rechner | Link |
Hier findest du eine Schritt-für-Schritt Anleitung zum Zusammenbau der Useless-Box:
- Drucke alle Teile der Box mit einem 3D-Drucker: 3D-Files (oder Prototype, wenn du die Hardware zuerst testen möchtest).
- Überprüfe alle 3D-gedruckten Teile und entferne alle Druckrückstände.
- Überprüfe, ob alle elektronischen Komponenten (Servos, Schalter, Sensor, Widerstand, Kabel) vorhanden sind und funktionieren.
- Schmelze die Gewindeeinsätze mit einem Lötkolben in die dafür vorgesehenen Löcher im Gehäuse ein.
- Löte an den Hebelschalter/Kippschalter Kabel an.
- Biege aus dem dicken Drahtstück auf der einen Seite eine Öse und auf der anderen Seite einen Haken, der später zur Verbindung des Deckels dient. Befestige den Draht mit der mitgelieferten Hardware am 9g Servo.
- Montiere den gedruckten Arm mit Hilfe der mit dem Servo gelieferten Hardware am 12g Servo.
- Montiere den Hebelschalter/Kippschalter und den APDS-9960 am festen Deckel.
- (optional) Installiere alle Komponenten für den Batteriebetrieb in der Box. Der Minuspol des Batteriehalters wird direkt mit dem Minuspol des Holsteckers verbunden. Der Wippschalter wird zwischen den Pluspol des Batteriehalters und den Pluspol des Holsteckers geschaltet.
- Die beiden Servos werden mit Hilfe von Schrauben am festen Deckel befestigt.
- Verbinde alle elektronischen Bauteile entsprechend dem Schaltplan mit dem Arduino.
- Einige Kabel/Bauteile müssen gelötet werden (z.B. Widerstand).
- Verlege nun alle Kabel ordentlich, um lose Verbindungen zu vermeiden. Optional kannst du die Kabel und Verbindungen auch mit Schrumpfschlauch oder etwas Isolierband fixieren.
- Montiere den Arduino mit 3 Schrauben an der dafür vorgesehenen Stelle im Gehäuse.
- Befestige den beweglichen Deckel mit zwei Senkkopfschrauben an der Box. Die Schrauben nicht zu fest anziehen, der Deckel muss sich noch leicht bewegen lassen.
- Hacke das Stück Metalldraht an der Öse im beweglichen Deckel ein.
- Befestige nun den festen Deckel mit den Senkkopfschrauben an der Box. Eventuell ist etwas Fingerspitzengefühl erforderlich, um den Deckel mit der Elektronik in die Box zu bekommen, ohne dass Kabel eingeklemmt werden.
- Kontrolliere, dass alle mechanischen Teile frei beweglich sind und nicht durch Kabel behindert werden.
Um nun das Projekt erfolgreich zu builden und zu flashen, stelle bitte sicher, dass folgende Software installiert ist:
- AVR-Toolchain – für das Kompilieren des Quellcodes.
- CMake – zum Konfigurieren und Erstellen des Projekts.
- AVRDUDE – zum Flashen der Firmware auf das Arduino Board.
Bevor das Projekt kompiliert und auf den Arduino geflasht werden kann, müssen zwei Umgebungsvariablen gesetzt werden:
AVRDUDE_PATH: Der absolute Pfad zuravrdude-Executable.ARDUINO_PORT: Der serielle Port, an dem der Arduino angeschlossen ist.
export AVRDUDE_PATH=/pfad/zu/avrdude
export ARDUINO_PORT=/dev/ttyUSB0$env:AVRDUDE_PATH="C:\Pfad\zu\avrdude"
$env:ARDUINO_PORT="COM3"Diese Umgebungsvariablen müssen gesetzt sein, bevor der Flash-Befehl ausgeführt wird.
Falls das Projekt noch nicht lokal vorhanden ist, klone das Repository:
git clone https://gitlab.mi.hdm-stuttgart.de/embedded/ws24/useless-box.git
cd useless-boxDas Projekt verwendet CMake zur Konfiguration und den AVR Toolchain-Support. Erstelle ein Build-Verzeichnis und konfiguriere das Projekt:
mkdir build && cd build
cmake -DCMAKE_TOOLCHAIN_FILE=../avr-toolchain.cmake --fresh ..Der folgende Befehl startet den Build-Prozess und flashed die Software auf den angeschlossenen Arduino:
cmake --build . --target flashDadurch wird die Firmware kompiliert und die .hex-Datei für den Arduino erzeugt und im Anschluss direkt auf den Arduino geflashed.
Mit diesen Schritten kannst du das Projekt erfolgreich kompilieren, flashen und testen. Falls Fehler auftreten, überprüfe die gesetzten Umgebungsvariablen und stelle sicher, dass avrdude korrekt installiert ist.
Es kann eventuell nötig sein, dass die Min-, Max- und Positions-Werte der Servos in der servo.h feinjustiert werden müssen.
Das Projekt enthält mehrere Build-Ziele für unterschiedliche Aufgaben.
Dieser Befehl kompiliert das Projekt und erzeugt die benötigte .hex-Datei für den Arduino:
cmake --build .Dieser Befehl kompiliert das Projekt, erzeugt die benötigte .hex-Datei für den Arduino und flashed diese im Anschluss direkt mit Hilfe von avrdude
cmake --build . --target flashDieser Befehl nutzt die zuvor gesetzten Umgebungsvariablen AVRDUDE_PATH und ARDUINO_PORT, um die Firmware an das richtige Gerät zu senden.
Falls das Build-Verzeichnis bereinigt werden muss (z. B. nach Änderungen im Code), um eine frische Kompilierung durchzuführen, kann folgender Befehl genutzt werden:
cmake --build . --target cleanDies entfernt alle kompilierten Dateien und bereitet das Projekt für einen neuen Build vor.
Zusätzlich zur lokalen Entwicklung werden diese Befehle auch in der GitLab CI/CD Pipeline verwendet, um Builds automatisiert zu erstellen und zu testen.
Das Projekt verwendet eine GitLab CI/CD Pipeline, um den Build-Prozess zu automatisieren, statische Code-Analysen durchzuführen und Releases zu erstellen. Dadurch wird sichergestellt, dass jeder Code-Commit automatisch getestet, gebaut und – sofern getaggt – als offizielles Release veröffentlicht wird.
Die Pipeline besteht aus mehreren Stufen:
- Ziel: Erstellen eines Docker-Images mit der benötigten Entwicklungsumgebung.
- Details:
- Das Docker-Image basiert auf
gcr.io/kaniko-project/executor:v1.23.2-debug. - Das Image wird aus dem
Dockerfileim Repository gebaut und in die GitLab Container Registry hochgeladen.
- Das Docker-Image basiert auf
- Trigger: Dieser Schritt wird nur manuell ausgeführt.
- Ziel: Überprüfung des Codes auf potenzielle Fehler und Code-Qualitätsprobleme.
- Details:
cppcheckwird verwendet, um den Quellcode zu analysieren.- Ergebnisse werden in
gl-code-quality-report.jsongespeichert und in GitLab als Artefakt hochgeladen.
- Trigger: Wird automatisch bei jedem Push in einen Branch ausgeführt.
- Ziel: Kompilieren der Firmware für das Arduino Board.
- Details:
- Ein Build-Ordner wird erstellt und mit CMake konfiguriert.
- Die AVR Toolchain wird genutzt, um die Firmware zu kompilieren.
- Die erzeugte
.hex-Datei wird mit einem Branch-spezifischen Namen versehen.
- Trigger: Wird bei jedem Commit auf einem Branch ausgeführt.
- Ziel: Spezialisierter Build für ein offizielles Release.
- Details:
- Gleiche Schritte wie
build, aber nur für getaggte Releases. - Die erzeugte
.hex-Datei wird unter Verwendung des Tag-Namens gespeichert.
- Gleiche Schritte wie
- Trigger: Automatisch bei Push eines Tags.
- Ziel: Erstellung eines neuen GitLab-Releases und Verlinkung der Firmware.
- Details:
- Ein GitLab-Release wird mit einer passenden Beschreibung erstellt.
- Die erzeugte
.hex-Datei wird als Asset verlinkt, sodass sie einfach heruntergeladen werden kann.
- Trigger: Automatisch nach einem erfolgreichen
build-tag.
- Reguläre Commits lösen die
static-analysisundbuildJobs aus. - Tags lösen
build-tagund anschließendreleaseaus. - Manuelles Starten ist für das
build-imageerforderlich.
Diese CI/CD Pipeline stellt sicher, dass das Projekt immer in einem funktionsfähigen Zustand bleibt und Releases automatisiert bereitgestellt werden können.
Die folgenden Funktionen sind bereits in das Projekt implementiert:
-
Kippschalter als Auslöser
- Beim Betätigen des Schalters aktiviert sich der mechanische Arm, um den Schalter wieder auszuschalten.
- Reaktionen des Arms wurden in verschiedenen "Attitüden" programmiert.
-
Beweglicher Deckel mit Servo
- Der Deckel öffnet und schließt sich, um die Mechanik zu verbergen.
-
APDS-9960 Annäherungssensor
- Erkennt Annäherungen und beeinflusst das Verhalten der Box.
- Reaktionen auf Annäherungen wurden in verschiedenen "Attitüden" programmiert.
-
Verschiedene Bewegungsmuster ("Attitüden")
- Unterschiedliche Reaktionsweisen auf das Betätigen des Schalters oder das Annähern an die Box.
- Der Arm kann sich mit verschiedenen Geschwindigkeiten und Bewegungen (z. B. Antäuschen) verhalten.
- "Mad-Mode", bei dem die Box nach einer bestimmten Anzahl von Betätigungen "aggressiver" reagiert.
Folgende zusätzliche Features sind möglich, wurden aber noch nicht integriert:
-
Mehrere Schalter mit unterschiedlichen Mechanismen
- Ein Arm, der sich kippt.
- Ein Arm, der auf einer Schiene fährt.
- Mehrere Arme, die sich unterschiedlich verhalten.
-
Zusätzliche Reaktionsmuster
- Komplexere Bewegungsschemata, abhängig von der Sensor-Eingabe.
-
Erweiterte Steuerung und Konfigurationsmöglichkeiten
- Möglichkeit zur Einstellung der Reaktionsgeschwindigkeit.
- Anpassbare Empfindlichkeit des Annäherungssensors.
Das Projekt ist aktuell voll funktionsfähig, aber es gibt noch Potenzial für Erweiterungen und kreative Verbesserungen!
Dieses Projekt steht unter der MIT-Lizenz.










