Pew Pew! Hoe een laser torentje te bouwen met een Arduino
Verveel je je? Kan net zo goed een lasertoren bouwen. U weet het - een die gaat pew pew, schiet een rode straal in veel verschillende richtingen en misschien zelfs in een rookmachine? Ja, een van hen.
Wat je nodig zult hebben
- Arduino
- 2 servo's
- Lasermodule, zoals een van deze sensorset
- Piëzo-zoemer of ander klein uitvoerapparaat
- Metaaldraad en kabelbinders voor bevestiging
- Lange vrouwelijke-> mannelijke sprongkabels, plus gewone springkabels
Optioneel is een rookmachine nodig - de laser heeft een vrij laag wattage, zodat u de straal niet kunt zien zonder rook, zelfs in een donkere kamer.
Bouw plan
Het basisidee van het torentje is om de lasermodule op één servo te plaatsen om horizontale rotatie te bieden; monteer die verpakking vervolgens op een andere servo die onder een hoek van 90 graden wordt geplaatst om verticale beweging te bieden. We hebben een piezo voor de pew pew geluidseffecten, en ik gooi voorgoed een rookmachine in.
Servo testen
Afhankelijk van je servo kunnen de draden anders gekleurd zijn, maar in het algemeen:
- Rood is de positieve draad, en op beide servo's was het het midden van drie - te verbinden met + 5v rail.
- Bruin of zwart is het negatief, om te worden verbonden met GND op de Arduino.
- Wit of oranje is de signaalkabel die moet worden aangesloten op een PWM-compatibele digitale I / O-pin (9 en 10 in de onderstaande demo).
Nadat je je twee servo's hebt aangesloten, upload je de volgende voorbeeldcode. Ik heb een servo genoemd “hori” om de horizontale beweging te besturen, en de andere “vert”. Iedereen zou een volledige bewegingsbereikbereik moeten uitvoeren (ongeveer 60 graden, in mijn geval).
#include Servo vert, hori; // maak een servo-object om een servo te besturen // er kunnen maximaal acht servo-objecten worden gemaakt int pos = 0; // variabele om de setup van de servo-positie op te slaan () hori.attach (9); vert.attach (10); // bevestigt de servo op pin 9,10 aan de servo-objecten 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) // gaat terug van 180 graden naar 0 graden vert.write (pos); // vertel servo om naar positie te gaan in variabele 'pos' hori.write (pos); vertraging (100); // wacht 100 ms totdat de servo de positie bereikt
Alles goed? Verder gaan dan.
Testen van de laser en Pew Pew Geluid
De lasermodule is net een LED, maar heeft een weerstand die in de module is ingebouwd, zodat we deze direct kunnen aansluiten op een digitale I / O - heel eenvoudig. Als u dezelfde lasermodule gebruikt als ik, de “-” gaat naar GND, de S gaat naar pin 12. Wijzig de bovenstaande voorbeeldcode om van pin 12 een uitvoer te maken:
int laser = 12; pinMode (laser, OUTPUT);
Knipper vervolgens de pin aan en uit elke lus met behulp van standaard digitalWrite () methode.
We gebruiken PWM gewoon om de piëzo-zoemer op een comfortabel geluidsniveau te zetten - je zou kunnen experimenteren met het gebruik van de toonbank als je dat wilt, maar een simpele ruis is alles wat ik nodig heb. Verbind de zwarte draad met aarde en de rode draad met pen 11. Bepaal uw zoemer op de betreffende pin, stel in op uitvoermodus en activeer met analogWrite (zoemer, 100) (of een willekeurig nummer dat u wilt maximaal 254); en analogWrite (buzzer, 0) uitschakelen.
De volledige voorbeeldcode die is gemodificeerd om twee servo te vegen, een laser te activeren en het vervelende geluid te spelen, is hier te vinden.
Al je componenten zouden moeten werken - nu moeten we alles samen binden.
De torentje maken
Gebruik kabelbinders om een servo aan de andere vast te maken; het maakt niet echt uit wat, zorg er gewoon voor dat er een op de horizontale gaat en de andere de verticale. U kunt het rotorblad verwijderen en opnieuw plaatsen tijdens het testen als de hoek niet goed is.
Gebruik een stijve modelleerdraad om de lasermodule op het blad van de andere servo te bevestigen, zoals:
Ten slotte heb ik het geheel aan een tafelpoot bevestigd met nog meer kabelbinders en een beetje sloophout.
Programmeren van de toren
Ik weet het niet van je, maar mijn idee van een lasertorentje komt uit ontelbare aantallen sci-fi-films en sterrenstapepisodes. Steevast zal iemand voorbij een torentje vliegen en weinig kerkbank-kerkbank foto's komen in een vluchtig patroon naar buiten, altijd milliseconden te langzaam, zodat onze hoofdpersoon niet daadwerkelijk geraakt wordt. Dat is wat ik probeer te repliceren, maar voel je vrij om de hoofdroutine af te stemmen op je idee van wat een torentje zou moeten doen.
Hier is de pseudo-code die ik uiteindelijk gebruikte voor de hoofdlus:
- Randomiseer de tijd tussen bursts en de tijd tussen elke afzonderlijke opname.
- Maak de begin- en eindpositie voor elke servo, vert en hori willekeurig.
- Willekeurig het aantal te maken opnamen.
- Bereken het aantal graden van verandering na elke opname als het verschil tussen start- en eindposities gedeeld door het aantal opnamen.
- Verplaats de servo's naar de startposities en wacht een beetje totdat ze daar zijn (100ms)
- Herhaal totdat alle opnamen zijn gemaakt, waarbij de servo's een beetje worden verplaatst zoals eerder is berekend; bewegen en schieten, bewegen en schieten.
- Herhaling.
Ik heb ook een aparte toegevoegd brand() methode om de code een beetje beter te structureren. Pas het bereik van allemaal aan willekeurig() functies om elke parameter te versnellen of te vertragen; of verhoog het aantal opnamen voor een meer danceclubgevoel. Scroll naar beneden voor een video van de code in actie!
#include Servo vert, hori; // maak een servo-object om een servo int pos = 0 te besturen; // variabele om de servopositie op te slaan in laser = 12; int zoemer = 11; void setup () hori.attach (9); vert.attach (10); // koppelt de servo op pin 9 aan het servo-object pinMode (laser, OUTPUT); pinMode (buzzer, OUTPUT); void loop () int timeBetweenBursts = random (200,1000); int timeTetweenShots = willekeurig (50.200); int vertStart = willekeurig (1,180); int vertEnd = willekeurig (1,180); int horiStart = willekeurig (1,180); int horiEnd = willekeurig (1,180); int numShots = willekeurig (5,20); int vertChange = (vertEnd - vertStart) / numShots; // hoeveel de verticale as moet worden verplaatst bij elke opname int horiChange = (horiEnd - horiStart) / numShots; vert.write (vertStart); // laat hem eerst de positie beginnen, wacht een beetje hori.write (horiStart); vertraging (100); voor (int shot = 0; opname
In actie
Ik denk niet dat dit kleine speeltje praktisch bruikbaar is, maar het is ontzettend leuk en er zijn veel variabelen die je kunt aanpassen om het gewenste effect te krijgen. Misschien komt het goed van pas voor een zelfgemaakte LEGO-film?
Ontdek meer over: Arduino.