Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Animatronics gigantes Lego Minfig Operation Game

Componentes y suministros

Arduino UNO
× 2
Adafruit Arduino MP3 Shield
× 1
MG90S Gear Micro Servo
× 6
Altavoz:3 W, 4 ohmios
× 2
Rodamiento de bolas OpenBuilds - 688Z 8x16x5
× 12

Herramientas y máquinas necesarias

Impresora Lulzbot Taz 5 FDM
X-Carve CNC

Acerca de este proyecto

Este proyecto se ha completado en 4 etapas. Cubriré rápidamente las primeras 3 etapas (que no contenían electrónica) y detallaré la 4 etapa que estaba convirtiendo a Frank en el juego de operaciones y agregando audio y animatronics.

Etapa 1:Construcción de Megafigs

Empecé construyendo la mano. Pensé que esta sería la parte más difícil de la construcción inicial y definió la escala para el resto de las piezas que debían fabricarse. La mano fue fabricada con tubería de PVC y resina de fibra de vidrio para llenar el vacío entre la mano interior y exterior.

La fabricación de la cabeza fue la siguiente. Está hecho de tubería de PVC (un accesorio de tubería grande para la parte principal de la cabeza), MDF y resina para llenar el vacío en la protuberancia superior.

El cuerpo de las megafigs estaba hecho de MDF y una estructura de caja bastante sencilla. Los accesorios de PVC se utilizan como juntas entre los apéndices y el torso

Las patas están hechas de MDF y PVC para definir las curvas de las patas superiores.

Los brazos (que terminaron siendo la parte más difícil) fueron desbastados con tubería de PVC en el antebrazo y MDF en la parte superior del brazo. Se utilizó espuma floral como relleno de espacios. Se utilizó Bondo para crear la forma de la parte superior del brazo, y toneladas de lijado y relleno le dieron su forma final.

Los brazos y las manos se moldearon y fundieron con Smoothcast 300.

Todo fue pintado en base al kit de Lego Monster Hunters.

Fase 2:Cabello

Esta fase consistió en fabricar el cabello de los científicos. La espuma para herramientas se cortó con la sierra de cinta en las formas básicas de los mechones de cabello. Las distintas partes de las piezas de cabello se pegaron con epoxi.

Toda la pieza de cabello se cubrió con Smoothcast 300 para crear una capa de plástico sobre la espuma. luego se lijó y se rellenó.

Se utilizó una escultura epoxi para rellenar todas las costuras entre las secciones del cabello.

Fue imprimado y pintado.

Fase 3:la cama de Frank

La tercera fase fue la construcción de la cama de Frank basada en el científico loco y su kit Monster Lego. Es una construcción de caja simple hecha de MDF y tubería de PVC para las protuberancias.

Los detalles de las esquinas se crearon con tubería de PVC que encajaba con un disco de MDF.

Todo fue lijado, imprimado y pintado.

Fase 4:juego de operaciones y movimiento

La parte final de este proyecto (hasta la fecha) es convertir a Frank en un juego de operaciones y agregar audio y movimiento a las Megafigs. Detallaré cada parte del cuerpo de la construcción en lugar de ir en el orden cronológico de cómo sucedieron las cosas (se estaba trabajando en todo al mismo tiempo).

Torso:

El torso tenía soportes impresos en 3D agregados a las articulaciones que sostenían 2 rodamientos de patines. Éstos actúan como un punto de pivote para los brazos y la cabeza.

La parte superior del cuerpo de Frank tenía 2 platos de dulces impresos en 3D, cubiertos con labios de aluminio fresados ​​y cubiertos con una nueva placa de torso. Los labios de aluminio actúan como un interruptor para el juego de operaciones. Cuando las pinzas (que están conectadas al protector MP3) tocan el aluminio, se completa el circuito, activando el programa.

Cabezas:

Ambos cabezales fueron modificados para mover y sostener altavoces. Primero se agregó un soporte impreso en 3D al cuello para sostener un perno de 5/16 que actúa como un eje.

Se utilizó metal perforado como guía para trazar los orificios de la rejilla del altavoz. Yo era el más nervioso por este proceso. Cualquier error arruinaría mi trabajo de pintura en las caras. Los agujeros se pintaron para que coincida con el color circundante.

