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

Игра Giant Animatronics Lego Minfig Operation Game

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

Arduino UNO
× 2
Adafruit Arduino MP3 Shield
× 1
MG90S Gear Micro Servo
× 6
Динамик:3 Вт, 4 Ом
× 2
Шарикоподшипник OpenBuilds - 688Z 8x16x5
× 12

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

FDM-принтер Lulzbot Taz 5
X-Carve CNC

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

Этот проект реализован в 4 этапа. Я быстро расскажу о первых трех этапах (которые не содержали электроники) и подробно расскажу о четырех этапах, на которых Фрэнк превращался в рабочую игру и добавлял аудио и аниматронику.

Этап 1. Создание мегафигов

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

Следующим было изготовление головы. Он изготовлен из трубы ПВХ (большой фитинг для основной части головы), МДФ и смолы для заполнения пустоты в верхнем выступе.

Корпус мегафигов был сделан из МДФ и имел довольно простую коробочную конструкцию. Фитинги из ПВХ используются в качестве соединений между придатками и туловищем

Ножки изготовлены из МДФ и ПВХ для определения изгиба верхних ножек.

Руки (которые оказались самой сложной частью) были обработаны трубкой из ПВХ для предплечья и МДФ для предплечья. В качестве наполнителя пространства использовалась цветочная пена. Bondo был использован для создания формы плеча, а тонны шлифовки и шпатлевки привели его к окончательной форме.

Руки и кисти были отлиты и отлиты из Smoothcast 300.

Все расписано на основе набора Лего Monster Hunters.

Этап 2:волосы

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

Вся часть волос была покрыта Smoothcast 300, чтобы создать пластиковую оболочку над пеной. затем его отшлифовали и залили.

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

Загрунтовали и покрасили.

Фаза 3:Кровать Фрэнка

Третьим этапом было строительство кровати Фрэнка на основе «Безумного ученого» и его набора «Монстр Лего». Это простая коробчатая конструкция из МДФ и трубы ПВХ для выступов.

Угловые детали были созданы из трубы ПВХ, зажатой между диском из МДФ.

Все отшлифовано, загрунтовано и покрашено.

Этап 4:Операционная игра и движение

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

Торс:

На торсе были напечатанные на 3D-принтере кронштейны, добавленные к суставам, на которых держались 2 подшипника роликовых коньков. Они служат опорой для рук и головы.

На верхней части тела Фрэнка были две формы для конфет, которые были напечатаны на 3D-принтере, увенчаны фрезерованными алюминиевыми губами и покрыты новой пластиной торса. Алюминиевые губы служат переключателем для операционной игры. Когда клещи (которые подключены к экрану MP3) касаются алюминия, он замыкает цепь, активируя программу.

Руководители:

Обе головки были модифицированы для перемещения и удержания динамиков. Сначала к шее был добавлен кронштейн, напечатанный на 3D-принтере, чтобы удерживать болт 5/16, который действует как ось.

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

Кронштейн, напечатанный на 3D-принтере, был создан для крепления динамиков за решетками.

Ноги:

Новые ножки были напечатаны на 3D-принтере в виде двух половинок, а также конфетницы в форме кости. Алюминиевая пластина была фрезерована наподобие туловища. Ножки склеили, отшлифовали, загладили бондо и покрасили.

Руки:

Оригинальный образец для рук был изменен, чтобы принять кронштейн, напечатанный на 3D-принтере, который имел 5/16 жирного шрифта для оси. Затем их переделали, отлили, очистили и раскрасили.

Сервоприводы:

Сервоприводы были установлены с помощью кронштейнов, напечатанных на 3D-принтере, и подключены к отросткам с помощью провода, а алюминиевый рожок прикрепил болты 5/16. Позже были добавлены пружины, помогающие поднимать руки.

Электроника:

Вся электроника была смонтирована на куске МДФ для создания испытательного стенда прототипа. Эта установка позволила мне и Дэниелу разобраться в программировании, настроить материал и устранить сбои. Все прошло хорошо.

Электроника работает

1:экран MP3 ожидает 1 из 3 входов (клещи на одну из алюминиевых пластин)

2:Когда активирована алюминиевая пластина, экран MP3 воспроизводит соответствующий файл MP3 и отправляет сигнал на сервопривод Arduino.

3:Когда серво Arduino получает сигнал от экрана MP3, он запускает соответствующий код для сервоприводов.

Оба ардуина были прикреплены к изнаночной стороне кровати Фрэнка, и все было переделано.

