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

Monstruo en una caja

Componentes y suministros

Caja de madera
× 1
Arduino UNO
× 1
Adafruit Wave Shield
× 1
Módulo de relé de 4 canales SainSmart
× 1
Motor del limpiaparabrisas
× 1
Luces de Navidad LED rojas (100)
× 1
Máquina de humo
× 1
Amplificador / altavoz con alimentación
× 1

Acerca de este proyecto

*** ACTUALIZADO a la versión 4 ***

Recientemente reescribí el código Arduino para este proyecto. Aquí hay un resumen de los cambios:

  • El bucle principal ahora se implementa como una máquina de estado
  • Todo el tiempo ahora se basa en la hora del evento frente a las evaluaciones de la hora actual

- el tiempo ya no depende de los fotogramas

- eliminación permitida de delay () en el bucle principal

- elimina el problema de 'puerto ocupado' cuando se conecta a Arduino IDE

  • Los relés ahora usan conexiones normalmente abiertas en lugar de normalmente cerradas. *** ¡Actualice sus conexiones de relés! ***
  • LED de detección de movimiento agregado
  • Se agregó el LED Ready to Wake
  • LED de pausa agregado
  • Interruptor de activación de acción eliminado
  • Se agregó la capacidad de agregar tiempo adicional a las luces rojas y el humo.

- permite que estos efectos funcionen un poco más que el rebotador de la tapa

  • Se agregaron muchos comentarios

Encontrarás el código más reciente aquí en github

Monstruo en una caja

Me encantan los accesorios de Halloween y he visto y leído acerca de un gran Monster in a Box construye el año pasado y decidí que debería construir el mío propio. La idea es bastante simple:crear la ilusión de que algún tipo de contenedor contiene un monstruo peligroso que está a punto de escapar. La ilusión se puede crear con cualquier combinación de movimiento, sonido, luz, humo y, por supuesto, sorpresa.

¿Qué hay en la caja?!?

Quieres una caja que sea lo suficientemente grande como para que parezca capaz de contener algo grande y aterrador. También aumenta la ilusión si la caja parece ser vieja, muy gastada y tal vez solo lo suficientemente fuerte como para mantener a raya al monstruo. Al principio, busqué algo en tiendas de segunda mano y en línea, pero nunca algo que me gustara, así que construí el mío. No fue muy difícil.

Usé 15 estacas de cercas de pino de 6 pies de Home Depot para hacer una caja que medía aproximadamente 3 pies x 2,5 pies x 2,5 pies. Corté toda la tabla a medida con una sierra de mesa y monté la caja con una clavadora neumática de clavos calibre 18. Esto pareció funcionar bien, pero luego me di cuenta de que los clavos no eran lo suficientemente fuertes para mantener la caja unida debido a todos los golpes y rebotes que estaría haciendo. Para fortalecer la caja, luego la atornillé con tornillos de pared seca de 1 pulgada (de adentro hacia afuera para que no se vieran).

Una vez construida, envejecí la madera con un proceso que usó té negro, vinagre y lana de acero. Luego lo decoré con plantillas y etiquetas que encontré en línea y / o creé e imprimí.

Brainzzzzz !!!

El accesorio tiene 2 estados operativos "Durmiendo" y "Despierto". Mientras duerme, la caja está relativamente tranquila y solo produce ronquidos y gruñidos leves. El monstruo se despierta cuando un truco o trato dispara un sensor de movimiento. Cuando el monstruo se despierta, el monstruo ruge, respira humo, hace rebotar la tapa y el interior de la caja se ilumina en rojo.

Usé un Arduino Uno junto con un WaveShield y un módulo de relé para orquestar el comportamiento de este accesorio. WaveShield está cargado con una pequeña colección de sonidos rugientes y para dormir. Un sensor de movimiento PIR proporcionó entrada al Arduino para cambiar la caja entre los modos "durmiendo" y "despierto". Durante el modo despierto, el Arduino activa los canales de relé para hacer funcionar el motor de la tapa, las luces rojas y el generador de humo. y reproducir los sonidos en WaveShield. Otra característica que agregué fue un botón de pausa. Esto me permitió silenciar temporalmente al monstruo cuando venían niños más pequeños.

