Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Турель Talking Portal 2

Компоненты и расходные материалы

Arduino Nano R3
× 1

Необходимые инструменты и машины

3D-принтер (общий)

Об этом проекте

История

В это Рождество я решил спроектировать и построить рабочую башню Portal из игры Portal 2 . . Для меня это было упражнение по правильному моделированию всей сборки в Fusion 360, прежде чем что-либо строить. В этой конструкции используется Arduino Nano, микросхема MP3-плеера, датчик расстояния, сервоприводы, светодиоды и детали, напечатанные на 3D-принтере.

Цель заключалась в том, чтобы заставить его двигаться по трем "осям", используя звуковой сигнал из игры и светодиоды для имитации стрельбы.

  • Раскройте «крылья», если почувствуете кого-то впереди. Используйте кривошипно-шатунный механизм с ползунами просто потому, что.
  • Если человек все еще там после открытия, стреляйте, пока он не упадет. Светодиоды и звук пулемета.
  • Если человека больше нет, запустите небольшую процедуру поиска.
  • Закройте и ложитесь спать, пока не придет кто-нибудь другой.
  • Используйте звуки и голоса турелей портала из игры.

Я позволил себе некоторые вольности в дизайне, стараясь сделать его примерно таким же, как в игре, но функциональным и пригодным для печати. Найдя в Интернете несколько базовых эскизов, я начал моделировать и планировать ...

Звуки хранятся на карте microSD, доступной с обратной стороны, поэтому звуки можно обновить или изменить позже. Он находится на одной линии с черной полосой заполнения, что делает его практически невидимым после установки. 18 отдельных выражений и звуков, использованных в этом круге.

Лидарный датчик (времяпролетный) находится на микросхеме с прямоугольным профилем. После сборки этот датчик практически не виден спереди.

Шаг 1. Моделирование в Fusion 360

Дизайн начался с эскизов, найденных в Интернете. Используя эти изображения как холсты, я начал набрасывать контуры трех видов. Затем нужно было выдавить их в 3D, затем обработать общую форму и сделать надрезы. Вся электроника была построена в Fusion в виде компонентов, которые вставлялись и размещались там, где я думал, что это будет иметь смысл. Параметры движения были:

  • После полной сборки Arduino Nano должен иметь разъем, доступный для обновления.
  • Карта MicroSD должна быть доступна таким же образом и в идеале должна быть невидимой после установки.
  • Датчик времени пролета также должен быть невидимым.
  • Электрический разъем 2,1 мм для питания сзади.
  • Печатные детали должны быть как можно больше (а не много мелких деталей).
  • Печать без опор

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

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

Когда вся модель была построена и я был уверен, что она будет работать, и ее можно будет построить (напечатать) и собрать, я распечатал детали и построил прототип. Как только это сработало, я вернулся к модели и внес некоторые изменения, чтобы улучшить внешний вид и сборку (это слово?). Эта модель появилась в результате этих изменений.

Это было довольно утомительно, так как в этой штуке действительно не так много квадратных форм, и она закрывается довольно плотно, без реального доступа для настройки после сборки. Я довольно много узнал в этом проекте, например, об использовании встроенных компонентов в других компонентах. Это сделало управление и сохранение узловых узлов связанными для быстрого доступа. В конце концов, это того стоило!

Шаг 2. Детали, напечатанные на 3D-принтере

Portal turret v4.zip обновлен и должен содержать все печатные детали, необходимые для сборки последней версии турели.

--- новая "Задняя тестовая ножка". Не соответствует оригиналу, но он находится сзади и позволяет использовать прямой разъем mini-USB прямо вверх. ---

Они были напечатаны на Prusa Mk2 с использованием PLA для всех деталей. Ориентация печати должна быть довольно очевидной. Корпус был распечатан в вертикальном положении, без опор. По бокам есть большой зазор, который нужно закрыть, но у меня действительно не было больших проблем с довольно стандартными настройками, кроме выпуклости. Удары спереди и сзади можно практически устранить с помощью хорошей нити накала и некоторых хороших настроек печати. Я обнаружил, что 0,2 мм хорошо работает в слайсере и дает приличный результат. В теле рядом с заполняющей полосой стали появляться отверстия большего размера и отверстия.

