Пью Пью! Как построить лазерную башню с Arduino

Вам скучно? Можно также построить лазерную башню. Вы знаете — тот, который идет на скамейке, стреляет красным лучом во многих разных направлениях и, возможно, даже бросает дымовую машину? Да, один из них.

Что тебе понадобится

  • Arduino
  • 2 сервопривода
  • Лазерный модуль, например, один из этого комплекта датчиков
  • Пьезо-зуммер или другое маленькое устройство вывода
  • Металлическая проволока и кабельные стяжки для крепления
  • Длинные женские-> мужские соединительные кабели, плюс обычные соединительные кабели

При желании требуется дымовая установка — лазер имеет довольно низкую мощность, поэтому вы не сможете увидеть луч без дыма даже в темной комнате.

компоненты

План строительства

Основная идея турели состоит в том, чтобы поместить лазерный модуль поверх одного сервопривода, чтобы обеспечить горизонтальное вращение; затем установите этот пакет на другой сервопривод, расположенный под углом 90 градусов, чтобы обеспечить вертикальное перемещение. У нас есть пьезо, чтобы обеспечить звуковые эффекты на скамье, и я добавляю дымовую машину для хорошей меры.

Серво Тестирование

В зависимости от вашего сервопривода, провода могут быть окрашены по-разному, но в целом:

  • Красный — это положительный провод, и на обоих моих сервоприводах он был центром трех — для подключения к шине + 5В.
  • Коричневый или черный — это негатив, который должен быть подключен к GND на Arduino.
  • Белый или оранжевый — это сигнальный провод, который нужно подключить к выводу цифрового ввода / вывода с ШИМ (9 и 10 в демонстрационном примере ниже).

После того, как вы подключите два сервопривода, загрузите следующий пример кода. Я назвал один сервопривод Hori для управления горизонтальным движением, а другой — Vert. Каждый должен выполнить полный диапазон движения (около 60 градусов, в моем случае).

#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
}
}

Все хорошо? Идем дальше.

Тестирование лазера и звука Pew Pew

Лазерный модуль похож на светодиод, но в него встроен резистор, поэтому мы можем подключить его непосредственно к цифровому вводу / выводу — очень просто. Если вы используете тот же лазерный модуль, что и я,Идет в GND, S переходит к контакту 12. Измените приведенный выше пример кода, чтобы сделать вывод 12 выводом:

int laser = 12;
pinMode(laser,OUTPUT);

Затем моргайте пальцем на каждой петле, используя стандартные digitalWrite () метод.

Мы просто используем PWM для управления пьезо-зуммером на комфортном уровне звука — вы можете поэкспериментировать с использованием библиотеки тонов, если хотите, но мне нужен простой шум. Подключите черный провод к земле, а красный провод к контакту 11. Определите зуммер на соответствующем выводе установите режим вывода и активируйте, используя analogWrite (зуммер, 100) (или любой номер, который вы хотите до 254); а также analogWrite (зуммер, 0) выключить.

Полный пример кода, модифицированный для сканирования двух сервоприводов, включения лазера и воспроизведения раздражающего звука, можно найти здесь.

Все ваши компоненты должны работать — теперь нам нужно связать все это вместе.

Создание башни

Используя кабельные стяжки, прикрепите один сервопривод к другому; это не имеет значения, просто убедитесь, что один будет двигаться по горизонтали, а другой — по вертикали. Вы можете снять лезвие ротора и снова установить его во время тестирования, если угол не правильный.

сервоприводы

Используйте жесткую модельную проволоку, чтобы прикрепить лазерный модуль к лезвию другого сервопривода, например так:

проволоки для лазера-модуля

Наконец, я прикрепил все это к ножке стола с еще большим количеством кабельных стяжек и небольшим количеством древесины.

присоединять-турель-к столу

Программирование башни

Я не знаю о вас, но мое представление о лазерной башне исходит из бесчисленного количества научно-фантастических фильмов и эпизодов из Star Trek. Неизменно кто-то пролетит мимо башни, и маленькие выстрелы, сделанные на скамье подсудимых, будут лететь стремительными темпами, всегда на миллисекунды слишком медленно, чтобы наш главный герой на самом деле не получил удар. Это то, что я пытаюсь воспроизвести, хотя не стесняйтесь настраивать основной режим, чтобы он соответствовал вашему представлению о том, что должна делать турель.

Вот псевдокод, который я использовал для основного цикла:

  • Рандомизируйте время между очередями и время между каждым выстрелом.
  • Произведите рандомизацию начальной и конечной позиции для каждого сервопривода, вертикали и горизонта.
  • Случайное количество снимков, чтобы сделать.
  • Определите количество степеней изменения после каждого выстрела как разницу между начальной и конечной позициями, деленную на количество выстрелов.
  • Переместите сервоприводы в исходное положение и немного подождите, пока они достигнут (100 мс)
  • Зацикливайтесь, пока не будут сделаны все снимки, каждый раз слегка перемещая сервоприводы, как рассчитывалось ранее; двигаться и стрелять, двигаться и стрелять.
  • Повторение.

Я также добавил отдельный Пожар() способ структурировать код немного лучше. Отрегулируйте диапазоны всех случайным образом () функции для ускорения или замедления каждого параметра; или увеличьте количество выстрелов для более энергичного танцевального клуба. Прокрутите вниз для видео кода в действии!

#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

В бою

Я не думаю, что есть практическое применение для этой маленькой игрушки, но это очень весело, и есть множество переменных, которые можно настроить, чтобы получить желаемый эффект. Возможно, это пригодится для домашнего фильма LEGO?

Ссылка на основную публикацию
Adblock
detector