¡Está vivo!

Un levantador de tapa es un dispositivo que levanta y baja rápidamente la tapa para hacerla golpear y rebotar como si el monstruo estuviera tratando de escapar. Hay varias formas en que esto se puede hacer, los más populares parecen ser los actuadores neumáticos y las levas giratorias. Aunque creo que un actuador neumático controlado electrónicamente me habría permitido hacer que los movimientos de la tapa fueran mucho más aleatorios, decidí optar por la leva giratoria, ya que parecía ser la opción más simple y menos costosa.

Compré un motor de limpiaparabrisas de automóvil usado en un depósito de chatarra local por $ 15. Fue un poco divertido. Entré y pedí un motor. El tipo detrás del mostrador preguntó "qué marca y modelo de auto" cuando dije "No me importa", inclinó un poco la cabeza hacia un lado y me miró de reojo. Después de que le expliqué lo que estaba haciendo, él quería construir uno :)

Estos motores, independientemente de la marca / modelo, funcionan con 12 voltios, giran a una velocidad razonable y tienen un gran par:¡perfecto! Nota. Cuando obtenga uno, asegúrese de que tenga parte del arnés de cables antiguo, ya que le resultará mucho más fácil empalmar el cable. también asegúrese de que tenga su brazo de manivela y su poste desplazado. Si el poste principal del motor es la única conexión física que tiene para trabajar, es probable que su cámara se deslice.

Monte el motor en algún lugar dentro de su caja. Puse el mío en una de las paredes laterales. Recuerde que habrá una leva giratoria grande conectada a él y debe poder girar libremente y sin ningún elemento, especialmente cables, que vaya a poner en la caja. Hay varios buenos tutoriales en YouTube sobre cómo trabajar con estos motores.

Corté una leva de 12 pulgadas de diámetro de un trozo de madera de 1/2 capa. primero corté un círculo perfecto. Lo monté en el motor y lo usé para determinar la altura requerida del motor en la caja. Solo quería que la tapa se levantara aproximadamente 2 pulgadas. Después de hacer este ajuste, utilicé una sierra de calar para cortar "dientes" aleatoriamente en la leva, haciendo todo lo posible para mantenerlos a un ancho y profundidad aleatorios.

Por último, monté un rodillo en la parte inferior de la tapa con 2 soportes metálicos en L, un espaciador de nailon de 1 pulgada y un perno de carro. El rodillo se coloca justo encima de la leva para que se mueva a lo largo de los dientes de la leva.

Usé el riel de 12 voltios de una fuente de alimentación ATX para alimentar el motor a través del relé controlado por Arduino. Sí, conseguir que todo se alinee requiere un poco de prueba y error. Después de reposicionar el rodillo una o dos veces ... ok tres veces ... ¡todo se alineó y la tapa comenzó a rebotar como estaba planeado!

Aliento de fuego:humo y luces

Usé un generador de humo barato de 400 vatios para efectos de humo. Fuera de la caja, esto fue controlado por radio. Para controlarlo con el Arduino, abrí el receptor y soldé dos líneas de plomo a las almohadillas de los botones de disparo. Esto me proporcionó líneas que conecté a un canal de relé controlado por Arduino. Fue un truco simple que aprendo viendo algunos videos de YouTube. También agregué una vieja manguera de aspiradora para que el humo saliera como un chorro justo debajo de la tapa. Me gustó el efecto visual y ayudó a reducir la condensación de vapor en los componentes electrónicos dentro de la caja.

Para las luces, simplemente corté un cable de extensión de servicio liviano y lo conecté a través de un canal de relé. La cadena de 100 luces LED rojas conectadas a esto podría encenderse y apagarse mediante Arduino.

