Pew Pew! Hoe een laser torentje te bouwen met een Arduino

Verveel je je? Kan net zo goed een lasertoren bouwen.

Verveel je je?  Kan net zo goed een lasertoren bouwen.
Advertentie

Verveel je je? Kan net zo goed een lasertoren bouwen. Weet je - een die bank pouwt, een rode straal schiet in verschillende richtingen, en misschien zelfs een rookmachine in gooit? Ja, een van hen.

Wat je nodig zult hebben

  • Arduino
  • 2 servo's
  • Lasermodule, zoals een van deze sensorset
  • Piëzo-zoemer of ander klein uitvoerapparaat
  • Metaaldraad en kabelbinders voor bevestiging
  • Lange vrouwelijke-> mannelijke sprongkabels, plus gewone springkabels

Optioneel is een rookmachine nodig - de laser heeft een vrij laag wattage, zodat u de straal niet kunt zien zonder rook, zelfs in een donkere kamer.

componenten

Bouw plan

Het basisidee van het torentje is om de lasermodule op één servo te plaatsen om horizontale rotatie te bieden; monteer die verpakking vervolgens op een andere servo die onder een hoek van 90 graden wordt geplaatst om verticale beweging te bieden. We hebben een piezo om de pew pew geluidseffecten te leveren, en ik gooi voor een goede dosis in een rookmachine.

Servo testen

Afhankelijk van je servo kunnen de draden anders gekleurd zijn, maar in het algemeen:

  • Rood is de positieve draad, en op beide servo's was het het midden van drie - te verbinden met + 5v rail.
  • Bruin of zwart is het negatief, om te worden verbonden met GND op de Arduino.
  • Wit of oranje is de signaalkabel die moet worden aangesloten op een PWM-compatibele digitale I / O-pin (9 en 10 in de onderstaande demo).

Nadat je je twee servo's hebt aangesloten, upload je de volgende voorbeeldcode. Ik heb een servo "hori" genoemd om de horizontale beweging te besturen, en de andere "vert". Elk zou een volledige bewegingsbereikbereik moeten uitvoeren (ongeveer 60 graden, in mijn geval).

#include Servo vert, hori; // create servo object to control a servo // a maximum of eight servo objects can be created int pos = 0; // variable to store the servo position void setup() { hori.attach(9); vert.attach(10); // attaches the servo on pin 9, 10 to the servo objects vert.write(0); hori.write(0); } void loop() { for(pos = 0; pos =1; pos-=10) // goes back from 180 degrees to 0 degrees { vert.write(pos); // tell servo to go to position in variable 'pos' hori.write(pos); delay(100); // waits 100ms for the servo to reach the position } } 

Alles goed? Verder gaan dan.

Testen van het laser- en het betingbankgeluid

De lasermodule is net een LED, maar heeft een weerstand die in de module is ingebouwd, zodat we deze direct kunnen aansluiten op een digitale I / O - heel eenvoudig. Als u dezelfde lasermodule als mij gebruikt, gaat de " - " naar GND, de S gaat naar pen 12. Wijzig de bovenstaande voorbeeldcode om van pen 12 een uitvoer te maken:

 int laser = 12; pinMode(laser, OUTPUT); 

Knipperen vervolgens de pin aan en uit elke lus met behulp van de standaard digitalWrite () methode.

We gebruiken PWM gewoon om de piëzo-zoemer op een comfortabel geluidsniveau te zetten - je zou kunnen experimenteren met het gebruik van de toonbank als je dat wilt, maar een simpele ruis is alles wat ik nodig heb. Verbind de zwarte draad met de aarde en de rode draad met pen 11. Bepaal uw zoemer op de relevante pin, stel in op uitgangsmodus en activeer met analoogWrite (zoemer, 100) (of een willekeurig nummer dat u maximaal 254 wilt); en analogWrite (buzzer, 0) om uit te schakelen.

De volledige voorbeeldcode die is gemodificeerd om twee servo te vegen, een laser te activeren en het vervelende geluid te spelen, is hier te vinden.

Al je componenten zouden moeten werken - nu moeten we alles samen binden.

De torentje maken

Gebruik kabelbinders om een ​​servo aan de andere vast te maken; het maakt niet echt uit wat, zorg er gewoon voor dat er een op de horizontale lijn beweegt en de andere de verticale lijn. U kunt het rotorblad verwijderen en tijdens het testen opnieuw inschuiven als de hoek niet goed is.

servo's

Gebruik een stijve modelleerdraad om de lasermodule op het blad van de andere servo te bevestigen, zoals:

wire-for-laser module

Ten slotte heb ik het geheel aan een tafelpoot bevestigd met nog meer kabelbinders en een beetje sloophout.

attach-turret tot bord

Programmeren van de toren

Ik weet het niet van je, maar mijn idee van een lasertorentje komt uit ontelbare aantallen sci-fi-films en sterrenstapepisodes. Steevast zal iemand voorbij een torentje vliegen en kleine schoten schieten in een vloeiend patroon, altijd milliseconden te langzaam, zodat onze hoofdpersoon niet daadwerkelijk geraakt wordt. Dat is wat ik probeer te repliceren, maar voel je vrij om de hoofdroutine af te stemmen op je idee van wat een torentje zou moeten doen.

Hier is de pseudo-code die ik uiteindelijk gebruikte voor de hoofdlus:

  • Randomiseer de tijd tussen bursts en de tijd tussen elke afzonderlijke opname.
  • Maak de begin- en eindpositie voor elke servo, vert en hori willekeurig.
  • Willekeurig het aantal te maken opnamen.
  • Bereken het aantal graden van verandering na elke opname als het verschil tussen start- en eindposities gedeeld door het aantal opnamen.
  • Verplaats de servo's naar de startposities en wacht een beetje totdat ze daar zijn (100ms)
  • Herhaal totdat alle opnamen zijn gemaakt, waarbij de servo's een beetje worden verplaatst zoals eerder is berekend; bewegen en schieten, bewegen en schieten.
  • Herhaling.

Ik heb ook een aparte fire () -methode toegevoegd om de code een beetje beter te structureren. Pas het bereik van alle random () -functies aan om elke parameter te versnellen of vertragen; of verhoog het aantal opnamen voor een meer danceclubgevoel. Scroll naar beneden voor een video van de code in actie!

 #include Servo vert, hori; // create servo object to control a servo int pos = 0; // variable to store the servo position int laser = 12; int buzzer = 11; void setup() { hori.attach(9); vert.attach(10); // attaches the servo on pin 9 to the servo object pinMode(laser, OUTPUT); pinMode(buzzer, OUTPUT); } void loop() { int timeBetweenBursts = random(200, 1000); int timeBetweenShots = random(50, 200); int vertStart = random(1, 180); int vertEnd = random(1, 180); int horiStart = random(1, 180); int horiEnd = random(1, 180); int numShots = random(5, 20); int vertChange = (vertEnd - vertStart) / numShots; //how much to move vertical axis by each shot int horiChange = (horiEnd - horiStart) / numShots; vert.write(vertStart);//let it get to start position first, wait a little hori.write(horiStart); delay(100); for(int shot = 0; shot  

In actie

Ik denk niet dat dit kleine speeltje praktisch bruikbaar is, maar het is ontzettend leuk en er zijn veel variabelen die je kunt aanpassen om het gewenste effect te krijgen. Misschien komt het goed van pas voor een zelfgemaakte LEGO-film?

In this article