Конструкция каналов и выступов выполнена с фаской под 45 градусов, поэтому «висячие в пространстве» элементы будут минимальными.

Мне нужно было немного почистить, чтобы собрать сборку. Полоски заполнения, которые вставляются в каналы, теперь довольно просты, с уменьшенной шириной и постоянной толщиной. Я думаю, что можно было бы использовать тонкий черный материал, разрезанный на полоски, вместо использования этих печатных частей (напечатанных на краю).

Единственная область, которая требует тонкости, - это штифты ползунка в рамке шага. Прямые штифты (гвозди) в просверленных отверстиях, проделанные сверлом 1/8 дюйма и небольшим количеством смазки, пригодятся.

Линза% 2Bv3b.stl Body-RHS% 2Bv4.stl Body-LHS% 2Bw% 2Bcomponents% 2Bv4.stl Крыло% 2BRH% 2Bbottom% 2Bv4.stl Крыло% 2BRH% 2Btop% 2Bv4.stl Крыло% 2BLH% 2Bbottom% 2Bv4.stl Крыло% 2BLH% 2Btop% 2Bv4.stl Шаг% 2BFrame% 2Bv4.stl Ветвь% 2B-% 2BREAR% 2Bv4.stl Заполнение% 2Bstrips% 2Bv3.stl Ветвь% 2B-% 2BREAR% 2Btest.stl Шаг% 2BFrame% 2B-% 2Bmodified% 2B1.stl крылья% 2Bv6.zip Arduino% 2BBase% 2Bw% 2BRadio.stl Портал% 2BTurret% 2Bv4.zip

Шаг 3. Компоненты

V4 (красная турель) имеет меньшую перемычку, требуются крылья v4 и рама Pitch.

v6 крылья являются an вариант это позволяет разные цветные «пушки». Я лично такого не делал, но все должно работать нормально.

Когда модель была завершена, и я был доволен своим прототипом, я напечатал Rev 2 с пластиковыми компонентами, как показано. Здесь все PLA, с черным и дизайнерским цветом (в данном случае синий), и крошечный кусочек полупрозрачного PLA для центральной линзы или лазерного глаза.

На этой фотографии хорошо запечатлены все компоненты, за исключением проводки.

Шаг 4. Электроника

В сборке используются следующие компоненты:

  • Ардуино Нано (1)
  • DFPlayer Mini MP3-плеер (или MP3-TF-16P) (1)
  • Времяпролетный датчик дальности VL53L0X (1)
  • Стандартные микросервоприводы SG90 (3)
  • 5-миллиметровые красные светодиоды (5)
  • Резисторы 220 Ом для светодиодов (5)
  • Резистор 1кОм (1)
  • Динамик 4 см, 4 Ом, 3 Вт (1)
  • Разъем питания 2,1 мм (1)
  • 3-дюймовые длинные обрамляющие гвозди (4)
  • Винты M2 x 6 (8)
  • Винты M2,5 x 8 (2)
  • винты M3 x 8 (4)
  • Винты M3 x 12 (4)
  • винты M3 x 16 (2)
  • термоусадочная пленка
  • маленькие завязки для галстуков

Все компоненты доступны на Arduino, Amazon, Banggood и других источниках.

Винты были взяты из ассортиментного набора. Иначе достать их - головная боль ...

Шаг 5:Механическая сборка

Большая часть механической сборки разумна. На распечатанных деталях в тех местах, где это необходимо, будут нарезаны отверстия большего размера, поэтому будет полезно быстро потянуть винт перед окончательной сборкой и упростить сборку привинченных компонентов.

Arduino и MP3-чип вставляются в подставку без аппаратного обеспечения. VL53LOX вставляется в переднюю часть корпуса без застежек. Сначала пробная установка, затем снятие и установка после подключения.

В качестве направляющих в сборке ползуна используются 4 обрамляющих гвоздя. Они примерно 1/8 дюйма в диаметре, с обрезанными головками. Они были взяты из полосы гвоздей DeWalt, используемых с их электрическим гвоздезабивателем. Излишне говорить, что гладкие гвозди просто необходимы.