Utilice su voz exterior

El WaveShield tiene un conector para auriculares de 1/8 de pulgada como salida, así como 2 pines de E / S para una conexión directa. Usé un patch chord de 1/8 de pulgada para conectarlo a un amplificador de bajo de 30 Watt que tomé prestado de mi sala de práctica. Cualquier número de altavoces amplificados funcionaría, incluidos los altavoces de PC. Pero usar algo con bajos sólidos es definitivamente una ventaja.

Encadenarlo

Compro algunas cadenas de plástico en una tienda de Halloween e imprimí en 3D un candado. Envolverlos sobre la caja añadió profundidad y sensación a la ilusión.

Halloween !!!

Coloque la caja en el jardín y oculte el sensor de movimiento en un arbusto cercano. Utilicé un tramo largo de cable de altavoz para conectar el sensor de modo que pudiera experimentar con la posición de modo que el monstruo se despertara cuando alguien se acercaba (unos 5 pies) a la caja.

A medida que la noche se hizo más oscura, me di cuenta de que todos los detalles del exterior de la caja se estaban volviendo difíciles de ver. Finalmente lo iluminé con un reflector estroboscópico y quedé muy contento con el efecto.

A medida que los asistentes al truco o trato caminaron por el camino de entrada, notaron la caja de gruñidos:algunos con curiosidad, otros en realidad le tenían miedo. A medida que se acercaban y el monstruo cobraba vida rugiendo, se levantaban y chillaban, algunos incluso aplaudían. Fue un gran éxito.

Mejoras

Me cansé de buscar formas de esconder mi sensor de movimiento en los arbustos, así que pegué uno en el vientre de una rata de plástico que puedo colocar en algún lugar a lo largo del camino de entrada o debajo de ese arbusto cercano. También instalé un conector telefónico RJ11 en la parte posterior de la caja para poder conectar el sensor de movimiento de la rata usando un cable telefónico de 50 pies, que es mucho mejor que los dos hilos de cable de altavoz que estaba usando anteriormente.

Notarás que también agregué un interruptor y algunos indicadores LED a esa nueva placa. El interruptor PAUSA todas las funciones de la caja sin apagarla. Mi interruptor principal es la regleta interior y es incómodo de acceder, además, con esto solo usa voltaje de señal (5v) en este interruptor externo. Este interruptor ha sido excelente para detener al monstruo para los jóvenes que hacen truco o trato y otros que piden echar un vistazo al interior en la noche de Halloween.

¡Oh! Coloco cadenas de plástico sobre la caja para darle efecto y, a veces, pueden resultar difíciles de manejar. Especialmente si necesito meterme en el palco durante la noche. Para hacer esto más fácil, até con cremallera mosquetones de resorte negros a los extremos de las cadenas. Esto me permite desenganchar / enganchar rápidamente los extremos de los ojales que atornillé en las esquinas inferiores de la caja. No es de muy alta tecnología, pero es muy útil.

El futuro

Hay algunas cosas que quiero agregar en el futuro. Tal vez el control de R / C para que pueda pausar o activar al monstruo desde la distancia. También agregaré algún tipo de retroalimentación al levantador de tapa para que el Arduino pueda 'saber' cuando la tapa está abierta o cerrada. Varias veces el levantador se detuvo en un punto alto del ciclo, lo que hizo que las "entrañas" de la caja fueran visibles hasta el siguiente ciclo de vigilia. Por último, puedo conectar las luces / luces estroboscópicas externas al Arduino para permitir que sean controladas por el programa o por el mando a distancia.

Repositorio de GitHub

Encontrará el código y los diagramas de cableado más recientes aquí en GitHub

Código

  • Bosquejo del monstruo en una caja
  • MonsterSounds.h
  • MonsterSounds.ino
