Sei annoiato? Potrebbe anche costruire una torretta laser. Sai - uno che va in panca, spara un raggio rosso in molte direzioni diverse, e magari lancia anche una macchina del fumo? Sì, uno di loro.
Di cosa avrai bisogno
- Arduino
- 2 servi
- Modulo laser, come quello di questo kit di sensori
- Cicalino piezoelettrico o altro piccolo dispositivo di uscita
- Fili metallici e fascette per fissaggio
- Lunghi cavi femmina-> salto maschile, più cavi di salto normali
Opzionalmente, è necessaria una macchina del fumo: il laser ha un wattaggio piuttosto basso, quindi non sarà possibile vedere il raggio senza fumo anche in una stanza buia.
Piano di costruzione
L'idea di base della torretta è di mettere il modulo laser sopra un servo per fornire una rotazione orizzontale; quindi montare il pacchetto su un altro servo posizionato a un angolo di 90 gradi per fornire un movimento verticale. Abbiamo un piezo per fornire gli effetti sonori del banco di attesa e sto lanciando una macchina del fumo per buona misura.
Test servo
A seconda del servo, i fili possono essere colorati in modo diverso, ma in generale:
- Il rosso è il filo positivo, e su entrambi i miei servi era il centro di tre - da collegare a + 5v rail.
- Marrone o nero è il negativo, per essere collegato a GND su Arduino.
- Bianco o arancione è il filo del segnale, da collegare a un pin di I / O digitale compatibile con PWM (9 e 10 nella demo di seguito).
Una volta cablati i due servi, carica il seguente codice di esempio. Ho chiamato un servo "hori" per controllare il movimento orizzontale e l'altro "vert". Ognuno dovrebbe eseguire una gamma completa di sweep del movimento (circa 60 gradi nel mio caso).
#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 } }
Tutto bene? Andando avanti allora.
Test del laser e Pew Pew Sound
Il modulo laser è proprio come un LED, ma ha una resistenza integrata nel modulo in modo che possiamo collegarlo direttamente a un I / O digitale - molto semplice. Se stai usando lo stesso modulo laser come me, il " - " va a GND, la S va al pin 12. Modifica il codice di esempio sopra per rendere il pin 12 un output:
int laser = 12; pinMode(laser, OUTPUT);
Quindi fai lampeggiare il pin su ciascun loop usando il metodo standard DigitalWrite () .
Useremo il PWM per pilotare il cicalino piezo a un livello sonoro confortevole: potresti provare a utilizzare la libreria dei toni se lo desideri, ma è sufficiente un semplice rumore. Collegare il cavo nero a terra e il filo rosso al pin 11. Definire il segnale acustico sul relativo pin, impostare la modalità di uscita e attivare utilizzando analogWrite (buzzer, 100) (o qualsiasi numero che si desidera fino a 254); e analogWrite (cicalino, 0) per spegnere.
L'intero codice di esempio modificato per spazzare due servo, attivare un laser e riprodurre il suono fastidioso, può essere trovato qui.
Tutti i componenti dovrebbero funzionare - ora dobbiamo legarli tutti insieme.
Creazione della torretta
Utilizzando le fascette, collegare un servo all'altro; non importa quale, ma assicurati che si muoverà sull'orizzontale e l'altro muoverà la verticale. È possibile estrarre la pala del rotore e riposizionarla durante i test se l'angolo non è corretto.
Utilizzare un filo di modellazione rigido per fissare il modulo laser alla lama dell'altro servo, in questo modo:
Alla fine, ho attaccato l'intera cosa a una gamba della scrivania con ancora più fascette e un po 'di legno di scarto.
Programmazione della torretta
Non so voi, ma la mia idea di una torretta laser proviene da innumerevoli film di fantascienza e episodi di star trek. Invariabilmente qualcuno sorvolerà una torretta e piccoli colpi di pan-pan verranno fuori in un ampio disegno, sempre in millisecondi troppo lenti, quindi il nostro protagonista non verrà colpito. Questo è quello che sto cercando di replicare, anche se sentiti libero di modificare la routine principale per adattarla alla tua idea di cosa dovrebbe fare una torretta.
Ecco lo pseudo-codice che ho usato per il ciclo principale:
- Randomize tempo tra scoppi e tempo tra ogni singolo colpo.
- Randomizza la posizione iniziale e finale per ogni servo, vert e hori.
- Randomizza il numero di colpi da prendere.
- Calcola il numero di gradi di variazione dopo ogni scatto come differenza tra la posizione iniziale e quella finale divisa per il numero di colpi.
- Sposta i servi nelle posizioni di partenza e aspetta un po 'per loro per arrivarci (100ms)
- Loop fino a quando non sono stati effettuati tutti i colpi, ogni volta spostando i servi un po 'come precedentemente calcolato; muovi e spara, muovi e spara.
- Ripetere.
Ho anche aggiunto un metodo fire () separato per strutturare il codice un po 'meglio. Regolare gli intervalli di tutte le funzioni casuali () per accelerare o rallentare ciascun parametro; o aumentare il numero di colpi per un'atmosfera più da discoteca. Scorri verso il basso per un video del codice in azione!
#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
In azione
Non penso che ci sia un uso pratico per questo piccolo giocattolo, ma è un sacco di divertimento e ci sono molte variabili che puoi modificare per ottenere l'effetto desiderato. Forse sarà utile per un film LEGO fatto in casa?