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

Talking Portal 2 Torreta

Componentes y suministros

Arduino Nano R3
× 1

Herramientas y máquinas necesarias

Impresora 3D (genérica)

Acerca de este proyecto

La historia

Esta Navidad, decidí diseñar y construir una torreta de Portal en funcionamiento del juego Portal 2 . Para mí, este fue un ejercicio de modelar correctamente todo el ensamblaje en Fusion 360 primero, antes de construir nada. Este diseño utiliza un Arduino Nano, un chip de reproductor MP3, sensor de distancia, servos, LED y piezas impresas en 3D.

El objetivo aquí era hacer que se moviera en 3 "ejes", con sonido hablado del juego y LED para simular disparos.

  • Abra las "alas" si detecta a alguien al frente. Utilice un mecanismo de manivela con deslizadores, simplemente porque sí.
  • Si la persona todavía está allí después de abrir, dispare hasta que caiga. Sonido de LED y ametralladora.
  • Si la persona ya no está allí, ejecute una pequeña rutina de búsqueda de escaneo.
  • Acérquese y duerma hasta que llegue otra persona.
  • Utiliza los sonidos y las voces de la torreta del portal del juego.

Me tomé algunas libertades en el diseño, tratando de que fuera sensiblemente igual al que se ve en el juego, pero funcional e imprimible. Con algunos bocetos básicos encontrados en línea, comencé a modelar y planificar ...

Los sonidos se almacenan en una tarjeta microSD, a la que se puede acceder desde la parte posterior para que los sonidos se puedan actualizar o cambiar más adelante. Está en línea con la tira de relleno negra, lo que la hace esencialmente invisible una vez instalada. 18 expresiones y sonidos individuales utilizados en esta ronda.

El sensor lidar (tiempo de vuelo) está en un chip con un perfil rectangular. Este sensor es casi invisible desde el frente una vez ensamblado.

Paso 1:Modelado de Fusion 360

El diseño comenzó a partir de bocetos encontrados en línea. Usando estas imágenes como lienzos, comencé a dibujar los contornos de las 3 vistas. Luego fue cuestión de extruirlos en 3D, luego desgranar la forma general y hacer cortes. Toda la electrónica se construyó en Fusion como componentes que se insertaron y colocaron donde pensé que tendría sentido. Los parámetros de conducción fueron:

  • Arduino Nano tenía que tener un conector accesible para actualizar una vez que estaba completamente ensamblado
  • La tarjeta microSD tenía que ser accesible de la misma manera e idealmente invisible una vez instalada
  • El sensor de tiempo de vuelo también debe ser invisible
  • Un conector eléctrico de 2,1 mm para alimentación en la parte posterior
  • Las piezas impresas deben ser lo más grandes posible (no muchas piezas pequeñas)
  • Imprime sin soportes

Después de agregar componentes (Nano, otros chips, servos) a la forma básica, se movieron y colocaron según fuera necesario, y se construyeron las estructuras de soporte para soportarlos dentro de la carcasa.

El mecanismo de apertura del ala era un mecanismo de manivela y deslizamiento. ¿Por qué? Porque quería usar un mecanismo de manivela, ¡por eso! Esto agregó algunas complicaciones, pero también tuvo un beneficio; una vez que se determinaba la geometría, la repetibilidad operativa estaría asegurada y los límites mínimo y máximo estaban prácticamente garantizados.

Una vez que se construyó el modelo completo y tuve la confianza de que funcionaría, y podría construirse (imprimirse) y ensamblarse, seguí adelante e imprimí las piezas y construí un prototipo. Una vez que funcionó, volví al modelo e hice algunos ajustes para mejorar la apariencia y la capacidad de ensamblaje (¿es una palabra?). Este modelo es el resultado de esos cambios.

Esto fue bastante agotador, ya que realmente no hay muchas formas cuadradas en esta cosa, y se cierra bastante bien, sin acceso real para ajustar una vez que se ensambla. Aprendí bastante en este proyecto, como el uso de componentes integrados dentro de otros componentes. Esto hizo que manipular y mantener los subconjuntos vinculados para un acceso rápido. ¡Al final, valió la pena el esfuerzo!

