Benutzer-Werkzeuge

Webseiten-Werkzeuge


projektesose24:int_regal:projektdoku

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
projektesose24:int_regal:projektdoku [2024/09/30 16:20]
backhaus [Technische Daten und Bauteile]
projektesose24:int_regal:projektdoku [2024/09/30 19:02] (aktuell)
XeniaN [Bedienungsanleitung für die Roboter-Bewertung]
Zeile 10: Zeile 10:
 ====Überblick über das Gesamtsystem==== ====Überblick über das Gesamtsystem====
  
-Um die Suche nach einem Buch zu starten ​wird das Programm auf dem Raspberry Pi gestartet. Daraufhin kann man über die URL, welche im Terminal angezeigt wird das **User-Interface** öffnen. Wenn dort nach einem bestimmten Buch gesucht wird, wird die Position dieses Buches aus der **Datenbank** an die LED-Funktion,​ sowie an die Motor-Funktion übermittelt. Diese Funktionen sorgen dafür, dass der **LED-Strip** an der entsprechenden Stelle aufleuchtet und der Schlitten auf der Schiene an die entsprechende Position fährt (**Schienenkonstruktion**). Der Schlitten wird mithilfe eines Stepper-Motors gesteuert. Anschließend fährt der **Scherenmechanismus** aus, um das gesuchte Buch nach vorne zu schieben. Dadurch wird das Buch erkenntlich gemacht.+Um die Suche nach einem Buch zu beginnen, ​wird das Programm auf dem Raspberry Pi gestartet. Daraufhin kann man über die URL, welche im Terminal angezeigt wirddas **User-Interface** öffnen. Wenn dort nach einem bestimmten Buch gesucht wird, wird die Position dieses Buches aus der **Datenbank** an die LED-Funktion,​ sowie an die Motor-Funktion übermittelt. Diese Funktionen sorgen dafür, dass der **LED-Strip** an der entsprechenden Stelle aufleuchtet und der Schlitten auf der Schiene an die entsprechende Position fährt (**Schienenkonstruktion**). Der Schlitten wird mithilfe eines Stepper-Motors gesteuert. Anschließend fährt der **Scherenmechanismus** aus, um das gesuchte Buch nach vorne zu schieben. Dadurch wird das Buch erkenntlich gemacht.
  
  
Zeile 16: Zeile 16:
  
 ===User-Interface=== ===User-Interface===
-Zu Beginn haben wir das User-Interface als Terminal-Anwendung implementiert,​ aber schlussendlich haben wir uns dazu entschieden es als Webapp zu programmieren,​ da wir dadurch die Möglichkeit hatten auch eine grafische und damit ansprechendere und leichter bedienbare Oberfläche zu designen. Außerdem bietet eine Webapp deutlich mehr Möglichkeiten,​ wie beispielsweise die Einbindung einer API (mehr dazu weiter unten). Diese Webapp haben wir mit dem Webframework "​Flask"​ programmiert, ​wodurch ​die App auf dem Raspberry Pi läuft und im lokalen Netzwerk erreichbar ist.+Zu Beginn haben wir das User-Interface als Terminal-Anwendung implementiert,​ aber schlussendlich haben wir uns dazu entschieden es als Webapp zu programmieren,​ da wir dadurch die Möglichkeit hatten auch eine grafische und damit ansprechendere und leichter bedienbare Oberfläche zu designen. Außerdem bietet eine Webapp deutlich mehr Möglichkeiten,​ wie beispielsweise die Einbindung einer API (mehr dazu weiter unten). Diese Webapp haben wir mit dem Webframework "​Flask"​ programmiert, ​sodass ​die App auf dem Raspberry Pi läuft und im lokalen Netzwerk erreichbar ist.
  
 Wenn die URL der Webapp geöffnet wird, wird als Erstes die Startseite angezeigt, auf der der Benutzer wählen kann, ob er ein neues Buch hinzufügen,​ nach einem Buch suchen oder sich alle Bücher anzeigen lassen will.  Wenn die URL der Webapp geöffnet wird, wird als Erstes die Startseite angezeigt, auf der der Benutzer wählen kann, ob er ein neues Buch hinzufügen,​ nach einem Buch suchen oder sich alle Bücher anzeigen lassen will. 
Zeile 24: Zeile 24:
 </​figure>​ </​figure>​
  
