
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?