Paso 2:Piezas impresas en 3D

Portal turret v4.zip se actualizó y debería contener todas las piezas impresas necesarias para construir la última torreta.

--- nueva "Pata de prueba trasera". No es fiel al original, pero está en la parte posterior y permite usar un conector mini-USB recto hacia arriba. ---

Estos se imprimieron en una Prusa Mk2, utilizando PLA para todas las piezas. La orientación de la impresión debería ser bastante evidente. El cuerpo se imprimió en posición vertical, sin soportes. Hay una gran brecha en los lados que se debe salvar, pero realmente no tuve grandes problemas con configuraciones bastante estándar, aparte del bache. La protuberancia en la parte delantera y trasera se puede eliminar virtualmente con un buen filamento y una buena configuración de impresión. Descubrí que 0,2 mm funcionaban bien en la cortadora y producían un resultado decente. Empezaron a aparecer aberturas más grandes en el cuerpo cerca de la tira de relleno.

El diseño de canales y protuberancias se realizó con chaflanes de 45 grados, por lo que los elementos de "colgar en el espacio" serán mínimos.

Tuve poca limpieza que hacer para armar el ensamblaje. Las tiras de relleno que se deslizan en los canales ahora son bastante sencillas, con un ancho reducido y un grosor constante. Creo que se podría usar un material negro delgado cortado en tiras en lugar de usar estas piezas impresas (impresas en el borde).

La única área que requiere delicadeza son los pasadores deslizantes en el marco del tono. Los pasadores rectos (clavos) en los orificios perforados con una broca de 1/8 "y un poco de lubricante serán de gran ayuda.

Lente% 2Bv3b.stl Cuerpo-RHS% 2Bv4.stl Cuerpo-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 Presentar% 2BFrame% 2Bv4.stl Tramo% 2B-% 2BREAR% 2Bv4.stl Rellene% 2Bstrips% 2Bv3.stl Tramo% 2B-% 2BREAR% 2Btest.stl Pitch% 2BFrame% 2B-% 2Bmodified% 2B1.stl alas% 2Bv6.zip Arduino% 2BBase% 2Bw% 2BRadio.stl Portal% 2BTurret% 2Bv4.zip

Paso 3:componentes

V4 (torreta roja) tiene puentes más pequeños, lo que requiere alas v4 y marco Pitch.

El v6 alas son un opción eso permite diferente "pistolas" de colores. No he hecho uno como este personalmente, pero debería funcionar bien.

Una vez que el modelo estuvo completo, y yo estaba contento con mi prototipo, imprimí la rev 2 con los componentes de plástico como se muestra. Todo aquí es PLA, con negro y color de diseño (azul en este caso), y un poco de PLA translúcido para el "Lente" central o el ojo láser.

Esta foto captura bastante bien los componentes, con la excepción del cableado.

Paso 4:Electrónica

La compilación utiliza los siguientes componentes:

  • Arduino Nano (1)
  • Reproductor de MP3 DFPlayer Mini (o MP3-TF-16P) (1)
  • Sensor de rango de tiempo de vuelo VL53L0X (1)
  • Micro servos SG90 genéricos (3)
  • LED rojos de 5 mm (5)
  • Resistencias de 220 ohmios para LED (5)
  • Resistencia de 1kOhmio (1)
  • Altavoz de 4 cm, 4 ohmios, 3 vatios (1)
  • Conector de alimentación de 2,1 mm (1)
  • Clavos para enmarcar de 3 "de largo (4)
  • Tornillos M2 x 6 (8)
  • Tornillos M2.5 x 8 (2)
  • Tornillos M3 x 8 (4)
  • Tornillos M3 x 12 (4)
  • Tornillos M3 x 16 (2)
  • envoltura retráctil
  • corbatas pequeñas

Todos los componentes están disponibles en Arduino, Amazon o Banggood y otras fuentes.

