Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Talking Portal 2 Turret Gun

Komponenten und Verbrauchsmaterialien

Arduino Nano R3
× 1

Notwendige Werkzeuge und Maschinen

3D-Drucker (generisch)

Über dieses Projekt

Die Geschichte

Dieses Weihnachten habe ich beschlossen, eine funktionierende Portal-Turmkanone aus dem Spiel Portal 2 zu entwerfen und zu bauen . Für mich war dies eine Übung, bei der zuerst die gesamte Baugruppe in Fusion 360 richtig modelliert wurde, bevor etwas gebaut wurde. Dieses Design verwendet einen Arduino Nano, einen MP3-Player-Chip, einen Distanzsensor, Servos, LEDs und 3D-gedruckte Teile.

Das Ziel hier war es, es in 3 "Achsen" zu bewegen, mit gesprochenem Ton aus dem Spiel und LEDs, um das Abfeuern zu simulieren.

  • Öffne die "Flügel", wenn es jemanden vor dir erkennt. Verwenden Sie einen Kurbelmechanismus mit Schiebern, nur weil.
  • Wenn die Person nach dem Öffnen noch da ist, feuern Sie, bis sie umfällt. LEDs und Maschinengewehr-Sound.
  • Wenn die Person nicht mehr da ist, führen Sie eine kleine Scan-Suchroutine durch.
  • Nah dich und geh schlafen, bis jemand anderes kommt.
  • Verwenden Sie Portalgeschütz-Sounds und -Stimmen aus dem Spiel.

Ich habe mir beim Design einige Freiheiten genommen und versucht, es merklich dem im Spiel zu gleichen, aber funktional und druckbar zu machen. Nachdem ich einige grundlegende Skizzen online gefunden hatte, begann ich mit dem Modellieren und Planen...

Die Sounds werden auf einer microSD-Karte gespeichert, die von der Rückseite zugänglich ist, so dass Sounds später aktualisiert oder geändert werden können. Es ist inline mit dem schwarzen Füllstreifen, so dass es nach der Installation im Wesentlichen unsichtbar ist. 18 individuelle Ausdrücke und Klänge, die in dieser Runde verwendet werden.

Der Lidar-Sensor (Time-of-Flight) befindet sich auf einem Chip mit rechteckigem Profil. Dieser Sensor ist nach dem Zusammenbau von vorne fast unsichtbar.

Schritt 1:Fusion 360-Modellierung

Das Design begann mit Skizzen, die online gefunden wurden. Mit diesen Bildern als Leinwände begann ich, die Umrisse der 3 Ansichten zu skizzieren. Dann ging es darum, sie in 3D zu extrudieren, dann die allgemeine Form zu schälen und Schnitte vorzunehmen. Die gesamte Elektronik wurde in Fusion als Komponenten gebaut, die dort eingefügt und platziert wurden, wo ich es für sinnvoll hielt. Fahrparameter waren:

  • Arduino Nano musste nach vollständiger Montage über einen für die Aktualisierung zugänglichen Anschluss verfügen
  • MicroSD-Karte musste auf die gleiche Weise zugänglich und nach der Installation idealerweise unsichtbar sein
  • Der Flugzeitsensor sollte ebenfalls unsichtbar sein
  • Ein 2,1 mm langer elektrischer Anschluss für die Stromversorgung auf der Rückseite
  • Druckteile so groß wie möglich sein (nicht viele kleine Teile)
  • Drucken ohne Unterstützung

Nachdem Komponenten (Nano, andere Chips, Servos) zur Grundform hinzugefügt wurden, wurden diese nach Bedarf verschoben und positioniert und die Tragstrukturen gebaut, um sie innerhalb der Schale zu tragen.

Der Flügelöffnungsmechanismus war ein Kurbel- und Schiebemechanismus. Wieso den? Weil ich einen Kurbelmechanismus verwenden wollte, deshalb! Dies fügte einige Komplikationen hinzu, hatte aber auch einen Vorteil; Sobald die Geometrie bestimmt war, war die Wiederholbarkeit im Betrieb gewährleistet und die Mindest- und Höchstgrenzen waren so gut wie garantiert.

Sobald das gesamte Modell gebaut war und ich zuversichtlich war, dass es funktionieren würde und gebaut (gedruckt) und zusammengebaut werden konnte, druckte ich die Teile aus und baute einen Prototyp. Als das geklappt hatte, ging ich zurück zum Modell und nahm einige Optimierungen vor, um das Aussehen und die Zusammenbaubarkeit zu verbessern (ist das ein Wort?). Dieses Modell ist das Ergebnis dieser Änderungen.

Das war ziemlich anstrengend, da es wirklich nicht viele kastenförmige Formen in diesem Ding gibt und es ziemlich eng schließt, ohne wirklichen Zugang zum Optimieren, wenn es einmal zusammengesetzt ist. Ich habe bei diesem Projekt einiges gelernt, beispielsweise die Verwendung eingebetteter Komponenten in anderen Komponenten. Dies machte das Manipulieren und Verknüpfen von Unterbaugruppen für einen schnellen Zugriff möglich. Am Ende hat sich die Mühe gelohnt!