Monster In A Box Sketch C / C ++
 / * Pines de protección contra ondas en uso:2, 3, 4, 5, 10, 11, 12 y 13 Los pines 13, 12, 11 siempre se utilizan en la tarjeta SD (son los únicos pines que tienen un SPI de alta velocidad). interfaz). Luego, hay otros 5 pines que se usan para hablar con el DAC y la tarjeta SD, pero se pueden configurar para conectarse a cualquier pin arduino. Sin embargo, de forma predeterminada, la biblioteca está configurada para usar los pines 10 (para la tarjeta SD) y los pines 2, 3, 4 y 5 para el DAC. Para cambiar estos pines es necesario modificar la biblioteca:los pines se referencian por sus nombres de pines de 'hardware' (es decir, PORTD, etc.), no por pines arduino. Eso significa que los pines 6, 7, 8, 9 y los 6 pines de entrada analógica (también conocidos como pines de E / S digitales 14-20) están disponibles. shield-for-arduino / faq * / # include "MonsterSounds.h" #define RESERVED_00 0 // Reservado para Serial RX # define RESERVED_01 1 // Reservado para Serial TX # define RESERVED_02 2 // Reservado para Wave Shield # define RESERVED_03 3 // Reservado para Wave Shield # define RESERVED_04 4 // Reservado para Wave Shield # define RESERVED_05 5 // Reservado para Wave Shield # define FOG_MACHINE 6 // Conecta el pin digital en Arduino al módulo de relé # define RED_LEDS 7 // Conecta el pin digital en Arduino al módulo de relé # define LID_BOUNCER 8 // Conecta el pin digital en Arduino al módulo de relé # define RESERVED_09 9 // Conecta el pin digital en Arduino al módulo de relé # define RESERVED_10 10 // Reservado para Wave Shield # define RESERVED_11 11 // Reservado para Wave Shield # define RESERVED_12 12 // Reservado para Wave Shield # define RESERVED_13 13 // Reservado para Wave Shield # define PIR_SENSOR A 0 // Entrada PIR # define MOTION_LED A1 // LED:se enciende cuando se detecta movimiento (independientemente del estado de pausa / dormir / despertar) #define PAUSED_LED A2 // LED:se enciende cuando el sistema está en pausa # define READY_LED A3 // LED:se enciende cuando el monstruo está en estado READY_TO_WAKE # define PAUSE_BUTTON A4 // Entrada de interruptor de pausa # define DEBUG_BUTTON A5 // Entrada de interruptor de depuración // Configuración del temporizador de efectos - en segundos (EDITAR ESTOS) #define WAKE_DELAY 30 // Cantidad mínima de tiempo entre 'despertar' ocurre en segundos # define WAKE_DELAY_DEBUG 10 // WAKE_DELAY anula cuando el interruptor DEGUB está activado # define SLEEP_SOUND_DELAY 1 // Número de segundos de espera entre intentar disparar el siguiente sonido de 'suspensión' # define WAKE_MIN 3 // Cantidad mínima de tiempo de 'despertar' en Segundos # define WAKE_MAX 5 // Cantidad máxima de tiempo 'despierto' en Segundos # define RED_LIGHT_EXTRA_TIME 1 // Permite que las luces rojas funcionen un poco más que el rebotador de la tapa, si se desea # define SMOKE_EXTRA_TIME 2 // Permite que el humo corra un poco más largo que el saltador de la tapa, si se desea // Efectos Timers Configuración - en milisegundos (No edite estos) #define WAKE_DELAY_MILLIS WAKE_DELAY * 1000 # define WAKE_DELAY_DEBUG_MILLIS WAKE_DELAY_DEBUG * 1000 # define SLEEP_SOUND_DELAY_MILLIS SLEEP_SOUND_DELAY * 1000 # define WAKE_MIN_MILLIS WAKE_MIN * 1000 # define WAKE_MAX_MILLIS WAKE_MAX * 1000 # define RED_LIGHT_EXTRA_TIME_MILLIS RED_LIGHT_EXTRA_TIME * 1000 # definir SMOKE_EXTRA_TIME_MILLIS SMOKE_EXTRA_TIME * 1000MonsterSounds sonidos; static unsigned long timeSinceLastSnore =0; static unsigned long wakeAllowedTimer =0; static unsigned long lidBounceTimer =0; static unsigned long lidBounceDuration =0; static unsigned long smokeTimer =0; static unsigned long smokeDuration =0; static unsigned long smokeDuration =0; static unsigned long lidBounceTimer =0; static unsigned long lidBounceDuration =0; static unsigned long smokeTimer =0; static unsigned long smokeDuration =0; static unsigned long smokeDuración redLightTimer =0; static unsigned long redLightDuration =0; enum States {STATE_INITIALIZE, // Solo mientras se ejecuta setup () y la primera vez en loop () STATE_PAUSED, // Apaga todos los sonidos y efectos STATE_SLEEPING, // Sin efectos, sonidos para dormir , no permite que se active el despertar STATE_READY_TO_WAKE, // No efectos, sonidos para dormir, permite que se active el despertar STATE_AWAKE}; // Dispara efectos y sonidos de monstruos despiertosEstados state =STATE_INITIALIZE; void setup () {// inicializa la comunicación serial:Serial.begin (9600); // Configurar todos los Pines de relé pinMode (LID_BOUNCER, OUTPUT); pinMode (RED_LEDS, SALIDA); pinMode (FOG_MACHINE, SALIDA); pinMode (PAUSED_LED, SALIDA); pinMode (MOTION_LED, SALIDA); pinMode (LISTO_LED, SALIDA); // Forzar todos los efectos a APAGAR stopAllEffects (); pinMode (PIR_SENSOR, ENTRADA); pinMode (PAUSE_BUTTON, INPUT_PULLUP); pinMode (DEBUG_BUTTON, INPUT_PULLUP); sonidos.inicializar (); // Sonidos de monstruos sounds.playSystemReady (); retraso (1000); Serial.println (); Serial.print ("*** Sistema listo ***"); Serial.println (); } / * * NOTA:Todos los botones usan pullups, por lo tanto, BAJO significa que el botón está PRESIONADO * Tenga en cuenta que el pull-up significa que la lógica del interruptor está invertida. * Se pone ALTO cuando está abierto y BAJO cuando se presiona. * * El sensor de movimiento PIR NO se comporta de esta manera. * // * * Bucle de procesamiento principal * - Administra la máquina de estado del monstruo * / void loop () {boolean pauseSwitchClosed =digitalRead (PAUSE_BUTTON) ==LOW; movimiento booleanoDetected =digitalRead (PIR_SENSOR) ==HIGH; digitalWrite (MOTION_LED, digitalRead (PIR_SENSOR)); switch (estado) {case STATE_INITIALIZE:if (pauseSwitchClosed) {goToPause (); } else {goToSleep (); } descanso; case STATE_PAUSED:if (! pauseSwitchClosed) {goToSleep (); digitalWrite (PAUSED_LED, BAJO); } else {digitalWrite (PAUSED_LED, HIGH); } descanso; case STATE_SLEEPING:if (pauseSwitchClosed) {goToPause (); } else if (isAllowedToWake ()) {goToReadyToWake (); } else {processSleeping (); } descanso; case STATE_READY_TO_WAKE:if (pauseSwitchClosed) {goToPause (); digitalWrite (LISTO_LED, BAJO); } else if (motionDetected) {goToAwake (); digitalWrite (LISTO_LED, BAJO); } else {processSleeping (); } descanso; case STATE_AWAKE:if (pauseSwitchClosed) {goToPause (); } else if (processAwakeAnimation ()) {goToSleep (); } // processAwakeAnimation () devuelve verdadero cuando todas las animaciones están completas break; predeterminado:Serial.println ("ESTADO DESCONOCIDO"); descanso; // Nunca deberíamos llegar aquí}} / * * Transición al estado de pausa * / inline void goToPause () {Serial.println ("PAUSED"); state =STATE_PAUSED; stopAllEffects (); sound.stopAll ();} / * * Transición al estado de suspensión * / inline void goToSleep () {Serial.println ("IR A DORMIR"); state =STATE_SLEEPING; wakeAllowedTimer =millis ();} / * * Transición al estado Listo para despertar * Este es un caso especial del estado durmiente * / inline void goToReadyToWake () {Serial.println ("LISTO PARA DESPERTAR"); state =STATE_READY_TO_WAKE; } / * * Transición al estado despierto * - Despierta al monstruo y procesa los efectos y sonidos * / inline void goToAwake () {Serial.println ("AWAKE"); state =STATE_AWAKE; wakeMonster ();} / * * procesar un ciclo de la actividad SLEEP * - Ejecutar sonidos para dormir * - Actualizar el temporizador de suspensión * / inline void processSleeping () {if ((millis () - timeSinceLastSnore)> SLEEP_SOUND_DELAY_MILLIS) {sounds.playSnore ( ); timeSinceLastSnore =millis (); }} / * * Determina si el monstruo puede despertar en este momento. * - Verifique el interruptor de depuración, si está cerrado usamos un Temporizador de activación permitido más corto * - El monstruo debe dormir por un tiempo mínimo predefinido antes de que pueda ser despertado * - Iluminar el LED cuando está listo para ser despertado * / booleano en línea isAllowedToWake ( ) {boolean isDebug =digitalRead (DEBUG_BUTTON) ==LOW; unsigned long requiredDelay =WAKE_DELAY_MILLIS; if (isDebug) {requiredDelay =WAKE_DELAY_DEBUG_MILLIS; } boolean isAllowed =(millis () - wakeAllowedTimer)> requiredDelay; if (isAllowed) {digitalWrite (READY_LED, HIGH); } return isAllowed;} / * * Wake Monster * Inicia las animaciones de Awake * Reproduce los sonidos de Awake * * Llame a esto UNA VEZ para iniciar el estado de DESPIERTO. * / void wakeMonster () {int activityDuration =aleatorio (WAKE_MIN_MILLIS, WAKE_MAX_MILLIS); // este es el tiempo que el monstruo estará activo Serial.print ("duración de la activación:"); Serial.print (activityDuration); Serial.println ("ms"); bounceLid (activityDuration); flashRedLight (activityDuration + RED_LIGHT_EXTRA_TIME_MILLIS); activeSmoke (activityDuration + SMOKE_EXTRA_TIME_MILLIS); sound.playRoar ();} / * * Gestiona el progreso de las animaciones DESPERTAR * Llama a esto CADA CICLO durante el estado DESPIERTO. * Devuelve VERDADERO cuando todas las animaciones están completas * / boolean processAwakeAnimation () {printTimersToLog (); booleano done1 =falso; booleano done2 ​​=falso; booleano done3 =falso; if (millis () - lidBounceTimer> lidBounceDuration) {bounceLid (0); hecho1 =verdadero; } if (millis () - redLightTimer> redLightDuration) {flashRedLight (0); done2 ​​=verdadero; } if (millis () - smokeTimer> smokeDuration) {activeSmoke (0); done3 =verdadero; } return done1 &&done2 ​​&&done3;} / * * Administrar efecto:rebotar la tapa de la caja * - diration es el número de milisegundos que el efecto debe ejecutarse * - la duración de 0 significa que el efecto debe detenerse * / inline void bounceLid (unsigned larga duración) {if (duración <=0) {energizeRelay (LID_BOUNCER); lidBounceDuration =0; } else {// inicia la tapa rebotando de_energizeRelay (LID_BOUNCER); lidBounceTimer =millis (); lidBounceDuration =duración; }} / * * Administrar efecto:destello de luces rojas * - diration es el número de milisegundos que el efecto debe ejecutarse * - duración de 0 significa que el efecto debe detenerse * / inline void flashRedLight (larga duración sin firmar) {if (duration <=0) {energizeRelay (RED_LEDS); redLightDuration =0; } else {// enciende la luz intermitente de_energizeRelay (RED_LEDS); RedLightTimer =millis (); redLightDuration =duración; }} / * * Start / Stop Effect:Activate Smoke * - diration es la cantidad de milisegundos que el efecto debe ejecutarse * - la duración de 0 significa que el efecto debe detenerse * / inline void activeSmoke (larga duración sin firmar) {// ' presione 'el botón de humo // la duración debe ser una cantidad fija de tiempo necesaria para que la máquina responda a la acción // establecer un tiempo de espera para que se detenga después de la duración si (duración <=0) {energizeRelay (FOG_MACHINE); smokeDuration =0; } else {// enciende la luz intermitente de_energizeRelay (FOG_MACHINE); smokeTimer =milis (); smokeDuration =duración; }} / * * Detener todos los efectos * - Esto efectivamente apaga al monstruo * / inline void stopAllEffects () {bounceLid (0); flashRedLight (0); activeSmoke (0);} / * * Imprime los temporizadores de Awake Animation en el registro una vez por segundo * / inline void printTimersToLog () {static unsigned long timeofLastTimerLog =0; if (millis () - timeofLastTimerLog> =1000) {Serial.print ("tapa:"); Serial.print ((millis () - lidBounceTimer)> lidBounceDuration? 0:(lidBounceDuration - (millis () - lidBounceTimer))); Serial.print ("luces:"); Serial.print ((millis () - redLightTimer)> redLightDuration? 0:(redLightDuration - (millis () - redLightTimer))); Serial.print ("humo:"); Serial.println ((millis () - smokeTimer)> smokeDuration? 0:(smokeDuration - (millis () - smokeTimer))); timeofLastTimerLog =millis (); }} / * * Energize Relay * Establece el terminal Normalmente Abierto (NO) en OPEN * Normalmente Cerrado se convertirá en Cerrado * / inline void energizeRelay (int channel) {digitalWrite (channel, HIGH); } / * * Desactivar relé * Establece el terminal normalmente abierto (NO) en CERRADO. * Normalmente Cerrado se convertirá en ABIERTO * / inline void de_energizeRelay (int channel) {digitalWrite (channel, LOW); } 
