Pew Pew! Hur man bygger en laserturret med en Arduino
Är du uttråkad? Kan också bygga en lasertorn. Du vet - en som går pew pew, 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.
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” 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).
#inkludera Servo Vert, Hori; // skapa servobjekt för att styra en servo // maximalt åtta servobjekt kan skapas int pos = 0; // variabel för att lagra servo position void setup () hori.attach (9); vert.attach (10); // fäster servo på stift 9,10 till servobjekten vert.write (0); hori.write (0); tomrumsling () för (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 tillbaka från 180 grader till 0 grader vert.write (pos); // berätta servo för att gå till position i variabel "pos" hori.write (pos); fördröjning (100); // väntar 100ms för servo att nå positionen
Allt väl? Flytta då.
Testa lasern och Pew Pew Ljud
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 jag, “-” går till GND, de S går till stift 12. Ändra provkoden ovan för att göra stift 12 en utgång:
int laser = 12; pinMode (laser, OUTPUT);
Blinka sedan pinnen på och av varje slinga med hjälp av standard digitalWrite () metod.
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älld till utgångsläge och aktivera med analog skriv (summer, 100) (eller något nummer du vill ha upp till 254); och analogWrite (summer, 0) 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.
Använd en styv modelleringstråd för att fixera lasermodulen till den andra servomaskinens blad, så här:
Slutligen fäster jag hela grejen på ett skrivbordsben med ännu fler kabelband och lite skrot.
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 ett torn och lite bänk-bänk skott kommer att flyga ut i ett svepande mönster, alltid millisekunder för långsam så att vår huvudperson inte faktiskt kommer hit. Det är vad jag försöker replikera, men känner mig fritt att tweak huvudrutinen för att passa din idé om vad ett 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 lade också till en separat brand() Metod för att strukturera koden lite bättre. Justera alla områden slumpmässig() Funktionerna 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 funktion!
#inkludera Servo Vert, Hori; // skapa servobjekt för att styra en servo int pos = 0; // variabel för att lagra servoställningen int laser = 12; int buzzer = 11; tomrumsinställning () hori.attach (9); vert.attach (10); // fäster servo på stift 9 till servobjektet pinMode (laser, OUTPUT); pinMode (summer, OUTPUT); tomrumsling () int timeBetweenBursts = slumpmässigt (200,1000); int timeBetweenShots = slumpmässigt (50.200); int vertStart = slumpmässig (1 180); int vertEnd = slumpmässig (1 180); int horiStart = slumpmässigt (1 180); int horiEnd = slumpmässig (1 180); int numShots = slumpmässigt (5,20); int vertChange = (vertEnd - vertStart) / numShots; // hur mycket att flytta vertikal axel vid varje skott int horiChange = (horiEnd - horiStart) / numShots; vert.write (vertStart); // låt det komma till startposition först, vänta lite hori.write (horiStart); fördröjning (100); för (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?
Utforska mer om: Arduino.