Сервоприводы устанавливаются, как показано. Ориентация важна. Сервоприводы шага и поворота «центрируются» при установке на их части. Рукоятка установлена ​​таким образом, что в открытом положении она закрывается вращением против часовой стрелки, если смотреть спереди. Открытое положение - стержни и кривошип прямо на одной линии, с поворотом еще на 10 градусов до упора.

Сборка ноги - самая простая часть. 2-2,5 мм винта, с защелкивающимися колпачками на локтях каждой ноги. Используйте крепежные детали, которые не выступают над верхней частью опоры для ног. Таким образом, вращающееся тело не будет связываться, если вы настроите диапазон вращения.

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

В кривошипе используются более длинные винты 2,5 мм. Шатуны кривошипа не должны быть зажаты между половинками кривошипа. Фактически, вы можете попробовать использовать более короткие винты без детали Crank2. Это тоже должно сработать (надеюсь, здесь нет заметного крутящего момента, если крылья скользят свободно).

Динамик фиксируется сервоприводом (2 шт.), Который фиксирует динамик. Громкоговоритель между этими «ножками» и удерживается на месте, закрепляя их на сервоприводе шага. Затем этот сервопривод соединяется с узлом шага (ползуна), за которым следует узел кривошипа со стержнями. Все это собирается перед установкой в ​​левый корпус с помощью 4 небольших винтов.

После того, как основные внутренности установлены и временно размещены Arduino и MP3-плеер, начинается самое интересное - электромонтаж!

Шаг 6. Подключение

V5 - Радио вариант (фото красной башни). Сюда входит радиочип nRF24L01. Полностью меняет разводку выводов Arduino для обеспечения всех подключений. Подробности будут позже ...

Окончательная упаковка плотная, поэтому потратить некоторое время на определение длины проводов того стоит. Большинство соединительных проводов, которые у меня остались, были между 3–4 дюймами.

Светодиоды подключаются напрямую к резисторам 220 Ом, с последующей термоусадочной пленкой и скручиванием проводов, а затем откладываются в сторону после тестирования. Я использовал здесь проводку легкого калибра, так как у меня кое-что валялось (проводка связи типа CAT5), и я не хотел, чтобы видимая проводка была навязчивой.

Механические насадки имитируются в корпусе, затем выясняется прокладка проводов, затем резка и подготовка проводов.

Я построил серворазъемы так, чтобы я мог подключать и заменять сервоприводы, если я когда-нибудь что-то испортил и снял шестерни. Это определенно помогло после того, как я провалил первый прототип.

После того, как основная часть проводки была удовлетворена, светодиоды были припаяны в конце. Затем пришло время аккуратно запихнуть проводную сборку в одну половину корпуса. Последний шаг - припаять разъем питания к проводам питания, когда все будет внутри.

- Важное примечание:убедитесь, что провода, проложенные позади Nano, не нажимают на кнопку сброса !! Это, очевидно, вызовет проблемы и помешает правильной работе устройства. -

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

Шаг 7. Код Arduino

Обновленный код! Почистил и поправил.

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

Я структурировал код с помощью подпрограмм, которые вызываю по мере необходимости. Он сохраняет основной корпус в чистоте и мне очень помог, когда я экспериментировал с различными характеристиками. Это помогло мне манипулировать кодом для различных действий.

Я также заранее использовал множество переменных, которые, например, помогли мне настроить положение парковки и минимальный и максимальный диапазоны.

Я использовал в своем коде библиотеку DFMiniMP3. Я пробовал другие библиотеки, например, DFRobot, но у меня возникли проблемы, поэтому вернулся к этой. Это означало, что я должен был сохранить «статические пустоты», чтобы они оставались функциональными. Это не обязательно для работы, но я не главный программист. Я хотел бы услышать о другой библиотеке, столь же простой и изящной, как библиотека VL53LOX. Дайте мне знать, если найдете способ лучше!