Готовы к хитрости или обману:

Все работает фантастически и выдерживает целую ночь оскорблений.

Для более подробного журнала сборки посетите ... http://www.therpf.com/showthread.php?t=195101. Там я подробно описал каждый шаг по мере его создания.

Код

  • Сервоприводы
  • Звуковые эффекты
Сервоприводы Arduino
Этот код загружается в Arduino uno, который управляет всеми 6 серводвигателями. Обычно он ожидает получения одного из 3 сигналов от экрана MP3. Когда сигнал получен, сервопривод Arduino Uno выполняет соответствующие перемещения сервопривода.
 / *************************** Targus - Эксплуатация - Сервоприводы ***************************** // ****** Примечания ******* // / Цифровые контакты 0 и 1 обычно используются для последовательной связи при загрузке и мониторинге Arduino с компьютера. // Цифровые контакты 0 и 1 могут использоваться для сервоприводов, если Arduino не подключен к компьютеру. // Если цифровые контакты 0 и 1 используются для сервоприводов, закомментируйте любые строки, начинающиеся с «Serial». в этом файле. // Убедитесь, что этот Arduino включен раньше другого Arduino, поскольку этот Arduino будет получать сигналы 5 В. // Убедитесь, что провод GND на этом Arduino подключен к GND на другом Arduino. /**** ***** Включает ********** / # include  / ********** Переменные *********** / Servo servo5; Servo servo6; Servo servo7; Servo servo8; Servo servo9; Servo servo10; Servo servo11; int pin2 =2; int pin3 =3; int pin4 =4; / ************** Arduino Настройка *************** / void setup () {Serial.begin (9600); // включение последовательной связи для разработки и устранения неполадок Serial.println ("Targus - Operation - Servos \ n"); / **************************************** Подключите сервоприводы и установите начальные положения ** *************************************** / servo5.attach (5); // цифровой вывод 5 servo5.write (90); // переходим на 90 градусов servo6.attach (6); // цифровой вывод 6 servo6.write (90); servo7.attach (7); // цифровой вывод 7 servo7.write (90); servo8.attach (8); // цифровой вывод 8 servo8.write (90); servo9.attach (9); // цифровой вывод 9 servo9.write (80); servo10.attach (10); // цифровой вывод 10 servo10.write (90); servo11.attach (11); // цифровой вывод 11 servo11.write (80); / ************************ Настройка цифровых входных контактов ******************** ****** / // Настройте входные контакты, чтобы Arduino со звуковыми эффектами сообщал нам, когда активировать сервоприводы. pinMode (pin2, INPUT_PULLUP); pinMode (pin3, INPUT_PULLUP); pinMode (pin4, INPUT_PULLUP);} / ************* Цикл Arduino ************** / void loop () {if (digitalRead (pin2) ==ВЫСОКИЙ) {zap2 (); } иначе, если (digitalRead (pin3) ==HIGH) {zap3 (); } иначе, если (digitalRead (pin4) ==HIGH) {zap4 (); } delay (300);} / ********** Функции *********** / int moveServo (Servo &servo, int degreeStart, int degreeEnd, unsigned long timeEnd, unsigned long timeStart , float (* easing) (float), unsigned long timeNow) {// эта функция вернет число 1, если еще предстоит работа timeEnd + =timeStart; // добавляем задержку ко времени окончания if (timeNow  timeEnd) {// фаза движения сервопривода завершена, делать нечего return 0; } // если мы зайдем так далеко, подготовимся к перемещению сервопривода float percentToMove =float (timeNow - timeStart) / float (timeEnd - timeStart); percentToMove =замедление (percentToMove); // отображать диапазоны градусов от 0-180 до 500-2400 микросекунд для SG-92R http://www.servodatabase.com/servo/towerpro/sg92r degreeStart =map (degreeStart, 0, 180, 500, 2400); градусEnd =карта (градусEnd, 0, 180, 500, 2400); float servoTo =0; if (СтепеньEnd> СтепеньСтарт) {// вращаемся против часовой стрелки servoTo =((СтепеньЭнд - СтепеньСтарт) * процентToMove) + СтепеньСтарт; } else {// повернуть по часовой стрелке percentToMove =1 - percentToMove; // обратный процент, поэтому значения вроде 0,8 становятся 0,2 servoTo =((degStart - degreeEnd) * percentToMove) + degreeEnd; } servo.writeMicroseconds (servoTo); // Serial.print ("Будет отображаться на:"); Serial.println (servoTo); // Serial.print ("degreeStart:"); Serial.println (degStart); // Serial.print ("degreeEnd:"); Serial.println (степеньEnd); // Serial.print ("timeEnd:"); Serial.println (timeEnd); // Serial.print ("timeStart:"); Serial.println (timeStart); // Serial.print ("timeNow:"); Serial.println (время сейчас); // Serial.print ("percentToMove:"); Serial.println (percentToMove); // Serial.print ("servoTo:"); Serial.println (servoTo); // Serial.print ("\ n"); return 1;} / ****************** Функции:сглаживание ******************* /// Функции сглаживания с https://github.com/warrenm/AHEasing/blob/master/AHEasing/easing.c переименован в соответствии с http://easings.net/ для облегчения предварительного просмотра. float easyInBack (float pos) {// Моделируется после превышения cubic y =x ^ 3-x * sin (x * pi) return pos * pos * pos - pos * sin (pos * M_PI);} float easyOutBack (float pos) {// Моделируется после выхода за пределы кубического y =1- ( (1-x) ^ 3- (1-x) * sin ((1-x) * pi)) float f =(1 - pos); return 1 - (f * f * f - f * sin (f * M_PI));} float easyInOutBack (float pos) {// Смоделировано на основе кубической функции кусочного выхода за пределы:// y =(1/2) * (( 2x) ^ 3- (2x) * sin (2 * x * pi)); [0, 0,5) // y =(1/2) * (1 - ((1-x) ^ 3- (1-x) * sin ((1-x) * pi)) + 1); [0,5, 1] ​​if (pos <0,5) {float f =2 * pos; return 0.5 * (f * f * f - f * sin (f * M_PI)); } else {float f =(1 - (2 * pos - 1)); return 0.5 * (1 - (f * f * f - f * sin (f * M_PI))) + 0.5; }} float easyInBounce (float pos) {return 1 - easyOutBounce (1 - pos);} float easyOutBounce (float pos) {if (pos <4 / 11.0) {return (121 * pos * pos) / 16.0; } else if (pos <8 / 11.0) {return (363 / 40.0 * pos * pos) - (99 / 10.0 * pos) + 17 / 5.0; } else if (pos <9 / 10.0) {return (4356 / 361.0 * pos * pos) - (35442 / 1805.0 * pos) + 16061 / 1805.0; } else {return (54 / 5.0 * pos * pos) - (513 / 25.0 * pos) + 268 / 25.0; }} float easyInOutBounce (float pos) {if (pos <0,5) {return 0,5 * easyInBounce (pos * 2); } else {return 0,5 * easyOutBounce (pos * 2 - 1) + 0,5; }} float easyInCirc (float pos) {// Моделируется после сдвига четвертого квадранта единичной окружности return 1 - sqrt (1 - (pos * pos));} float easyOutCirc (float pos) {// Моделируется после сдвига второго квадранта единицы circle return sqrt ((2 - pos) * pos);} float easyInOutCirc (float pos) {// Моделируется на основе кусочно-круговой функции // y =(1/2) (1 - sqrt (1 - 4x ^ 2)); [0, 0.5) // y =(1/2) (sqrt (- (2x - 3) * (2x - 1)) + 1); [0,5, 1] ​​if (pos <0,5) {return 0,5 * (1 - sqrt (1 - 4 * (pos * pos))); } else {return 0.5 * (sqrt (- ((2 * pos) - 3) * ((2 * pos) - 1)) + 1); }} float easyInCubic (float pos) {// Смоделировано по кубической y =x ^ 3 return pos * pos * pos;} float easyOutCubic (float pos) {// Смоделировано по кубической y =(x - 1) ^ 3 + 1 поплавок f =(pos - 1); return f * f * f + 1;} float easyInOutCubic (float pos) {// Моделируется на основе кусочно-кубической // y =(1/2) ((2x) ^ 3); [0, 0.5) // y =(1/2) ((2x-2) ^ 3 + 2); [0,5, 1] ​​if (pos <0,5) {return 4 * pos * pos * pos; } else {float f =((2 * pos) - 2); return 0.5 * f * f * f + 1; }} float easyInElastic (float pos) {// Моделируется после затухающей синусоидальной волны y =sin (13pi / 2 * x) * pow (2, 10 * (x - 1)) return sin (13 * M_PI_2 * pos) * pow (2, 10 * (pos - 1));} float easyOutElastic (float pos) {// Моделируется после затухающей синусоидальной волны y =sin (-13pi / 2 * (x + 1)) * pow (2, - 10x) + 1 return sin (-13 * M_PI_2 * (pos + 1)) * pow (2, -10 * pos) + 1;} float easyInOutElastic (float pos) {// Моделируется на основе кусочно экспоненциально затухающей синусоидальной волны :// y =(1/2) * sin (13pi / 2 * (2 * x)) * pow (2, 10 * ((2 * x) - 1)); [0,0.5) // y =(1/2) * (sin (-13pi / 2 * ((2x-1) +1)) * pow (2, -10 (2 * x-1)) + 2 ); [0,5, 1] ​​if (pos <0,5) {return 0,5 * sin (13 * M_PI_2 * (2 * pos)) * pow (2, 10 * ((2 * pos) - 1)); } else {return 0.5 * (sin (-13 * M_PI_2 * ((2 * pos - 1) + 1)) * pow (2, -10 * (2 * pos - 1)) + 2); }} float easyInExpo (float pos) {// Смоделировано по экспоненциальной функции y =2 ^ (10 (x - 1)) return (pos ==0.0)? pos:pow (2, 10 * (pos - 1));} float easyOutExpo (float pos) {// Смоделировано по экспоненциальной функции y =-2 ^ (- 10x) + 1 return (pos ==1.0)? pos:1 - pow (2, -10 * pos);} float easyInOutExpo (float pos) {// Моделируется на основе кусочной экспоненты // y =(1/2) 2 ^ (10 (2x - 1)); [0,0.5) // y =- (1/2) * 2 ^ (- 10 (2x - 1))) + 1; [0.5,1] if (pos ==0.0 || pos ==1.0) return pos; if (pos <0.5) {return 0.5 * pow (2, (20 * pos) - 10); } else {return -0.5 * pow (2, (-20 * pos) + 10) + 1; }} float linear (float pos) {return pos;} float easyInQuad (float pos) {// Моделируется по параболе y =x ^ 2 return pos * pos;} float easyOutQuad (float pos) {// Моделируется по параболе y =-x ^ 2 + 2x return - (pos * (pos - 2));} float easyInOutQuad (float pos) {// Моделируется по кусочно-квадратичной // y =(1/2) ((2x) ^ 2 ); [0, 0.5) // y =- (1/2) ((2x-1) * (2x-3) - 1); [0,5, 1] ​​if (pos <0,5) {return 2 * pos * pos; } else {return (-2 * pos * pos) + (4 * pos) - 1; }} float easyInQuart (float pos) {// Смоделировано после четверти x ^ 4 return pos * pos * pos * pos;} float easyOutQuart (float pos) {// Смоделировано после четверти y =1 - (x - 1) ^ 4 float f =(pos - 1); return f * f * f * (1 - pos) + 1;} float easyInOutQuart (float pos) {// Моделируется по кусочной четверти // y =(1/2) ((2x) ^ 4); [0, 0.5) // y =- (1/2) ((2x-2) ^ 4-2); [0,5, 1] ​​if (pos <0,5) {return 8 * pos * pos * pos * pos; } else {float f =(pos - 1); return -8 * f * f * f * f + 1; }} float easyInQuint (float pos) {// Смоделировано по квинтике y =x ^ 5 return pos * pos * pos * pos * pos;} float easyOutQuint (float pos) {// Смоделировано по квинтике y =(x - 1) ^ 5 + 1 с плавающей запятой f =(pos - 1); return f * f * f * f * f + 1;} float easyInOutQuint (float pos) {// Смоделировано после кусочно-пятой // y =(1/2) ((2x) ^ 5); [0, 0.5) // y =(1/2) ((2x-2) ^ 5 + 2); [0,5, 1] ​​if (pos <0,5) {return 16 * pos * pos * pos * pos * pos; } else {float f =((2 * pos) - 2); return 0.5 * f * f * f * f * f + 1; }} float easyInSine (float pos) {// Моделируется после четверти цикла синусоидальной волны return sin ((pos - 1) * M_PI_2) + 1;} float easyOutSine (float pos) {// Моделируется после четверти цикла синусоиды wave (другая фаза) return sin (pos * M_PI_2);} float easyInOutSine (float pos) {// Моделируется после возврата половины синусоидальной волны 0.5 * (1 - cos (pos * M_PI));} / ****** ********* Функции:Zap **************** // ****** Zap 2 ******* / void zap2 () {Serial.println («ZAP 2 вызван!»); // Косточка без знака long timeStart =millis (); int todo; do {unsigned long timeNow =millis () - timeStart; todo =0; // M Leg Kick // todo + =moveServo (servo5, 90, 50, 100, 0, easyInOutCubic, timeNow); // перемещаем servo5 от 90 до 180 градусов на 1 секунду после задержки в 0 секунд // todo + =moveServo (servo5, 50, 90, 500, 500, easyOutBounce, timeNow); // перемещаем servo5 от 180 до 90 градусов на 1 секунду после задержки в 1 секунду // M Из стороны в сторону todo + =moveServo (servo7, 90, 110, 500,0, easyInOutCubic, timeNow); // перемещаем servo7 от 90 до 180 градусов на 1 секунду после 0 секунд задержки todo + =moveServo (servo7, 110, 70, 500, 500, easyInOutCubic, timeNow); // перемещаем servo7 от 180 до 90 градусов на 1 секунду после задержки в 1 секунду todo + =moveServo (servo7, 70, 110, 500, 1000, easyInOutCubic, timeNow); todo + =moveServo (servo7, 110, 70, 500, 1500, easyInOutCubic, timeNow); todo + =moveServo (servo7, 70, 110, 500, 2000, easyInOutCubic, timeNow); todo + =moveServo (servo7, 110, 70, 500, 2500, easyInOutCubic, timeNow); todo + =moveServo (servo7, 70, 90, 500, 3000, easyInOutCubic, timeNow); // M левая рука вверх и вниз todo + =moveServo (servo8, 90, 170, 1000, 0, easyInOutCubic, timeNow); // перемещаем servo8 от 90 до 180 градусов на 1 секунду после 0 секунд задержки todo + =moveServo (servo8, 170, 90, 1000, 4000, easyOutBounce, timeNow); // перемещаем servo8 от 180 до 90 градусов на 1 секунду после задержки в 1 секунду // M правая рука вверх и вниз todo + =moveServo (servo6, 90, 130, 1000, 1500, easyInOutCubic, timeNow); // перемещаем servo8 от 90 до 180 градусов на 1 секунду после задержки в 0 секунд todo + =moveServo (servo6, 130, 90, 1000, 5000, easyOutBounce, timeNow); // перемещаем servo8 от 180 до 90 градусов на 1 секунду после задержки в 1 секунду // S Из стороны в сторону todo + =moveServo (servo10, 90, 40, 1000, 500, easyInOutCubic, timeNow); // перемещаем servo7 от 90 до 180 градусов на 1 секунду после задержки 0 секунд todo + =moveServo (servo10, 40, 105, 1000, 2000, easyInOutCubic, timeNow); // перемещаем servo7 от 180 до 90 градусов на 1 секунду после задержки в 1 секунду todo + =moveServo (servo10, 105, 90, 1000, 6000, easyInOutCubic, timeNow); // S левая рука вверх и вниз todo + =moveServo (servo11, 80, 160, 1000, 2000, easyInOutCubic, timeNow); // перемещаем servo8 от 90 до 180 градусов на 1 секунду после задержки в 0 секунд todo + =moveServo (servo11, 160, 80, 1000, 5000, easyInOutCubic, timeNow); // перемещаем servo8 от 180 до 90 градусов на 1 секунду после задержки в 1 секунду // S правая рука вверх и вниз todo + =moveServo (servo9, 80, 20, 1000, 1000, easyInOutCubic, timeNow); // перемещаем servo8 от 90 до 180 градусов на 1 секунду после задержки в 0 секунд todo + =moveServo (servo9, 20, 80, 1000, 2000, easyInOutCubic, timeNow); // перемещаем servo8 от 180 до 90 градусов на 1 секунду после задержки в 1 секунду (20); } while (todo> 0);} / ****** Zap 3 ******* / void zap3 () {Serial.println ("ZAP 3 вызван!"); беззнаковый длинный timeStart =millis (); int todo; do {unsigned long timeNow =millis () - timeStart; todo =0; // M Из стороны в сторону todo + =moveServo (servo7, 90, 130, 1000, 0, easyInOutCubic, timeNow); // перемещаем servo7 от 90 до 180 градусов на 1 секунду после задержки в 0 секунд todo + =moveServo (servo7, 130, 90, 1000, 5000, easyInOutCubic, timeNow); // перемещаем servo7 от 180 до 90 градусов на 1 секунду после задержки в 1 секунду // M левая рука вверх и вниз todo + =moveServo (servo8, 90, 170, 1000, 0, easyInOutCubic, timeNow); // перемещаем servo8 от 90 до 180 градусов на 1 секунду после 0 секунд задержки todo + =moveServo (servo8, 170, 90, 1000, 4000, easyOutBounce, timeNow); // перемещаем servo8 от 180 до 90 градусов на 1 секунду после задержки в 1 секунду // M правая рука вверх и вниз todo + =moveServo (servo6, 90, 130, 1000, 1500, easyInOutCubic, timeNow); // перемещаем servo8 от 90 до 180 градусов на 1 секунду после задержки в 0 секунд todo + =moveServo (servo6, 130, 90, 1000, 5000, easyOutBounce, timeNow); // перемещаем servo8 от 180 до 90 градусов на 1 секунду после задержки в 1 секунду // S Из стороны в сторону todo + =moveServo (servo10, 90, 40, 1000, 500, easyInOutCubic, timeNow); // перемещаем servo7 от 90 до 180 градусов на 1 секунду после задержки 0 секунд todo + =moveServo (servo10, 40, 105, 1000, 2000, easyInOutCubic, timeNow); // перемещаем servo7 от 180 до 90 градусов на 1 секунду после задержки в 1 секунду todo + =moveServo (servo10, 105, 90, 1000, 6000, easyInOutCubic, timeNow); // S левая рука вверх и вниз todo + =moveServo (servo11, 80, 160, 1000, 0, easyInOutCubic, timeNow); // перемещаем servo8 от 90 до 180 градусов на 1 секунду после задержки в 0 секунд todo + =moveServo (servo11, 160, 80, 1000, 5000, easyInOutCubic, timeNow); // перемещаем servo8 от 180 до 90 градусов на 1 секунду после задержки в 1 секунду // S правая рука вверх и вниз todo + =moveServo (servo9, 80, 20, 1000, 1000, easyInOutCubic, timeNow); // перемещаем servo8 от 90 до 180 градусов на 1 секунду после 0 секунд задержки todo + =moveServo (servo9, 20, 80, 1000, 6000, easyInOutCubic, timeNow); // перемещаем servo8 от 180 до 90 градусов на 1 секунду после задержки в 1 секунду (10); } while (todo> 0);} / ****** Zap 4 ******* / void zap4 () {Serial.println ("ZAP 4 вызван!"); беззнаковый длинный timeStart =millis (); int todo; do {unsigned long timeNow =millis () - timeStart; todo =0; // M Из стороны в сторону todo + =moveServo (servo7, 90, 130, 1000, 0, easyInOutCubic, timeNow); // перемещаем servo7 от 90 до 180 градусов на 1 секунду после задержки в 0 секунд todo + =moveServo (servo7, 130, 90, 1000, 5000, easyInOutCubic, timeNow); // перемещаем servo7 от 180 до 90 градусов на 1 секунду после задержки в 1 секунду // M левая рука вверх и вниз todo + =moveServo (servo8, 90, 170, 1000, 0, easyInOutCubic, timeNow); // перемещаем servo8 от 90 до 180 градусов на 1 секунду после 0 секунд задержки todo + =moveServo (servo8, 170, 90, 1000, 4000, easyOutBounce, timeNow); // перемещаем servo8 от 180 до 90 градусов на 1 секунду после задержки в 1 секунду // M правая рука вверх и вниз todo + =moveServo (servo6, 90, 130, 1000, 1500, easyInOutCubic, timeNow); // перемещаем servo8 от 90 до 180 градусов на 1 секунду после задержки в 0 секунд todo + =moveServo (servo6, 130, 90, 1000, 5000, easyOutBounce, timeNow); // перемещаем servo8 от 180 до 90 градусов на 1 секунду после задержки в 1 секунду // S Из стороны в сторону todo + =moveServo (servo10, 90, 40, 1000, 500, easyInOutCubic, timeNow); // перемещаем servo7 от 90 до 180 градусов на 1 секунду после задержки 0 секунд todo + =moveServo (servo10, 40, 105, 1000, 2000, easyInOutCubic, timeNow); // перемещаем servo7 от 180 до 90 градусов на 1 секунду после задержки в 1 секунду todo + =moveServo (servo10, 105, 90, 1000, 6000, easyInOutCubic, timeNow); // S левая рука вверх и вниз todo + =moveServo (servo11, 80, 160, 1000, 2000, easyInOutCubic, timeNow); // перемещаем servo8 от 90 до 180 градусов на 1 секунду после задержки в 0 секунд todo + =moveServo (servo11, 160, 80, 1000, 5000, easyInOutCubic, timeNow); // перемещаем servo8 от 180 до 90 градусов на 1 секунду после задержки в 1 секунду // S правая рука вверх и вниз todo + =moveServo (servo9, 80, 20, 1000, 1000, easyInOutCubic, timeNow); // перемещаем servo8 от 90 до 180 градусов на 1 секунду после задержки в 0 секунд todo + =moveServo (servo9, 20, 80, 1000, 2000, easyInOutCubic, timeNow); // перемещаем servo8 от 180 до 90 градусов на 1 секунду после задержки в 1 секунду (10); } while (todo> 0);} 