Los tornillos se obtuvieron de un kit surtido. Es un dolor en el trasero tenerlos de otra manera ...

Paso 5:Montaje mecánico

La mayor parte del montaje mecánico es razonable. Las piezas impresas se imprimen con los agujeros más grandes roscados donde sea necesario, por lo que una búsqueda rápida con un tornillo antes del ensamblaje final será útil y hará que el ensamblaje de los componentes atornillados sea bastante fácil.

El Arduino y el chip MP3 encajan en la base sin hardware. El VL53LOX se deslizará en la carcasa frontal sin sujetadores. Primero ajuste el ajuste, luego retírelo e instálelo una vez conectado.

El ensamblaje del deslizador utiliza 4 clavos de estructura como rieles deslizantes. Miden aproximadamente 1/8 "de diámetro, con las cabezas recortadas. Se tomaron de una tira de clavos para enmarcar DeWalt que se usaron con su clavadora eléctrica para enmarcar. No hace falta decir que los clavos lisos son imprescindibles.

Los servos se montan como se muestra. La orientación es importante. El tono y los servos de pivote están "centrados" cuando se instalan en sus piezas. La manivela está instalada de tal manera que, cuando está en la posición abierta, se cerrará girando en el sentido contrario a las agujas del reloj, cuando se mira desde el frente. La posición abierta es de varillas y manivela en línea recta, con otra rotación de 10 grados hasta bloquear.

El montaje de la pata es la parte más sencilla. Tornillos de 2-2,5 mm, con las tapas de las piernas encajadas sobre los codos de cada pierna. Utilice sujetadores que no sobresalgan por encima de la parte superior de la placa para las piernas. De esa manera, el cuerpo pivotante no se atascará si modificas el rango de rotación.

Todas las conexiones de los servos a las piezas impresas se realizan utilizando la manivela blanca corta que viene con los servos. Estas manivelas simplemente presionan en las partes impresas. Intenté imprimir el orificio estriado en las partes que se conectaban a cada servo, pero tuve un éxito limitado y repetible. Es mucho más fácil usar las manivelas que vienen con los servos.

El conjunto de manivela utiliza los tornillos más largos de 2,5 mm. Las bielas no deben apretarse entre las mitades de las bielas. De hecho, podría intentar usar tornillos más cortos sin la pieza Crank2. Eso también debería funcionar (es de esperar que no haya un par apreciable aquí si las alas se deslizan libremente).

El altavoz es capturado por un soporte de servo (2 piezas) que captura al altavoz. Altavoz entre estas "patas", y se mantiene en posición asegurándolas al servo de tono. Este servo luego se conecta al conjunto de paso (deslizador), seguido por el conjunto de manivela con varillas. Todo esto se ensambla antes de ser instalado en el cuerpo LHS con 4 tornillos pequeños.

Una vez que las tripas principales están instaladas, con el Arduino y el reproductor MP3 ubicados temporalmente, comienza la diversión:¡el cableado!

Paso 6:cableado

V5 - Opción de radio (fotos de torreta roja). Esto incluye un chip de radio nRF24L01. Cambia completamente el cableado del pin Arduino para acomodar todas las conexiones. Detalles por venir ...

El empaque final es ajustado, por lo que vale la pena dedicar un tiempo aquí a averiguar las longitudes de los cables. La mayoría de los cables de interconexión con los que terminé tenían entre 3 "y 4".

Los LED se conectan directamente con las resistencias de 220 ohmios, seguidos de una envoltura retráctil y un poco de torsión del cableado, y luego se dejan a un lado, después de que se hayan probado. Usé cableado de calibre ligero aquí ya que tenía algunos por ahí (cableado de comunicación tipo CAT5) y no quería que el cableado visible fuera molesto.

Las brocas mecánicas se colocan de forma simulada en la carcasa, luego se determina el enrutamiento de los cables y luego se corta y prepara los cables.

Construí los conectores de servo para poder enchufar y reemplazar los servos si alguna vez estropeaba algo y quitaba los engranajes. Esto fue definitivamente útil después de estropear durante mi primer prototipo.