Schritt 2:3D-gedruckte Teile

Portal Revolver v4.zip wurde aktualisiert und sollte alle gedruckten Teile enthalten, die zum Bau des neuesten Revolvers benötigt werden.

--- neues "Hinteres Testbein". Nicht originalgetreu, aber auf der Rückseite, und ermöglicht die Verwendung eines geraden Mini-USB-Anschlusses direkt nach oben. ---

Diese wurden auf einem Prusa Mk2 gedruckt, wobei PLA für alle Teile verwendet wurde. Die Druckausrichtung sollte ziemlich offensichtlich sein. Der Körper wurde in vertikaler Position ohne Stützen gedruckt. Es gibt die große Lücke an den Seiten, die überbrückt werden muss, aber mit ziemlich Standardeinstellungen hatte ich wirklich keine großen Probleme, außer der Beule. Die Unebenheit auf Vorder- und Rückseite kann mit gutem Filament und einigen guten Druckeinstellungen praktisch beseitigt werden. Ich fand, dass 0,2 mm im Slicer gut funktionierten und ein anständiges Ergebnis lieferten. Alle größeren und Öffnungen begannen im Körper in der Nähe des Füllstreifens zu erscheinen.

Das Design der Kanäle und Vorsprünge wurde mit 45-Grad-Fasen ausgeführt, sodass "im Raum hängende" Elemente minimal sind.

Ich musste wenig aufräumen, um die Baugruppe zusammenzusetzen. Die Einfüllstreifen, die in die Kanäle gleiten, sind jetzt ziemlich einfach, mit reduzierter Breite und gleichbleibender Dicke. Ich denke, dass man anstelle dieser bedruckten Stücke (auf der Kante bedruckt) ein dünnes, schwarzes Material verwenden könnte, das in Streifen geschnitten ist.

Der einzige Bereich, der Finesse erfordert, sind die Schieberstifte im Pitch-Rahmen. Gerade Stifte (Nägel) in den Bohrlöchern, die mit einem 1/8"-Bohrer und etwas Schmiermittel gejagt werden, reichen viel aus.

Linse%2Bv3b.stl Body-RHS%2Bv4.stl Body-LHS%2Bw%2Bcomponents%2Bv4.stl Wing%2BRH%2Bbottom%2Bv4.stl Wing%2BRH%2Btop%2Bv4.stl Wing%2BLH%2Bbottom%2Bv4.stl Wing%2BLH%2Btop%2Bv4.stl Pitch%2BFrame%2Bv4.stl Leg%2B-%2BREAR%2Bv4.stl Infill%2Bstrips%2Bv3.stl Leg%2B-%2BREAR%2Btest.stl Pitch%2BFrame%2B-%2Bmodified%2B1.stl Flügel%2Bv6.zip Arduino%2BBase%2Bw%2BRadio.stl Portal%2BTurret%2Bv4.zip

Schritt 3:Komponenten

V4 (Roter Turm) hat eine kleinere Überbrückung und erfordert V4-Flügel und Pitch-Rahmen.

Die v6 Flügel sind ein Option das erlaubt anders Farb"Waffen". Persönlich habe ich so einen noch nicht gemacht, aber es sollte gut funktionieren.

Als das Modell fertig war und ich mit meinem Prototyp zufrieden war, druckte ich Rev 2 mit den Plastikkomponenten wie abgebildet. Alles hier ist PLA, mit Schwarz und Designfarbe (in diesem Fall Blau) und ein bisschen durchscheinendem PLA für die zentrale "Linse" oder das Laserauge.

Dieses Foto fängt die Komponenten mit Ausnahme der Verkabelung ziemlich gut ein.

Schritt 4:Elektronik

Der Build verwendet die folgenden Komponenten:

  • Arduino Nano (1)
  • DFPlayer Mini-MP3-Player (oder MP3-TF-16P) (1)
  • VL53L0X Flugzeit-Entfernungssensor (1)
  • Generische SG90-Mikroservos (3)
  • 5 mm rote LEDs (5)
  • 220 Ohm Widerstände für LEDs (5)
  • 1kOhm Widerstand (1)
  • 4cm Lautsprecher, 4Ohm, 3 Watt (1)
  • 2,1 mm Stromanschluss (1)
  • 3" lange Rahmennägel (4)
  • M2 x 6 Schrauben (8)
  • M2,5 x 8 Schrauben (2)
  • M3 x 8 Schrauben (4)
  • M3 x 12 Schrauben (4)
  • M3 x 16 Schrauben (2)
  • Schrumpffolie
  • kleine Krawattenwickel

Alle Komponenten sind leicht von Arduino, Amazon oder Banggood und anderen Quellen erhältlich.

Die Schrauben wurden aus einem Sortimentssatz bezogen. Es ist eine Qual, sie sonst zu bekommen...

Schritt 5:Mechanische Montage

Der Großteil der mechanischen Montage ist vernünftig. Die gedruckten Teile sind mit den größeren Löchern bedruckt, wo nötig, so dass eine schnelle Verfolgung mit einer Schraube vor der Endmontage hilfreich ist und die Montage der verschraubten Komponenten ziemlich einfach macht.

