Piu Piu! Como construir uma torre laser com um Arduino

Você está entediado? Pode também construir uma torre laser.

Você está entediado?  Pode também construir uma torre laser.
Propaganda

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.

componentes

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.

servos

Use um pouco de arame de modelagem para fixar o módulo de laser na lâmina do outro servo, assim:

fio-para-módulo-laser

Por fim, prendi a coisa toda a uma perna de mesa com ainda mais braçadeiras e um pedaço de madeira.

Anexar-torreta-para-mesa

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?

In this article