Una vez satisfecho con la mayor parte del cableado, los LED se soldaron al final. Entonces es el momento de meter con cuidado el conjunto cableado en la mitad de la carcasa. El último paso es soldar el conector de alimentación a los cables de alimentación una vez que esté todo dentro.

- Nota importante:¡Asegúrate de que el cableado que se encuentra detrás del Nano no esté presionando el botón de reinicio! Obviamente, esto causará problemas e impedirá que la unidad funcione correctamente. -

En este punto, todo el cableado está hecho, pero antes del ensamblaje final, es importante cargar el código en el Nano y encenderlo para asegurarse de que los LED, los servos y el reproductor MP3 funcionen como se diseñaron. Después de eso, es hora de juntar el resto de las piezas mecánicas.

Paso 7:Código Arduino

¡Código actualizado! Lo limpié e hice algunos ajustes.

El archivo adjunto es lo que se me ocurrió para conducir la unidad como se muestra en los videos. Seguiré ajustando para cambiar el carácter de la torreta y la forma en que se comporta. Muchas opciones aquí.

Estructuré el código usando subrutinas que llamo según sea necesario. Mantiene limpio el cuerpo principal y fue muy útil cuando estaba jugando con diferentes características. Me ayudó a manipular el código para diferentes comportamientos.

También utilicé muchas variables por adelantado que me ayudaron a modificar y ajustar las posiciones de estacionamiento y los rangos mínimo y máximo, por ejemplo.

Usé la biblioteca DFMiniMP3 en mi código. Probé otras bibliotecas, como la de DFRobot, pero tuve problemas, así que volví a esta. Significaba que tenía que mantener las piezas del 'vacío estático' para que siguiera funcionando. Estos no son necesarios para la operación, pero bueno, no soy un codificador maestro. Me encantaría saber de otra biblioteca que sea igualmente tan simple y ordenada como la biblioteca VL53LOX. ¡Avísame si encuentras una mejor manera de hacer esto!

En cuanto a los sonidos, la implementación se realiza de forma sencilla, al tener una carpeta denominada "mp3" en la tarjeta SD, con los nombres de los archivos 0001.mp3, 0002.mp3, etc. Los primeros cuatro dígitos deben estar en este formato, pero puede agregar cualquier sufijo después de eso para ayudar a identificar los sonidos particulares. Consulte https://www.dfrobot.com/blog-277.html para ver un ejemplo. He incluido una foto de los nombres de mis archivos tal como se usan en la carpeta. Los números corresponden a las llamadas en el código.

Los archivos de sonido que saqué de la página de Wikipedia sobre Portal Turret suenan. El código muestra un archivo de sonido aleatorio (1 de 2 o 3 sonidos) para evitar que las cosas se vuelvan obsoletas.

Paso 8:Ensamblaje final del cuerpo

Esta parte es un poco complicada debido a las tiras de relleno negras. La escala del ensamblaje final es lo suficientemente pequeña como para que las tiras y las ranuras receptoras sean diminutas. Esto requirió perseguir el canal con un puntero u otro pequeño implemento raspador para asegurarse de que las tiras encajaran con poca resistencia antes de intentar poner el otro lado.

Unir los cables cuidadosamente y atarlos según sea necesario hará que esto sea mucho más fácil.

He reunido un par de estos ahora y me resulta más fácil juntar las dos mitades primero y luego insertar las tiras de relleno. Inserte un lado en la mitad con el "estante" que evita que la tira de relleno se caiga, luego haga palanca para abrir y presione suavemente. No está tan mal ahora.

Esta fue una de las partes más complicadas. Quizás algún día, reconsidere este montaje, pero me gusta cómo se ve cuando está hecho, y es bastante sólido.

Paso 9:Ensambles de ala

Ahora que el cuerpo está unido, con los LED de las alas sobresaliendo, es hora de preparar las alas y ensamblarlas.