Der Arduino und der MP3-Chip rasten ohne Hardware in die Halterung ein. Der VL53LOX rutscht ohne Befestigungselemente in die Frontschale. Zuerst anprobieren, dann entfernen und installieren, sobald die Verkabelung abgeschlossen ist.

Die Schieberbaugruppe verwendet 4 Rahmennägel als Schieberschienen. Sie haben einen Durchmesser von etwa 1/8" mit abgeschnittenen Köpfen. Diese wurden aus einem Streifen von DeWalt Framing-Nägeln entnommen, die mit ihrem elektrischen Framing-Nagler verwendet werden. Natürlich sind glatte Nägel ein Muss.

Die Servos werden wie abgebildet montiert. Orientierung ist wichtig. Die Pitch- und Pivot-Servos werden beim Einbau in ihre Teile "zentriert". Die Kurbel ist so montiert, dass sie sich in geöffneter Position von vorne gesehen durch Drehen gegen den Uhrzeigersinn schließt. Offene Position sind Stangen und Kurbel geradeaus, mit weiteren 10 Grad Drehung bis zum Einrasten.

Die Beinmontage ist der einfachste Teil. 2-2,5-mm-Schrauben, wobei die Beinkappen über die Ellbogen jedes Beins schnappen. Verwenden Sie Befestigungselemente, die nicht über die Oberseite der Beinplatte hinausragen. Auf diese Weise blockiert der schwenkbare Körper nicht, wenn Sie den Drehbereich optimieren.

Alle Servoverbindungen zu gedruckten Teilen werden mit der kurzen weißen Kurbel hergestellt, die mit den Servos geliefert wird. Diese Kurbeln drücken einfach in die gedruckten Teile. Ich habe versucht, die Keilnut in den Teilen zu drucken, die mit jedem Servo verbunden waren, hatte aber einen begrenzten, wiederholbaren Erfolg. Viel einfacher mit den Kurbeln, die mit den Servos geliefert werden.

Die Kurbelbaugruppe verwendet die längeren 2,5-mm-Schrauben. Die Kurbelstangen dürfen nicht zwischen die Kurbelhälften gequetscht werden. Tatsächlich könnten Sie versuchen, kürzere Schrauben ohne das Crank2-Teil zu verwenden. Das sollte auch funktionieren (hoffentlich kein nennenswertes Drehmoment hier, wenn die Flügel frei gleiten).

Der Lautsprecher wird von einer Servohalterung (2 Stück) erfasst, die den Lautsprecher erfasst. Lautsprecher zwischen diese "Beine" und in Position gehalten, indem sie am Pitch-Servo befestigt werden. Dieses Servo wurde dann mit der Pitch- (Schieber-) Baugruppe verbunden, gefolgt von der Kurbelbaugruppe mit Stangen. All dies wird vor dem Einbau in den LHS-Körper mit 4 kleinen Schrauben zusammengebaut.

Sobald die wichtigsten Eingeweide installiert sind und der Arduino und der MP3-Player vorübergehend platziert sind, beginnt der Spaß - die Verkabelung!

Schritt 6:Verkabelung

V5 - Funkoption (rote Turmfotos). Dazu gehört ein nRF24L01 Funkchip. Ändert die Arduino-Pin-Verdrahtung vollständig, um alle Verbindungen aufzunehmen. Details folgen...

Die endgültige Verpackung ist eng, daher lohnt es sich, einige Zeit hier zu verbringen, um die Drahtlängen herauszufinden. Die meisten Verbindungsdrähte, die ich am Ende hatte, waren zwischen 3" - 4".

Die LEDs werden direkt mit den 220-Ohm-Widerständen verdrahtet, gefolgt von etwas Schrumpffolie und etwas Kabelverdrillung, dann nach dem Testen beiseite gelegt. Ich habe hier Lichtleiterkabel verwendet, da ich einige herumliegen hatte (Kommunikationskabel vom Typ CAT5) und nicht wollte, dass die sichtbare Verkabelung aufdringlich ist.

Die mechanischen Bits werden nachempfunden in die Schale eingepasst, dann wird die Kabelführung festgelegt, dann ist das Schneiden und Vorbereiten der Drähte als nächstes erforderlich.

Ich habe die Servoanschlüsse so gebaut, dass ich Servos anschließen und ersetzen kann, wenn ich jemals etwas durcheinander gebracht und die Zahnräder abgezogen habe. Das war definitiv hilfreich, nachdem ich bei meinem ersten Prototyp etwas durcheinander gebracht hatte.

Nachdem Sie mit dem Großteil der Verkabelung zufrieden waren, wurden die LEDs am Ende verlötet. Dann ist es Zeit, die verdrahtete Baugruppe vorsichtig in eine Hälfte der Schale zu stecken. Der letzte Schritt besteht darin, den Stromanschluss an die Stromkabel zu löten, sobald alles drin ist.

-- Wichtiger Hinweis:Stellen Sie sicher, dass die hinter dem Nano gestopfte Verkabelung nicht auf den Reset-Knopf drückt!! Dies führt offensichtlich zu Problemen und verhindert den ordnungsgemäßen Betrieb des Geräts. --