-Wählt er eine der Optionen aus, wird eine URL aufgerufen, die die entsprechende Funktion der Anwendung ​aufruft. Jede dieser Optionen führt zu einer spezifischen Webroute innerhalb der Flask-Anwendung,​ welche dafür sorgt, dass ein passendes HTML-Template gerendert wird. Die HTML Dateien werden mit CSS gestyled.+Wählt er eine der Optionen aus, wird eine URL aufgerufen, die die entsprechende Funktion der Anwendung ​startet. Jede dieser Optionen führt zu einer spezifischen Webroute innerhalb der Flask-Anwendung,​ welche dafür sorgt, dass ein passendes HTML-Template gerendert wird. Die HTML Dateien werden mit CSS gestyled.
  
 <code python> <code python>
Zeile 43: Zeile 43:
 Nachdem die Daten eingetragen und bestätigt wurden, prüft die Anwendung, ob das Buch bereits in der Datenbank vorhanden ist. Wenn dies der Fall ist, wird der Benutzer mit einer Fehlermeldung benachrichtigt. Andernfalls wird das Buch zur Datenbank hinzugefügt,​ und der Benutzer wird zur Übersicht weitergeleitet. Nachdem die Daten eingetragen und bestätigt wurden, prüft die Anwendung, ob das Buch bereits in der Datenbank vorhanden ist. Wenn dies der Fall ist, wird der Benutzer mit einer Fehlermeldung benachrichtigt. Andernfalls wird das Buch zur Datenbank hinzugefügt,​ und der Benutzer wird zur Übersicht weitergeleitet.
  