Es imperativo que los orificios del deslizador se perforen con una broca de 1/8 "y luego se limpien. Recorte las cabezas de los clavos con cortadores de pernos, mordazas, sierra para metales o su herramienta favorita para cortar clavos. Los pasadores del deslizador (clavos recortados ) se instalan en las alas colocándolas a presión en cada pieza de ala. Clavos rectos, desbarbados y alisados ​​son la clave para que esto funcione. Las correderas y los orificios de las alas deben lubricarse y probarse antes de conectar las bielas y ponerlas en funcionamiento. Se recomienda grafito u otro lubricante adecuado para PLA. Me parece que un pequeño tubo de lubricante personal funciona muy bien y es barato. Es muy resbaladizo. También requiere un poco de 'explicaciones' cuando tu pareja o padre entra y pregunta qué es exactamente ¡¡Lo necesitas para el banco de trabajo !!

Comience por averiguar qué parte del ala va a dónde, y pruebe primero deslizando esa parte. Luego, coloque las mitades superior e inferior juntas una vez que los pasadores estén instalados, aplique un poco de lubricante (un hisopo funciona bien para esto) y asegúrese de que las alas se deslicen bien. Esto puede ser complicado, pero sin asegurarse de que las alas se deslicen sin esfuerzo, sin atascarse, pasará un momento frustrante. Confía en mí ...

Una vez que las alas están listas para funcionar, solo es cuestión de deslizarlas en su lugar, ubicar la biela sobre el orificio del ala y ensamblar con un solo tornillo. Luego, los LED se insertan en los orificios de la pistola, los cables se colocan contra el ala y ¡está listo para comenzar! También puede usar un poco de pegamento termofusible para fijarlos en su lugar una vez que todo esté probado.

Paso 10:¡Asusta y sorprende a tus amigos!

La última pequeña advertencia sobre este diseño es que un enchufe en ángulo es una gran idea, ya que no interfiere con la pata trasera al girar. La pata trasera revisada (v3) se ha estirado para dar un poco más de espacio.

Una vez construido y enchufado (5V o adecuado para Nano), permanecerá en silencio hasta que se detecte a alguien dentro de la distancia programada, luego cobrará vida y matará a cualquiera que entre en su dominio.

¡Avísame si creas uno (o más) y si se te ocurren nuevas funciones o conceptos!

Código

  • Torreta del portal con radio (RED)
