Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Talking Portal 2 Turret Gun

Componenten en benodigdheden

Arduino Nano R3
× 1

Benodigde gereedschappen en machines

3D-printer (algemeen)

Over dit project

Het verhaal

Deze kerst besloot ik een werkend Portal-geschut te ontwerpen en te bouwen uit de game Portal 2 . Voor mij was dit een oefening om eerst de hele assembly goed te modelleren in Fusion 360, voordat ik iets bouwde. Dit ontwerp maakt gebruik van een Arduino Nano, een MP3-spelerchip, afstandssensor, servo's, LED's en 3D-geprinte onderdelen.

Het doel hier was om het in 3 "assen" te laten bewegen, met gesproken geluid uit het spel en LED's om het schieten te simuleren.

  • Open de "vleugels" als hij iemand vooraan waarneemt. Gebruik een krukmechanisme met schuiven, gewoon omdat.
  • Als de persoon er na het openen nog steeds is, vuur dan tot hij erbij neervalt. LED's en machinegeweergeluid.
  • Als de persoon er niet meer is, voer dan een kleine scanzoekroutine uit.
  • Close-up en ga slapen totdat er iemand anders langskomt.
  • Gebruik Portal-torentjegeluiden en stemmen uit de game.

Ik nam wat vrijheden in het ontwerp, in een poging om het merkbaar hetzelfde te maken als in het spel, maar functioneel en afdrukbaar. Met wat basisschetsen die ik online vond, begon ik te modelleren en te plannen...

De geluiden worden opgeslagen op een microSD-kaart, die toegankelijk is vanaf de achterkant, zodat geluiden later kunnen worden bijgewerkt of gewijzigd. Het is in lijn met de zwarte opvulstrook, waardoor het in wezen onzichtbaar is als het eenmaal is geïnstalleerd. 18 individuele uitdrukkingen en geluiden die in deze go-round worden gebruikt.

De lidarsensor (time-of-flight) zit op een chip met een rechthoekig profiel. Eenmaal gemonteerd is deze sensor bijna onzichtbaar vanaf de voorkant.

Stap 1:Fusion 360-modellering

Het ontwerp is uitgegaan van schetsen die online zijn gevonden. Met behulp van deze afbeeldingen als doeken begon ik de contouren van de 3 aanzichten te schetsen. Daarna was het een kwestie van ze in 3D te extruderen, vervolgens de algemene vorm te beschieten en sneden te maken. Alle elektronica werd in Fusion gebouwd als componenten die werden ingevoegd en geplaatst waar ik dacht dat het logisch zou zijn. Rijparameters waren:

  • Arduino Nano moest een connector hebben die toegankelijk moest zijn om te kunnen updaten zodra deze volledig geassembleerd was
  • MicroSD-kaart moest op dezelfde manier toegankelijk zijn en idealiter onzichtbaar na installatie
  • Time-of-flight-sensor moet ook onzichtbaar zijn
  • Een elektrische connector van 2,1 mm voor voeding aan de achterkant
  • Bedrukte onderdelen moeten zo groot mogelijk zijn (niet veel kleine stukjes)
  • Afdrukken zonder ondersteuning