-Um das Eintragen neuer Bücher möglichst nutzerfreundlich zu machen, haben wir die Seite mit der Open Library Books API verbunden, über die die Buchinformationen anhand der ISBN abfragt ​werden (https://​openlibrary.org/​dev/​docs/​api/​books). Open Library ist ein Projekt, welches eine offene Datenbank mit Buchinformationen zur Verfügung stellt. Laut eigenen Angaben umfasst ihre Datenbank ca. 20 Millionen frei zugängliche Datensätze. Außerdem stellt Open Library eine API zur Verfügung, welche Buchdaten suchen und abrufen kann. Wenn der Nutzer eine ISBN eingibt wird eine Anfrage mit dieser ISBN an die API gestellt. Ist das Buch in der Datenbank vorhanden, werden der Titel, der Autor, sowie das Erscheinungsjahr an das Programm zurückgegeben und in das Formular eingetragen. ​+Um das Eintragen neuer Bücher möglichst nutzerfreundlich zu machen, haben wir die Seite mit der Open Library Books API verbunden, über die die Buchinformationen anhand der ISBN abgefragt ​werden (https://​openlibrary.org/​dev/​docs/​api/​books). Open Library ist ein Projekt, welches eine offene Datenbank mit Buchinformationen zur Verfügung stellt. Laut eigenen Angaben umfasst ihre Datenbank ca. 20 Millionen frei zugängliche Datensätze. Außerdem stellt Open Library eine API zur Verfügung, welche Buchdaten suchen und abrufen kann. Wenn der Nutzer eine ISBN eingibt wird eine Anfrage mit dieser ISBN an die API gestellt. Ist das Buch in der Datenbank vorhanden, werden der Titel, der Autor, sowie das Erscheinungsjahr an das Programm zurückgegeben und in das Formular eingetragen. ​
  
 \\ \\
-Wählt der Nutzer "Nach Buch suchen"​ aus, führt das zu der Route "/​search_book",​ welche ​wiederrum ​das HTML-Template rendert. Auf dieser Seite kann der Nutzer ein schon existierendes Buch in der Datenbank aufgrund des Titels, des Autors, der ISBN und/oder des Genres suchen. ​+Wählt der Nutzer "Nach Buch suchen"​ aus, führt das zu der Route "/​search_book",​ welche ​wiederum ​das HTML-Template rendert. Auf dieser Seite kann der Nutzer ein schon existierendes Buch in der Datenbank aufgrund des Titels, des Autors, der ISBN und/oder des Genres suchen. ​
  
  
Zeile 53: Zeile 53:
 </​figure>​ </​figure>​
  
-Über die Route wird eine GET-Anfrage gesendet und die Datenbank wird nach dem entsprechenden Kriterium durchsucht. Ist die Suche erfolgreich wird der Nutzer auf die "​show_books"​ Seite weitergeleitet,​ auf welcher ihm die Ergebnisse angezeigt werden. Außerdem wird die LED-Funktion,​ sowie die Motor-Funktion mit der entsprechenden Position des Buches (bzw. den Positionen der Bücher) aufgerufen. Im Falle der LED-Funktion steht auch die Breite im Übergabe Argument. Wird kein passendes Buch in der Datenbank gefunden, erhält der Nutzer eine Fehlermeldung.+Über die Route wird eine GET-Anfrage gesendet und die Datenbank wird nach dem entsprechenden Kriterium durchsucht. Ist die Suche erfolgreich wird der Nutzer auf die "​show_books"​ Seite weitergeleitet,​ auf welcher ihm die Ergebnisse angezeigt werden. Außerdem wird die LED-Funktion,​ sowie die Motor-Funktion mit der entsprechenden Position des Buches (bzw. den Positionen der Bücher) aufgerufen. Im Falle der LED-Funktion steht auch die Breite im Übergabe-Argument. Wird kein passendes Buch in der Datenbank gefunden, erhält der Nutzer eine Fehlermeldung.
  
 \\ \\
Zeile 81: Zeile 81:
 flashLED_async(positions,​ widths) flashLED_async(positions,​ widths)
 </​code>​ </​code>​
-Um den LED-Strip nun an der richtigen Stelle aufleuchten zu lassen, war die Herausforderung die übergebene Position in den LED-Index umzurechen. Dies geschieht, indem die Position des Buches durch 0,625 geteilt wird. Dieser Faktor ergibt sich, wenn die Gesamtlänge des Strips (500cm) durch die Gesamtanzahl der LEDs geteilt wird (800). Der Index muss noch in einen Integer umgewandelt werden, da es nur ganze Inidizes ​gibt. Wenn nun die Position (beispielsweise 14cm) durch 0,625 geteilt wird ergibt sich ein Index von 22. In unserem Fall wird vor dieser Rechnung noch 26,5 auf die Position aufaddiert, da die Buchreihe erst nach 26,5 cm des Led-Strips anfängt. Damit nun nicht nur eine LED, sondern die gesamte Breite des Buches aufleuchtet,​ wird ein zweiter Index berechnet, welcher sich ergibt, indem zu der Position die Breite des Buches addiert wird. Anschließend werden mithilfe einer for-Schleife alle LEDs zwischen dem ersten und zweiten Index zum Leuchten gebracht. ​+Um den LED-Strip nun an der richtigen Stelle aufleuchten zu lassen, war die Herausforderung die übergebene Position in den LED-Index umzurechen. Dies geschieht, indem die Position des Buches durch 0,625 geteilt wird. Dieser Faktor ergibt sich, wenn die Gesamtlänge des Strips (500cm) durch die Gesamtanzahl der LEDs geteilt wird (800). Der Index muss noch in einen Integer umgewandelt werden, da es nur ganze Indizes ​gibt. Wenn nun die Position (beispielsweise 14cm) durch 0,625 geteilt wird ergibt sich ein Index von 22. In unserem Fall wird vor dieser Rechnung noch 26,5 auf die Position aufaddiert, da die Buchreihe erst nach 26,5 cm des Led-Strips anfängt. Damit nun nicht nur eine LED, sondern die gesamte Breite des Buches aufleuchtet,​ wird ein zweiter Index berechnet, welcher sich ergibt, indem zu der Position die Breite des Buches addiert wird. Anschließend werden mithilfe einer for-Schleife alle LEDs zwischen dem ersten und zweiten Index zum Leuchten gebracht. ​
 <code python> <code python>
 for position, width in zip(positions,​ widths): for position, width in zip(positions,​ widths):
Zeile 91: Zeile 91:
 </​code>​ </​code>​
  
-Damit im Fall von mehreren gesuchten Büchern nicht jedes Buch in derselben Farbe aufleuchtet,​ haben wir am Anfang der LED-Datei eine Liste mit verschiedenen Farben definiert. Nach der Berechnung der Indizes wird eine for-Schleife durchlaufen,​ welche den verschiedenen LED-Abschnitten verschiedene Farben zuweist.+Damit bei mehreren gesuchten Büchern nicht jedes Buch in derselben Farbe aufleuchtet,​ haben wir am Anfang der LED-Datei eine Liste mit verschiedenen Farben definiert. Nach der Berechnung der Indizes wird eine for-Schleife durchlaufen,​ welche den verschiedenen LED-Abschnitten verschiedene Farben zuweist.
 <code python> <code python>
 # Define a list of colors to use for the LEDs # Define a list of colors to use for the LEDs
Zeile 123: Zeile 123:
  
 Für die Motoren des Scherenmechanismus’ und des Schienenmechanismus’ verwenden wir zwei DRV8825 Stepper Treiber. Zur Versorgung nutzen wir eine 24V 2A Spannungsquelle. ​ Für die Motoren des Scherenmechanismus’ und des Schienenmechanismus’ verwenden wir zwei DRV8825 Stepper Treiber. Zur Versorgung nutzen wir eine 24V 2A Spannungsquelle. ​
-Beide Stepper Treiber bekommen jeweils die selben Signale vom Raspberry Pi. Damit die Motoren sich dennoch individuell bewegen können, wird immer maximal einer der beiden Treiber vom Pi aktiviert.+Beide Stepper-Treiber bekommen jeweils die selben Signale vom Raspberry Pi. Damit die Motoren sich dennoch individuell bewegen können, wird immer maximal einer der beiden Treiber vom Pi aktiviert.
 <​figure>​ <​figure>​
 {{ :​projektesose24:​int_regal:​dibr_motor_schaltung.png?​direct&​300 |}} <​caption>​Motorsteuerung</​caption>​ {{ :​projektesose24:​int_regal:​dibr_motor_schaltung.png?​direct&​300 |}} <​caption>​Motorsteuerung</​caption>​
 </​figure>​ </​figure>​
-Zur Steuerung des Schlittens haben wir die Funktion move(positions) geschrieben,​ welche eine Liste an Positionen übergeben bekommt. Diese Positionen werden berechnet als: Position + 1/2*Breite, um immer möglichst die mitte des Buches zu treffen. +Zur Steuerung des Schlittens haben wir die Funktion move(positions) geschrieben,​ welche eine Liste an Positionen übergeben bekommt. Diese Positionen werden berechnet als: Position + 1/2*Breite, um immer möglichst die Mitte des Buches zu treffen. 
-Die Ansteuerung der Stepper Treiber erfolgt durch das setzen ​des Richtungs-Pins auf HIGH oder LOW und anschließend wiederholtes ​ein und ausschalten ​des Step-Pins. Die Geschwindigkeit des Motors wird dabei durch die Wartezeit zwischen den Impulsen gesteuert.+Die Ansteuerung der Stepper Treiber erfolgt durch das Setzen ​des Richtungs-Pins auf HIGH oder LOW und anschließend wiederholtes ​Ein- und Ausschalten ​des Step-Pins. Die Geschwindigkeit des Motors wird dabei durch die Wartezeit zwischen den Impulsen gesteuert.
 \\ \\
-Vor jedem Step signal, ​wird geprüft, ob der Limit-Switch in Fahrtrichtung des Schlittens gedrückt wurde. Ist dies der Fall, so wird die move() Funktion vorzeitig abgebrochen und die Variable, welche die Motorposition speichert, korrigiert.\\ +Vor jedem Step-Signal ​wird geprüft, ob der Limit-Switch in Fahrtrichtung des Schlittens gedrückt wurde. Ist dies der Fall, so wird die move() Funktion vorzeitig abgebrochen und die Variable, welche die Motorposition speichert, korrigiert.\\ 
-Korrigieren bedeutet, dass die Variable motor_position entweder auf 0, oder auf 21304 gesetzt wird, jenachdem, ob der linke oder rechte Taster gedrückt wurde.\\+Korrigieren bedeutet, dass die Variable motor_position entweder auf 0, oder auf 21304 gesetzt wird, je nachdem, ob der linke oder rechte Taster gedrückt wurde.\\
 21304 ist hierbei die Anzahl an Schritten, die der Motor machen muss, um von dem einem Taster zum anderen Taster zu kommen.\\ 21304 ist hierbei die Anzahl an Schritten, die der Motor machen muss, um von dem einem Taster zum anderen Taster zu kommen.\\
 \\ \\
-Da der Schlitten sich recht schnell bewegen können soll, wird der Schlitten auf seinem Weg Be- und Entschleunigt. Hierzu wird die Wartezeit zur hälfte ​der zurückgelegten Strecke hin kürzer, und zum ende hin wieder länger. Die Formel, die wir hierfür verwenden ist: +Da der Schlitten sich recht schnell bewegen können soll, wird der Schlitten auf seinem Weg sanft beschleunigt ​und abgebremst. Hierzu wird die Wartezeit zur Hälfte ​der zurückgelegten Strecke hin kürzer, und zum Ende hin wieder länger. Die Formel, die wir hierfür verwenden ist: 
  
 <code python> ​ <code python> ​
Zeile 140: Zeile 140:
 </​code>​ </​code>​
  
-Wurzel(x) - Wurzel(x+1) ist eine Approximation der Ableitung der Wurzel funktion. Da diese anfangs einen großen ​anstieg ​besitzt, welcher mit der Zeit abflacht, haben wir anfangs eine längere Wartezeit, welche immer kleiner wird. \\ +Wurzel(x) - Wurzel(x+1) ist eine Approximation der Ableitung der Wurzelfunktion. Da diese anfangs einen großen ​Anstieg ​besitzt, welcher mit der Zeit abflacht, haben wir anfangs eine längere Wartezeit ​zwischen den Steps, welche immer kleiner wird. \\ 
-x ist hierbei entweder die Anzahl der zurückgelegten ​schritte ​(Zum beschleunigen) oder die länge ​der gesamten zurückzulegenden Strecke (in Motor-Schritten) minus die Anzahl der bisherigen Schritte. (Zum entschleunigen)\\ x zählt also bis zur hälfte ​der Strecke linear hoch, und ab der hälfte ​wieder linear runter.\\+x ist hierbei entweder die Anzahl der zurückgelegten ​Schritte ​(Zum Beschleunigen) oder die Länge ​der gesamten zurückzulegenden Strecke (in Motor-Schritten) minus die Anzahl der bisherigen Schritte. (Zum Abbremsen)\\ x zählt also bis zur Hälfte ​der Strecke linear hoch, und ab der Hälfte ​wieder linear runter.\\
 max(0.000447,​ …) sorgt dafür, dass der Schlitten eine bestimmte Geschwindigkeit nicht überschreitet,​ da es ansonsten passieren kann, dass Schritte des Motors übersprungen werden. max(0.000447,​ …) sorgt dafür, dass der Schlitten eine bestimmte Geschwindigkeit nicht überschreitet,​ da es ansonsten passieren kann, dass Schritte des Motors übersprungen werden.
 Der Wert 0.000447 ist durchs ausprobieren verschiedener Werte entstanden. Bei Wartezeiten unterhalb von diesem Wert, haben wir ungleichmäßiges Fahrverhalten des Schlittens und einen Genauigkeitsverlust feststellen können. \\ Der Wert 0.000447 ist durchs ausprobieren verschiedener Werte entstanden. Bei Wartezeiten unterhalb von diesem Wert, haben wir ungleichmäßiges Fahrverhalten des Schlittens und einen Genauigkeitsverlust feststellen können. \\
 \\ \\
-Wenn ein Buch gesucht wird, wird die Position in cm aus der Datenbank entnommen, durch multiplizieren ​mit einer Konstante ​in Motor Schritte umgerechnet,​ und an die Move funktion ​übergeben, welche dann den abstand ​der aktuellen Schlittenposition (in Motorschritten) von der Buchposition subtrahiert. Die Richtung der Bewegung wird dann durch das Vorzeichen bestimmt, der Abstand durch den Betrag ​der Berechnung.\\+Wenn ein Buch gesucht wird, wird die Position in cm aus der Datenbank entnommen, durch Multiplizieren ​mit einer Konstanten ​in Motor Schritte umgerechnet,​ und an die Move-Funktion ​übergeben, welche dann den Abstand ​der aktuellen Schlittenposition (in Motorschritten) von der Buchposition subtrahiert. Die Richtung der Bewegung wird dann durch das Vorzeichen bestimmt, der Abstand durch den Betrag ​dieser ​Berechnung.\\
 \\ \\
 Am Ende der move() Funktion, wird die push_book() Funktion aufgerufen. Diese deaktiviert den Stepper für die Schiene, und aktiviert den Stepper für den Schiebemechanismus. Anschließend wird der Schiebemechanismus eingefahren,​ ausgefahren und wieder eingefahren. \\ Am Ende der move() Funktion, wird die push_book() Funktion aufgerufen. Diese deaktiviert den Stepper für die Schiene, und aktiviert den Stepper für den Schiebemechanismus. Anschließend wird der Schiebemechanismus eingefahren,​ ausgefahren und wieder eingefahren. \\
-Das Einfahren wird jeweils durch das drücken ​des Limit-Switches gestoppt. +Das Einfahren wird jeweils durch das Drücken ​des Limit-Switches gestoppt. 
-Zum Ausfahren macht der Motor 1280 Schritte. Hier wäre es schwer gewesen einen Limit Switch zu verwednen, und da wir die Ausgangsposition des Motors kennen, und durch das Einfahren am Anfang sogar noch sicher stellen, ist hier auch kein weiterer Limit-Switch notwendig. \\+Zum Ausfahren macht der Motor 1280 Schritte. Hier wäre es schwer gewesen einen weiteren ​Limit Switch zu verwenden, und da wir die Ausgangsposition des Motors kennen, und durch das Einfahren am Anfang sogar noch sicher stellen, dass der Motor an der richtigen Position ist, ist hier auch kein weiterer Limit-Switch notwendig. \\
 \\ \\
  
Zeile 165: Zeile 165:
  
  
-Die Rotation der Zahnräder wird von einem [[https://​www.mintgruen.tu-berlin.de/​robotikWiki/​doku.php?​id=projektesose24:​int_regal:​projektdoku#​technische_daten_und_bauteile|Motor]] erzeugt, der über eine 3D-gedruckte Halterung an der Scherengitterkonstruktion befestigt ist. An den vorderen Enden der Hebelarme ist ein Schwamm angebracht, um eine größere Auflagefläche für die Kraftübertragung von den Hebelarmen auf das Buch zu schaffen und es gleichzeitig vor Beschädigungen zu schützen.+Die Rotation der Zahnräder wird von einem Motor erzeugt, der über eine 3D-gedruckte Halterung an der Scherengitterkonstruktion befestigt ist. An den vorderen Enden der Hebelarme ist ein Stück ​Schwamm angebracht, um eine größere Auflagefläche für die Kraftübertragung von den Hebelarmen auf das Buch zu schaffen und es gleichzeitig vor Beschädigungen zu schützen.
  
 <​figure>​ <​figure>​
Zeile 186: Zeile 186:
 Um sicherzustellen,​ dass der Schlitten nicht über die Schiene hinausfährt,​ haben wir an der Grundplatte Endschalter ([[https://​www.mintgruen.tu-berlin.de/​robotikWiki/​doku.php?​id=projektesose24:​int_regal:​projektdoku#​technische_daten_und_bauteile|Limit Switches]]) Um sicherzustellen,​ dass der Schlitten nicht über die Schiene hinausfährt,​ haben wir an der Grundplatte Endschalter ([[https://​www.mintgruen.tu-berlin.de/​robotikWiki/​doku.php?​id=projektesose24:​int_regal:​projektdoku#​technische_daten_und_bauteile|Limit Switches]])
  ​angebracht.  ​angebracht.
-Doch wie fährt der Schlitten ​überhaupt ​auf der Schiene ​an die Stelle ​des gesuchten Buches? ​+Doch wie fährt der Schlitten auf der Schiene ​zur Position ​des gesuchten Buches? ​
 Dafür ist der Schlitten an zwei Stellen mit einem GT2-Zahnriemenband verbunden. ​ Dafür ist der Schlitten an zwei Stellen mit einem GT2-Zahnriemenband verbunden. ​
 Das GT2-Zahnriemenband ist an dem einen Ende der Schiene mithilfe einer GT2-Zahnriemenscheibe mit einem Motor verknüpft, der über Rotation des Zahnriemenbands den Schlitten nach links und rechts bewegen kann. Die Position des gesuchten Buches wird der Motorfunktion übermittelt. Die Funktion berechnet dann, wie weit und in welche Richtung der Motor rotieren muss, um den Schlitten präzise zur richtigen Position zu bringen, ausgehend von der aktuellen Position des Schlittens. Das GT2-Zahnriemenband ist an dem einen Ende der Schiene mithilfe einer GT2-Zahnriemenscheibe mit einem Motor verknüpft, der über Rotation des Zahnriemenbands den Schlitten nach links und rechts bewegen kann. Die Position des gesuchten Buches wird der Motorfunktion übermittelt. Die Funktion berechnet dann, wie weit und in welche Richtung der Motor rotieren muss, um den Schlitten präzise zur richtigen Position zu bringen, ausgehend von der aktuellen Position des Schlittens.
Zeile 195: Zeile 195:
 </​figure>​ </​figure>​
  
- +\\
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
 ====Bedienungsanleitung für die Roboter-Bewertung==== ====Bedienungsanleitung für die Roboter-Bewertung====
 1. Schließe den Raspberry Pi über ein USB-C Kabel an Strom an. \\ 1. Schließe den Raspberry Pi über ein USB-C Kabel an Strom an. \\
 \\ \\
-2. Verbinde den Pi über ein LAN Kabel mit einem Computer \\+2. Verbinde den Pi über einen Netzweradapter ​mit einem Computer ​(der Netzwerkadapter muss im gleichen Subnetz wie der Raspberry Pi konfiguriert sein, der Raspberry Pi hat eine statische IP-Adresse: 192.168.0.42) ​\\
 \\ \\
 3. Öffne am Computer die Eingabeaufforderung (CMD) \\ 3. Öffne am Computer die Eingabeaufforderung (CMD) \\
Zeile 218: Zeile 207:
 ssh pi@192.168.0.42 ssh pi@192.168.0.42
 </​code> ​ </​code> ​
-   ​(Dieser Schritt kann ein paar Minuten dauern. Der Pi braucht sehr lange, bis er über das LAN kabel erreichbar ist. Den Befehl einfach so oft ausführen, bis kein Timeout error mehr auftaucht.) \\+   ​(Dieser Schritt kann ein paar Minuten dauern. Den Befehl einfach so oft ausführen, bis kein Timeout error mehr auftaucht.) \\
 \\ \\
-5. Das ssh Passwort ​lautet:  +5. Gib das ssh Passwort ​ein \\ 
-<​code>​ +6. Zum Starten ​des Roboters führe die folgenden Befehle aus:
-!EcBR! +
-</​code> ​\\ +
-6. Zum starten ​des Roboters führe die folgenden Befehle aus:+
 <code bash> <code bash>
-sudo cd /​Code/​Buecherregal+cd /​Code/​Buecherregal 
 +source /​myenv/​bin/​activate (aktiviert virtuelle Umgebung)
 sudo myenv/​bin/​python3 app.py sudo myenv/​bin/​python3 app.py
 </​code>​ \\ </​code>​ \\
-7. Nun kann auf das User Interface zugegriffen werden: [[http://​127.0.0.1|http://​127.0.0.1]] \\(Achtung: Nur der Computer, der mit dem Pi verbunden ist, hat zugriff ​auf diese Seite) \\+7. Nun kann auf das User Interface zugegriffen werden: [[http://​127.0.0.1:5000|http://​127.0.0.1:5000]] \\ 
 +(Achtung: Nur der Computer, der mit dem Pi verbunden ist, hat Zugriff ​auf diese Seite) \\
 \\ \\
  
Zeile 235: Zeile 223:
 ====Ergebnis==== ====Ergebnis====
  
-Von unseren Zielen aus der Planung konnten wir viele erfolgreich umsetzen: Über eine Benutzeroberfläche ist es möglich, Bücher in einer Datenbank zu suchen, hinzuzufügen und zu löschen. Die Datenbank kennt den Standort jedes Buches. Bei einer erfolgreichen Suche leuchtet der LED-Strip an der Stelle des Buches auf, und das Buch wird herausgeschoben. Zudem kann man nicht nur nach dem Titel, sondern auch nach Autor, Genre oder ISBN suchen. Der LED-Strip kann außerdem als Raumbeleuchtung verwendet werden. +Von unseren Zielen aus der Planung konnten wir viele erfolgreich umsetzen: Über eine Benutzeroberfläche ist es möglich, Bücher in einer Datenbank zu suchen, hinzuzufügen und zu löschen. Die Datenbank kennt den Standort jedes Buches. Bei einer erfolgreichen Suche leuchtet der LED-Strip an der Stelle des Buches auf, und das Buch wird hervorgeschoben. Zudem kann man nicht nur nach dem Titel, sondern auch nach Autor, Genre oder ISBN suchen. Der LED-Strip kann außerdem ​(mit seperatem Code) als Raumbeleuchtung verwendet werden. 
-Ein Ziel, das wir nicht erreichen konnten, war die Verknüpfung der Datenbank mit einem Scanner, der die ISBN einscannt und die Daten des Buches automatisch in die Datenbank einfügt. +Ein Ziel, das wir noch nicht erreichen konnten, war die Verknüpfung der Datenbank mit einem Scanner, der die ISBN einscannt und die Daten des Buches automatisch in die Datenbank einfügt. 
-Die Größe der Bücher, die herausgeschoben ​werden können, wird jedoch wahrscheinlich immer eingeschränkt bleiben. Der Schiebemechanismus und der Schwamm haben eine bestimmte Breite, die nicht wesentlich reduziert werden kann, da dies die Auflagefläche für sehr breite Bücher verringern würde. Außerdem ist der Motor zu schwach, um besonders dicke Bücher ​herauszuschieben. Auch die Höhe spielt eine Rolle, da der Mechanismus idealerweise im mittleren oder unteren Bereich des Buches ansetzen sollte. Andernfalls kippt das Buch auf der rauen Oberfläche,​ anstatt ​herausgeschoben ​zu werden. Daher ist eine eher homogene Auswahl an Büchern erforderlich,​ damit das System optimal funktioniert. Die Bücher sollten eine Mindesthöhe von 120 mm haben und ungefähr 10,5 bis 50 mm breit sein.+Die Größe der Bücher, die hervorgeschoben ​werden können, wird jedoch wahrscheinlich immer eingeschränkt bleiben. Der Schiebemechanismus und der Schwamm haben eine bestimmte Breite, die nicht wesentlich reduziert werden kann, da dies die Auflagefläche für sehr breite Bücher verringern würde. Außerdem ist der Motor zu schwach, um besonders dicke Bücher ​zu schieben. Auch die Höhe spielt eine Rolle, da der Mechanismus idealerweise im mittleren oder unteren Bereich des Buches ansetzen sollte. Andernfalls kippt das Buch auf der rauen Oberfläche,​ anstatt ​geschoben ​zu werden. Daher ist eine eher homogene Auswahl an Büchern erforderlich,​ damit das System optimal funktioniert. Die Bücher sollten eine Mindesthöhe von 120 mm haben und ungefähr 10,5 bis 50 mm breit sein.
  
 +\\
 ====Ausblick==== ====Ausblick====
  
 In der Weiterentwicklung des intelligenten Bücherregals soll die Verknüpfung der Datenbank mit einem Scanner realisiert werden, um den Eintragungsprozess zu automatisieren und die Benutzerfreundlichkeit zu steigern. ​ In der Weiterentwicklung des intelligenten Bücherregals soll die Verknüpfung der Datenbank mit einem Scanner realisiert werden, um den Eintragungsprozess zu automatisieren und die Benutzerfreundlichkeit zu steigern. ​
-Darüber hinaus könnte ein Leihsystem integriert werden, das es ermöglicht,​ die Datenbanken mehrerer Bücherregale,​ beispielsweise von Freunden, miteinander zu verknüpfen. Wenn ein gesuchtes Buch im eigenen Regal nicht vorhanden ist, aber bei jemand anderem, könnte man eine Leihanfrage stellen. Dadurch behält man gleichzeitig den Überblick darüber, wem man seine eigenen Bücher ausgeliehen hat. +Darüber hinaus könnte ein Leihsystem integriert werden, das es ermöglicht,​ die Datenbanken mehrerer Bücherregale,​ beispielsweise von Freunden, miteinander zu verknüpfen. Wenn ein gesuchtes Buch im eigenen Regal nicht vorhanden ist, aber in einem anderen Regal, könnte man eine Leihanfrage stellen. Dadurch behält man gleichzeitig den Überblick darüber, wem man seine eigenen Bücher ausgeliehen hat.
  
 +\\
 ====Anhang==== ====Anhang====
  
 ===Code und Rohdaten=== ===Code und Rohdaten===
-[[https://​github.com/​AinexMaja/​Das-intelligente-Buecherregal/​tree/​main|Das Intelligente Bücherregal - Github]]+Die aktuellste Version des Codes: ​[[https://​github.com/​AinexMaja/​Das-intelligente-Buecherregal/​tree/​Abgabe-Labor|Das Intelligente Bücherregal - Github]] 
 + 
 +(Alternativ,​ die Version vom 30.09.2024 als .zip): 
 +{{projektesose24:​int_regal:​das-intelligente-buecherregal-abgabe-labor.zip|Das intelligente Bücherregal.zip}} 
  
  
Zeile 316: Zeile 309:
  
  
- 
- 
-====Fortschritt==== 
-01.07.24 - 05.07.24 
-  * Material gekauft und bestellt 
-  * coole Idee für Scheerengitterkonstruktion gebaut -> aus Lego 
-  * SD-Karte vom Raspberry Pi kaputt -> System neu aufsetzen 
  
  
projektesose24/int_regal/projektdoku.1727706030.txt.gz · Zuletzt geändert: 2024/09/30 16:20 von backhaus