Är du uttråkad? Kan lika gärna bygga ett lasertorn. Du vet – en som går bänk bänk, skjuter en röd stråle åt många olika håll, och kanske till och med slänger in en rökmaskin? Japp, en av dem.
Vad du kommer att behöva
Arduino 2 servon Lasermodul, till exempel en från denna sensorsats [Broken URL Removed] Piezo-summer eller annan liten utgångsenhet Metalltråd och buntband för fixering av långa hon->han-startkablar, plus vanliga startkablar
Eventuellt behövs en rökmaskin – lasern har ganska låg effekt, så du kommer inte att kunna se strålen utan rök även i ett mörkt rum.
Byggplan
Den grundläggande idén med tornet är att placera lasermodulen ovanpå en servo för att ge horisontell rotation; Montera sedan paketet på en annan servo placerad i 90 graders vinkel för att ge vertikal rörelse. Vi har en piezo att ge bänk bänk ljudeffekter, och jag slänger in en rökmaskin för gott skull.
Servotester
Beroende på din servo kan ledningarna vara olika färgade, men generellt:
Röd är den positiva ledningen, och på båda mina servon var den mitten av tre – för att anslutas till +5v-skena. Brunt eller svart är det negativa, som ska kopplas till GND på Arduino. Vit eller orange är signaltråden som ska anslutas till ett PWM-kapabelt digitalt I/O-stift (9 och 10 i demon nedan).
När du har kopplat upp dina två servon laddar du upp följande exempelkod. Jag har döpt en servo till “hori” för att styra den horisontella rörelsen, och den andra “vert”. Var och en bör utföra ett komplett rörelsesvep (cirka 60 grader, i mitt fall).
#include <servo.h>
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 < 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) // 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? Går vidare 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 koppla upp den direkt till en digital I/O – väldigt enkelt. Om du använder samma lasermodul som jag, “–” går till GNDden S går till stift 12. Ändra exempelkoden ovan för att göra stift 12 till en utgång:
int laser = 12;
pinMode(laser,OUTPUT);
Blinka sedan stiftet på och av varje slinga med standard digitalWrite() metod.
Vi kommer bara att använda PWM för att driva piezosummern 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 jord och den röda ledningen till stift 11. Definiera din summer på relevant stift, ställ in på utgångsläge och aktivera med analogWrite(summer, 100) (eller vilket nummer du vill upp till 254); och analogWrite(summer,0) att stänga av.
Den fullständiga provkoden modifierad för att svepa två servo, aktivera en laser och spela upp det irriterande ljudet, finns här.
Alla dina komponenter borde fungera – nu måste vi knyta ihop allt.
Skapa tornet
Använd buntband, fäst en servo till den andra; det spelar egentligen ingen roll vilken, se bara till att den ena flyttar sig horisontellt och den andra flyttar vertikalen. Du kan dra av rotorbladet och sätta tillbaka det under testet om vinkeln inte är rätt.
Använd lite styv modelleringstråd för att fixera lasermodulen till bladet på den andra servo, så här:
Till sist fäste jag det hela på ett skrivbordsben med ännu fler buntband och lite träskrot.
Programmering av tornet
Jag vet inte om dig, men min idé om ett lasertorn kommer från ett oräkneligt antal sci-fi-filmer och star trek-avsnitt. Alltid kommer någon att flyga förbi ett torn och lite bänk-bänk skott kommer flygande i ett svepande mönster, alltid millisekunder för långsamt så att vår huvudperson faktiskt inte blir träffad. Det är vad jag försöker replikera, men känner free för att justera huvudrutinen så att den passar din idé om vad ett torn ska göra.
Här är pseudokoden som jag slutade använda för huvudslingan:
Randomisera tiden mellan skurarna och tiden mellan varje enskilt skott. Randomisera start- och slutpositionen för varje servo, vert och hori. Slumpmässigt antal bilder att ta. Räkna ut antalet grader av förändring efter varje skott som skillnaden mellan start- och slutpositioner dividerat med antalet skott. Flytta servon till startpositionerna och vänta lite tills de kommer dit (100ms) Slinga tills alla skott har tagits, varje gång flytta servon 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 intervallen för alla slumpmässig() funktioner för att påskynda eller sakta ner varje parameter; eller öka antalet bilder för en mer dansklubbskänsla. Scrolla ner för en video av koden i aktion!
#include <servo.h>
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<numShots; shot++){
vert.write(vertStart);
hori.write(horiStart);
vertStart += vertChange;//increment the vert value for next time
horiStart += horiChange;
fire();
delay(timeBetweenShots); //add a bit of variety to the speed of shots
}
delay(timeBetweenBursts);
}
void fire(){
digitalWrite(laser,HIGH);
analogWrite(buzzer,100);
delay(20);//adjust this to change length of turret shot
digitalWrite(laser,LOW);
analogWrite(buzzer, 0);
}
I aktion
http://www.youtube.com/watch?v=LmpqJ961qtM
Jag tror inte att det finns någon praktisk användning för den här lilla leksaken, men det är oerhört roligt och det finns många variabler du kan justera för att få önskad effekt. Kanske kommer det att vara praktiskt för en hemmagjord LEGO-film?
Om författaren
James Bruce (720 publicerade artiklar)
James har en BSc i artificiell intelligens och är CompTIA A+ och Network+ certifierad. När han inte är upptagen som Hardware Review Editor, gillar han LEGO, VR och brädspel. Innan han började på MakeUseOf var han ljustekniker, engelskalärare och datacenteringenjör.
Mer från James Bruce
Prenumerera på vårt nyhetsbrev
Gå med i vårt nyhetsbrev för tekniska tips, recensioner, free e-böcker och exklusiva erbjudanden!
Klicka här för att prenumerera