Se creó un soporte impreso en 3D para sujetar los altavoces detrás de las parrillas.

Piernas:

Las nuevas patas se imprimieron en 3D en dos mitades, así como un plato de dulces en forma de hueso. Una placa de aluminio fue fresada como el torso. Las patas se unieron, se lijaron, se alisaron con bondo y se pintaron.

Brazos:

El patrón original de los brazos se modificó para aceptar un soporte impreso en 3D que tenía una negrita de 5/16 para un eje. Luego fueron remodelados, moldeados, limpiados y pintados.

Servos:

Los servos se instalaron utilizando soportes impresos en 3D y se conectaron a los apéndices mediante un cable y una bocina de aluminio unida a los pernos de 5/16. Posteriormente se agregaron resortes para ayudar a levantar los brazos.

Electrónica:

Toda la electrónica se montó en una pieza de MDF para crear un prototipo de banco de pruebas. Esta configuración nos permitió a Daniel y a mí resolver la programación, modificar las cosas y resolver los problemas técnicos. Todo funcionó bien.

La forma en que funciona la electrónica es

1:el protector de MP3 espera 1 de 3 entradas (las pinzas a una de las placas de aluminio)

2:Cuando se activa una placa de aluminio, el escudo MP3 reproduce el archivo MP3 correspondiente y envía una señal al servo Arduino.

3:Cuando el servo arduino recibe una señal del escudo MP3, ejecuta el código correspondiente para los servos.

Ambos arduinos se montaron en la parte inferior de la cama de Frank y todo volvió a cablearse.

Listo para trucos o golosinas:

Todo funciona fantásticamente y aguantado hasta una noche completa de abuso.

Para obtener un registro de compilación más detallado, visite ... http://www.therpf.com/showthread.php?t=195101. Allí detallé cada paso a medida que lo produje.

Código

  • Servos
  • Efectos de sonido