MonsterSounds.h C / C ++
Cabecera de Arduino para la biblioteca de sonidos de monstruos
 / * NOTA SOBRE LOS PINS DE ARDUINO * Los pines 13, 12, 11 siempre son usados ​​por la tarjeta SD (son los únicos pines que tienen una interfaz SPI de alta velocidad). * Luego hay otros 5 pines que se usan para hablar con el DAC y la tarjeta SD, pero se pueden configurar para conectarse a cualquier pin arduino. * Sin embargo, de forma predeterminada, la biblioteca está configurada para usar los pines 10 (para la tarjeta SD) y los pines 2, 3, 4 y 5 para el DAC. * Para cambiar estos pines es necesario modificar la biblioteca:los pines se referencian por sus nombres de pines de 'hardware' (es decir, PORTD, etc.), no por pines arduino. * Eso significa que los pines 6, 7, 8, 9 y los 6 pines de entrada analógica (también conocidos como pines de E / S digitales 14-20) están disponibles. * * / #include  #include  #include  #include  static const char roar0 [] ="ROAR0000.wav"; static const char roar1 [] ="ROAR0001.wav"; static const char roar2 [] ="ROAR0002.wav"; static const char * const roarSounds [] ={rugido0, rugido1, rugido2}; static const char sleep0 [] ="SNORE000.wav"; static const char sleep1 [] ="SNORE001.wav"; static const char sleep2 [] ="SNORE002.wav"; static const char * const sleepSounds [] ={sleep0, sleep1, sleep2}; int previousRoarSound =-1; class MonsterSounds {privado:tarjeta SdReader; // Este objeto contiene la información de la tarjeta FatVolume vol; // Contiene la información de la partición en la tarjeta raíz FatReader; // Contiene la información del archivo FatReader del directorio raíz de los volúmenes; // Este objeto representa el archivo WAV para una frase WaveHC wave; // Un objeto de onda única:solo se reproduce un sonido a la vez void playfile (char * name); public:void initialize (); void playSystemReady (); void playRoar (); void playSnore (); void stopAll ();}; 