Nadat componenten (Nano, andere chips, servo's) aan de basisvorm waren toegevoegd, werden ze verplaatst en gepositioneerd zoals vereist, en werden de ondersteunende structuren gebouwd om ze in de schaal te ondersteunen.

Het vleugelopeningsmechanisme was een kruk- en schuifmechanisme. Waarom? Omdat ik een slingermechanisme wilde gebruiken, daarom! Dit zorgde voor wat complicaties, maar het had ook een voordeel; zodra de geometrie was bepaald, zou de operationele herhaalbaarheid worden gegarandeerd en waren de min en max limieten vrijwel gegarandeerd.

Toen het hele model eenmaal was gebouwd en ik er zeker van was dat het zou werken en gebouwd (geprint) en geassembleerd kon worden, ging ik verder en drukte ik de onderdelen af ​​en bouwde ik een prototype. Toen dat eenmaal gelukt was, ging ik terug naar het model en maakte enkele aanpassingen om het uiterlijk en de montage te verbeteren (is dat een woord?). Dit model is het resultaat van die veranderingen.

Dit was behoorlijk belastend, omdat er echt niet veel boxy-vormen in dit ding zijn, en het sluit behoorlijk strak, zonder echte toegang om te tweaken als het eenmaal in elkaar is gezet. Ik heb nogal wat geleerd over dit project, zoals het gebruik van embedded componenten in andere componenten. Dit maakte het manipuleren en gekoppeld houden van subassemblages voor snelle toegang. Uiteindelijk was het de moeite waard!

Stap 2:3D-geprinte onderdelen

Portal turret v4.zip is bijgewerkt en zou alle gedrukte onderdelen moeten bevatten die nodig zijn om de nieuwste turret te bouwen.

--- nieuwe "Rear test Leg". Niet trouw aan het origineel, maar het zit aan de achterkant en maakt het mogelijk om een ​​rechte mini-USB-connector recht omhoog te gebruiken. ---

Deze zijn geprint op een Prusa Mk2 met PLA voor alle onderdelen. De afdrukoriëntatie moet vrij duidelijk zijn. Het lichaam werd gedrukt in verticale positie, zonder steunen. Er is de grote opening aan de zijkanten die overbrugd moet worden, maar ik had echt geen grote problemen met vrij standaard instellingen, behalve de hobbel. De hobbel aan de voor- en achterkant kan vrijwel worden geëlimineerd met goed filament en een aantal goede printinstellingen. Ik ontdekte dat 0,2 mm goed werkte in de snijmachine en een behoorlijk resultaat opleverde. Alle grotere en openingen begonnen in het lichaam bij de opvulstrook te verschijnen.

Het ontwerp van kanalen en uitsteeksels is gedaan met afschuiningen van 45 graden, dus "hangende in de ruimte" elementen zullen minimaal zijn.

Ik hoefde weinig op te ruimen om het geheel in elkaar te zetten. De opvulstroken die in de kanalen schuiven, zijn nu vrij eenvoudig, met verminderde breedte en consistente dikte. Ik denk dat je een dun, zwart materiaal zou kunnen gebruiken dat in reepjes is gesneden in plaats van deze bedrukte stukken (op de rand gedrukt).

Het enige gebied dat wel finesse vereist, zijn de schuifpennen in het pitchframe. Rechte pinnen (spijkers) in de boorgaten die worden gefreesd met een boor van 1/8" en wat smeermiddel zullen een lange weg gaan.

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 Been%2B-%2BREAR%2Bv4.stl Infill%2Bstrips%2Bv3.stl Been%2B-%2BREAR%2Btest.stl Pitch%2BFrame%2B-%2Bmodified%2B1.stl wings%2Bv6.zip Arduino%2BBase%2Bw%2BRadio.stl Portaal%2BTurret%2Bv4.zip

Stap 3:Componenten

V4 (Rood torentje) heeft kleinere overbruggingen, waarvoor v4-vleugels en Pitch-frame nodig zijn.

De v6 vleugels zijn een optie dat staat toe anders kleur"geweren". Ik heb er zelf niet zo een gemaakt, maar het zou goed moeten werken.

Toen het model klaar was en ik tevreden was met mijn prototype, drukte ik rev 2 af met de plastic onderdelen zoals afgebeeld. Alles is hier PLA, met zwart en designkleur (blauw in dit geval), en een klein beetje doorschijnend PLA voor de centrale "Lens" of laseroog.

Deze foto legt de componenten vrij goed vast, met uitzondering van de bedrading.

Stap 4:Elektronica

De build gebruikt de volgende componenten:

  • Arduino Nano (1)
  • DFPlayer Mini MP3-speler (of MP3-TF-16P) (1)
  • VL53L0X tijd-van-vlucht bereiksensor (1)
  • Generieke SG90 microservo's (3)
  • 5 mm rode LED's (5)
  • 220 Ohm weerstanden voor LED's (5)
  • 1kOhm weerstand (1)
  • Luidspreker van 4 cm, 4 Ohm, 3 Watt (1)
  • 2.1 mm voedingsconnector (1)
  • 3" lange nagels (4)
  • M2 x 6 schroeven (8)
  • M2,5 x 8 schroeven (2)
  • M3 x 8 schroeven (4)
  • M3 x 12 schroeven (4)
  • M3 x 16 schroeven (2)
  • krimpfolie
  • kleine tie-wraps

Alle componenten zijn direct verkrijgbaar bij Arduino, Amazon of Banggood en andere bronnen.

De schroeven waren afkomstig uit een assortimentsset. Het is vervelend om ze anders te krijgen...

Stap 5:Mechanische montage

Het grootste deel van de mechanische montage is redelijk. De geprinte onderdelen zijn bedrukt met de grotere gaten waar nodig getapt, dus een snelle achtervolging met een schroef voor de definitieve montage zal nuttig zijn en de montage van de geschroefde componenten vrij eenvoudig maken.

De Arduino en de MP3-chip klikken zonder hardware in de houder. De VL53LOX zal zonder bevestigingsmiddelen in de voorschaal glijden. Eerst passen, dan verwijderen en installeren zodra de bedrading is aangesloten.

De schuifconstructie gebruikt 4 kaderspijkers als schuifrails. Ze hebben een diameter van ongeveer 1/8 ", met de koppen geknipt. Deze werden genomen van een strook DeWalt-framespijkers die werden gebruikt met hun elektrische framespijkermachine. Onnodig te zeggen dat gladde nagels een must zijn.

De servo's worden gemonteerd zoals afgebeeld. Oriëntatie is belangrijk. De toonhoogte en de spilservo's zijn "gecentreerd" wanneer ze in hun stukken worden geïnstalleerd. De kruk is zo geïnstalleerd dat hij, wanneer hij open is, zal sluiten door tegen de klok in te draaien, gezien vanaf de voorkant. Open positie is stangen en slinger recht in lijn, met nog eens 10 graden rotatie tot slot.

De pootmontage is het gemakkelijkste onderdeel. 2-2,5 mm schroeven, waarbij de pootdoppen over de ellebogen van elke poot klikken. Gebruik bevestigingsmiddelen die niet boven de bovenzijde van de pootplaat uitsteken. Op die manier zal het draaiende lichaam niet vastlopen als je het rotatiebereik aanpast.

Alle servoverbindingen naar geprinte onderdelen worden gemaakt met behulp van de korte witte slinger die bij de servo's wordt geleverd. Deze cranks drukken gewoon in de geprinte delen. Ik probeerde de spiebaanboring af te drukken in de onderdelen die op elke servo waren aangesloten, maar had beperkt, herhaalbaar succes. Veel gemakkelijker met de cranks die bij de servo's worden geleverd.

De crankconstructie maakt gebruik van de langere 2,5 mm schroeven. De krukstangen mogen niet tussen de krukhelften worden geperst. Je zou zelfs kunnen proberen kortere schroeven te gebruiken zonder het Crank2-onderdeel. Dat zou ook moeten werken (hopelijk geen merkbaar koppel hier als de vleugels vrij schuiven).

De speaker wordt opgevangen door een servo mount (2 stuks) die de speaker opvangt. Luidspreker tussen deze "benen", en op hun plaats gehouden door ze aan de pitch-servo te bevestigen. Deze servo werd vervolgens verbonden met de pitch (schuif) montage, gevolgd door de krukmontage met stangen. Dit alles wordt gemonteerd voordat het met 4 kleine schroeven in de LHS-behuizing wordt geïnstalleerd.

Zodra de belangrijkste lef is geïnstalleerd, met de Arduino en MP3-speler tijdelijk gelokaliseerd, begint het plezier - bedrading!

Stap 6:Bedrading

V5 - Radio-optie (Rode torentje foto's). Dit omvat een nRF24L01-radiochip. Verandert de Arduino-pinbedrading volledig om alle verbindingen mogelijk te maken. Details volgen...

De uiteindelijke verpakking is strak, dus het is de moeite waard om hier wat tijd door te brengen met het uitzoeken van draadlengtes. De meeste verbindingsdraden waarmee ik eindigde waren tussen de 3" - 4".

De LED's worden rechtstreeks bedraad met de 220 Ohm-weerstanden, gevolgd door wat krimpfolie en wat verdraaiing van de bedrading en vervolgens opzij gelegd nadat ze zijn getest. Ik gebruikte hier lichte bedrading omdat ik er een paar had liggen (CAT5-communicatiebedrading) en niet wilde dat de zichtbare bedrading opdringerig zou zijn.

De mechanische bits passen zo goed als in de schaal, vervolgens wordt de draadroutering berekend en vervolgens is het knippen en voorbereiden van de draden de volgende stap.

Ik heb de servoconnectoren zo gebouwd dat ik servo's kon aansluiten en vervangen als ik ooit iets verknoeide en de versnellingen zou strippen. Dit was zeker nuttig na het verknoeien tijdens mijn eerste prototype.

Eenmaal tevreden met het grootste deel van de bedrading, werden de LED's aan het einde gesoldeerd. Dan is het tijd om de bedrade assemblage voorzichtig in de ene helft van de schaal te proppen. De laatste stap is om de stroomconnector aan de stroomdraden te solderen zodra alles erin zit.

-- Belangrijke opmerking:Zorg ervoor dat de bedrading achter de Nano niet op de resetknop drukt!! Dit zal uiteraard problemen veroorzaken en verhinderen dat het toestel correct werkt. --

Op dit punt is alle bedrading klaar, maar vóór de definitieve montage is het belangrijk om de code naar de Nano te uploaden en aan te zetten om ervoor te zorgen dat de LED's, servo's en MP3-speler allemaal werken zoals ontworpen. Daarna is het tijd om de rest van de mechanische onderdelen in elkaar te zetten.

Stap 7:Arduino-code

Code bijgewerkt! Schoongemaakt en wat aanpassingen gedaan.

Het bijgevoegde bestand is wat ik bedacht om het apparaat te besturen zoals getoond in de video's. Ik zal blijven tweaken om het karakter van de Turret en de manier waarop hij zich gedraagt ​​te veranderen. Veel opties hier.

Ik heb de code gestructureerd met behulp van subroutines die ik indien nodig aanroep. Het houdt het hoofdgedeelte schoon en was erg handig toen ik met verschillende kenmerken aan het spelen was. Het hielp me de code te manipuleren voor ander gedrag.

Ik heb vooraf ook veel variabelen gebruikt, waardoor ik bijvoorbeeld parkeerposities en minimum- en maximumbereiken aanpaste en aanpaste.

Ik heb de DFMiniMP3-bibliotheek in mijn code gebruikt. Ik heb andere bibliotheken geprobeerd, zoals die van DFRobot, maar had problemen, dus ging ik terug naar deze. Het betekende dat ik de 'statische leegte'-stukken moest behouden om het functioneel te houden. Deze zijn niet nodig voor de operatie, maar hey, ik ben geen master coder. Ik zou graag horen van een andere bibliotheek die net zo eenvoudig en netjes is als de VL53LOX-bibliotheek. Laat het me weten als je een betere manier vindt om dit te doen!

Wat betreft geluiden, de implementatie gebeurt op een eenvoudige manier, door een map met de naam "mp3" op de SD-kaart te hebben, met de bestandsnamen 0001.mp3, 0002.mp3, enz. De eerste vier cijfers moeten in dit formaat zijn, maar je kunt daarna elk achtervoegsel toevoegen om de specifieke geluiden te helpen identificeren. Zie https://www.dfrobot.com/blog-277.html voor een voorbeeld. Ik heb een foto bijgevoegd van mijn bestandsnamen zoals gebruikt in de map. De nummers komen overeen met de toelichtingen in de code.

De geluidsbestanden die ik van de Wikipedia-pagina op Portal Turret heb gehaald, klinken. De code toont een willekeurig geluidsbestand (1 van 2 of 3 geluiden) om te voorkomen dat dingen oud worden.

Stap 8:Final Body Assembly

Dit onderdeel is wat lastig door de zwarte invulstrips. De schaal van de eindmontage is klein genoeg zodat de stroken en opneemgroeven klein zijn. Dit vereiste het najagen van het kanaal met een wijzer of een ander klein schraapwerktuig om ervoor te zorgen dat de strips met weinig weerstand zouden passen voordat werd geprobeerd de andere kant aan te brengen.

Door de draden netjes aan elkaar te knopen en waar nodig te binden, wordt dit veel gemakkelijker.

Ik heb er nu een paar bij elkaar gezet en vind het makkelijker om eerst de twee helften tegen elkaar te zetten en dan de opvulstroken erin te steken. Steek een kant in de helft met de "plank" die voorkomt dat de opvulstrook erin valt, wrik dan lichtjes open en druk voorzichtig naar binnen. Niet zo erg nu.

Dit was een van de lastigere onderdelen. Misschien zal ik op een dag deze assemblage heroverwegen, maar ik hou van de manier waarop het eruit ziet als het klaar is, en het is behoorlijk robuust.

Stap 9:Vleugelmontages

Nu het lichaam in elkaar zit, met de vleugel-LED's die uitsteken, is het tijd om de vleugels voor te bereiden en te monteren.

Het is absoluut noodzakelijk dat de gaten van de schuif worden gefreesd met een boor van 1/8" en vervolgens worden schoongemaakt. Knip de koppen van de spijkers met een boutenschaar, bankschroef, ijzerzaag of uw favoriete spijkersnijgereedschap. De schuifpennen (geknipte spijkers ) worden in de vleugels geïnstalleerd door ze met een perspassing in elk vleugelstuk te plaatsen. Rechte, ontbraamde en afgevlakte spijkers zijn de sleutel om dit te laten werken. De vleugelschuiven en gaten moeten worden gesmeerd en getest voordat de krukstangen worden aangesloten en gaan draaien. Droog grafiet of ander voor PLA geschikt glijmiddel wordt aanbevolen. Ik vind dat een klein buisje persoonlijk glijmiddel heel goed werkt en goedkoop is. Het is echt glad. Het vereist ook wat 'splainin' wanneer je partner of ouder binnenkomt en vraagt ​​wat precies dat heb je nodig voor op de werkbank!!

Begin door uit te zoeken welk vleugeldeel waar komt, en probeer eerst dat deel te schuiven. Pas vervolgens de bovenste en onderste helften aan elkaar zodra de pinnen zijn geïnstalleerd, breng wat smeermiddel aan (een wattenstaafje werkt hiervoor goed) en zorg ervoor dat de vleugels goed glijden. Dit kan lastig zijn, maar zonder ervoor te zorgen dat de vleugels moeiteloos schuiven, zonder te binden, wacht je een frustrerende tijd. Geloof me...

Als de vleugels eenmaal goed zijn om te gaan, is het gewoon een kwestie van ze op hun plaats te schuiven, de verbindingsstang over het gat in de vleugel te plaatsen en met een enkele schroef in elkaar te zetten. Vervolgens worden de LED's in de pistoolgaten gestoken, worden de draden tegen de vleugel geschoven en ben je klaar om te gaan! Je kunt ook wat hete lijm gebruiken om ze op hun plaats te vergrendelen zodra alles is getest.

Stap 10:Schrik en schok je vrienden!!

Het laatste kleine voorbehoud bij dit ontwerp is dat een gehoekte plug een geweldig idee is, omdat het de achterpoot niet hindert bij het draaien. De herziene achterpoot (v3) is uitgerekt om iets meer ruimte te geven.

Eenmaal gebouwd en aangesloten (5V of geschikt voor Nano), zal het stil blijven zitten totdat iemand binnen de geprogrammeerde afstand wordt gedetecteerd, dan tot leven komen en iedereen doden die zijn domein betreedt!!

Laat het me weten als je er een (of meer) bouwt en als je nieuwe functies of concepten bedenkt!

Code

  • Portaaltoren met Radio (ROOD)
Portaaltoren met Radio (ROOD)C/C++
Code gebruikt voor torentje. Dit omvat code die controle door de Master Turret Control mogelijk maakt, die op een andere pagina staat.
Verschillende smaken vereisen aanpassingen.
///* Portal Turret - Optie met radio!! * Chris Nowak - februari 2019 * https://www.instructables.com/member/ChrisN219/ * https://create.arduino.cc/projecthub/Novachris/talking-portal-2-turret-gun-637bf3 * * Dit code bevat alle functies die nodig zijn om de Cara Mia Opera uit te voeren, * Chattijd en handmatige modus, zoals bestuurd door de Maseter Turret Control (MTC). * De MTC is een aparte controller op een andere build. De turret * zal autonoom werken met deze code zonder de MTC. * * De code is gebouwd om met drie torentjes te werken, maar elk zal onafhankelijk werken. * Veel foutopsporingscode achtergelaten. Gebruik of ruim naar wens op. Het is meestal debugged, * maar is niet perfect. Gezien de prijs die je betaald hebt, vind ik dat oké!;) * =================ROOD ====================*/#include  #include #include "Arduino.h"#include #include #include #include #include # include class Mp3Notify{public:static void OnError(uint8_t errorCode) { // zie DfMp3_Error voor code die Serial.println(); Serial.print ("Com-fout "); Serial.println(foutcode); } statische leegte OnPlayFinished(uint8_t globalTrack) {Serial.println(); Serial.print("Speel klaar voor #"); Serial.println(globalTrack); } statische leegte OnCardOnline(uint8_t code) {Serial.println(); Serial.print("Kaart online"); Serieel.println(code); } statische leegte OnCardInserted(uint8_t code) {Serial.println(); Serial.print("Kaart geplaatst"); Serieel.println(code); } statische leegte OnCardRemoved(uint8_t code) {Serial.println(); Serial.print("Kaart verwijderd"); Serieel.println(code); }}; Servo servo_pivot;Servo servo_wings;Servo servo_pitch;VL53L0X sensor;// Setup voor geluidskaartSoftwareSerial secundaireSerial(4, 2); // RX, TXDFMiniMp3 mp3 (secondarySerial);// Setup voor radioRF24-radio (10, 9); // nRF24L01 (CE,CSN)RF24Netwerknetwerk (radio); // Neem de radio op in de netwerkconst uint64_t this_node =01; // Dit torentje - Rood - in Octaal formaat (04.031, etc) const uint64_t WHT =02; // Turret 02 - Whiteconst uint64_t BLU =03; // Turret 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; 6; //whitebyte VLEUGELS =3; // yellowbyte PITCH =5; //bluebyte parkPIVOT =96; // Kleiner getal roteert CW gezien vanaf de topbyte 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 puls =20;byte toonhoogteCW =1;byte pivotCW =1;byte willekeurigWake;byte willekeurigOpen;byte willekeurigFalse;byte willekeurigStart;byte willekeurigOntkoppelen;int triggerDistance =300; byte buttonStatus;byte busyRed =1;byte restModeWhite;byte goState;int x;int y;byte pb1State; // Firebyte pb2State; // say random commentbyte pb3State;byte randomPic;// Payload van Master Turret Control (MTC)// int payload [] ={0, 1, 2 , 3 , 4 , 5 };// int payload [] ={x , y, pb1State, pb2State, pb3State, goState};int payload [6];/* Dit is de "conversatie"-kaart voor "Chat Time". * 0-99 =spreuken met rode torentjes * 100-199 =spreuken met witte torentjes * 200-299 =spreuken van blauwe torentjes * Bestanden op alle SD-kaarten worden opgeslagen als 0-100. * Voeg hier 100 toe aan het dossiernummer voor Wit, 200 voor Blauw. * Bestand 204 zou BLAUWE torentje zijn, bestandsnummer 0004. */ int chatSayings [] ={ 0, // Start pauze op i =0, gevolgd door "rondes"... 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};/* Dit is de RODE en WITTE turret-timingkaart. Ze delen uitspraken. * Deze timing komt overeen met de tijd die nodig is * om de individuele uitspraken te spelen, in milliseconden. * Wijzig de bovenstaande uitspraken naar wens, maar verander deze tijden niet. * Bijvoorbeeld, i =2 duurt 0,8 seconden (NormalTimings[2]) * om het chatSayings[2]-bestand af te spelen. */int NormalTimings [] ={1000, // Start pauze op i =0, gevolgd door "rondes"...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};/* Dit is de BLAUWE turret-timingkaart. * Deze tijden komen overeen met de tijd die nodig is * om de individuele uitspraken in seconden te spelen. * Bijvoorbeeld, i =2 heeft 0,9 seconden nodig (DefectiveTimings[2]) * om het chatSayings [2]-bestand af te spelen. */int DefectiveTimings [] ={1000, // Start pauze op i =0, gevolgd door "rondes"...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};/////////////////////////////// //////////////////////////////////// //=======================INSTELLEN =================================///// ////////////////////////////////////////////////// //////////////void setup(){ secundairSerial.begin(9600);//Serial.begin(9600);// mp3.begin(); mp3.setVolume(22); Draad.begin(); SPI.begin(); // Radio instellen radio.begin(); radio.setPALevel(RF24_PA_LOW); // zet de radio op laag vermogen. Allemaal bij elkaar radio.setDataRate(RF24_2MBPS); // Ik vind dat dit het beste werkt met meerdere radio's network.begin(70, this_node); //(kanaal, knooppuntadres) sensor_read(); pinMode (LED_LH_up, OUTPUT); pinMode (LED_LH_down, OUTPUT); pinMode (LED_CENTRE, UITGANG); pinMode (LED_RH_up, OUTPUT); pinMode (LED_RH_down, OUTPUT); digitalWrite (LED_CENTRE, HOOG); active_servo's(); servo_wings.write(WINGopen); // open vleugels servo_pivot.write (parkPIVOT); // park pivot servo_pitch.write (parkPITCH); // parkeerveld randomWake =willekeurig (1, 3); mp3.playMp3FolderTrack(1); // speel wakker commentaar vertraging (2000); servo_wings.write(WINGclose); // sluit vleugels vertraging (1500); digitalWrite (LED_CENTRE, LAAG); turn_off_servo's(); bezetRood =0;}///////////////////////////////////////////// ////////////////////////=======================HOOFD LUS =============================////////////////////// ////////////////////////////////////////////////ongeldige lus( ){ while (sensor.readRangeSingleMillimeters()>triggerDistance) { // niets voor sensor, niets doen ReadNet(); SchrijfNet(); output_sensor(); if (payload [5] ==1) { // Voorwaarden gebruikt met MTC. Turret werkt automatisch zonder MTC-vertraging (500); SchrijfNet(); Cara_Mia(); // Operatijd!! } else if (payload [5] ==2) { delay(500); SchrijfNet(); Chatty_time(); // Chatty tijd!!} ReadNet(); } else if (payload [5] ==3) { delay(500); SchrijfNet(); Handmatige Controle (); // Handmatige bediening } } if (sensor.readRangeSingleMillimeters()triggerDistance){ // opende zich en persoon ging falseActivate(); // zeg "waar ben je heen?" commentaar en close-up vertraging (2000); scangebied(); // voer een scan uit van het gebied } else { // iemand is er zeker - open vuur!! bezighouden(); vertraging (2400); for (int j=0; j <=2; j++){ if (sensor.readRangeSingleMillimeters()=maxPIVOT) pivotCW =0; if (posPIVOT <=minPIVOT) pivotCW =1; als (posPITCH>=maxPITCH) toonhoogteCW =0; if (posPITCH <=minPITCH) toonhoogteCW =1;}////////////////////////////////////// ///////////////////////////////=======================ACTIVEREN ==============================/////////////// ////////////////////////////////////////////////// ////voidactivate(){ // open vleugels en zeg iets busyRed =1; LeesNet(); SchrijfNet(); output_sensor(); digitalWrite (LED_CENTRE, HOOG); //LED oog op randomOpen =willekeurig (3, 6);// kies willekeurige openingscommentaar mp3.playMp3FolderTrack (randomOpen); // speel willekeurig "Ik zie je" commentaar servo_wings.write (WINGopen); // open vleugels output_sensor(); vertraging (3400);}//////////////////////////////////////////// /////////////////////////====================VALS ACTIVEREN ============================///////////////////////// ////////////////////////////////////////////void falseActivate(){ / / bezetRood =1; LeesNet(); SchrijfNet(); output_sensor(); randomFalse =willekeurig (6, 9);// kies willekeurige openingscommentaar mp3.playMp3FolderTrack (randomFalse); // speel willekeurig "waar ging je heen?" 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(); opbrengst; } 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); Serieel.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("------- ");} */}

Aangepaste onderdelen en behuizingen

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

Schema's

Schematic that I made for building the turret.

Productieproces

  1. Amber
  2. Guillotine
  3. Grafsteen
  4. Zwempak
  5. Silicium
  6. Skateboard
  7. Wodka
  8. Carrousel
  9. Bank
  10. IJzer
  11. Eindwerkend torentje verkort de cyclustijd