Вам скучно? Можно также построить лазерную башню. Вы знаете — тот, который идет на скамейке , стреляет красным лучом во многих разных направлениях и, возможно, даже бросает дымовую машину? Да, один из них.
Что тебе понадобится
- Arduino
- 2 сервопривода
- Лазерный модуль, например, один из этого комплекта датчиков
- Пьезо-зуммер или другое маленькое устройство вывода
- Металлическая проволока и кабельные стяжки для крепления
- Длинные женские-> мужские соединительные кабели, а также обычные соединительные кабели
По желанию, требуется дымовая установка — у лазера достаточно низкая мощность, поэтому вы не сможете увидеть луч без дыма даже в темной комнате.
План строительства
Основная идея турели состоит в том, чтобы поместить лазерный модуль поверх одного сервопривода, чтобы обеспечить горизонтальное вращение; затем установите этот пакет на другой сервопривод, расположенный под углом 90 градусов, чтобы обеспечить вертикальное перемещение. У нас есть пьезо, чтобы обеспечить звуковые эффекты, и я добавляю дымовую машину для хорошей меры.
Серво Тестирование
В зависимости от вашего сервопривода, провода могут быть окрашены по-разному, но в целом:
- Красный — это положительный провод, и на обоих моих сервоприводах он был центром трех — для подключения к шине + 5В.
- Коричневый или черный — это негатив, который должен быть подключен к GND на Arduino.
- Белый или оранжевый — это сигнальный провод, который нужно подключить к выводу цифрового ввода / вывода с ШИМ (9 и 10 в демонстрационном примере ниже).
После того, как вы подключите два сервопривода, загрузите следующий пример кода. Я назвал один сервопривод Hori для управления горизонтальным движением, а другой — Vert. Каждый должен выполнить полный диапазон движения (около 60 градусов, в моем случае).
#include <servo.h> 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 < 180; pos += 10) // goes from 0 degrees to 180 degrees { // in steps of 10 degrees vert.write(pos); hori.write(pos); // tell servo to go to position in variable 'pos' delay(100); // waits 100ms for the servo to reach the position } for(pos = 180; 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), чтобы выключить.
Полный пример кода, модифицированный для сканирования двух сервоприводов, включения лазера и воспроизведения раздражающего звука, можно найти здесь .
Все ваши компоненты должны работать — теперь нам нужно связать все это вместе.
Создание башни
Используя кабельные стяжки, прикрепите один сервопривод к другому; это не имеет значения, просто убедитесь, что один будет двигаться по горизонтали, а другой — по вертикали. Вы можете снять лезвие ротора и снова установить его во время тестирования, если угол не правильный.
Используйте жесткий провод для моделирования, чтобы прикрепить лазерный модуль к лезвию другого сервопривода, например:
Наконец, я прикрепил все это к ножке стола с еще большим количеством кабельных стяжек и небольшим количеством древесины.
Программирование башни
Я не знаю о вас, но моя идея лазерной башни основана на бесчисленном количестве научно-фантастических фильмов и эпизодов из «Звездного пути». Неизменно кто-то пролетит мимо башни, и маленькие выстрелы, сделанные на скамье подсудимых, будут лететь стремительными темпами, всегда на миллисекунды слишком медленно, поэтому наш главный герой на самом деле не попадет в цель. Это то, что я пытаюсь воспроизвести, хотя не стесняйтесь настраивать основной режим, чтобы соответствовать вашему представлению о том, что должна делать турель.
Вот псевдокод, который я использовал для основного цикла:
- Рандомизируйте время между очередями и время между каждым выстрелом.
- Произведите рандомизацию начальной и конечной позиции для каждого сервопривода, вертикали и горизонта.
- Случайное количество снимков, чтобы сделать.
- Определите количество степеней изменения после каждого выстрела как разницу между начальной и конечной позициями, деленную на количество выстрелов.
- Переместите сервоприводы в исходное положение и немного подождите, пока они достигнут (100 мс)
- Зацикливайтесь, пока не будут сделаны все снимки, каждый раз слегка перемещая сервоприводы, как рассчитывалось ранее; двигаться и стрелять, двигаться и стрелять.
- Повторение.
Я также добавил отдельный метод fire (), чтобы немного лучше структурировать код. Отрегулируйте диапазоны всех функций random () для ускорения или замедления каждого параметра; или увеличьте количество выстрелов для более энергичного танцевального клуба. Прокрутите вниз для видео кода в действии!
#include <servo.h> 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<numShots; shot++){ vert.write(vertStart); hori.write(horiStart); vertStart += vertChange;//increment the vert value for next time horiStart += horiChange; fire(); delay(timeBetweenShots); //add a bit of variety to the speed of shots } delay(timeBetweenBursts); } void fire(){ digitalWrite(laser,HIGH); analogWrite(buzzer,100); delay(20);//adjust this to change length of turret shot digitalWrite(laser,LOW); analogWrite(buzzer, 0); }
В бою
Я не думаю, что есть практическое применение для этой маленькой игрушки, но это очень весело, и есть множество переменных, которые можно настроить, чтобы получить желаемый эффект. Возможно, это пригодится для домашнего фильма LEGO?