Im Rahmen eines Lernfeldes in der Berufsschule haben wir (@Yannik-Roesser und @SpraxDev) den 3D-Objektscanner 2000 entwickelt.
Im Grunde besteht dieser aus einem Drehteller, auf dem sich ein Objekt befindet – Ein ToF Sensor misst die Distanz zum Objekt-Messpunkt und speichert diesen ab.
Der Drehteller dreht sich, wodurch wir eine 360°-Ansicht des Objekts erhalten; Der ToF Sensor kann in der Höhe verstellt werden, wodurch wir nun über das gesamte Objekt hinweg messen können.
(Weitere Bilder in docs/)
Im Grundlegenden sollten wir folgende Anforderungen erfüllen:
- Verwendung von mindestens vier unterschiedlichen Sensoren oder Aktoren
- 1x Stepper-Motor (Drehteller)
- 1x Stepper-Motor mit Linearschlitten (Auf- und Abwärtsbewegung; Für den ToF Sensor)
- 1x ToF Sensor
- Webinterface (Ein- und Ausgabe; Rendering 3D Modell; Download als STL-Datei)
- REST-API
- Trennung von Erfassung und Ausgabe der Sensordaten (2 verschiedene Geräte)
- Erfassung: Python-Script
- Ausgabe: Webinterface
- Sensorwerte und Eingaben müssen für mindestens 30 Tage gespeichert werden
- PostgreSQL-Datenbank (Speicherdauer unbegrenzt)
- Fehleingaben des Nutzers müssen entsprechend behandelt werden
- Validierung der Eingaben
- Fehlermeldungen (z.B. bei Verbindungsproblemen)
- Klar definiertes Anwendungsgebiet
- Videospiel-Prototyp günstiger und einfacher herstellen
- Marketing-Materialien (z.B. für die Produktpräsentation)
- 3D-Druck (z.B. als Hilfe, wenn ein Objekt als CAD file design werden muss)
- ...
Das Projekt besteht aus mehrere Software-Komponenten:
- Webinterface-Frontend
- Webinterface-Backend (Webserver + REST-API)
- Python-Script
- FreeCAD
- Enthält FreeCAD-Projekte, mit Halterungen für die Hardware (zum selber Drucken)
- Je nach 3D-Druck sind die Maße der Halterungen unter Umständen 1 bis 2 mm zu klein
Funktionen und Aufgaben der Komponenten:
- Das Frontend muss einmalig gebaut werden und kann deployed werden oder vom Backend ausgeliefert werden.
- Das Backend startet einen HTTP-Server, der die REST-API bereitstellt und optional das Frontend ausliefert.
- Das Backend kann auch auf einem anderen Server laufen, als das Frontend
- Das Python-Script wird auf dem Raspberry Pi ausgeführt, der die meisten Sensoren und Aktoren steuert
- Das Python-Script kann auch auf einem anderen Server laufen, als das Backend
Die Daten werden in einer PostgreSQL-Datenbank gespeichert.
Frontend und Backend benötigen Node.js (getestet mit Version 18) und npm (wird in der Regel mit Node.js mitgeliefert) als package manager.
Für das Python-Skript wird Python 3 benötigt und pip
als package manager.
- Im Frontendordner
npm ci
ausführen, um alle notwendigen Pakete zu installieren npm run build
ausführen, um das Frontend zu bauen- Nach der ersten Ausführung, generiert sich eine
config.json
imconfig/
-Ordner, die angepasst werden kann
- Nach der ersten Ausführung, generiert sich eine
- Das fertige Frontend findet sich im neuen
dist/
-Ordner – Dieses kann (optional) manuell auf ein anderes System deployed werden
- Im Backendordner
npm ci
ausführen, um alle notwendigen Pakete zu installieren npm run build
ausführen, um das Backend zu bauen- Das fertige Backend findet sich im neuen
dist/
-Ordner – Die (production) Abhängigkeiten innode_modules/
werden zur Ausführung benötigt - Zum Starten
npm run start
ausführen- Es generiert sich eine
config.json
imconfig/
-Ordner, die angepasst werden muss - Wurde das Frontend vorab gebaut und die Projekt-Ordnerstruktur nicht verändert, wird dieses automatisch gefunden und ausgeliefert
- Es generiert sich eine
- Die Hardware, wie in
Verkabelung.fzz
beschrieben, anschließen - Die Hardware mit den GPIO-Pins des Raspberry Pi verbinden
- ToF Sensor an den I2C-Bus anschließen
- Die Motor-Driver-Boards an die entsprechenden Pins aus
scanner-script/scanner_controller.py
(ca. ab Zeile 109 beiGPIO_motorTeller
undGPIO_motorVert
)
- Im Python-Script-Ordner
pip3 install -r requirements.txt
ausführen, um alle notwendigen Pakete zu installieren- Es empfiehlt sich vorab ein virtuelles Python-Environment anzulegen
- Unter Umständen muss
pip
anstelle vonpip3
verwendet werden
- Skript bei Bedarf konfigurieren
postgres.py
anpassen, um die Datenbankverbindung zu konfigurierenDISTANCE_BETWEEN_SENSOR_AND_TURN_TABLE_CENTER_MM
inscanner_controller.py
anpassen, um die Entfernung zwischen dem ToF-Sensor und dem Mittelpunkt des Teller zu konfigurieren
python3 scanner_controller.py
ausführen, um das Script zu starten- Unter Umständen muss
python
anstelle vonpython3
verwendet werden
- Unter Umständen muss
- Das Script wartet nun auf einen Startbefehl über die REST-API
Die /database.sql
enthält die Datenbankstruktur und muss einmalig in die Datenbank eingespielt werden.
Es enthält keine OWNER-Informationen, da diese je nach Umgebung variieren können.
Dies sind die Teile, die wir im Rahmen der Projekt-Konzeption verwendet haben. Ein Breadboard und Kabel sind ebenfalls Notwendig – Die 2 Raspberry Pis haben wir ebenfalls nicht aufgelistet, da diese als Teil der Aufgabenstellung bereits vorhanden waren.
- Steppermotor mit Linearschlitten
- Hierran befestigen wir unseren ToF Sensor
- NEMA17-04
- Nutzen wir für unseren Drehteller (lieber einen stärkeren Motor nehmen, da wir den Teller auch mit Gewicht bewegen wollen)
- 2x A4988 Schrittmotor-Treiber-Modul
- Damit können wir die beiden Motoren ansteuern
- Das Video könnte hilfreich sein
- Steckernetzteil 12V 2A
- Damit können wir den NEMA17-04 bzw. das Treibermodul mit Strom versorgen
- Kupplung, Ø außen: 5,5 mm, Ø innen: 2,1 mm (DELOCK 65421)
- Darüber verbinden wir das Netzteil mit dem Treibermodul
- Hätte auch einfach abgeschnitten und 2 Steckverbindungen draufgelötet, aber lassen wir das beim Schulprojekt mal lieber
- Adafruit VL6180X Time of Flight Micro-LIDAR Distance Sensor
- Damit messen wir die Distanz zum Objekt, dass auf dem Drehteller liegt
- 2x 100µF Capacitor (ca. 70 V)
- Kommt zur externen Stromversorgung des Motors (möglichst nah am Driver-Board)
- Details gibts im Datasheet
- Weniger als 70 V ist sicherlich auch okay, aber keinesfalls unter 40 V würde ich sagen
- Kommt zur externen Stromversorgung des Motors (möglichst nah am Driver-Board)
Das Projekt ist grundsätzlich unter der MIT-Lizenz veröffentlicht.
Das verwendete Logo im Frontend ist von DinosoftLabs auf Flaticon, lizensiert unter der Flaticon license.