Звуковые эффекты Arduino
Этот код загружается в Arduino Uno с установленным на нем экраном MP3. Basically it receives a signal from one of three switches, plays the corresponding audio file and send a signal the Arduino Uno controlling the servos. Two buttons can also be mounted to it to control volume.
/*********************************** Targus - Operation - Sound Effects************************************//****** Notes*******/// Digital Pins 0 and 1 are normally used for serial commucation when uploading and monitoring an Arduino from a computer.// Digital Pins 3, 4, 6, 7, 11, 12, and 13 are used by the Adafruit Music Maker Shield.// This Arduino should be powered on after the servos Arduino since this Arduino will be sending 5V signals.// Make sure a GND wire on this Arduino is connected to GND on the other Arduino./********* Includes**********/#include #include #include /********** Variables***********/int relayPin5 =5;int relayPin8 =8;int relayPin9 =9;int pinVolDown =14; // aka Analog In 0int pinVolUp =15; // aka Analog In 1int volume =50; // this is the default volume which can be changed later by the volDown() and volUp() functions/******************************************************************** Adafruit Music Maker Shield - https://www.adafruit.com/product/1788*********************************************************************/// Adafruit Music Maker Shield Pins#define SHIELD_RESET -1 // VS1053 reset pin (unused!)#define DREQ 3 // VS1053 Data request, ideally an Interrupt pin. See http://arduino.cc/en/Reference/attachInterrupt for more info.#define CARDCS 4 // Card chip select pin#define SHIELD_DCS 6 // VS1053 Data/command select pin (output)#define SHIELD_CS 7 // VS1053 chip select pin (output)// the most important thing on the line below is the variable 'musicPlayer' which we will use to play music laterAdafruit_VS1053_FilePlayer musicPlayer =Adafruit_VS1053_FilePlayer(SHIELD_RESET, SHIELD_CS, SHIELD_DCS, DREQ, CARDCS);/************** Arduino Setup***************/void setup() { Serial.begin(9600); // enable serial communication for development and troubleshooting Serial.println("Targus - Operation - Sound Effects\n"); if (! musicPlayer.begin()) { // initialise the music player Serial.println(F("Couldn't find VS1053, do you have the right pins defined?")); while (1); // loop forever since we could not connect to the Adafruit Music Maker Shield } SD.begin(CARDCS); // initialise the SD card // Set volumes for the left and right channels. musicPlayer.setVolume(volume,volume); // 0-255 with 0 being crazy loud // If DREQ is on an interrupt pin (on uno, #2 or #3) we can do background audio playing musicPlayer.useInterrupt(VS1053_FILEPLAYER_PIN_INT); // DREQ int // Specify which GPIO pins to use for input. musicPlayer.GPIO_pinMode(2, OUTPUT); // switch for ... musicPlayer.GPIO_pinMode(3, OUTPUT); // switch for ... musicPlayer.GPIO_pinMode(4, OUTPUT); // switch for ... // Specify which digital pins we will use for volume control pinMode(pinVolDown, INPUT_PULLUP); pinMode(pinVolUp, INPUT_PULLUP); // Specify which digital pins we will use to communicate with the other Arduino (aka the Arduino with all the servos). pinMode(relayPin5, OUTPUT); pinMode(relayPin8, OUTPUT); pinMode(relayPin9, OUTPUT);}/************* Arduino Loop**************/void loop() { int gpio2 =musicPlayer.GPIO_digitalRead(2); int gpio3 =musicPlayer.GPIO_digitalRead(3); int gpio4 =musicPlayer.GPIO_digitalRead(4); int ioDown =digitalRead(pinVolDown); // volume down int ioUp =digitalRead(pinVolUp); // volume up// Serial.println(ioDown);// Serial.println(ioUp);// Serial.println(gpio2); if (gpio2 ==1) { Serial.println("GPIO 2 triggered.\n"); zap2(); } else if (gpio3 ==1) { Serial.println("GPIO 3 triggered.\n"); zap3(); } else if (gpio4 ==1) { Serial.println("GPIO 4 triggered.\n"); zap4(); } else if (ioDown ==LOW) { Serial.println("Analog 0 triggered.\n"); volDown(); } else if (ioUp ==LOW) { Serial.println("Analog 1 triggered.\n"); volUp(); } delay(2); // this delay may need to be reduced or removed depending on how responsive hitting the tongs to the side of a container feels}/********** Functions***********/void audioPlay(String file) { Serial.println("Playing " + file); musicPlayer.startPlayingFile(file.c_str()); задержка (500); // wait half a second before returning so the audio can get going}void audioStop(String file) { musicPlayer.stopPlaying(); Serial.println("Done playing " + file);}void activate(int pin) { digitalWrite(pin, HIGH); delay(300); // delay as long as needed for the other Arduino to notice an event digitalWrite(pin, LOW);}void volDown() { volume =volume + 1; if (volume> 255) { volume =255; } // Set volumes for the left and right channels. musicPlayer.setVolume(volume,volume); // 0-255 with 0 being crazy loud Serial.print("Volume set to "); Serial.println(volume);}void volUp() { volume =volume - 1; if (volume <0) { volume =0; } // Set volumes for the left and right channels. musicPlayer.setVolume(volume,volume); // 0-255 with 0 being crazy loud Serial.print("Volume set to "); Serial.println(volume);}/*************** Functions:Zap****************/ /****** Zap 2 *******/ void zap2() { // Audio and Servo(s) triggered by GPIO 2 String file ="02.mp3"; // this file should exist on the SD card /*********** Play Audio ************/ audioPlay(file); /************************************* Tell other Arduino to Animate Servos **************************************/ activate(relayPin5); delay(6000); // Customize delay to match end of servo movements, go by feel vs. accurate math since this Arduino's clock may not sync with the other Arduino. /*********** Stop Audio ************/ audioStop(file); } /****** Zap 3 *******/ void zap3() { // Audio and Servo(s) triggered by GPIO 3 String file ="03.mp3"; // this file should exist on the SD card /*********** Play Audio ************/ audioPlay(file); /************************************* Tell other Arduino to Animate Servos **************************************/ activate(relayPin8); delay(6000); // Customize delay to match end of servo movements, go by feel vs. accurate math since this Arduino's clock may not sync with the other Arduino. /*********** Stop Audio ************/ audioStop(file); } /****** Zap 4 *******/ void zap4() { // Audio and Servo(s) triggered by GPIO 4 String file ="04.mp3"; // this file should exist on the SD card /*********** Play Audio ************/ audioPlay(file); /************************************* Tell other Arduino to Animate Servos **************************************/ activate(relayPin9); delay(6000); // Customize delay to match end of servo movements, go by feel vs. accurate math since this Arduino's clock may not sync with the other Arduino. /*********** Stop Audio ************/ audioStop(file); } 

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

3D grown Parts
Файл САПР на сайте thingiverse.com

Схема

Connect GPIO 2, 3, 4 of the MP3 shield to the aluminum Plates.
Connect 3v of the MP3 shield to the tongs.
Connect pins 5, 8, 9 of the MP3 shiled to pins 2, 3, 4 of the servo Arduino.
Connect pins 6, 7, 8, 9, 10, 11 of the servo Arduino to the servos.
Wire the positive and negative of the servos to a 5v plug.
Wire the graounds of both the servo Arduino and the MP3 shield to the 5v plug.
Wire up both speaker inputs. These are the scaled and dimensioned drawings I used to construct the megafigs.

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

  1. Создание монитора Ambilight с помощью Arduino
  2. Игра Arduino Pong - OLED-дисплей
  3. Игровой контроллер Arduino
  4. Автоматический стрелок из лего
  5. Игра Arduino Touch Breakout
  6. Детектор звуковой частоты
  7. Клон Arduino Tamagotchi - цифровой питомец
  8. Манипулятор беспроводного переключателя света
  9. Tech-TicTacToe
  10. Водяной пистолет с датчиком движения