Pew Pew! Cum sa construiesti o turela cu laser cu un arduino
Ești plictisit? Ar putea construi și o turelă cu laser. Știi - una care merge pew pew, trage o rază roșie în multe direcții diferite și poate chiar arunca o mașină de fumat? Da, unul dintre ei.
Ce vei avea nevoie
- Arduino
- 2 servoare
- Modul laser, cum ar fi unul din acest set de senzori
- Piezo buzzer sau alt dispozitiv de ieșire mic
- Sârme metalice și cabluri pentru fixare
- Cabluri lungi de sex feminin-> de sex masculin, plus cabluri normale de salt
Opțional, este necesară o mașină de fumat - laserul are putere mică, deci nu veți putea vedea fasciculul fără fum chiar și într-o cameră întunecată.
Construiți un plan
Ideea de bază a turelei este de a pune modulul laser deasupra unui servo pentru a oferi o rotație orizontală; apoi montați pachetul pe un alt servo amplasat la un unghi de 90 de grade pentru a asigura mișcarea verticală. Avem un piezo pentru a oferi pew pew efecte sonore și eu arunc într-o mașină de fumat pentru o măsură bună.
Servo-testarea
În funcție de servo, firele pot fi colorate diferit, dar în general:
- Roșul este firul pozitiv, iar pe ambele servoare a fost centrul celor trei - care urmează să fie conectați la șina + 5v.
- Maro sau negru este negativ, pentru a fi conectat la GND pe Arduino.
- Alb sau portocaliu este firul de semnal, care trebuie conectat la un pin de intrare / ieșire digital capabil de PWM (9 și 10 în demo-ul de mai jos).
Odată ce ați conectat cele două servere, încărcați următorul exemplu de cod. Am numit un servo “Hori” pentru a controla mișcarea orizontală, iar cealaltă “vert”. Fiecare ar trebui să efectueze o gamă completă de mișcări de mișcare (aproximativ 60 de grade, în cazul meu).
#include Servo vert, hori; // creare obiect servo pentru a controla un servo // un maxim de opt servo obiecte pot fi create int pos = 0; // variabila pentru stocarea poziției servo void setup () hori.attach (9); vert.attach (10); // atașează servo pe pinul 9,10 la servo obiectele vert.write (0); hori.write (0); void loop () pentru (pos = 0; poz < 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) // se întoarce de la 180 grade la 0 grade vert.write (pos); // spune servo să meargă la poziția variabilă 'pos' hori.write (pos); întârziere (100); // așteaptă 100 ms pentru ca servo să ajungă la poziție
Toate bune? Mutarea pe atunci.
Testarea laserului și Pew Pew Sunet
Modulul laser este la fel ca un LED, dar are un rezistor încorporat în modul astfel încât să îl putem conecta direct la un I / O digital - foarte simplu. Dacă utilizați același modul laser ca mine, “-” se duce la GND, S merge la pin 12. Modificați codul de probă de mai sus pentru a face pinul 12 o ieșire:
int laser = 12; pinMode (laser, OUTPUT);
Apoi clipește pinul de pe și de pe fiecare buclă folosind standard digitalWrite () metodă.
Vom folosi doar PWM pentru a conduce buzzerul piezo la un nivel de sunet confortabil - ai putea experimenta cu utilizarea bibliotecii de tonuri dacă vrei, dar un zgomot simplu este tot ce am nevoie. Conectați firul negru la masă și firul roșu pentru a fixa 11. Definiți-vă sirenă pe pinul relevant, setați la modul de ieșire și activați utilizarea analogWrite (buzzer, 100) (sau orice număr doriți până la 254); și analogWrite (buzzer, 0) a opri.
Modul complet de probă modificat pentru a mătui două servo, a activa un laser și a reda sunetul enervant poate fi găsit aici.
Toate componentele dvs. ar trebui să funcționeze - acum trebuie să le legăm împreună.
Crearea turretului
Utilizând legăturile de cabluri, atașați un servo la celălalt; nu contează cu adevărat care, asigurați-vă că unul se va mișca pe orizontală, iar celălalt va mișca vertical. Puteți scoate lama rotorului și repoziționa în timpul încercării dacă unghiul nu este corect.
Utilizați un fir rigid de modelare pentru a fixa modulul laser la lama celuilalt servo, cum ar fi:
În cele din urmă, am atașat totul la un picior de birou, cu încă legături de cabluri și un pic de lemn resturi.
Programarea turretului
Nu știu despre tine, dar ideea mea despre o turelă cu laser vine din nenumărate filme SF și episoade de trek. În mod invariabil, cineva va zbura după o turelă și puțin Pew-pew loviturile vor veni să zboare într-un model matur, mereu milisecunde prea lent, astfel încât protagonistul nostru nu este de fapt lovit. Aceasta este ceea ce încerc să replic, dar vă simțiți liber să modificați rutina principală pentru a se potrivi ideii dvs. despre ce ar trebui să facă o turelă.
Iată codul pseudo pe care l-am folosit pentru buclă principală:
- Randomizați timpul între explozii și timpul dintre fiecare împușcare individuală.
- Randomizați poziția de început și de sfârșit pentru fiecare servo, vert și hori.
- Randomizați numărul de fotografii pe care doriți să le faceți.
- Efectuați numărul de grade de schimbare după fiecare fotografiere ca diferență între pozițiile de început și sfârșit, împărțite la numărul de fotografii.
- Deplasați serverele în pozițiile de pornire și așteptați puțin pentru ca acestea să ajungă acolo (100ms)
- Bucle până când toate fotografiile au fost luate, de fiecare dată când mișcați serverele puțin așa cum ați calculat anterior; mutați și trageți, mutați și trageți.
- Repeta.
De asemenea, am adăugat o distincție foc() pentru a structura codul un pic mai bine. Reglați intervalele tuturor întâmplător() funcționează pentru a accelera sau încetini fiecare parametru; sau să crească numărul de fotografii pentru o atmosferă de club mai dans. Derulați în jos pentru un videoclip cu codul în acțiune!
#include Servo vert, hori; // a crea servo obiect pentru a controla un servo int pos = 0; // variabilă pentru a stoca poziția servo int laser = 12; int buzzer = 11; void setup () hori.attach (9); vert.attach (10); // atașează servo-ul pe știftul 9 pinomode-ului servo (laser, OUTPUT); pinMode (buzzer, OUTPUT); void loop () int timeBetweenBursts = aleator (200,1000); int timeBetweenShots = aleatoare (50,200); int vertStart = aleatoare (1,180); int vertEnd = aleatoare (1,180); int horiStart = aleatoare (1,180); int horiEnd = aleatoriu (1,180); int numShots = aleatoare (5,20); int vertChange = (vertEnd - vertStart) / numShots; // cât de mult să mișcați axa verticală de fiecare lovitură int horiChange = (horiEnd - horiStart) / numShots; vert.write (vertStart); // lăsați-o să înceapă mai întâi poziția, așteptați puțin hori.write (horiStart); întârziere (100); pentru (int shot = 0;
În acțiune
Nu cred că există o utilizare practică pentru această jucărie mică, dar este o mulțime de distracție și există o mulțime de variabile pe care le puteți modifica pentru a obține efectul dorit. Poate că va veni la îndemână pentru un film LEGO de casă?
Explorați mai multe despre: Arduino.