Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
projektewise24:projekt6:doku [2025/03/31 03:03] uszer [Hardware:] |
projektewise24:projekt6:doku [2025/03/31 03:22] (aktuell) uszer [Reference] |
||
---|---|---|---|
Zeile 140: | Zeile 140: | ||
Das Magazin besteht aus einer 17mm hohen und 70mm dicken Platte, in die beliebig viele Kammern eingefügt werden können. Jede Kammer hat einen Durchmesser von 13mm, und eine Wanddicke in alle Richtungen von 2mm. Dadurch ergibt sich folgende Formel für die Länge des Magazins:\\ | Das Magazin besteht aus einer 17mm hohen und 70mm dicken Platte, in die beliebig viele Kammern eingefügt werden können. Jede Kammer hat einen Durchmesser von 13mm, und eine Wanddicke in alle Richtungen von 2mm. Dadurch ergibt sich folgende Formel für die Länge des Magazins:\\ | ||
{{:projektewise24:projekt6:equation_maglength.png?200 |Formel zum berechnen der Länge des Magazins in mm}} | {{:projektewise24:projekt6:equation_maglength.png?200 |Formel zum berechnen der Länge des Magazins in mm}} | ||
- | //Hier bei gibt "n" die Anzahl der Kammern an, also die Kapazität des Magazins. Bei unserem fertig modelliertem Magazin handelt es sich um ein Magazin mit einer Kapazität von 11 Darts, also einer Länge von 167mm// | + | //Hier bei gibt "n" die Anzahl der Kammern an, also die Kapazität des Magazins. Bei unserem fertig modelliertem Magazin handelt es sich um ein Magazin mit einer Kapazität von 11 Darts, also einer Länge von 167mm//\\ |
+ | <sup>Abb.11: Screenshot, Formel zum Berechnen der Länge des Magazins in Abhängigkeit von der Kapazität</sup> | ||
Mittig über jeder Kammer befindet sich eine Erhöhung, die den MicroSwitch oberhalb des Triggers auslöst und so sicher geht, dass das Magazin zentral ausgerichtet ist.\\ | Mittig über jeder Kammer befindet sich eine Erhöhung, die den MicroSwitch oberhalb des Triggers auslöst und so sicher geht, dass das Magazin zentral ausgerichtet ist.\\ | ||
- | {{:projektewise24:projekt6:mag_gear_simensions.png?300 |Skizze und Berechnungen zur Größe der Zahnräder/Gear Racks. Und ja, ich habe mich vertippt.}} | + | {{:projektewise24:projekt6:mag_gear_simensions.png?300 |Skizze und Berechnungen zur Größe der Zahnräder/Gear Racks.}} |
Das Magazin verfügt über zwei mittige Einschnitte an der Unterseite, die auf gleiche negative Schienen auf einer Magazin-Grundplatte angepasst sind. In dieser Grundplatte befinden sich zwei Zahnräder, die über eine eingebettete Achse mit dem Magazin-Servo-Motor verbunden sind, und über Zahnstangen (Gear Racks) an der Unterseite des Magazins dieses entlang des Triggers bewegen. Diese Zahnräder sind mit dem Abstand der Achse und der Gear Racks auf den Millimeter angepassst.\\ | Das Magazin verfügt über zwei mittige Einschnitte an der Unterseite, die auf gleiche negative Schienen auf einer Magazin-Grundplatte angepasst sind. In dieser Grundplatte befinden sich zwei Zahnräder, die über eine eingebettete Achse mit dem Magazin-Servo-Motor verbunden sind, und über Zahnstangen (Gear Racks) an der Unterseite des Magazins dieses entlang des Triggers bewegen. Diese Zahnräder sind mit dem Abstand der Achse und der Gear Racks auf den Millimeter angepassst.\\ | ||
Das Entwickeln von Zahnrädern passend zu bereits gegebenen Umständen (wie z.B. Abstand der Achsen, also Durchmesser des Zahnrades) ist komplizierter als am Anfang angenommen, weshalb auch hier viel Zeit verloren ging. Am Beispiel des Magazinantriebs wird dieser Vorgang nun dargelegt. | Das Entwickeln von Zahnrädern passend zu bereits gegebenen Umständen (wie z.B. Abstand der Achsen, also Durchmesser des Zahnrades) ist komplizierter als am Anfang angenommen, weshalb auch hier viel Zeit verloren ging. Am Beispiel des Magazinantriebs wird dieser Vorgang nun dargelegt. | ||
+ | |||
+ | <sup>Abb.12: Skizze, Zahnrad Schematik für Magazin</sup> | ||
----- | ----- | ||
- | Ein paar wichtige Größen müssen vorher definiert werden. Damit zwei Zahnräder miteinander "meshen" können, das Bedeutet, Problemlos ineinander greifen, müssen der Pitch Diameter, der Pressure Angle und das Module gleich sein, und sie müssen im Richtigen Abstand voneinander angebracht sein. | + | Ein paar wichtige Größen müssen vorher definiert werden. Damit zwei Zahnräder miteinander "meshen" können, das Bedeutet, Problemlos ineinander greifen, müssen der Pitch Diameter, der Pressure Angle und das Module gleich sein, und sie müssen im Richtigen Abstand voneinander angebracht sein. |
[[https://static.wixstatic.com/media/2f92ea_b0c8f903a106445095ff83c87057b39e~mv2.jpg/v1/fill/w_568,h_532,al_c,q_80,usm_0.66_1.00_0.01,enc_avif,quality_auto/2f92ea_b0c8f903a106445095ff83c87057b39e~mv2.jpg|{{ :projektewise24:projekt6:gear_dimensions_exmpl.png?400|Link to image}}]] | [[https://static.wixstatic.com/media/2f92ea_b0c8f903a106445095ff83c87057b39e~mv2.jpg/v1/fill/w_568,h_532,al_c,q_80,usm_0.66_1.00_0.01,enc_avif,quality_auto/2f92ea_b0c8f903a106445095ff83c87057b39e~mv2.jpg|{{ :projektewise24:projekt6:gear_dimensions_exmpl.png?400|Link to image}}]] | ||
- | Der **"Pitch Diameter"** ('PD'; Pitch Diamteter') ist der Durchmesser des Zahnrades, berechnet von der Mitte der Zähne, der sogenannte "Pitch Circle". In diesem Fall liegt die Achse 13mm von dem Pitch Circle des Gear Racks entfernt. Dadurch lässt sich ein Pitch Diamete r von 26mm berechnen. | + | Der **"Pitch Diameter"** ('PD'; Pitch Diamteter') ist der Durchmesser des Zahnrades, berechnet von der Mitte der Zähne, der sogenannte "Pitch Circle". In diesem Fall liegt die Achse 13mm von dem Pitch Circle des Gear Racks entfernt. Dadurch lässt sich ein Pitch Diameter von 26mm berechnen. |
>>PD = 26mm | >>PD = 26mm | ||
Der **"Pressure Angle"** (α; 'Alpha') bestimmt den Winkel der Zähne zueinander, ein geringer Pressure Angle sorgt für eine geringere Kraftübertragung im Austausch für mehr Präzision. Da es um nicht besonders viel Gewicht geht, wurde sich für einen Mittelwert von 20° Entschieden. | Der **"Pressure Angle"** (α; 'Alpha') bestimmt den Winkel der Zähne zueinander, ein geringer Pressure Angle sorgt für eine geringere Kraftübertragung im Austausch für mehr Präzision. Da es um nicht besonders viel Gewicht geht, wurde sich für einen Mittelwert von 20° Entschieden. | ||
Zeile 159: | Zeile 162: | ||
>>m = 2 | >>m = 2 | ||
- | Da wir mit zwei verschiedenen Arten von Zahnrädern arbeiten, hier mit einem sogenannten "Spur Gear" und einem "Spur Rack" brauchen wir mehrere verschiedene Formeln. Die Länge des Gearracks ist bereits bekannt: Die Länge des Magazins, also 167mm.\\ | + | Da wir mit zwei verschiedenen Arten von Zahnrädern arbeiten, hier mit einem sogenannten "Spur Gear" und einem "Spur Rack" brauchen wir mehrere verschiedene Formeln. Die Länge des Gearracks ist bereits bekannt: <sup>Abb.13: Webbild, Visualisierung der Zahnrad-Größen</sup>\\ |
+ | Die Länge des Magazins, also 167mm. | ||
Die **Anzahl an Zähnen im GearRack** Z<sub>rack</sub> lässt sich nun aus der Formel //l=m*pi*Z<sub>rack</sub>// berechnen (m=Module, l=Länge des Magazins), nach Umstellen der Formel erhalten wir Z<sub>rack</sub>~26. | Die **Anzahl an Zähnen im GearRack** Z<sub>rack</sub> lässt sich nun aus der Formel //l=m*pi*Z<sub>rack</sub>// berechnen (m=Module, l=Länge des Magazins), nach Umstellen der Formel erhalten wir Z<sub>rack</sub>~26. | ||
>>Z<sub>rack</sub> = 26 | >>Z<sub>rack</sub> = 26 | ||
Zeile 173: | Zeile 178: | ||
====Pin Belegung==== | ====Pin Belegung==== | ||
^ Pin ^ Name ^ Zweck ^ | ^ Pin ^ Name ^ Zweck ^ | ||
- | | d2 | redLED | aktiviert und deaktiviert die rote LED (LED 1 -> kein Face detected) | | + | | d2 | redLED | aktiviert und deaktiviert die rote LED (LED 1 -> kein Face detected) | |
| d3 | yellowLED | aktiviert und deaktiviert die gelbe LED (LED 2 -> face detected) | | | d3 | yellowLED | aktiviert und deaktiviert die gelbe LED (LED 2 -> face detected) | | ||
| d4 | greenLED | aktiviert und deaktiviert die grüne LED (LED 3 -> face locked) | | | d4 | greenLED | aktiviert und deaktiviert die grüne LED (LED 3 -> face locked) | | ||
Zeile 182: | Zeile 187: | ||
| d10 | flywheelServo | startet oder stoppt die Flywheels über einen nMOS | | | d10 | flywheelServo | startet oder stoppt die Flywheels über einen nMOS | | ||
| d12 | contactPin | verbunden mit dem MicroSwitch um Magazinausrichtung zu überprüfen | | | d12 | contactPin | verbunden mit dem MicroSwitch um Magazinausrichtung zu überprüfen | | ||
+ | <sup>Tab.1: Tabelle zur Belegung der Digital Pins am Arduino UNO </sup> | ||
----- | ----- | ||
====Code und Software==== | ====Code und Software==== | ||
Zeile 191: | Zeile 196: | ||
===LFK_face_tracking=== | ===LFK_face_tracking=== | ||
- | Die einzige nennenswerte Änderung des Codes, abgesehen von größtenteils gescheiterten Stabilisierungen, ist eine veränderung der Roam-Logic, also wie der Roboter sich bewegt, wenn es gearde kein face zu tracken gibt. | + | Die einzige nennenswerte Änderung des Codes, abgesehen von größtenteils gescheiterten Stabilisierungen, ist eine veränderung der Roaming-Logic, also wie der Roboter sich bewegt, wenn es gerade kein face zu tracken gibt. |
- | Im originalen Code nutzt der Roboter random numbers, um sich auf beiden Achsen zufällig im definierten Bereich zu bewegen. Diese Logik wurde durch eine simplere Version ersetzt. Da der Roboter insgesamt deutlich schwerer ist als das Beispiel auf welches das Programm eigentlich zugeschnitten ist, waren Modifikationen von Nöten, so wurde der zufällige Neigungswinkel komplett entfernt und durch konstante 90° ersetzt, das bedeutet beim Roamen bleibt die Kamera bei einer neutralen, mittleren Neigung. | + | Im originalen Code nutzt der Roboter random numbers, um sich auf beiden Achsen zufällig im definierten Bereich zu bewegen. Diese Logik wurde durch eine simplere Version ersetzt. Da der Roboter insgesamt deutlich schwerer ist als das Beispiel auf welches das Programm eigentlich zugeschnitten ist, waren Modifikationen von Nöten, so wurde der zufällige Neigungswinkel komplett entfernt und durch konstante 90° ersetzt, das bedeutet beim Roaming <sub>Vid.3: Video, Prototyp beim 'Roaming'</sub>\\ bleibt die Kamera bei einer neutralen, mittleren Neigung. |
{{ :projektewise24:projekt6:roaming_test.mp4|Roaming Test}} | {{ :projektewise24:projekt6:roaming_test.mp4|Roaming Test}} | ||
Zeile 202: | Zeile 207: | ||
Der Arduino beginnt seine Funktion mit einer kurzen LED-Sequenz, und bewegt alle Servos in ihre Ausgangsposition.\\ | Der Arduino beginnt seine Funktion mit einer kurzen LED-Sequenz, und bewegt alle Servos in ihre Ausgangsposition.\\ | ||
Die loop, die danach ausgeführt wird, ist relativ simple:\\ | Die loop, die danach ausgeführt wird, ist relativ simple:\\ | ||
- | {{ :projektewise24:projekt6:rduibo_aktivierungsskizze.png?1080 |Loop function des Arduino}} | + | {{ :projektewise24:projekt6:rduibo_aktivierungsskizze.png?1080 |Loop function des Arduino}}\\ |
+ | <sup>Abb.14: Skizze, Aktivierungsdiagramm der Arduino loop()-funktion</sup> | ||
Dieser Code Abschnitt ist einer der Herausfordernsten, nicht weil die Funktion an sich etwas komplexes tut, sondern weil sie auf einem schon existierenden Framework gebaut werden musste. Da das Programm auf Schleifendurchläufen basiert, musste eine etwas komplexere Lösung gefunden werden, weshalb mit states und der millis()-funktion gearbeitet werden muss. | Dieser Code Abschnitt ist einer der Herausfordernsten, nicht weil die Funktion an sich etwas komplexes tut, sondern weil sie auf einem schon existierenden Framework gebaut werden musste. Da das Programm auf Schleifendurchläufen basiert, musste eine etwas komplexere Lösung gefunden werden, weshalb mit states und der millis()-funktion gearbeitet werden muss. | ||
Zeile 254: | Zeile 260: | ||
Korrupte Datensätze liegen vermutlich an überlasteten Anschlüssen und schlechter Verbindung meinerseits, da ich einen USB-Hub mit einem USBA-USBC-Adapter nutzen muss um sowohl Kamera als auch Arduino gleichzeitig anschließen zu können. | Korrupte Datensätze liegen vermutlich an überlasteten Anschlüssen und schlechter Verbindung meinerseits, da ich einen USB-Hub mit einem USBA-USBC-Adapter nutzen muss um sowohl Kamera als auch Arduino gleichzeitig anschließen zu können. | ||
{{ :projektewise24:projekt6:application_crash_bufferoverflow.mp4 |Dieses Video zeigt representativ, was bei einem Buffer-Overflow passiert. (Ardiuino start message not received, stuck in waiting loop)}} | {{ :projektewise24:projekt6:application_crash_bufferoverflow.mp4 |Dieses Video zeigt representativ, was bei einem Buffer-Overflow passiert. (Ardiuino start message not received, stuck in waiting loop)}} | ||
+ | <sup>Vid.4: Screenrecording, Crash-Ursache: Buffer Overflow aufgrund einer infinite Loop</sup> | ||
----- | ----- | ||
Ein weiteres Beispiel für das crashen des Programmes aufgrund von korrupter Kommunikation lässt sich in der gleichen Funktion, nur ein paar Zeilen weiter finden: | Ein weiteres Beispiel für das crashen des Programmes aufgrund von korrupter Kommunikation lässt sich in der gleichen Funktion, nur ein paar Zeilen weiter finden: | ||
Zeile 275: | Zeile 282: | ||
Wie das aussieht, sieht man in diesem Video: | Wie das aussieht, sieht man in diesem Video: | ||
{{ :projektewise24:projekt6:application_crash_corruptendmarker.mp4 | Achtet besonders auf die Konsole im Hintergrund.}} | {{ :projektewise24:projekt6:application_crash_corruptendmarker.mp4 | Achtet besonders auf die Konsole im Hintergrund.}} | ||
+ | <sup>Vid.5: Screenrecording, Crash-Ursache: Korrupte Endmarker</sup> | ||
//Side note: Diese Characters werden vom Arduino automatisch am Ende jeder Nachricht hinzugefügt: Ein "carriage return" \r der denCurser zurück zum Anfang der aktuellen line bewegt, und der "new line character" \n, der eine neue Linie beginnt. Diese sind Teil der Serialen Kommunikation, sollten allerdings durch den End Marker '>', der davor versandt wird, nicht gelesen werden.// | //Side note: Diese Characters werden vom Arduino automatisch am Ende jeder Nachricht hinzugefügt: Ein "carriage return" \r der denCurser zurück zum Anfang der aktuellen line bewegt, und der "new line character" \n, der eine neue Linie beginnt. Diese sind Teil der Serialen Kommunikation, sollten allerdings durch den End Marker '>', der davor versandt wird, nicht gelesen werden.// | ||
Zeile 288: | Zeile 296: | ||
----- | ----- | ||
- | ====Reference==== | + | |
- | <imgcaption image1|>Neigungsmechanismus</imgcaption> | + |