Pew Pew! Hur man bygger en laserturret med en Arduino

Är du uttråkad? Kan också bygga en lasertorn.

Är du uttråkad?  Kan också bygga en lasertorn.
Annons

Är du uttråkad? Kan också bygga en lasertorn. Du vet - en som går i kyrkan, skjuter en röd stråle i många olika riktningar, och kanske till och med kasta in en rökmaskin? Ja, en av dem.

Vad du kommer att behöva

  • Arduino
  • 2 servos
  • Lasermodul, t.ex. en från denna sensorsats
  • Piezo-summer eller annan liten utmatningsenhet
  • Metalltråd och kabelband för fastsättning
  • Långa kvinnliga-> hanehoppkablar, plus vanliga hoppkablar

Eventuellt behövs en rökmaskin - lasern är ganska lågt watt, så du kan inte se strålen utan rök även i ett mörkt rum.

komponenter

Byggplan

Turret bygger på att man placerar lasermodulen på en servo för att ge horisontell rotation; Montera sedan det paketet på en annan servo placerad i 90 graders vinkel för att ge vertikal rörelse. Vi har en piezo för att ge pew pew ljudeffekter, och jag kastar in en rökmaskin för gott mått.

Servotestning

Beroende på din servo kan trådarna färgas annorlunda men i allmänhet:

  • Röd är den positiva ledningen, och på båda mina servon var det mitt på tre - för att anslutas till + 5v-räls.
  • Brun eller svart är den negativa, att anslutas till GND på Arduino.
  • Vit eller orange är signaltråden, som ska anslutas till en PWM-kompatibel digital I / O-pin (9 och 10 i demon nedan).

När du har anslutit dina två servrar, ladda upp följande provkod. Jag har namngett en servo "Hori" för att styra den horisontella rörelsen, och den andra "vert". Var och en borde utföra ett fullständigt sortiment av rörelsefeber (ca 60 grader, i mitt fall).

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

Allt väl? Flytta då.

Testning av laser- och pew-pew- ljudet

Lasermodulen är precis som en LED, men den har ett motstånd inbyggt i modulen så att vi kan ansluta den direkt till en digital I / O - väldigt enkel. Om du använder samma lasermodul som mig, går " - " till GND, S går till stift 12. Ändra provkoden ovan för att göra stift 12 till en utgång:

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

Blinka sedan pinnen på och av varje slinga med hjälp av standard digitalWrite () -metoden.

Vi använder bara PWM för att köra piezoomvandlaren på en bekväm ljudnivå - du kan experimentera med att använda tonbiblioteket om du vill, men ett enkelt ljud är allt jag behöver. Anslut den svarta ledningen till marken och den röda ledningen till stift 11. Ange din summer på aktuell stift, ställ in till utgångsläge och aktivera med analogWrite (summer, 100) (eller något nummer du vill ha upp till 254); och analogskrivning (summer, 0) för att stänga av.

Den fullständiga provkoden modifieras för att svepa två servo, aktivera en laser och spela det irriterande ljudet, finns här.

Alla dina komponenter ska fungera - nu måste vi knyta allt ihop.

Skapa tornet

Anslut en servo till den andra med hjälp av kabelband. Det spelar ingen roll om vilket, bara se till att man kommer att flytta på horisontalen och den andra kommer att flytta vertikalen. Du kan dra av rotorbladet och sätta tillbaka det under provningen om vinkeln inte är rätt.

servon

Använd en styv modelleringstråd för att fixera lasermodulen till den andra servomaskinens blad, så här:

tråd-för-laser-modul

Slutligen fäster jag hela grejen på ett skrivbordsben med ännu fler kabelband och lite skrot.

attach-torn till bord

Programmera tornet

Jag vet inte om dig, men min idé om en laserturret kommer från otaliga sci-fi-filmer och stjärntrappspisoder. Självfallet kommer någon att flyga förbi en torn och små pew-pew- skott kommer att flyga ut i ett svepande mönster, alltid millisekunder för långsam så att vår huvudperson inte blir faktiskt slagen. Det är vad jag försöker replikera, men känner mig fritt att tweak huvudrutinen för att passa din idé om vad en torn ska göra.

Här är pseudokoden som jag slutade använda för huvudslingan:

  • Randomera tiden mellan brister och tid mellan varje enskilt skott.
  • Randomera start- och slutpositionen för varje servo, vert och hori.
  • Slumpmässigt antalet skott att ta.
  • Utför antalet grader av förändring efter varje skott som skillnaden mellan start- och slutpositioner dividerat med antal skott.
  • Flytta servonerna till startpositionerna och vänta lite för att de ska komma dit (100ms)
  • Loop tills alla bilder har tagits, varje gång servoerna flyttas lite som tidigare beräknat; flytta och skjuta, flytta och skjuta.
  • Upprepa.

Jag har också lagt till en separat brand () metod för att strukturera koden lite bättre. Justera intervallet för alla slumpmässiga () funktioner för att påskynda eller sakta ner varje parameter; eller öka antalet bilder för en mer dansklubbens vibe. Bläddra ner för en video av 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

Jag tror inte att det finns en praktisk användning för den här lilla leken, men det är väldigt roligt och det finns många variabler du kan tweak för att få önskad effekt. Kanske kommer det att vara till nytta för en hemlagad LEGO-film?

In this article