Zu diesem Zeitpunkt ist die gesamte Verkabelung abgeschlossen, aber vor der Endmontage ist es wichtig, den Code auf den Nano hochzuladen und ihn einzuschalten, um sicherzustellen, dass die LEDs, Servos und der MP3-Player wie vorgesehen funktionieren. Danach ist es an der Zeit, den Rest der mechanischen Bits zusammenzusetzen.

Schritt 7:Arduino-Code

Aktualisierter Code! Habe es aufgeräumt und einige Optimierungen vorgenommen.

Die angehängte Datei ist das, was ich mir ausgedacht habe, um das Gerät wie in den Videos gezeigt zu fahren. Ich werde weiter daran arbeiten, den Charakter des Turms und sein Verhalten zu ändern. Viele Optionen hier.

Ich habe den Code mit Unterprogrammen strukturiert, die ich nach Bedarf aufrufe. Es hält den Hauptkörper sauber und war ziemlich hilfreich, wenn ich mit verschiedenen Eigenschaften herumspielte. Es hat mir geholfen, den Code für verschiedene Verhaltensweisen zu manipulieren.

Ich habe auch viele Variablen im Voraus verwendet, die mir zum Beispiel geholfen haben, Parkpositionen und Min- und Max-Bereiche zu optimieren und anzupassen.

Ich habe die DFMiniMP3-Bibliothek in meinem Code verwendet. Ich habe andere Bibliotheken ausprobiert, wie die von DFRobot, hatte aber Probleme und bin zu dieser zurückgekehrt. Es bedeutete, dass ich die Teile der "statischen Leere" behalten musste, um sie funktionsfähig zu halten. Diese sind für den Betrieb nicht notwendig, aber hey, ich bin kein Mastercoder. Ich würde gerne von einer anderen Bibliothek hören, die ähnlich einfach und übersichtlich ist wie die VL53LOX-Bibliothek. Lass es mich wissen, wenn du einen besseren Weg dafür findest!

Bei den Sounds erfolgt die Implementierung auf einfache Weise, indem auf der SD-Karte ein Ordner namens "mp3" mit den Dateinamen 0001.mp3, 0002.mp3 usw. vorhanden ist. Die ersten vier Ziffern müssen in diesem Format vorliegen, Sie können jedoch jedes Suffix danach hinzufügen, um die einzelnen Sounds zu identifizieren. Ein Beispiel finden Sie unter https://www.dfrobot.com/blog-277.html. Ich habe ein Bild meiner Dateinamen eingefügt, wie sie im Ordner verwendet werden. Die Zahlen entsprechen den Call-Outs im Code.

Die Sounddateien, die ich von der Wikipedia-Seite zu Portal Turret-Sounds gezogen habe. Der Code erstellt eine zufällige Sounddatei (1 von 2 oder 3 Sounds), um zu verhindern, dass die Dinge alt werden.

Schritt 8:Endgültige Karosseriemontage

Dieser Teil ist wegen der schwarzen Füllstreifen etwas knifflig. Der Maßstab der Endmontage ist so klein, dass die Leisten und Aufnahmenuten winzig sind. Dies erforderte es, den Kanal mit einem Zeiger oder einem anderen kleinen Kratzwerkzeug zu verfolgen, um sicherzustellen, dass die Streifen mit geringem Widerstand passen, bevor Sie versuchten, die andere Seite anzubringen.

Wenn Sie die Drähte ordentlich zusammenbinden und die Kabel nach Bedarf umwickeln, wird dies viel einfacher.

Ich habe jetzt ein paar davon zusammengefügt und finde es einfacher, zuerst die beiden Hälften zusammenzusetzen und dann die Füllstreifen einzulegen. Eine Seite in die Hälfte mit der "Ablage", die verhindert, dass der Füllstreifen hineinfällt, einführen, dann leicht aufhebeln und vorsichtig eindrücken. Jetzt nicht so schlimm.

Dies war einer der kniffligeren Teile. Vielleicht werde ich eines Tages diese Baugruppe überdenken, aber ich mag das Aussehen, wenn es fertig ist, und es ist ziemlich robust.

Schritt 9:Flügelbaugruppen

Jetzt, da der Körper zusammen ist und die Flügel-LEDs herausragen, ist es Zeit, die Flügel vorzubereiten und zusammenzubauen.

Es ist unbedingt erforderlich, dass die Schieberlöcher mit einem 1/8"-Bohrer gefräst und dann gereinigt werden. Schneiden Sie die Köpfe mit einem Bolzenschneider, Schraubstock, einer Bügelsäge oder einem bevorzugten Nagelschneidewerkzeug von den Nägeln ab. Die Schieberstifte (abgeschnittene Nägel ) werden in die Flügel eingebaut, indem sie in jedes Flügelstück eingepresst werden. Gerade, entgratete und geglättete Nägel sind der Schlüssel dazu. Die Flügelgleiter und Löcher sollten geschmiert und getestet werden, bevor die Kurbelstangen angeschlossen und in Betrieb genommen werden Graphit oder ein anderes PLA-geeignetes Gleitmittel wird empfohlen. Ich finde, dass eine kleine Tube Gleitmittel für den persönlichen Gebrauch sehr gut funktioniert und billig ist. Es ist wirklich glatt. Es erfordert auch etwas "Splainin", wenn Ihr Partner oder Elternteil hereinkommt und fragt, was genau? das brauchst du für die Werkbank!!