Что касается звуков, реализация выполняется простым способом, имея папку с именем «mp3» на SD-карте с именами файлов 0001.mp3, 0002.mp3 и т. Д. Первые четыре цифры должны быть в этом формате, но вы можете добавить любой суффикс после этого, чтобы помочь идентифицировать конкретные звуки. См. Пример на https://www.dfrobot.com/blog-277.html. Я включил изображение своих имен файлов, используемых в папке. Цифры соответствуют выноскам в коде.

Звуковые файлы, которые я извлек со страницы Википедии о звуках Portal Turret. Код изображает случайный звуковой файл (1 из 2 или 3 звуков), чтобы файлы не устарели.

Шаг 8:Окончательная сборка корпуса

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

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

Я собрал пару штук вместе, и мне легче сначала соединить две половинки, а затем вставить полосы заполнения. Вставьте одну сторону в половину с «полкой», которая предотвращает падение полосы наполнителя, затем слегка подденьте и осторожно надавите. Теперь неплохо.

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

Шаг 9. Сборки крыльев

Теперь, когда корпус собран, и на крыльях торчат светодиоды, пришло время подготовить крылья и собрать их.

Крайне важно прорезать отверстия для ползунков сверлом 1/8 дюйма, а затем очистить их. Отрежьте головки от гвоздей, используя болторез, тиски, ножовку или другой инструмент для резки гвоздей. ) устанавливаются в крылья путем запрессовки их в каждую деталь крыла. Прямые, без заусенцев и заглаженные гвозди являются ключом к выполнению этой работы. Ползуны и отверстия крыльев необходимо смазать и проверить перед соединением шатунов и запуском. Рекомендуется использовать графит или другую смазку, подходящую для PLA. Я считаю, что небольшая тюбик личной смазки работает очень хорошо и стоит дешево. Она действительно гладкая. Также требуется немного "сплайна", когда ваш партнер или родитель входит и спрашивает, что именно вам это нужно на верстаке !!

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

Как только крылья готовы к работе, остается лишь вставить их на место, установить шатун над отверстием в крыле и собрать с помощью одного винта. Затем светодиоды вставляются в отверстия пистолета, провода заправляются напротив крыла, и все готово! Вы также можете использовать горячий клей, чтобы зафиксировать их на месте, когда все будет проверено.

Шаг 10:напугайте и шокируйте своих друзей !!

Последнее небольшое предостережение в отношении этой конструкции заключается в том, что угловая вилка - отличная идея, поскольку она не мешает задней ножке при повороте. Измененная задняя нога (v3) была растянута, чтобы освободить немного больше места.

После сборки и подключения (5 В или подходит для Nano) он будет тихо сидеть, пока кто-то не будет обнаружен в пределах запрограммированного расстояния, затем оживает и убивает любого, кто входит в его владения !!

Дайте мне знать, если вы создадите один (или несколько) и придумаете ли вы новые функции или концепции!

Код

  • Портальная турель с радио (КРАСНЫЙ)