MonsterSounds.ino C / C ++
Código Arduino para la biblioteca de sonidos de monstruos
 / * NOTA SOBRE LOS PINES ARDUINO * Los pines 13, 12, 11 siempre son usados ​​por la tarjeta SD (son los únicos pines que tienen una interfaz SPI de alta velocidad). * Luego hay otros 5 pines que se usan para hablar con el DAC y la tarjeta SD, pero se pueden configurar para conectarse a cualquier pin arduino. * Sin embargo, de forma predeterminada, la biblioteca está configurada para usar los pines 10 (para la tarjeta SD) y los pines 2, 3, 4 y 5 para el DAC. * Para cambiar estos pines es necesario modificar la biblioteca:los pines se referencian por sus nombres de pines de 'hardware' (es decir, PORTD, etc.), no por pines arduino. * Eso significa que los pines 6, 7, 8, 9 y los 6 pines de entrada analógica (también conocidos como pines de E / S digitales 14-20) están disponibles. * * / void MonsterSounds ::initialize () {Serial.println ("Inicializando sonidos ..."); if (! card.init ()) Serial.println (F ("¡Inicialización de tarjeta fallida!")); if (! vol.init (tarjeta)) Serial.println (F ("¡Sin partición!")); if (! root.openRoot (vol)) Serial.println (F ("No se pudo abrir el directorio")); Serial.println (F ("Archivos encontrados:")); root.ls (); randomSeed (analogRead (0));} void MonsterSounds ::playSystemReady () {this-> playfile ("WELCOME0.WAV");} void MonsterSounds ::playRoar () {int index =random (3); // 0, 1, 2 while (index ==previousRoarSound) {index =random (3); } previousRoarSound =índice; this-> playfile (roarSounds [index]);} void MonsterSounds ::playSnore () {if (! wave.isplaying) // No interrumpas un sonido existente con ronquidos {int index =random (3); // 0, 1, 2 this-> playfile (sleepSounds [índice]); }} void MonsterSounds ::stopAll () {wave.stop (); // Detiene cualquier WAV que se esté reproduciendo actualmente} // --------------------------------------- ---------------------------- // playfile () // Abra y comience a reproducir un archivo WAV // ------ -------------------------------------------------- ----------- void MonsterSounds ::playfile (char * name) {PgmPrint ("Reproduciendo sonido:"); Serial.println (nombre); if (wave.isplaying) {// ya está reproduciendo algo, ¡así que deténgalo! wave.stop (); // detenerlo} if (! file.open (root, name)) {PgmPrintln ("Archivo no encontrado"); regreso; } if (! wave.create (file)) {PgmPrintln ("No es un WAV válido"); regreso; } // ¡Bien, es hora de jugar! wave.play ();} 

Piezas y carcasas personalizadas

monstersounds_7vLZD3NU4t.zip

Esquemas


Proceso de manufactura

  1. Máquina de EEG
  2. Caja de jugo
  3. Máquina expendedora
  4. Cambiar máquina
  5. Máquina de coser
  6. Pantimedias
  7. Haga una máquina de escribir para hacer tareas caseras en casa
  8. Giftduino - La caja de regalo perfecta para Arduino
  9. Máquina de LEVITACIÓN ULTRASÓNICA usando ARDUINO
  10. Arduino + ESP Weather Box
  11. Reloj digital en Arduino usando una máquina de estados finitos