Torreta de portal con radio (RED) C / C ++
Código utilizado para torreta. Esto incluye código que habilitará el control por parte del Control de torreta maestro, que se muestra en otra página.
Los diferentes sabores requieren ajustes.
 /// * Portal Turret - ¡Opción con radio! * Chris Nowak - Febrero de 2019 * https://www.instructables.com/member/ChrisN219/ * https://create.arduino.cc/projecthub/Novachris/talking-portal-2-turret-gun-637bf3 * * Este El código incluye todas las funciones necesarias para ejecutar Cara Mia Opera, * Chat Time y modo Manual, según lo controla el Maseter Turret Control (MTC). * El MTC es un controlador independiente que se incluye en otra versión. La torreta * funcionará de forma autónoma utilizando este código sin el MTC. * * El código está diseñado para funcionar con tres torretas, pero cada una funcionará de forma independiente. * Queda mucho código de depuración. Úselo o límpielo como desee. En su mayoría está depurado, * pero no es perfecto. Dado el precio que pagaste, ¡me imagino que está bien!;) * =================RED ====================* / # incluye  #include  #include "Arduino.h" #include  #include  #include  #include  #include  # incluir  clase Mp3Notify {public:static void OnError (uint8_t errorCode) {// ver DfMp3_Error para el código que significa Serial.println (); Serial.print ("Error de comunicación"); Serial.println (errorCode); } vacío estático OnPlayFinished (uint8_t globalTrack) {Serial.println (); Serial.print ("Juego terminado para #"); Serial.println (globalTrack); } static void OnCardOnline (código uint8_t) {Serial.println (); Serial.print ("Tarjeta en línea"); Serial.println (código); } static void OnCardInserted (código uint8_t) {Serial.println (); Serial.print ("Tarjeta insertada"); Serial.println (código); } static void OnCardRemoved (código uint8_t) {Serial.println (); Serial.print ("Tarjeta extraída"); Serial.println (código); }}; Servo servo_pivot; Servo servo_wings; Servo servo_pitch; Sensor VL53L0X; // Configuración de la tarjeta de sonidoSoftwareSerialdarySerial (4, 2); // RX, TXDFMiniMp3  mp3 (secundarioSerial); // Configuración para radioRF24 radio (10, 9); // nRF24L01 (CE, CSN) RF24 Red de red (radio); // Incluir la radio en networkconst uint64_t this_node =01; // Esta torreta - Roja - en formato Octal (04,031, etc.) const uint64_t WHT =02; // Torreta 02 - Whiteconst uint64_t BLU =03; // Torreta 03 - Blueconst uint64_t MTC =00; // Control de torreta maestro sin firmar largo anteriorMillis1 =0; sin firmar largo anteriorMillis2 =0; sin firmar largo anteriorMillis3 =0; byte LED_LH_up =A1; byte LED_LH_down =A2; byte LED_CENTRE =A3; byte LED_RH_up =7; byte LED_RH_down =8; byte PIVOT 6; // whitebyte ALAS =3; // yellowbyte PITCH =5; // bluebyte parkPIVOT =96; // El número más pequeño gira CW visto desde el byte superior 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; byte pb1State; // Firebyte pb2State; // decir comentario byte aleatorio pb3State; byte randomPic; // Carga útil de Master Turret Control (MTC) // int payload [] ={0, 1, 2, 3, 4, 5}; // int payload [] ={x , y, pb1State, pb2State, pb3State, goState}; int payload [6]; / * Este es el mapa de "conversación" para "Chat Time". * 0-99 =dichos de la torreta roja * 100-199 =dichos de la torreta blanca * 200-299 =dichos de la torreta azul * Los archivos de todas las tarjetas SD se guardan como 0-100. * Agregue 100 al número de archivo aquí para blanco, 200 para azul. * El archivo 204 sería torreta AZUL, número de archivo 0004. * / int chatSayings [] ={0, // Iniciar pausa en i =0, seguido de "rondas" ... 204, 164, 25, // 1205, 127, 76, // 2208, 162, 65, // 3143, 230, 23, // 4130, 41, 225, // 5 153, 31, 133, // 6234, 49, 155, / / 7229, 175, 74, // 8231, 58, 226, // 9 161, 223, 59, // 10227, 68, 236, // 11136, 50, 224, // 12 34, 160 , 78, // 13 222, 42 // Fin}; / * Este es el mapa de tiempos de las torretas ROJA y BLANCA. Comparten dichos. * Estos tiempos corresponden al tiempo necesario * para reproducir los dichos individuales, en milisegundos. * Cambie los dichos anteriores como desee, pero no cambie estos tiempos. * Por ejemplo, i =2 tardará 0,8 segundos (NormalTimings [2]) * en reproducir el archivo chatSayings [2]. * / int NormalTimings [] ={1000, // Iniciar pausa en i =0, seguido de "rondas" ... 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}; / * Este es el mapa de tiempos de la torreta AZUL. * Estos tiempos corresponden al tiempo necesario * para reproducir los dichos individuales, en segundos. * Por ejemplo, i =2 tardará 0,9 segundos (DefectiveTimings [2]) * en reproducir el archivo chatSayings [2]. * / int DefectiveTimings [] ={1000, // Iniciar pausa en i =0, seguido de "rondas" ... 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}; ///////////////////////////////// ////////////////////////////////////// // =======================CONFIGURACIÓN =================================///// //////////////////////////////////////////////////// ////////////// void setup () {secundarioSerial.begin (9600); // Serial.begin (9600); // mp3.begin (); mp3.setVolume (22); Wire.begin (); SPI.begin (); // Configuración de radio radio.begin (); radio.setPALevel (RF24_PA_LOW); // pone la radio a baja potencia. Todos cerca uno del otro radio.setDataRate (RF24_2MBPS); // Encuentro que esto funciona mejor con múltiples radios network.begin (70, this_node); // (canal, dirección de nodo) sensor_read (); pinMode (LED_LH_up, SALIDA); pinMode (LED_LH_down, SALIDA); pinMode (LED_CENTRE, SALIDA); pinMode (LED_RH_up, SALIDA); pinMode (LED_RH_down, SALIDA); escritura digital (LED_CENTRE, ALTO); activar_servos (); servo_wings.write (WINGopen); // alas abiertas servo_pivot.write (parkPIVOT); // estacionar pivote servo_pitch.write (parkPITCH); // estacionar el tono randomWake =random (1, 3); mp3.playMp3FolderTrack (1); // reproducir retraso de comentario de despertar (2000); servo_wings.write (WINGclose); // retardo de alas de cierre (1500); digitalWrite (LED_CENTRE, BAJO); turn_off_servos (); busyRed =0;} ///////////////////////////////////////////// //////////////////////// =======================BUCLE PRINCIPAL =============================//////////////////////// ///////////////////////////////////////////////// bucle vacío ( ) {while (sensor.readRangeSingleMillimeters ()> triggerDistance) {// nada frente al sensor, no hacer nada ReadNet (); WriteNet (); sensor_de_salida (); if (payload [5] ==1) {// Condiciones utilizadas con MTC. La torreta funcionará automáticamente sin demora de MTC (500); WriteNet (); Cara_Mia (); // ¡¡Hora de la ópera !! } más si (carga útil [5] ==2) {retraso (500); WriteNet (); Chatty_time (); // ¡¡Tiempo de charla !!} ReadNet (); } más si (carga útil [5] ==3) {retraso (500); WriteNet (); Control manual (); // Control manual}} if (sensor.readRangeSingleMillimeters ()  triggerDistance) {// se abrió y la persona se volvió falsaActivate (); // di "¿a dónde fuiste?" comentario y retraso de cierre (2000); scanArea (); // realizar un escaneo del área} else {// definitivamente hay alguien allí - ¡abrir fuego! comprometerse(); retraso (2400); for (int j =0; j <=2; j ++) {if (sensor.readRangeSingleMillimeters ()  =maxPIVOT) pivotCW =0; if (posPIVOT <=minPIVOT) pivotCW =1; if (posPITCH> =maxPITCH) pitchCW =0; if (posPITCH <=minPITCH) pitchCW =1;} ////////////////////////////////////// /////////////////////////////// =======================ACTIVAR ==============================/////////////// //////////////////////////////////////////////////// //// void active () {// abre alas y di algo busyRed =1; ReadNet (); WriteNet (); sensor_de_salida (); escritura digital (LED_CENTRE, ALTO); // Ojo de LED en randomOpen =random (3, 6); // seleccionar comentario de apertura aleatorio mp3.playMp3FolderTrack (randomOpen); // jugar al azar "Te veo" comentario servo_wings.write (WINGopen); // alas abiertas sensor_salida (); retraso (3400);} ////////////////////////////////////////////// ///////////////////////// ====================FALSO ACTIVAR ============================/////////////////////////// //////////////////////////////////////////// void falseActivate () {/ / busyRed =1; ReadNet (); WriteNet (); sensor_de_salida (); randomFalse =random (6, 9); // seleccionar comentario de apertura aleatorio mp3.playMp3FolderTrack (randomFalse); // jugar al azar "¿a dónde fuiste?" 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 i =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(); regreso; } 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(); i++; } } 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("------- ");} */}

Piezas y carcasas personalizadas

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

Esquemas

Schematic that I made for building the turret.

Proceso de manufactura

  1. Ámbar
  2. Guillotina
  3. Lápida
  4. Traje de baño
  5. Silicio
  6. Patineta
  7. Vodka
  8. Carrusel
  9. Sofá
  10. Hierro
  11. La torreta de acabado reduce el tiempo de ciclo