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 17:07]
backhaus
projektesose24:int_regal:projektdoku [2024/09/30 19:02] (aktuell)
XeniaN [Bedienungsanleitung für die Roboter-Bewertung]
Zeile 53: Zeile 53:
 </​figure>​ </​figure>​
  
-Über die Route wird eine GET-Anfrage gesendetund 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 Idizes ​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 127: Zeile 127:
 {{ :​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.\\
Zeile 134: Zeile 134:
 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 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: +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 Abbremsen)\\ 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 dieser 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 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 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 benötigt etwas Zeit, 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>​ +
-!EcBR! +
-</​code> ​\\+
 6. Zum Starten des Roboters führe die folgenden Befehle aus: 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]] \\ +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) \\+(Achtung: Nur der Computer, der mit dem Pi verbunden ist, hat Zugriff ​auf diese Seite) \\
 \\ \\
  
Zeile 236: 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 hervorgeschoben. 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 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. 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====
  
Zeile 245: Zeile 233:
 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. 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===
-Die aktuellste Version des Codes: [[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): (Alternativ,​ die Version vom 30.09.2024 als .zip):
-{{:projektesose24:​int_regal:​das-intelligente-buecherregal-main.zip|Das intelligente Bücherregal ​main.zip}}+{{projektesose24:​int_regal:​das-intelligente-buecherregal-abgabe-labor.zip|Das intelligente Bücherregal.zip}}
  
  
Zeile 321: 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.1727708857.txt.gz · Zuletzt geändert: 2024/09/30 17:07 von backhaus