Você está entediado? Pode também construir uma torre laser. Você sabe - um que vai banco de banco, dispara um feixe vermelho em muitas direções diferentes e talvez até mesmo jogar em uma máquina de fumaça? Sim, um deles.
O que você precisa
- Arduino
- 2 servos
- Módulo laser, como um deste kit de sensores
- Campainha piezo ou outro pequeno dispositivo de saída
- Fio de metal e braçadeiras para fixação
- Longa fêmea-> cabos de salto masculinos, mais cabos de salto regulares
Opcionalmente, é necessária uma máquina de fumaça - o laser tem uma potência muito baixa, então você não poderá ver o feixe sem fumaça, mesmo em um quarto escuro.
Plano de construção
A idéia básica da torre é colocar o módulo de laser no topo de um servo para fornecer rotação horizontal; em seguida, monte esse pacote em outro servo colocado em um ângulo de 90 graus para fornecer movimento vertical. Nós temos um piezo para fornecer os efeitos sonoros do banco do banco, e eu estou jogando em uma máquina de fumaça para uma boa medida.
Teste Servo
Dependendo do seu servo, os fios podem ser coloridos de forma diferente, mas em geral:
- Vermelho é o fio positivo, e em ambos os meus servos era o centro de três - para ser conectado ao trilho de + 5v.
- Marrom ou preto é o negativo, para ser conectado ao GND no Arduino.
- Branco ou laranja é o fio de sinal, para ser conectado a um pino de E / S digital compatível com PWM (9 e 10 na demonstração abaixo).
Depois de conectar seus dois servos, faça o upload do seguinte código de amostra. Eu nomeei um servo "hori" para controlar o movimento horizontal e o outro "vert". Cada um deve executar uma gama completa de varredura de movimento (cerca de 60 graus, no meu 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 } }
Tudo bom? Seguindo em frente.
Testando o Laser e o Pew Pew Sound
O módulo de laser é como um LED, mas tem um resistor embutido no módulo para que possamos conectá-lo diretamente a uma E / S digital - muito simples. Se você estiver usando o mesmo módulo de laser que eu, o “ - ” vai para GND, o S vai para o pino 12. Modifique o código de exemplo acima para fazer o pino 12 uma saída:
int laser = 12; pinMode(laser, OUTPUT);
Em seguida, pisque o pino e desligue cada laço usando o método digitalWrite () padrão.
Nós apenas usaremos o PWM para conduzir a campainha piezo a um nível de som confortável - você poderia experimentar usar a biblioteca de sons se quisesse, mas um simples ruído é tudo que eu preciso. Conecte o fio preto ao terra e o fio vermelho ao pino 11. Defina sua campainha no pino relevante, defina para o modo de saída e ative usando analogWrite (buzzer, 100) (ou qualquer número que você quiser até 254); e analogWrite (buzzer, 0) para desligar.
O código de amostra completo modificado para varrer dois servos, ativar um laser e reproduzir o som irritante, pode ser encontrado aqui.
Todos os seus componentes devem estar funcionando - agora precisamos amarrá-los todos juntos.
Criando a torreta
Usando braçadeiras, conecte um servo ao outro; Realmente não importa qual, apenas certifique-se de que um se moverá na horizontal e o outro moverá a vertical. Você pode retirar a lâmina do rotor e recolocar durante o teste se o ângulo não estiver correto.
Use um pouco de arame de modelagem para fixar o módulo de laser na lâmina do outro servo, assim:
Por fim, prendi a coisa toda a uma perna de mesa com ainda mais braçadeiras e um pedaço de madeira.
Programando a torreta
Eu não sei sobre você, mas minha ideia de uma torre de laser vem de inúmeros filmes de ficção científica e episódios de Star Trek. Invariavelmente, alguém passa voando por uma torre e pequenos tiros de banco vão voando em um padrão abrangente, sempre em milissegundos, então nosso protagonista não é atingido. Isso é o que eu estou tentando replicar, embora sinta-se livre para ajustar a rotina principal para se adequar à sua ideia do que uma torre deve fazer.
Aqui está o pseudo código que acabei usando para o loop principal:
- Randomize tempo entre rajadas e tempo entre cada tiro individual.
- Randomize a posição inicial e final para cada servo, vert e hori.
- Randomize o número de fotos para tirar.
- Calcule o número de graus de mudança após cada disparo como a diferença entre as posições inicial e final dividida pelo número de disparos.
- Mova os servos para as posições iniciais e espere um pouco para eles chegarem lá (100ms)
- Faça um loop até que todas as tomadas tenham sido feitas, cada vez movendo os servos um pouco como calculado anteriormente; Mova e dispare, mova e dispare.
- Repetir.
Eu também adicionei um método separado fire () para estruturar o código um pouco melhor. Ajuste os intervalos de todas as funções random () para acelerar ou desacelerar cada parâmetro; ou aumentar o número de tiros para uma vibração mais dance club. Role para baixo para um vídeo do código em ação!
#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
Em ação
Eu não acho que há um uso prático para este brinquedinho, mas é muito divertido e há muitas variáveis que você pode ajustar para obter o efeito desejado. Talvez seja útil para um filme LEGO caseiro?