Портальная турель с радио (КРАСНЫЙ) C / C ++
Код, используемый для башни. Это включает в себя код, который позволит управлять с помощью Master Turret Control, представленного на другой странице.
Различные варианты требуют настройки.
 /// * Portal Turret - опция с радио !! * Крис Новак - февраль 2019 г. * https://www.instructables.com/member/ChrisN219/ * https://create.arduino.cc/projecthub/Novachris/talking-portal-2-turret-gun-637bf3 * * Это Код включает в себя все функции, необходимые для работы в Cara Mia Opera, режиме разговора и ручном режиме, которые контролируются системой управления турелью Maseter (MTC). * MTC - это отдельный контроллер, включенный в другую сборку. Турель * будет работать автономно с использованием этого кода без MTC. * * Код построен для работы с тремя турелями, но каждая будет работать независимо. * Осталось много отладочного кода. Используйте или очистите по желанию. В основном он отлажен, * но не идеален. Учитывая цену, которую вы заплатили, я считаю, что это нормально!;) * =================КРАСНЫЙ ====================* / # include  #include  #include "Arduino.h" #include  #include  #include  #include  #include  # include  class Mp3Notify {public:static void OnError (uint8_t errorCode) {// см. DfMp3_Error для кода, означающего Serial.println (); Serial.print ("Ошибка связи"); Serial.println (код ошибки); } статическая пустота OnPlayFinished (uint8_t globalTrack) {Serial.println (); Serial.print («Игра закончена для #»); Serial.println (globalTrack); } static void OnCardOnline (код uint8_t) {Serial.println (); Serial.print («Карта онлайн»); Serial.println (код); } static void OnCardInserted (код uint8_t) {Serial.println (); Serial.print («Карта вставлена»); Serial.println (код); } static void OnCardRemoved (код uint8_t) {Serial.println (); Serial.print («Карта удалена»); Serial.println (код); }}; Servo servo_pivot; Servo servo_wings; Servo servo_pitch; VL53L0X sensor; // Настройка звуковой карты SoftwareSerial secondarySerial (4, 2); // RX, TXDFMiniMp3  mp3 (secondarySerial); // Настройка для радио RadioRF24 (10, 9); // nRF24L01 (CE, CSN) RF24Network network (радио); // Включаем радио в сетьconst uint64_t this_node =01; // Эта турель - красная - в восьмеричном формате (04 031 и т. Д.) Const uint64_t WHT =02; // Турель 02 - Whiteconst uint64_t BLU =03; // Турель 03 - Blueconst uint64_t MTC =00; // Управление главной турельюunsigned long previousMillis1 =0; unsigned long previousMillis2 =0; unsigned long previousMillis3 =0; байт LED_LH_up =A1; байт LED_LH_down =A2; байт LED_CENTRE =A3; байт LED_RH_up =7; байт LED_RH_down =8; байт LED_RH_down =8; байт LED_RH_down =8; байт 6; // whitebyte WINGS =3; // yellowbyte PITCH =5; // bluebyte parkPIVOT =96; // Меньшее число вращается по часовой стрелке, если смотреть из верхнего байта posPIVOT =96; byte maxPIVOT =116; byte minPIVOT =76; byte WINGclose =165; byte WINGopen =10; byte WINGpos =160; byte parkPITCH =86; byte posPITCH =86; byte maxPITCH =96; byte minPITCH =75; byte pos =90; byte pulse =20; byte pitchCW =1; byte pivotCW =1; byte randomWake; byte randomOpen; byte randomFalse; byte randomStart; byte randomDisengage; int triggerDistance =300; byte buttonStatus; byte busyRed =1; byte restModeWhite; byte goState; int x; int y; байт pb1State; // Firebyte pb2State; // произнести случайный комментарий byte pb3State; byte randomPic; // Полезная нагрузка от Master Turret Control (MTC) // int payload [] ={0, 1, 2, 3, 4, 5}; // int payload [] ={x , y, pb1State, pb2State, pb3State, goState}; int payload [6]; / * Это карта «разговора» для «времени разговора». * 0-99 =Высказывания Red Turret * 100-199 =Высказывания White Turret * 200-299 =Высказывания Blue Turret * Файлы на всех SD-картах сохраняются как 0-100. * Добавьте 100 к номеру файла для белого и 200 для синего. * Файл 204 будет СИНЕЙ турелью, номер файла 0004. * / int chatSayings [] ={0, // Начать паузу при i =0, за которой следуют «раунды» ... 204, 164, 25, // 1 205, 127, 76, // 2 208, 162, 65, // 3 143, 230, 23, // 4 130, 41, 225, // 5 153, 31, 133, // 6 234, 49, 155, / / 7 229, 175, 74, // 8 231, 58, 226, // 9 161, 223, 59, // 10 227, 68, 236, // 11 136, 50, 224, // 12 34, 160 , 78, // 13 222, 42 // End}; / * Это КРАСНАЯ и БЕЛАЯ временная карта турели. Они делятся высказываниями. * Эти тайминги соответствуют времени, необходимому * для воспроизведения отдельных высказываний в миллисекундах. * Измените высказывания, указанные выше, по желанию, но не меняйте время. * Например, при i =2 потребуется 0,8 секунды (NormalTimings [2]) * для воспроизведения файла chatSayings [2]. * / int NormalTimings [] ={1000, // Начало паузы при i =0, затем «раунды» ... 2600, 800, 2800, 900, 1700, 1600, 1300, 2500, 1400, 1900, // 1 - 101600, 2300, 800, 3000, 300, 100, 200, 0, 0, 300, // 11 - 20298000, 1300, 2600, 1300, 1400, 2100, 1900, 1600, 800, 1700, // 21 - 301100 , 1000, 1000, 2100, 1500, 1300, 1100, 800, 1200, 1000, // 31 - 402200, 1700, 1300, 1400, 1500, 1000, 2000, 500, 2700, 9000, // 41 - 501100, 1200 , 900, 2400, 1200, 1100, 2100, 2000, 2500, 1700, // 51 - 601100, 1000, 1100, 500, 1900, 0, 1300, 2100, 1700, 900, // 61 - 701100, 800, 1100 , 1700, 1100, 1100, 1500, 1500, 500, 900, // 71 - 802100 // 81}; / * Это СИНЯЯ временная карта турели. * Эти тайминги соответствуют времени, необходимому * для воспроизведения отдельных высказываний в секундах. * Например, при i =2 потребуется 0,9 секунды (DefectiveTimings [2]) * для воспроизведения файла chatSayings [2]. * / int DefectiveTimings [] ={1000, // Начало паузы при i =0, затем «раунды» ... 1700, 900, 2000, 600, 1100, 1800, 1900, 3000, 1500, 800, // 1 - 102100, 800, 1900, 900, 3200, 2700, 0, 0, 0, 2000, // 11 - 204400, 800, 3200, 900, 1400, 2000, 2100, 1200, 1300, 1000, // 21 - 301100 , 1400, 2100, 1000, 1600, 1000, 1200 // 31-40}; /////////////////////////////// //////////////////////////////////// // =======================НАСТРОЙКА ===================================///// ////////////////////////////////////////////////// ////////////// void setup () {secondarySerial.begin (9600); // Serial.begin (9600); // mp3.begin (); mp3.setVolume (22); Wire.begin (); SPI.begin (); // Настройка радио radio.begin (); radio.setPALevel (RF24_PA_LOW); // установить радио на низкое энергопотребление. Все рядом друг с другом radio.setDataRate (RF24_2MBPS); // Я считаю, что это лучше всего работает с несколькими радиомодулями network.begin (70, this_node); // (канал, адрес узла) sensor_read (); pinMode (LED_LH_up, ВЫХОД); pinMode (LED_LH_down, ВЫХОД); pinMode (LED_CENTRE, ВЫХОД); pinMode (LED_RH_up, ВЫХОД); pinMode (LED_RH_down, ВЫХОД); digitalWrite (LED_CENTRE, HIGH); activate_servos (); servo_wings.write (WINGopen); // открываем крылья servo_pivot.write (parkPIVOT); // поворотная точка парковки servo_pitch.write (parkPITCH); // парковать высоту randomWake =random (1, 3); mp3.playMp3FolderTrack (1); // играем пробуждение с задержкой комментария (2000); servo_wings.write (WINGclose); // закрытие крыльев delay (1500); digitalWrite (LED_CENTRE, LOW); Turn_off_servos (); busyRed =0;} ///////////////////////////////////////////// //////////////////////// =======================MAIN LOOP =============================////////////////////// /////////////////////////////////////////////// void loop ( ) {while (sensor.readRangeSingleMillimeters ()> triggerDistance) {// ничего перед датчиком, ничего не делаем ReadNet (); WriteNet (); output_sensor (); if (payload [5] ==1) {// Условия, используемые с MTC. Турель будет работать автоматически без задержки MTC (500); WriteNet (); Cara_Mia (); // Время оперы !! } иначе, если (полезная нагрузка [5] ==2) {задержка (500); WriteNet (); Chatty_time (); // Болтать !!} ReadNet (); } иначе, если (полезная нагрузка [5] ==3) {задержка (500); WriteNet (); Ручное управление (); // Ручное управление}} if (sensor.readRangeSingleMillimeters ()  triggerDistance) {// открылся, и человек ушел falseActivate (); // скажем "куда ты пошел?" комментарий и задержка крупным планом (2000); scanArea (); // сканирование местности} else {// кто-то определенно там - открыть огонь !! привлекать(); задержка (2400); for (int j =0; j <=2; j ++) {if (sensor.readRangeSingleMillimeters ()  =maxPIVOT) pivotCW =0; если (posPIVOT <=minPIVOT) pivotCW =1; если (posPITCH> =maxPITCH) pitchCW =0; if (posPITCH <=minPITCH) pitchCW =1;} ////////////////////////////////////// /////////////////////////////// =======================АКТИВИРОВАТЬ ==============================/////////////// ////////////////////////////////////////////////// //// void activate () {// распахнуть крылья и сказать что-нибудь busyRed =1; ReadNet (); WriteNet (); output_sensor (); digitalWrite (LED_CENTRE, HIGH); // светодиодный глаз на randomOpen =random (3, 6); // выбираем случайный открывающий комментарий mp3.playMp3FolderTrack (randomOpen); // проигрываем случайный комментарий «Я вижу тебя» servo_wings.write (WINGopen); // открываем крылья output_sensor (); delay (3400);} //////////////////////////////////////////// ///////////////////////// ====================ЛОЖНАЯ АКТИВАЦИЯ ============================///////////////////////// //////////////////////////////////////////// void falseActivate () {/ / busyRed =1; ReadNet (); WriteNet (); output_sensor (); randomFalse =random (6, 9); // выбираем случайный начальный комментарий mp3.playMp3FolderTrack (randomFalse); // воспроизведение в случайном порядке "куда вы пошли?" comment delay (1800);}/////////////////////////////////////////////////////////////////////=======================SCAN AREA =============================/////////////////////////////////////////////////////////////////////void scanArea(){ // continue scanning for a bit after falseActivate busyRed =1; ReadNet(); WriteNet(); output_sensor(); mp3.playMp3FolderTrack(2); // "searching..." servo_pitch.write(parkPITCH); delay(1600); servo_pitch.detach(); servo_wings.detach(); mp3.playMp3FolderTrack(21); for (int i=0; i <=220; i++){ //scan for a little bit... output_sensor(); if (pivotCW ==0) posPIVOT =posPIVOT - 1; // increment one step CW if CW =0 if (pivotCW ==1) posPIVOT =posPIVOT + 1; // otherwise go one step other direction if (posPIVOT>=maxPIVOT) pivotCW =0; // if max rotation clockwise, switch to counterclockwise if (posPIVOT <=minPIVOT) pivotCW =1; // if min rotation counterclockwise,switch to clockwise servo_pivot.write(posPIVOT); if (sensor.readRangeSingleMillimeters()=(850 + (i * 100))) { // 1050 randomWingPos =random(10 + (i*20), (60 + (i*20))); servo_wings.write(randomWingPos); previousMillis1 =millis(); } } } disengage(); busyRed =0; goState =0; mp3.stop(); ReadNet(); delay(1000);}/////////////////////////////////////////////////////////////////// //=======================CHATTY TIME ===========================/////////////////////////////////////////////////////////////////////void Chatty_time(){ busyRed =1; WriteNet(); int я =0; int talk; int saying; int timeadder =750; int talkTime =NormalTimings[i]; int randomPivotPos; activate_servos(); servo_wings.write(WINGopen); digitalWrite(LED_CENTRE, HIGH); do { ReadNet(); WriteNet(); //output_sensor(); // used for debugging... if (i>=43) { // end of sequence busyRed =0; WriteNet(); disengage(); возвращение; } unsigned long currentMillis =millis(); // grab current time if ((unsigned long)(currentMillis - previousMillis3)>=talkTime) { if (chatSayings[i] <100) { // RED Turret talking talk =chatSayings[i]; saying =chatSayings[i]; talkTime =(NormalTimings[saying] + timeadder); } else if ((chatSayings[i]> 99) &&(chatSayings[i] <200)) { // WHITE turret talking talk =0; saying =chatSayings[i] - 100; talkTime =(NormalTimings[saying] + timeadder); } else { // BLUE turret talking talk =0; saying =chatSayings[i] - 200; // sound file # of BLUE talkTime =(DefectiveTimings[saying] + timeadder); // Time for that saying } if (talk ==0) { digitalWrite(LED_CENTRE, LOW); } else { digitalWrite(LED_CENTRE, HIGH); mp3.playMp3FolderTrack(talk); } randomPivotPos =random(minPIVOT, maxPIVOT); servo_pivot.write(randomPivotPos); Serial.println (); Serial.print(F("i:")); Serial.print (i); Serial.print ("\t"); Serial.print(F("chatSayings[i] ")); Serial.print (chatSayings[i]); Serial.print ("\t"); Serial.print(F("Saying ")); Serial.print (saying); Serial.print ("\t"); Serial.print(F("talk ")); Serial.print (talk); Serial.print ("\t"); Serial.print(F("chat time ")); Serial.print (talkTime); Serial.print ("\t"); Serial.print(F("busyRed:"));Serial.print (busyRed); Serial.print (" "); previousMillis3 =millis(); я ++; } } while (payload[4] ==1); busyRed =0; WriteNet(); digitalWrite(LED_CENTRE, LOW); disengage();}/////////////////////////////////////////////////////////////////// //=======================MANUAL CONTROL =======================/////////////////////////////////////////////////////////////////////void ManualControl(){ int servoWings; int servoPitch; int servoPivot; activate_servos(); servo_wings.write(WINGopen); digitalWrite(LED_CENTRE, HIGH); ReadNet(); do { output_sensor(); ReadNet(); servoPivot =map(payload[0], 1023, 0, minPIVOT, maxPIVOT); servoPitch =map(payload[1], 1023, 0, minPITCH, maxPITCH); servo_pivot.write(servoPivot); servo_pitch.write(servoPitch); unsigned long currentMillis =millis(); // grab current time if (payload[3] ==0) { if ((unsigned long)(currentMillis - previousMillis1)>=2500) { randomPic =random(1, 20); mp3.playMp3FolderTrack(randomPic); previousMillis1 =millis(); } } if (payload[2] ==0){ fire(); } } while (payload[5] ==3); disengage(); busyRed =0; WriteNet(); digitalWrite(LED_CENTRE, LOW); }/////////////////////////////////////////////////////////////////////=========================RECEIVING ===========================/////////////////////////////////////////////////////////////////////void ReadNet(){ network.update(); if ( network.available() ) { RF24NetworkHeader header; network.peek(header); network.read(header, &payload, sizeof(payload));} // Read the package }/////////////////////////////////////////////////////////////////////=========================SENDING =============================/////////////////////////////////////////////////////////////////////void WriteNet(){ network.update(); RF24NetworkHeader header4(MTC); bool ok4 =network.write(header4, &busyRed, sizeof(busyRed));/* if (ok4) { // used for debugging... Serial.print("MTC ok4 ");} else { Serial.print("------- ");} */}

Изготовленные на заказ детали и корпуса

Lens%2Bv3b.stl Body-RHS%2Bv4.stl Body-LHS%2Bw%2Bcomponents%2Bv4.stl Wing%2BRH%2Bbottom%2Bv4.stl Wing%2BRH%2Btop%2Bv4.stl Wing%2BLH%2Bbottom%2Bv4.stl Wing%2BLH%2Btop%2Bv4.stl Pitch%2BFrame%2Bv4.stl Leg%2B-%2BREAR%2Bv4.stl Infill%2Bstrips%2Bv3.stl Leg%2B-%2BREAR%2Btest.stl Pitch%2BFrame%2B-%2Bmodified%2B1.stl Arduino%2BBase%2Bw%2BRadio.stl

Схема

Schematic that I made for building the turret.

Производственный процесс

  1. Янтарный
  2. Гильотина
  3. Надгробие
  4. Купальник
  5. Кремний
  6. Водка
  7. Карусель
  8. Диван
  9. Железо
  10. Endworking Turret сокращает время цикла