Beginnen Sie damit, herauszufinden, welcher Flügelteil wohin gehört, und versuchen Sie, diesen Teil zuerst zu schieben. Setzen Sie dann die obere und untere Hälfte zusammen, sobald die Stifte installiert sind, tragen Sie etwas Schmiermittel auf (ein Wattestäbchen funktioniert dafür gut) und stellen Sie sicher, dass die Flügel gut gleiten. Dies kann schwierig sein, aber ohne sicherzustellen, dass die Flügel mühelos gleiten, ohne zu binden, werden Sie eine frustrierende Zeit erleben. Vertrau mir...

Sobald die Flügel fertig sind, müssen Sie sie nur noch einschieben, die Pleuelstange über das Loch im Flügel legen und mit einer einzigen Schraube montieren. Dann werden die LEDs in die Kanonenlöcher gesteckt, Drähte gegen den Flügel gesteckt und schon kann es losgehen! Sie können auch etwas Heißkleber verwenden, um sie zu fixieren, sobald alles getestet wurde.

Schritt 10:Erschrecken und schockieren Sie Ihre Freunde !!

Der letzte kleine Vorbehalt bei diesem Design ist, dass ein abgewinkelter Stecker eine gute Idee ist, da er beim Schwenken das hintere Bein nicht beeinträchtigt. Das überarbeitete Hinterbein (v3) wurde gestreckt, um etwas mehr Platz zu bieten.

Einmal gebaut und angeschlossen (5V oder geeignet für Nano), wird es ruhig sitzen, bis jemand innerhalb der programmierten Entfernung erkannt wird, dann zum Leben erwachen und jeden töten, der seine Domäne betritt!!

Lass es mich wissen, wenn du eines (oder mehrere) baust und wenn du neue Funktionen oder Konzepte hast!

Code

  • Portalturm mit Funkgerät (ROT)
