Pew Pew! Sådan bygger du en laserturret med en Arduino

Keder du dig? Kan lige så godt bygge et lasertårn.

Keder du dig?  Kan lige så godt bygge et lasertårn.
Reklame

Keder du dig? Kan lige så godt bygge et lasertårn. Du ved - en, der går pew pew, skyder en rød stråle i mange forskellige retninger, og måske endda smide i en røgmaskine? Yep, en af ​​dem.

Hvad du skal bruge

  • Arduino
  • 2 servos
  • Lasermodul, såsom en fra dette sensorsæt
  • Piezo-summer eller anden lille udgangsenhed
  • Metaltråd og kabelbinder til fastgørelse
  • Long female-> male jump kabler, plus regelmæssige jump kabler

Eventuelt er der brug for en røgmaskine - laseren er temmelig lav watt, så du kan ikke se strålen uden røg selv i et mørkt rum.

komponenter

Build Plan

Tårnets grundlæggende idé er at sætte lasermodulet oven på en servo for at tilvejebringe vandret rotation; Monter derefter pakken på en anden servo placeret 90 graders vinkel for at give vertikal bevægelse. Vi har en piezo for at give pew pew lydeffekter, og jeg smider ind i en røgmaskine til god foranstaltning.

Servotestning

Afhængigt af din servo, kan ledningerne være farvet anderledes, men generelt:

  • Rød er den positive ledning, og på begge min servoer var det midt på tre - for at blive forbundet til + 5v skinne.
  • Brun eller sort er det negative, at være forbundet til GND på Arduino.
  • Hvid eller orange er signaltråden, der skal sluttes til en PWM-kompatibel digital I / O-stik (9 og 10 i demoen nedenfor).

Når du har tilsluttet dine to servoer, skal du uploade følgende prøvekode. Jeg har navngivet en servo "hori" for at styre den vandrette bevægelse, og den anden "vert". Hver bør udføre et komplet udvalg af bevægelsesfeje (ca. 60 grader, i mit tilfælde).

#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 } } 

Alt godt? Flytter på da.

Testning af laser- og pew-pew- lyden

Lasermodulet er ligesom en LED, men den har en modstand indbygget i modulet, så vi kan tilslutte det direkte til en digital I / O - meget enkel. Hvis du bruger det samme lasermodul som mig, går " - " til GND, S går til pin 12. Ændre prøvekode ovenfor for at gøre pin 12 til en udgang:

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

Blink derefter tappen på og fra hver sløjfe ved hjælp af standard digitalWrite () -metoden.

Vi bruger bare PWM til at køre piezo summeren på et behageligt lydniveau - du kan eksperimentere med at bruge tone biblioteket, hvis du vil have det, men en simpel støj er alt, hvad jeg har brug for. Tilslut den sorte ledning til jord og den røde ledning til pin 11. Definer din summer på den relevante pin, indstillet til udgangstilstand og aktiver ved hjælp af analogWrite (summer, 100) (eller et hvilket som helst nummer, du vil have op til 254); og analogWrite (summer, 0) for at slukke.

Den fulde prøvekode ændret til at feje to servo, aktivere en laser og afspille den irriterende lyd, kan findes her.

Alle dine komponenter skal fungere - nu skal vi knytte det hele sammen.

Oprettelse af tårnet

Ved hjælp af kabelbånd monteres en servo til den anden; det betyder ikke rigtig noget, som bare sørger for at man bevæger sig på vandret og den anden vil bevæge sig lodret. Du kan trække rotorbladet ud og sætte dig igen under test, hvis vinklen ikke er korrekt.

servoer

Brug en stiv modelleringstråd til at fastgøre lasermodulet til den anden servos blad, sådan:

wire-til-laser-modul

Endelig fik jeg det hele til et bordben med endnu flere kabler og lidt skrot.

vedhæfte-tårn til bord

Programmering af tårnet

Jeg ved ikke om dig, men min ide om en laserturret kommer fra utallige sci-fi-film og stjernetraktepisoder. Alligevel vil nogen flyve forbi et tårn og små pew-pew skud vil komme ud i et fejende mønster, altid millisekunder for langsomt, så vores hovedperson ikke rent faktisk bliver ramt. Det er det, jeg forsøger at replikere, selvom du er velkommen til at finjustere hovedrutinen, så den passer til din ide om, hvad et tårn skal gøre.

Her er pseudokoden, jeg endte med at bruge til hovedsløjfen:

  • Randomize tiden mellem udbrud og tid mellem hvert enkelt skud.
  • Randomize start- og slutpositionen for hver servo, vert og hori.
  • Randomize antallet af skud, der skal tages.
  • Udarbejd antallet af forandringsgrader efter hvert skud som forskellen mellem start- og slutpositioner divideret med antal skud.
  • Flyt servoerne til startpositionerne, og vent lidt for at komme derhen (100ms)
  • Loop indtil alle skud er taget, hver gang servoerne flytter lidt som tidligere beregnet; flytte og skyde, flytte og skyde.
  • Gentage.

Jeg har også tilføjet en separat brand () metode til at strukturere koden lidt bedre. Juster rækkevidden af ​​alle tilfældige () funktioner for at fremskynde eller sænke hver parameter; eller øg antallet af skud til en mere dance club vibe. Rul ned for en video af koden i aktion!

 #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  

I aktion

Jeg tror ikke, at der er en praktisk brug for denne lille legetøj, men det er en forfærdelig masse sjov og der er mange variabler, du kan finjustere for at få den ønskede effekt. Måske vil det komme til nytte for en hjemmelavet LEGO film?

In this article