Пью Пью! Как Построить Лазерную Башню с Arduino

  • Mark Lucas
  • 0
  • 4266
  • 416
Реклама

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

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

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

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

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

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

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

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

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

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

# Включите Servo Vert, Hori; // создаем сервообъект для управления сервоприводом // можно создать максимум восемь сервообъектов int pos = 0; // переменная для хранения позиции сервопривода void setup () hori.attach (9); vert.attach (10); // присоединяет сервопривод на выводе 9,10 к сервообъектам vert.write (0); hori.write (0);  void loop () for (pos = 0; pos = 1; pos- = 10) // возвращается от 180 градусов к 0 градусам vert.write (pos); // сообщаем сервоприводу перейти в позицию в переменной 'pos' hori.write (pos); задержки (100); // ждет сервопривода 100 мс, чтобы достичь позиции 

Все хорошо? Двигаясь затем.

Тестирование лазера и Пью Пью звук

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

int laser = 12; pinMode (лазер, OUTPUT); 

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

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

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

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

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

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

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

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

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

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

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

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

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

# Включите Servo Vert, Hori; // создаем сервообъект для управления сервоприводом int pos = 0; // переменная для хранения позиции сервопривода int laser = 12; зуммер = 11; void setup () hori.attach (9); vert.attach (10); // присоединяет сервопривод на выводе 9 к сервообъекту pinMode (laser, OUTPUT); pinMode (зуммер, 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 (1180); int horiEnd = random (1 180); int numShots = random (5,20); int vertChange = (vertEnd - vertStart) / numShots; // на сколько нужно перемещать вертикальную ось каждым выстрелом int horiChange = (horiEnd - horiStart) / numShots; vert.write (vertStart); // сначала дайте ему добраться до начальной позиции, немного подождите hori.write (horiStart); задержки (100); для (int shot = 0; выстрел

В бою

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




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