Servos Arduino
Este código se carga en el Arduino uno que controla los 6 servomotores. Básicamente, espera recibir una de las 3 señales del escudo MP3. Cuando se recibe la señal, el servo Arduino Uno ejecuta los correspondientes movimientos del servo.
 / ************************** Targus - Operación - Servos ***************************** // ****** Notas ******* // / Los pines digitales 0 y 1 se utilizan normalmente para la comunicación en serie al cargar y monitorear un Arduino desde una computadora .// Los pines digitales 0 y 1 se pueden usar para servos si el Arduino no está conectado a una computadora .// Si los pines digitales 0 y 1 se están usando para servos, comente cualquier línea que comience con 'Serial'. en este archivo. // Asegúrese de que este Arduino esté encendido antes que el otro Arduino, ya que este Arduino recibirá señales de 5V. // Asegúrese de que un cable GND en este Arduino esté conectado a GND en el otro Arduino./**** ***** Incluye ********** / # incluye  / ********** Variables *********** / Servo servo5; Servo servo6; Servo servo7; Servo servo8; Servo servo9; Servo servo10; Servo servo11; int pin2 =2; int pin3 =3; int pin4 =4; / ************** Arduino Configuración *************** / void setup () {Serial.begin (9600); // habilita la comunicación en serie para el desarrollo y la resolución de problemas Serial.println ("Targus - Operación - Servos \ n"); / **************************************** Conecte los servos y establezca las posiciones iniciales ** *************************************** / servo5.attach (5); // pin digital 5 servo5.write (90); // mover a 90 grados servo6.attach (6); // pin digital 6 servo6.write (90); servo7.attach (7); // pin digital 7 servo7.write (90); servo8.attach (8); // pin digital 8 servo8.write (90); servo9.attach (9); // pin digital 9 servo9.write (80); servo10.attach (10); // pin digital 10 servo10.write (90); servo11.attach (11); // pin digital 11 servo11.write (80); / ************************* Configuración de pines de entrada digital ******************** ****** / // Configure los pines de entrada para que el Arduino con efectos de sonido pueda decirnos cuándo activar los servos. pinMode (pin2, INPUT_PULLUP); pinMode (pin3, INPUT_PULLUP); pinMode (pin4, INPUT_PULLUP);} / ************* Arduino Loop ************** / void loop () {if (digitalRead (pin2) ==ALTO) {zap2 (); } else if (digitalRead (pin3) ==HIGH) {zap3 (); } else if (digitalRead (pin4) ==HIGH) {zap4 (); } delay (300);} / ********** Funciones *********** / int moveServo (Servo &servo, int degreeStart, int degreeEnd, unsigned long timeEnd, unsigned long timeStart , float (* easing) (float), unsigned long timeNow) {// esta función devolverá un número 1 si aún queda trabajo por hacer timeEnd + =timeStart; // agrega cualquier retraso a la hora de finalización if (timeNow  timeEnd) {// fase de movimiento del servo realizada, nada que hacer return 0; } // si llegamos hasta aquí, prepárate para mover un servo float percentToMove =float (timeNow - timeStart) / float (timeEnd - timeStart); percentToMove =suavizado (percentToMove); // rangos de grados del mapa 0-180 a rango de microsegundos 500-2400 para un SG-92R http://www.servodatabase.com/servo/towerpro/sg92r degreeStart =map (degreeStart, 0, 180, 500, 2400); gradoEnd =mapa (gradoEnd, 0, 180, 500, 2400); flotar servoTo =0; if (degreeEnd> degreeStart) {// gira en sentido antihorario servoTo =((degreeEnd - degreeStart) * percentToMove) + degreeStart; } else {// girar en el sentido de las agujas del reloj percentToMove =1 - percentToMove; // porcentaje inverso para que valores como 0.8 se conviertan en 0.2 servoTo =((degreeStart - degreeEnd) * percentToMove) + degreeEnd; } servo.writeMicroseconds (servoTo); // Serial.print ("Asignaría a:"); Serial.println (servoTo); // Serial.print ("degreeStart:"); Serial.println (degreeStart); // Serial.print ("degreeEnd:"); Serial.println (gradoEnd); // Serial.print ("timeEnd:"); Serial.println (timeEnd); // Serial.print ("timeStart:"); Serial.println (timeStart); // Serial.print ("timeNow:"); Serial.println (timeNow); // Serial.print ("percentToMove:"); Serial.println (percentToMove); // Serial.print ("servoTo:"); Serial.println (servoTo); // Serial.print ("\ n"); return 1;} / ****************** Funciones:Facilidad ****************** /// Funciones de facilitación de https://github.com/warrenm/AHEasing/blob/master/AHEasing/easing.c renombrado para que coincida con http://easings.net/ para una vista previa fácil. cubic y =x ^ 3-x * sin (x * pi) return pos * pos * pos - pos * sin (pos * M_PI);} float facilidadOutBack (float pos) {// Modelado después de sobrepasar cubic y =1- ( (1-x) ^ 3- (1-x) * sin ((1-x) * pi)) flotante f =(1 - pos); return 1 - (f * f * f - f * sin (f * M_PI));} float easyInOutBack (float pos) {// Modelado a partir de la función cúbica de rebasamiento por partes:// 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)); devuelve 0.5 * (1 - (f * f * f - f * sin (f * M_PI))) + 0.5; }} flotar easyInBounce (posición flotante) {retorno 1 - facilidadOutBounce (1 - pos);} flotar facilidadOutBounce (posición flotante) {if (posición <4 / 11.0) {retorno (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 (posición flotante) {if (pos <0.5) {return 0.5 * easyInBounce (pos * 2); } else {return 0.5 * easyOutBounce (pos * 2 - 1) + 0.5; }} float easyInCirc (float pos) {// Modelado a partir del cuadrante IV desplazado del círculo unitario return 1 - sqrt (1 - (pos * pos));} float easyOutCirc (float pos) {// Modelado a partir del cuadrante II desplazado de la unidad circle return sqrt ((2 - pos) * pos);} float easyInOutCirc (float pos) {// Modelado a partir de la función circular por partes // y =(1/2) (1 - sqrt (1 - 4x ^ 2)); [0, 0.5) // y =(1/2) (raíz cuadrada (- (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 easinCubic (float pos) {// Modelado a partir del cúbico y =x ^ 3 return pos * pos * pos;} float easyOutCubic (float pos) {// Modelado a partir del cúbico y =(x - 1) ^ 3 + 1 flotador f =(pos - 1); return f * f * f + 1;} float easyInOutCubic (float pos) {// Modelado a partir del cúbico por partes // 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); devuelve 0.5 * f * f * f + 1; }} float easinElastic (float pos) {// Modelado a partir de la onda sinusoidal amortiguada 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) {// Modelado a partir de la onda sinusoidal amortiguada 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) {// Modelado a partir de la onda sinusoidal amortiguada exponencialmente por tramos :// 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) {// Modelado a partir de la función exponencial y =2 ^ (10 (x - 1)) return (pos ==0.0)? pos:pow (2, 10 * (pos - 1));} float easyOutExpo (float pos) {// Modelado a partir de la función exponencial y =-2 ^ (- 10x) + 1 return (pos ==1.0)? pos:1 - pow (2, -10 * pos);} float easyInOutExpo (float pos) {// Modelado a partir del exponencial por partes // 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) {// Modelado a partir de la parábola y =x ^ 2 return pos * pos;} float easyOutQuad (float pos) {// Modelado a partir de la parábola y =-x ^ 2 + 2x return - (pos * (pos - 2));} float easyInOutQuad (float pos) {// Modelado a partir de la cuadrática por partes // 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 easinQuart (float pos) {// Modelado a partir del cuartico x ^ 4 return pos * pos * pos * pos;} float easOutQuart (float pos) {// Modelado a partir del cuartico y =1 - (x - 1) ^ 4 flotador f =(pos - 1); return f * f * f * (1 - pos) + 1;} float easinOutQuart (float pos) {// Modelado a partir del cuartico por partes // 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); devuelve -8 * f * f * f * f + 1; }} float easyInQuint (float pos) {// Modelado a partir de la quintic y =x ^ 5 return pos * pos * pos * pos * pos;} float easyOutQuint (float pos) {// Modelado a partir de la quintic y =(x - 1) ^ 5 + 1 flotador f =(pos - 1); return f * f * f * f * f + 1;} float easyInOutQuint (float pos) {// Modelado a partir del quintic por partes // 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); devuelve 0.5 * f * f * f * f * f + 1; }} float easyInSine (float pos) {// Modelado después de un cuarto de ciclo de la onda sinusoidal return sin ((pos - 1) * M_PI_2) + 1;} float easyOutSine (float pos) {// Modelado después de un cuarto de ciclo del seno wave (fase diferente) return sin (pos * M_PI_2);} float easyInOutSine (float pos) {// Modelado a partir de media onda sinusoidal return 0.5 * (1 - cos (pos * M_PI));} / ****** ********* Funciones:Zap *************** // ****** Zap 2 ******* / void zap2 () {Serial.println ("¡ZAP 2 llamado!"); // Hueso sin firmar long timeStart =millis (); int todo; hacer {tiempo largo sin firmar ahora =millis () - inicio de tiempo; todo =0; // M Patada de pierna // todo + =moveServo (servo5, 90, 50, 100, 0, easyInOutCubic, timeNow); // mueve el servo5 de 90 a 180 grados durante 1 segundo después de un retraso de 0 segundos // todo + =moveServo (servo5, 50, 90, 500, 500, easyOutBounce, timeNow); // mueve el servo5 de 180 a 90 grados durante 1 segundo después de un retraso de 1 segundo // M Cabeza de lado a lado todo + =moveServo (servo7, 90, 110, 500,0, easyInOutCubic, timeNow); // mueve el servo7 de 90 a 180 grados durante 1 segundo después de un retardo de 0 segundos todo + =moveServo (servo7, 110, 70, 500, 500, easyInOutCubic, timeNow); // mueve el servo7 de 180 a 90 grados durante 1 segundo después de un retraso de 1 segundo 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 brazo izquierdo arriba y abajo todo + =moveServo (servo8, 90, 170, 1000, 0, easyInOutCubic, timeNow); // mueve el servo8 de 90 a 180 grados durante 1 segundo después de un retardo de 0 segundos todo + =moveServo (servo8, 170, 90, 1000, 4000, easyOutBounce, timeNow); // mueve el servo8 de 180 a 90 grados durante 1 segundo después de un retraso de 1 segundo // M brazo derecho arriba y abajo todo + =moveServo (servo6, 90, 130, 1000, 1500, easyInOutCubic, timeNow); // mueve el servo8 de 90 a 180 grados durante 1 segundo después de un retardo de 0 segundos todo + =moveServo (servo6, 130, 90, 1000, 5000, easyOutBounce, timeNow); // mueve el servo8 de 180 a 90 grados durante 1 segundo después de un retraso de 1 segundo // S Cabeza de lado a lado todo + =moveServo (servo10, 90, 40, 1000, 500, easyInOutCubic, timeNow); // mueve el servo7 de 90 a 180 grados durante 1 segundo después de un retardo de 0 segundos todo + =moveServo (servo10, 40, 105, 1000, 2000, easyInOutCubic, timeNow); // mueve el servo7 de 180 a 90 grados durante 1 segundo después de un retraso de 1 segundo todo + =moveServo (servo10, 105, 90, 1000, 6000, easyInOutCubic, timeNow); // S brazo izquierdo arriba y abajo todo + =moveServo (servo11, 80, 160, 1000, 2000, easyInOutCubic, timeNow); // mueve el servo8 de 90 a 180 grados durante 1 segundo después de un retardo de 0 segundos todo + =moveServo (servo11, 160, 80, 1000, 5000, easyInOutCubic, timeNow); // mueve el servo8 de 180 a 90 grados durante 1 segundo después de un retraso de 1 segundo // S brazo derecho arriba y abajo todo + =moveServo (servo9, 80, 20, 1000, 1000, easyInOutCubic, timeNow); // mueve servo8 de 90 a 180 grados durante 1 segundo después de un retardo de 0 segundos todo + =moveServo (servo9, 20, 80, 1000, 2000, easyInOutCubic, timeNow); // mueve el servo8 de 180 a 90 grados durante 1 segundo después de un retardo de 1 segundo (20); } while (todo> 0);} / ****** Zap 3 ******* / void zap3 () {Serial.println ("¡ZAP 3 llamado!"); unsigned long timeStart =millis (); int todo; hacer {tiempo largo sin firmar ahora =millis () - inicio de tiempo; todo =0; // M Cabeza de lado a lado todo + =moveServo (servo7, 90, 130, 1000, 0, easyInOutCubic, timeNow); // mueve el servo7 de 90 a 180 grados durante 1 segundo después de un retardo de 0 segundos todo + =moveServo (servo7, 130, 90, 1000, 5000, easyInOutCubic, timeNow); // mueve el servo7 de 180 a 90 grados durante 1 segundo después de un retraso de 1 segundo // M brazo izquierdo arriba y abajo todo + =moveServo (servo8, 90, 170, 1000, 0, easyInOutCubic, timeNow); // mueve el servo8 de 90 a 180 grados durante 1 segundo después de un retardo de 0 segundos todo + =moveServo (servo8, 170, 90, 1000, 4000, easyOutBounce, timeNow); // mueve el servo8 de 180 a 90 grados durante 1 segundo después de un retraso de 1 segundo // M brazo derecho arriba y abajo todo + =moveServo (servo6, 90, 130, 1000, 1500, easyInOutCubic, timeNow); // mueve el servo8 de 90 a 180 grados durante 1 segundo después de un retardo de 0 segundos todo + =moveServo (servo6, 130, 90, 1000, 5000, easyOutBounce, timeNow); // mueve el servo8 de 180 a 90 grados durante 1 segundo después de un retraso de 1 segundo // S Cabeza de lado a lado todo + =moveServo (servo10, 90, 40, 1000, 500, easyInOutCubic, timeNow); // mueve el servo7 de 90 a 180 grados durante 1 segundo después de un retardo de 0 segundos todo + =moveServo (servo10, 40, 105, 1000, 2000, easyInOutCubic, timeNow); // mueve el servo7 de 180 a 90 grados durante 1 segundo después de un retraso de 1 segundo todo + =moveServo (servo10, 105, 90, 1000, 6000, easyInOutCubic, timeNow); // S brazo izquierdo arriba y abajo todo + =moveServo (servo11, 80, 160, 1000, 0, easyInOutCubic, timeNow); // mueve el servo8 de 90 a 180 grados durante 1 segundo después de un retardo de 0 segundos todo + =moveServo (servo11, 160, 80, 1000, 5000, easyInOutCubic, timeNow); // mueve el servo8 de 180 a 90 grados durante 1 segundo después de un retraso de 1 segundo // S brazo derecho arriba y abajo todo + =moveServo (servo9, 80, 20, 1000, 1000, easyInOutCubic, timeNow); // mueve el servo8 de 90 a 180 grados durante 1 segundo después de un retardo de 0 segundos todo + =moveServo (servo9, 20, 80, 1000, 6000, easyInOutCubic, timeNow); // mueve el servo8 de 180 a 90 grados durante 1 segundo después de un retardo de 1 segundo (10); } while (todo> 0);} / ****** Zap 4 ******* / void zap4 () {Serial.println ("¡ZAP 4 llamado!"); unsigned long timeStart =millis (); int todo; hacer {tiempo largo sin firmar ahora =millis () - inicio de tiempo; todo =0; // M Cabeza de lado a lado todo + =moveServo (servo7, 90, 130, 1000, 0, easyInOutCubic, timeNow); // mueve el servo7 de 90 a 180 grados durante 1 segundo después de un retardo de 0 segundos todo + =moveServo (servo7, 130, 90, 1000, 5000, easyInOutCubic, timeNow); // mueve el servo7 de 180 a 90 grados durante 1 segundo después de un retraso de 1 segundo // M brazo izquierdo arriba y abajo todo + =moveServo (servo8, 90, 170, 1000, 0, easyInOutCubic, timeNow); // mueve el servo8 de 90 a 180 grados durante 1 segundo después de un retardo de 0 segundos todo + =moveServo (servo8, 170, 90, 1000, 4000, easyOutBounce, timeNow); // mueve el servo8 de 180 a 90 grados durante 1 segundo después de un retraso de 1 segundo // M brazo derecho arriba y abajo todo + =moveServo (servo6, 90, 130, 1000, 1500, easyInOutCubic, timeNow); // mueve el servo8 de 90 a 180 grados durante 1 segundo después de un retardo de 0 segundos todo + =moveServo (servo6, 130, 90, 1000, 5000, easyOutBounce, timeNow); // mueve el servo8 de 180 a 90 grados durante 1 segundo después de un retraso de 1 segundo // S Cabeza de lado a lado todo + =moveServo (servo10, 90, 40, 1000, 500, easyInOutCubic, timeNow); // mueve el servo7 de 90 a 180 grados durante 1 segundo después de un retardo de 0 segundos todo + =moveServo (servo10, 40, 105, 1000, 2000, easyInOutCubic, timeNow); // mueve el servo7 de 180 a 90 grados durante 1 segundo después de un retraso de 1 segundo todo + =moveServo (servo10, 105, 90, 1000, 6000, easyInOutCubic, timeNow); // S brazo izquierdo arriba y abajo todo + =moveServo (servo11, 80, 160, 1000, 2000, easyInOutCubic, timeNow); // mueve el servo8 de 90 a 180 grados durante 1 segundo después de un retardo de 0 segundos todo + =moveServo (servo11, 160, 80, 1000, 5000, easyInOutCubic, timeNow); // mueve el servo8 de 180 a 90 grados durante 1 segundo después de un retraso de 1 segundo // S brazo derecho arriba y abajo todo + =moveServo (servo9, 80, 20, 1000, 1000, easyInOutCubic, timeNow); // mueve servo8 de 90 a 180 grados durante 1 segundo después de un retardo de 0 segundos todo + =moveServo (servo9, 20, 80, 1000, 2000, easyInOutCubic, timeNow); // mueve el servo8 de 180 a 90 grados durante 1 segundo después de un retardo de 1 segundo (10); } while (todo> 0);} 
Efectos de sonido Arduino
Este código se carga en el Arduino Uno con el protector MP3 montado en él. 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?")); mientras (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()); retraso (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); } 

Piezas y carcasas personalizadas

3D grown Parts
CAD file on thingiverse.com

Esquemas

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.

Proceso de manufactura

  1. Hacer Monitor Ambilight usando Arduino
  2. Juego Arduino Pong - Pantalla OLED
  3. Controlador de juego Arduino
  4. Tirador de Lego automatizado
  5. Arduino Touch Breakout Game
  6. Detector de frecuencia de audio
  7. Clon Arduino Tamagotchi - Mascota digital
  8. Manipulador de interruptor de luz inalámbrico
  9. Tech-TicTacToe
  10. Pistola de agua con sensor de movimiento
  11. Temporizador de cuenta atrás de Arduino