Portalturm mit Funk (ROT)C/C++
Code für Turm verwendet. Dazu gehört Code, der die Steuerung durch die Master Turret Control ermöglicht, die auf einer anderen Seite vorgestellt wird.
Verschiedene Geschmacksrichtungen erfordern Optimierungen.
///* Portalturm - Option mit Funk!! * Chris Nowak - Februar 2019 * https://www.instructables.com/member/ChrisN219/ * https://create.arduino.cc/projecthub/Novachris/talking-portal-2-turret-gun-637bf3 * * This Der Code enthält alle Funktionen, die für die Durchführung der Cara Mia Opera erforderlich sind, * Chat-Zeit und manueller Modus, wie er von der Maseter Turret Control (MTC) gesteuert wird. * Der MTC ist ein separater Controller, der in einem anderen Build enthalten ist. Der Turm * wird mit diesem Code ohne MTC autonom arbeiten. * * Der Code ist so aufgebaut, dass er mit drei Geschütztürmen funktioniert, aber jeder funktioniert unabhängig. * Viele Debugging-Codes bleiben drin. Verwenden oder bereinigen Sie nach Wunsch. Es ist größtenteils debuggt, * aber nicht perfekt. Angesichts des Preises, den Sie bezahlt haben, finde ich das in Ordnung!;) * =================ROT ====================*/#include  #include #include "Arduino.h"#include #include #include #include #include # include class Mp3Notify{public:static void OnError(uint8_t errorCode) {// siehe DfMp3_Error für Codebedeutung Serial.println(); Serial.print ("Com-Fehler"); Serial.println (Fehlercode); aufrechtzuerhalten. Static void OnPlayFinished (uint8_t globalTrack) {Serial.println(); Serial.print ("Wiedergabe für # beendet"); Serial.println (globalTrack); aufrechtzuerhalten. Static void OnCardOnline (uint8_t code) {Serial.println(); Serial.print ("Karte online"); Serial.println (Code); aufrechtzuerhalten. Static void OnCardInserted (uint8_t code) {Serial.println(); Serial.print ("Karte eingelegt"); Serial.println (Code); aufrechtzuerhalten. Static void OnCardRemoved (uint8_t code) {Serial.println(); Serial.print ("Karte entfernt"); Serial.println (Code); }}; Servo servo_pivot;Servo servo_wings;Servo servo_pitch;VL53L0X Sensor;// Setup für SoundcardSoftwareSerial SecondarySerial(4, 2); // RX, TXDFMiniMp3 mp3 (secondarySerial); // Setup für radioRF24-Radio (10, 9); // nRF24L01 (CE, CSN)RF24Netzwerknetzwerk (Funk); // Das Radio in das Netzwerk aufnehmen const uint64_t this_node =01; // Dieser Turm - Rot - im Oktalformat ( 04.031 usw.)const uint64_t WHT =02; // Turm 02 - Whiteconst uint64_t BLU =03; // Turm 03 - Blueconst uint64_t MTC =00; // Master Turret Controlunsigned long previousMillis1 =0;unsigned long previousMillis2 =0;unsigned long previousMillis3 =0;byte LED_LH_up =A1;byte LED_LH_down =A2;byte LED_CENTRE =A3;byte LED_RH_up =7;byte LED_RH_down =8;byte PIVOT =6; // Whitebyte WINGS =3; // Yellowbyte PITCH =5; // Bluebyte-ParkPIVOT =96; //Kleinere Zahl dreht sich im CW von oben aus gesehen Byte posPIVOT =96;Byte maxPIVOT =116;Byte minPIVOT =76;Byte WINGclose =165;Byte WINGopen =10;Byte WINGpos =160;Byte parkPITCH =86;Byte posPITCH =86; byte maxPITCH =96;byte minPITCH =75;byte pos =90;byte pulse =20;byte pitchCW =1;byte pivotCW =1;byte randomWake;byte randomOpen;byte randomFalse;byte randomStart;byte randomDisengage;int triggerDistance =300; Byte buttonStatus;Byte busyRed =1;Byte restModeWhite;Byte goState;int x;int y;Byte pb1State; // Firebyte pb2State; // sag zufälliges Kommentarbyte pb3State;byte randomPic; // Nutzlast von Master Turret Control (MTC) // int Nutzlast [] ={0, 1, 2 , 3 , 4 , 5 }; // int Nutzlast [] ={x , y, pb1State, pb2State, pb3State, goState};int payload [6];/* Dies ist die "Konversations"-Map für "Chat Time". * 0-99 =Red Turret Sprüche * 100-199 =White Turret Sprüche * 200-299 =Blue Turret Sprüche * Dateien auf allen SD-Karten werden als 0-100 gespeichert. * Addieren Sie hier 100 zur Dateinummer für Weiß, 200 für Blau. * Datei 204 wäre BLAUER Turm, Dateinummer 0004. */ int chatSayings [] ={ 0, // Starte Pause bei i =0, gefolgt von "Runden"... 204, 164, 25, // 1 205, 127, 76, // 2 208, 162, 65, // 3 143, 230, 23, // 4 130, 41, 225, // 5 153, 31, 133, // 6 234, 49, 155, / / 7 229, 175, 74, // 8 231, 58, 226, // 9 161, 223, 59, // 10 227, 68, 236, // 11 136, 50, 224, // 12 34, 160 , 78, // 13 222, 42 // End};/* Dies ist die ROTE und WEISSE Turm-Timing-Map. Sie teilen Sprüche. * Diese Timings entsprechen der Zeit, die * benötigt wird, um die einzelnen Sprüche in Millisekunden abzuspielen. * Ändern Sie die obigen Sprüche nach Belieben, aber ändern Sie diese Zeiten nicht. * Zum Beispiel dauert i =2 0,8 Sekunden (NormalTimings[2]) * um die chatSayings[2]-Datei abzuspielen. */int NormalTimings [] ={1000, // Starte Pause bei i =0, gefolgt von "Runden"...2600, 800, 2800, 900, 1700, 1600, 1300, 2500, 1400, 1900, // 1 - 101600, 2300, 800, 3000, 300, 100, 200, 0, 0, 300, // 11 - 20298000, 1300, 2600, 1300, 1400, 2100, 1900, 1600, 800, 1700, // 21 - 301100 , 1000, 1000, 2100, 1500, 1300, 1100, 800, 1200, 1000, // 31 - 402200, 1700, 1300, 1400, 1500, 1000, 2000, 500, 2700, 9000, // 41 - 501100, 1200 , 900, 2400, 1200, 1100, 2100, 2000, 2500, 1700, // 51 - 601100, 1000, 1100, 500, 1900, 0, 1300, 2100, 1700, 900, // 61 - 701100, 800, 1100 , 1700, 1100, 1100, 1500, 1500, 500, 900, // 71 - 802100 // 81};/* Dies ist die BLAUE Turm-Timing-Map. * Diese Timings entsprechen der Zeit, die * benötigt wird, um die einzelnen Sprüche in Sekunden abzuspielen. * Zum Beispiel dauert i =2 0,9 Sekunden (DefectiveTimings[2]) * um die Datei chatSayings [2] abzuspielen. */int DefectiveTimings [] ={1000, // Start Pause bei i =0, gefolgt von "Runden"...1700, 900, 2000, 600, 1100, 1800, 1900, 3000, 1500, 800, // 1 - 102100, 800, 1900, 900, 3200, 2700, 0, 0, 0, 2000, // 11 - 204400, 800, 3200, 900, 1400, 2000, 2100, 1200, 1300, 1000, // 21 - 301100 , 1400, 2100, 1000, 1600, 1000, 1200 // 31 - 40};////////////////////////////// /////////////////////////////////// //=======================EINRICHTEN ===============================///// //////////////////////////////////////////////// //////////////void setup () {secondarySerial.begin (9600); // Serial.begin (9600); // mp3.begin (); mp3.setVolume (22); Wire.begin(); SPI.begin(); // Funkeinrichtung radio.begin (); radio.setPALevel(RF24_PA_LOW); // Radio auf niedrige Leistung stellen. Alle nahe beieinander radio.setDataRate(RF24_2MBPS); // Ich finde, das funktioniert am besten mit mehreren Funkgeräten network.begin(70, this_node); //(Kanal, Knotenadresse) sensor_read(); pinMode (LED_LH_up, OUTPUT); pinMode (LED_LH_down, AUSGANG); pinMode (LED_ZENTRUM, AUSGANG); pinMode (LED_RH_up, OUTPUT); pinMode (LED_RH_down, AUSGANG); digitalWrite (LED_ZENTRUM, HOCH); enable_servos(); servo_wings.write (WINGopen); // Flügel öffnen servo_pivot.write (parkPIVOT); // Pivot parken servo_pitch.write (parkPITCH); // Parkabstand randomWake =random(1, 3); mp3.playMp3FolderTrack(1); // Aufwachkommentar abspielen Verzögerung (2000); servo_wings.write (WINGclose); // Flügel schließen Verzögerung (1500); digitalWrite (LED_CENTRE, LOW); turn_off_servos(); beschäftigtRot =0;}/////////////////////////////////////////// ////////////////////////=======================MAIN LOOP =============================///////////////////// /////////////////////////////////////////////void loop ( ) { Während (sensor.readRangeSingleMillimeters()>triggerDistance) {//nichts vor dem Sensor, nichts tun ReadNet(); WriteNet(); output_sensor(); if (payload[5] ==1) { // Mit MTC verwendete Bedingungen. Turm funktioniert automatisch ohne MTC-Verzögerung (500); WriteNet(); Cara_Mia(); // Opernzeit!! aufrechtzuerhalten. Sonst if (Nutzlast[5] ==2) { Verzögerung (500); WriteNet(); Chatty_time(); // Gesprächige Zeit!!} ReadNet(); aufrechtzuerhalten. Sonst if (Nutzlast[5] ==3) { Verzögerung (500); WriteNet(); Manuelle Kontrolle (); // Manuelle Steuerung}} if (sensor.readRangeSingleMillimeters () triggerDistance){// geöffnet und die Person ist falseActivate(); //Sag "Wo bist du hingegangen?" Kommentar- und Nahaufnahmeverzögerung (2000); scanArea(); // Scan des Bereichs durchführen } else { // Es ist definitiv jemand da - Feuer eröffnen!! einsetzen(); Verzögerung (2400); for (int j=0; j <=2; j++){ if (sensor.readRangeSingleMillimeters()=maxPIVOT) PivotCW =0; if (posPIVOT <=minPIVOT) PivotCW =1; if (posPITCH>=maxPITCH) PitchCW =0; if (posPITCH <=minPITCH) PitchCW =1;}//////////////////////////////////// //////////////////////////////=======================AKTIVIEREN ==============================/////////////// //////////////////////////////////////////////// ////void Activate () { // Flügel öffnen und etwas sagen busyRed =1; ReadNet(); WriteNet(); output_sensor(); digitalWrite (LED_ZENTRUM, HOCH); // LED-Auge auf randomOpen =random (3, 6); // zufälligen Eröffnungskommentar auswählen mp3.playMp3FolderTrack (randomOpen); // zufällig spielen "Ich sehe dich" Kommentar servo_wings.write (WINGopen); // Flügel öffnen output_sensor (); Verzögerung (3400);}////////////////////////////////////////// /////////////////////////====================FALSCH AKTIVIEREN ============================///////////////////////// ///////////////////////////////////////////void falseActivate(){ / / beschäftigtRot =1; ReadNet(); WriteNet(); output_sensor(); randomFalse =random (6, 9); // zufälligen Eröffnungskommentar auswählen mp3.playMp3FolderTrack (randomFalse); // spiele zufällig "wo bist du hingegangen?" comment delay (1800);}/////////////////////////////////////////////////////////////////////=======================SCAN AREA =============================/////////////////////////////////////////////////////////////////////void scanArea(){ // continue scanning for a bit after falseActivate busyRed =1; ReadNet(); WriteNet(); output_sensor(); mp3.playMp3FolderTrack(2); // "searching..." servo_pitch.write(parkPITCH); delay(1600); servo_pitch.detach(); servo_wings.detach(); mp3.playMp3FolderTrack(21); for (int i=0; i <=220; i++){ //scan for a little bit... output_sensor(); if (pivotCW ==0) posPIVOT =posPIVOT - 1; // increment one step CW if CW =0 if (pivotCW ==1) posPIVOT =posPIVOT + 1; // otherwise go one step other direction if (posPIVOT>=maxPIVOT) pivotCW =0; // if max rotation clockwise, switch to counterclockwise if (posPIVOT <=minPIVOT) pivotCW =1; // if min rotation counterclockwise,switch to clockwise servo_pivot.write(posPIVOT); if (sensor.readRangeSingleMillimeters()=(850 + (i * 100))) { // 1050 randomWingPos =random(10 + (i*20), (60 + (i*20))); servo_wings.write(randomWingPos); previousMillis1 =millis(); } } } disengage(); busyRed =0; goState =0; mp3.stop(); ReadNet(); delay(1000);}/////////////////////////////////////////////////////////////////// //=======================CHATTY TIME ===========================/////////////////////////////////////////////////////////////////////void Chatty_time(){ busyRed =1; WriteNet(); int i =0; int talk; int saying; int timeadder =750; int talkTime =NormalTimings[i]; int randomPivotPos; activate_servos(); servo_wings.write(WINGopen); digitalWrite(LED_CENTRE, HIGH); do { ReadNet(); WriteNet(); //output_sensor(); // used for debugging... if (i>=43) { // end of sequence busyRed =0; WriteNet(); disengage(); Rückkehr; } unsigned long currentMillis =millis(); // grab current time if ((unsigned long)(currentMillis - previousMillis3)>=talkTime) { if (chatSayings[i] <100) { // RED Turret talking talk =chatSayings[i]; saying =chatSayings[i]; talkTime =(NormalTimings[saying] + timeadder); } else if ((chatSayings[i]> 99) &&(chatSayings[i] <200)) { // WHITE turret talking talk =0; saying =chatSayings[i] - 100; talkTime =(NormalTimings[saying] + timeadder); } else { // BLUE turret talking talk =0; saying =chatSayings[i] - 200; // sound file # of BLUE talkTime =(DefectiveTimings[saying] + timeadder); // Time for that saying } if (talk ==0) { digitalWrite(LED_CENTRE, LOW); } else { digitalWrite(LED_CENTRE, HIGH); mp3.playMp3FolderTrack(talk); } randomPivotPos =random(minPIVOT, maxPIVOT); servo_pivot.write(randomPivotPos); Serial.println(); Serial.print(F("i:")); Serial.print (i); Serial.print ("\t"); Serial.print(F("chatSayings[i] ")); Serial.print (chatSayings[i]); Serial.print ("\t"); Serial.print(F("Saying ")); Serial.print (saying); Serial.print ("\t"); Serial.print(F("talk ")); Serial.print (talk); Serial.print ("\t"); Serial.print(F("chat time ")); Serial.print (talkTime); Serial.print ("\t"); Serial.print(F("busyRed:"));Serial.print (busyRed); Serial.print (" "); previousMillis3 =millis(); i++; } } while (payload[4] ==1); busyRed =0; WriteNet(); digitalWrite(LED_CENTRE, LOW); disengage();}/////////////////////////////////////////////////////////////////// //=======================MANUAL CONTROL =======================/////////////////////////////////////////////////////////////////////void ManualControl(){ int servoWings; int servoPitch; int servoPivot; activate_servos(); servo_wings.write(WINGopen); digitalWrite(LED_CENTRE, HIGH); ReadNet(); do { output_sensor(); ReadNet(); servoPivot =map(payload[0], 1023, 0, minPIVOT, maxPIVOT); servoPitch =map(payload[1], 1023, 0, minPITCH, maxPITCH); servo_pivot.write(servoPivot); servo_pitch.write(servoPitch); unsigned long currentMillis =millis(); // grab current time if (payload[3] ==0) { if ((unsigned long)(currentMillis - previousMillis1)>=2500) { randomPic =random(1, 20); mp3.playMp3FolderTrack(randomPic); previousMillis1 =millis(); } } if (payload[2] ==0){ fire(); } } while (payload[5] ==3); disengage(); busyRed =0; WriteNet(); digitalWrite(LED_CENTRE, LOW); }/////////////////////////////////////////////////////////////////////=========================RECEIVING ===========================/////////////////////////////////////////////////////////////////////void ReadNet(){ network.update(); if ( network.available() ) { RF24NetworkHeader header; network.peek(header); network.read(header, &payload, sizeof(payload));} // Read the package }/////////////////////////////////////////////////////////////////////=========================SENDING =============================/////////////////////////////////////////////////////////////////////void WriteNet(){ network.update(); RF24NetworkHeader header4(MTC); bool ok4 =network.write(header4, &busyRed, sizeof(busyRed));/* if (ok4) { // used for debugging... Serial.print("MTC ok4 ");} else { Serial.print("------- ");} */}

Kundenspezifische Teile und Gehäuse

Lens%2Bv3b.stl Body-RHS%2Bv4.stl Body-LHS%2Bw%2Bcomponents%2Bv4.stl Wing%2BRH%2Bbottom%2Bv4.stl Wing%2BRH%2Btop%2Bv4.stl Wing%2BLH%2Bbottom%2Bv4.stl Wing%2BLH%2Btop%2Bv4.stl Pitch%2BFrame%2Bv4.stl Leg%2B-%2BREAR%2Bv4.stl Infill%2Bstrips%2Bv3.stl Leg%2B-%2BREAR%2Btest.stl Pitch%2BFrame%2B-%2Bmodified%2B1.stl Arduino%2BBase%2Bw%2BRadio.stl

Schaltpläne

Schematic that I made for building the turret.

Herstellungsprozess

  1. Bernstein
  2. Guillotine
  3. Grabstein
  4. Badeanzug
  5. Silizium
  6. Wodka
  7. Karussell
  8. Sofa
  9. Eisen
  10. Endbearbeitungsrevolver reduziert Zykluszeit