Pew Pew! Come costruire una torretta laser con un Arduino

Sei annoiato? Potrebbe anche costruire una torretta laser.

Sei annoiato?  Potrebbe anche costruire una torretta laser.
Annuncio pubblicitario

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.

componenti

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.

servi

Utilizzare un filo di modellazione rigido per fissare il modulo laser alla lama dell'altro servo, in questo modo:

wire-per-laser-modulo

Alla fine, ho attaccato l'intera cosa a una gamba della scrivania con ancora più fascette e un po 'di legno di scarto.

attach-torretta alla tavola

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?

In this article