Pew Pew! Hvordan bygge en laserturret med en Arduino

Pew Pew! Hvordan bygge en laserturret med en Arduino / DIY

Kjeder du deg? Kan også bygge et lasertårn. Du vet - en som går pew pew, skyter en rød stråle i mange forskjellige retninger, og kanskje til og med kaste inn en røykmaskin? Ja, en av dem.

Hva du trenger

  • Arduino
  • 2 servos
  • Lasermodul, for eksempel en fra dette sensorsettet
  • Piezo-buzzer eller annen liten utgangsenhet
  • Metalltråd og kabelbinder for festing
  • Long female-> male jump kabler, pluss vanlige hoppekabler

Eventuelt er det behov for en røykmaskin - laseren er ganske lav watt, slik at du ikke kan se strålen uten røyk selv i et mørkt rom.

Bygg Plan

Den grunnleggende ideen til tårnet er å sette lasermodulen på toppen av en servo for å gi horisontal rotasjon; Monter deretter pakken på en annen servo plassert i 90 grader vinkel for å gi vertikal bevegelse. Vi har en piezo å gi pew pew lydeffekter, og jeg kaster inn en røykmaskin for godt mål.

Servotesting

Avhengig av din servo, kan ledningene være fargede forskjellig, men generelt:

  • Rød er den positive ledningen, og på begge servene var det midtpunktet på tre - for å være koblet til + 5v skinne.
  • Brun eller svart er det negative, for å være koblet til GND på Arduino.
  • Hvit eller oransje er signalledningen, som skal kobles til en PWM-kompatibel digital I / O-pin (9 og 10 i demoen under).

Når du har koblet til de to tjenestene dine, laster du opp følgende prøvekode. Jeg har kalt en servo “Hori” å kontrollere den horisontale bevegelsen, og den andre “Vert”. Hver bør utføre et bredt spekter av bevegelsessvep (ca. 60 grader, i mitt tilfelle).

#inkludere  Servo vert, hori; // lage servobjekt for å styre en servo // maksimalt åtte servobjekter kan opprettes int pos = 0; // variabel for å lagre servo posisjon void setup () hori.attach (9); vert.attach (10); // legger servoen på pin 9,10 til servobjektene vert.write (0); hori.write (0);  tomromsløyfe () for (pos = 0; pos < 180; pos += 10) // goes from 0 degrees to 180 degrees  // in steps of 10 degrees vert.write(pos); hori.write(pos); // tell servo to go to position in variable 'pos' delay(100); // waits 100ms for the servo to reach the position  for(pos = 180; pos>= 1; pos- = 10) // går tilbake fra 180 grader til 0 grader vert.write (pos); // fortell servo for å gå til posisjon i variabel 'pos' hori.write (pos); forsinkelse (100); // venter 100ms for servo å nå posisjonen 

Helt fint? Flytter på da.

Testing av laser og Pew Pew Lyd

Lasermodulen er som en LED, men den har en motstand innebygd i modulen slik at vi kan koble den opp direkte til en digital I / O - veldig enkel. Hvis du bruker samme lasermodul som meg, “-” går til GND, de S går til pin 12. Endre prøvekoden over for å gjøre pin 12 til en utgang:

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

Blink deretter pinnen på og av hver løkke med standard digitalWrite () metode.

Vi bruker bare PWM til å kjøre piezo summeren på et komfortabelt lydnivå. Du kan eksperimentere med å bruke tone biblioteket hvis du vil, men en enkel lyd er alt jeg trenger. Koble den svarte ledningen til bakken og den røde ledningen til pin 11. Definer din summer På den aktuelle pinnen, sett til utgangsmodus, og aktiver med analog skriv (summer, 100) (eller et hvilket som helst nummer du vil ha opptil 254); og analog (summer, 0) å skru av.

Den fulle prøvekoden er modifisert for å feie to servo, aktivere en laser og spille irriterende lyden, finner du her.

Alle dine komponenter skal fungere - nå må vi knytte det hele sammen.

Opprette Turret

Ved hjelp av kabelbinder, fest en servo til den andre; det spiller ingen rolle noe som bare sørger for at man beveger seg på den horisontale og den andre vil bevege seg vertikalt. Du kan trekke av rotorbladet og sette på plass under test hvis vinkelen ikke er riktig.

Bruk litt stiv modelleringstråd for å fikse lasermodulen til den andre servoens blad, slik som:

Til slutt festet jeg hele greia til et skrivebordsben med enda flere kabler og litt skrap.

Programmering av tårnet

Jeg vet ikke om deg, men ideen om en laserturret kommer fra utallige sci-fi-filmer og stjernetrekepisoder. Det vil alltid flyr forbi et tårn og lite pew-pew Skudd kommer til å flyr ut i et feiende mønster, alltid millisekunder for sakte, slik at vår hovedperson ikke faktisk blir rammet. Det er det jeg prøver å replikere, men vær så snill å justere hovedrutinen for å passe din ide om hva et tårn skal gjøre.

Her er pseudokoden jeg endte med å bruke for hovedløkken:

  • Randomize tid mellom utbrudd og tid mellom hvert enkelt skudd.
  • Tilfeldig start- og sluttposisjonen for hver servo, vert og horisont.
  • Randomize antall skudd å ta.
  • Trene ut antall grader av endring etter hvert skudd som forskjellen mellom start- og sluttposisjoner delt på antall skudd.
  • Flytt servoene til startposisjonene, og vent litt for dem å komme dit (100ms)
  • Loop til alle skuddene er tatt, hver gang servosene flyttes litt som tidligere beregnet; flytte og skyte, flytte og skyte.
  • Gjenta.

Jeg har også lagt til en egen Brann() metode for å strukturere koden litt bedre. Juster rekkevidden til alle tilfeldig() Fungerer for å øke eller senke hver parameter eller øk antall skudd for en mer dance club vibe. Rull ned for en video av koden i aksjon!

#inkludere  Servo vert, hori; // lage servobjekt for å styre en servo int pos = 0; // variabel for å lagre servo posisjon int laser = 12; int buzzer = 11; tomtoppsett () hori.attach (9); vert.attach (10); // legger servoen på pinne 9 til servoobjektet pinMode (laser, OUTPUT); pinMode (summer, OUTPUT);  tomromsløyfe () int timeBetweenBursts = tilfeldig (200,1000); int timeBetweenShots = tilfeldig (50,200); int vertStart = tilfeldig (1,180); int vertEnd = tilfeldig (1,180); int horiStart = tilfeldig (1,180); int horiEnd = tilfeldig (1,180); int numShots = tilfeldig (5,20); int vertChange = (vertEnd - vertStart) / numShots; // hvor mye å flytte vertikal akse ved hvert skudd int horiChange = (horiEnd - horiStart) / numShots; vert.write (vertStart); // la det komme til å starte posisjon først, vent litt hori.write (horiStart); forsinkelse (100); for (int shot = 0; shot

I aksjon

Jeg tror ikke det er en praktisk bruk for denne lille leken, men det er en veldig mye moro og det er mange variabler du kan justere for å få ønsket effekt. Kanskje det kommer til nytte for en hjemmelaget LEGO-film?

Utforsk mer om: Arduino.