Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Monstre dans une boîte

Composants et fournitures

Caisse/Boîte en bois
× 1
Arduino UNO
× 1
Adafruit Wave Shield
× 1
Module relais 4 canaux SainSmart
× 1
Moteur d'essuie-glace
× 1
Lumières de Noël à DEL rouges (100)
× 1
Machine à fumée
× 1
Ampli/enceinte amplifié
× 1

À propos de ce projet

*** MIS À JOUR à Ver 4 ***

J'ai récemment réécrit le code Arduino pour ce projet. Voici un résumé des changements :

  • La boucle principale est maintenant implémentée comme une machine à états
  • Tous les horaires sont désormais basés sur l'heure de l'événement par rapport aux évaluations de l'heure actuelle

- le timing ne dépend plus des images

- suppression autorisée de delay() dans la boucle principale

- élimine le problème de « port occupé » lors de la connexion à Arduino IDE

  • Les relais utilisent désormais des connexions normalement ouvertes plutôt que normalement fermées *** Mettez à jour vos connexions de relais !!! ***
  • Ajout d'une LED de détection de mouvement
  • Ajout d'un voyant Prêt à se réveiller
  • Ajout d'une LED en pause
  • Interrupteur de déclenchement d'action supprimé
  • Ajout de la possibilité d'ajouter du temps supplémentaire aux feux rouges et à la fumée

- permet à ces effets de fonctionner un peu plus longtemps que le videur de couvercle

  • Ajout de nombreux commentaires

Vous trouverez tout le dernier code ici sur github

Monstre dans une boîte

J'adore les accessoires d'Halloween et j'ai vu et lu de superbes Monster in a Box construit l'année dernière et j'ai décidé de construire le mien. L'idée est assez simple :créer l'illusion qu'un certain type de conteneur contient un monstre dangereux qui est sur le point de s'échapper. L'illusion peut être créée avec n'importe quelle combinaison de mouvement, de son, de lumière, de fumée et, bien sûr, de surprise.

Qu'y a-t-il dans la boîte !?!?

Vous voulez une boîte suffisamment grande pour qu'elle semble capable de contenir quelque chose de gros et d'effrayant. Cela ajoute également à l'illusion si la boîte semble être vieille, bien usée et peut-être juste assez solide pour tenir le monstre à distance. Au début, j'ai magasiné dans les friperies et en ligne pour quelque chose mais jamais quelque chose que j'aimais, alors j'ai construit le mien. Ce n'était pas très difficile.

J'ai utilisé 15 piquets de clôture en pin de 6 pieds de Home Depot pour fabriquer une boîte mesurant environ 3 pieds x 2,5 pieds x 2,5 pieds. J'ai coupé toute la planche à la longueur avec une scie à table et assemblé la boîte à l'aide d'une cloueuse pneumatique de calibre 18. Cela a semblé bien fonctionner, mais plus tard, j'ai réalisé que les attaches parisiennes n'étaient pas assez solides pour maintenir la boîte ensemble en raison de tous les coups et rebondissements qu'elle ferait. Pour renforcer la boîte, je l'ai ensuite vissée avec des vis pour cloison sèche de 1 pouce (de l'intérieur vers l'extérieur pour qu'elles ne se voient pas).

Une fois construit, j'ai vieilli le bois avec un processus qui utilisait du thé noir, du vinaigre et de la laine d'acier. Je l'ai ensuite décoré avec des pochoirs et des étiquettes que j'ai trouvés en ligne et/ou créés et imprimés.

Brainzzzzzz !!!

L'hélice a 2 états opérationnels "Sleeping" et "Awake". Pendant le sommeil, la boîte est relativement calme et ne fait que des ronflements et des grognements légers. Le monstre est réveillé lorsqu'un trick-or-treater déclenche un capteur de mouvement. Lorsque le monstre est réveillé, le monstre rugit, respire de la fumée, fait rebondir le couvercle et l'intérieur de la boîte devient rouge.

J'ai utilisé un Arduino Uno avec un WaveShield et un module de relais pour orchestrer le comportement de cet accessoire. Le WaveShield est chargé d'une petite collection de sons endormis et rugissants. Un capteur de mouvement PIR a fourni une entrée à l'Arduino pour basculer la boîte entre les modes "sommeil" et "éveil". En mode veille, l'Arduino active les canaux de relais pour faire fonctionner le moteur du couvercle, les lumières rouges, le générateur de fumée. et jouez les sons sur le WaveShield. Une autre fonctionnalité que j'ai ajoutée était un bouton Pause. Cela m'a permis de faire taire temporairement le monstre lorsque de jeunes enfants passent.

C'est Aliiiiiiiive !

Un lève-couvercle est un appareil qui soulève et abaisse rapidement le couvercle pour le faire claquer et rebondir comme si le monstre essayait de s'échapper. Il existe plusieurs façons de le faire, les plus populaires semblent être les actionneurs pneumatiques et les cames rotatives. Bien que je pense qu'un actionneur pneumatique à commande électronique m'aurait permis de rendre les mouvements du couvercle beaucoup plus aléatoires, j'ai décidé d'opter pour une came rotative car cela semblait être l'option la plus simple et la moins chère.

J'ai acheté un moteur d'essuie-glace automobile d'occasion dans un parc à ferraille local pour 15 $. C'était assez drôle. Je suis entré et j'ai demandé un moteur. Le gars derrière le comptoir a demandé "pour quelle marque et quel modèle de voiture" quand j'ai dit "je m'en fiche", sa tête s'est penchée un peu sur le côté et il m'a donné un peu d'œil de côté. Après avoir expliqué ce que je préparais, il voulait en construire un :)

Ces moteurs, quelle que soit la marque/le modèle, fonctionnent sur 12 volts, tournent à une vitesse raisonnable et ont un bon couple :parfait ! Noter. Lorsque vous en obtenez un, assurez-vous qu'il contient une partie de l'ancien faisceau de câbles, il vous sera beaucoup plus facile d'y épisser votre fil. assurez-vous également qu'il a son bras de manivelle et son poteau décalé. Si le poste moteur principal est la seule connexion physique que vous devez utiliser, votre came glissera probablement.

Montez le moteur quelque part à l'intérieur de votre boîte. J'ai mis le mien sur l'un des murs latéraux. N'oubliez pas qu'une grande came rotative y sera connectée et qu'elle doit pouvoir tourner librement et sans aucun élément, en particulier les fils, que vous allez mettre dans la boîte. Il existe plusieurs bons tutoriels sur YouTube sur l'utilisation de ces moteurs.

J'ai coupé une came de 12 pouces de diamètre dans un morceau de bois 1/2 pli. J'ai d'abord coupé un cercle parfait. Je l'ai monté sur le moteur et l'ai utilisé pour déterminer la hauteur requise du moteur dans la boîte. Je voulais seulement que le couvercle se soulève d'environ 2 pouces. Après avoir effectué cet ajustement, j'ai utilisé une scie sauteuse pour couper au hasard des « dents » dans la came en essayant de mon mieux de les maintenir à une largeur et à une profondeur aléatoires.

Enfin, j'ai monté un rouleau sous le couvercle à l'aide de 2 supports en L métalliques, d'une entretoise en nylon de 1 pouce et d'un boulon de carrosserie. Le galet est positionné juste au-dessus de la came afin qu'il roule le long des dents de la came.

J'ai utilisé le rail 12 volts d'une alimentation ATX pour alimenter le moteur via le relais contrôlé par l'Arduino. Oui, tout aligner nécessite un peu d'essais et d'erreurs. Après avoir repositionné le rouleau une ou deux fois... ok trois fois... tout s'est aligné et le couvercle a commencé à rebondir comme prévu !

Souffle de Feu :Fumée et Lumières

J'ai utilisé un générateur de fumée bon marché de 400 watts pour les effets de fumée. Hors de la boîte, c'était radiocommandé. Pour le contrôler avec l'Arduino, j'ai ouvert le récepteur et soudé deux lignes de plomb aux pads des boutons de déclenchement. Cela m'a fourni des lignes que j'ai connectées à un canal de relais contrôlé par Arduino. C'était un simple hack que j'ai appris en regardant quelques vidéos YouTube. J'ai également ajouté un vieux tuyau d'aspirateur pour diriger la fumée pour qu'elle sorte sous forme de flux juste sous le couvercle. J'ai aimé l'effet visuel et cela aide à réduire la condensation de vapeur sur l'électronique à l'intérieur de la boîte.

Pour les lumières, j'ai simplement coupé une rallonge pour service léger et l'ai câblée via un canal de relais. La chaîne de 100 lumières LED rouges connectées à cela pourrait ensuite être allumée et éteinte par l'Arduino.

Utilisez votre voix extérieure

Le WaveShield dispose d'une prise casque de 1/8 pouce et d'une sortie - ainsi que de 2 broches d'E/S pour une connexion directe. J'ai utilisé un patch chord de 1/8 de pouce pour me connecter à un amplificateur de guitare basse de 30 watts que j'ai emprunté à ma salle de répétition. N'importe quel nombre de haut-parleurs amplifiés fonctionnerait, y compris les haut-parleurs PC. Mais utiliser quelque chose avec des graves solides est définitivement un plus.

Enchaînez-le

J'achète des chaînes en plastique dans un magasin d'Halloween et j'ai imprimé en 3D un cadenas. Les envelopper sur la caisse a ajouté à la profondeur et à la sensation de l'illusion.

Halloween !!!

Mettez la caisse dans la cour et cachez le détecteur de mouvement dans un buisson à proximité. J'ai utilisé un long fil de haut-parleur pour connecter le capteur afin que je puisse expérimenter le positionnement de telle sorte que le monstre se réveille lorsque quelqu'un s'approche (environ 5 pieds) de la caisse.

Alors que la soirée s'assombrissait, j'ai réalisé que tous les détails à l'extérieur de la caisse devenaient difficiles à voir. Finalement, je l'ai éclairé avec un projecteur stroboscopique et j'étais très satisfait de l'effet.

Alors que les tricheurs marchaient dans l'allée, ils remarquèrent la boîte qui grondait :certains avec curiosité, d'autres en avaient réellement peur. À mesure qu'ils s'approchaient et que le monstre rugissait, ils se levaient et poussaient des cris, certains applaudissaient même. Ce fut un énorme succès.

Améliorations

J'en ai eu marre de chercher des moyens de cacher mon capteur de mouvement dans les buissons, alors j'en ai collé un à chaud dans le ventre d'un rat en plastique que je peux positionner quelque part le long de l'allée ou sous ce buisson à proximité. J'ai également installé une prise téléphonique RJ11 à l'arrière de la boîte afin de pouvoir connecter le capteur de mouvement du rat à l'aide d'un câble téléphonique de 50 pieds - ce qui est bien mieux que les deux brins de fil de haut-parleur que j'utilisais auparavant.

Vous noterez que j'ai également ajouté un interrupteur et des voyants LED à cette nouvelle plaque. L'interrupteur PAUSE toutes les fonctions de la box sans la mettre hors tension. Mon coupe-circuit principal est la multiprise à l'intérieur et est difficile d'accès, de plus, il n'utilise que la tension du signal (5 V) sur ce commutateur externe. Cet interrupteur a été idéal pour arrêter le monstre pour les plus jeunes et autres qui demandent un coup d'œil à l'intérieur la nuit d'Halloween.

Oh! Je drape des chaînes en plastique sur la boîte pour l'effet et elles peuvent parfois être difficiles à manier. Surtout si j'ai besoin d'entrer dans la boîte pendant la soirée. Pour faciliter cela, j'ai attaché des mousquetons à ressort noirs aux extrémités des chaînes. Cela me permet de décrocher/accrocher rapidement les extrémités aux œillets que j'ai vissés dans les coins inférieurs de la boîte. Pas très high-tech mais très utile.

Le futur

Il y a quelques choses que je veux ajouter à l'avenir. Peut-être un contrôle R/C pour que je puisse mettre en pause ou déclencher le monstre à distance. J'ajouterai également un certain type de retour d'information au lève-couvercle afin que l'Arduino puisse «savoir» lorsque le couvercle est ouvert ou fermé. Plusieurs fois, l'élévateur s'est arrêté à un point culminant du cycle, ce qui a rendu les « entrailles » de la boîte visibles jusqu'au prochain cycle de réveil. Enfin, je peux connecter les éclairages/stroboscopes externes à l'Arduino pour leur permettre d'être contrôlés par le programme et/ou la télécommande R/C.

Référentiel GitHub

Vous trouverez les derniers codes et schémas de câblage ici sur GitHub

Code

  • Esquisse de monstre dans une boîte
  • MonsterSounds.h
  • MonsterSounds.ino
Monster In A Box SketchC/C++
/*Wave Shield Pins in Use:2, 3, 4, 5, 10, 11, 12 &13Pins 13, 12, 11 sont toujours utilisés par la carte SD (ce sont les seules broches qui ont un SPI haute vitesse interface). Ensuite, il y a 5 autres broches utilisées pour parler au DAC et à la carte SD, mais elles peuvent être configurées pour se connecter à n'importe quelle broche arduino. Cependant, par défaut, la bibliothèque est configurée pour utiliser les broches 10 (pour la carte SD) et les broches 2, 3, 4 et 5 pour le DAC. Pour modifier ces broches, il faut modifier la bibliothèque - les broches sont référencées par leurs noms de broches « matérielles » (c'est-à-dire PORTD, etc.) et non par les broches arduino. Cela signifie que les broches 6, 7, 8, 9 et les 6 broches analogiques (également appelées broches d'E/S numériques 14-20) sont disponibles.https://learn.adafruit.com/adafruit-wave-shield-audio- shield-for-arduino/faq*/#include "MonsterSounds.h"#define RESERVED_00 0 // Réservé pour Serial RX#define RESERVED_01 1 // Réservé pour Serial TX#define RESERVED_02 2 // Réservé pour Wave Shield#define RESERVED_03 3 // Réservé pour Wave Shield#define RESERVED_04 4 // Réservé pour Wave Shield#define RESERVED_05 5 // Réservé pour Wave Shield#define FOG_MACHINE 6 // Connecter la broche numérique sur Arduino au module de relais#define RED_LEDS 7 // Connecter la broche numérique sur Arduino au module relais#define LID_BOUNCER 8 // Connecter la broche numérique sur Arduino au module relais#define RESERVED_09 9 // Connecter la broche numérique sur Arduino au module relais#define RESERVED_10 10 // Réservé pour Wave Shield#define RESERVED_11 11 // Réservé pour Wave Shield#define RESERVED_12 12 // Réservé pour Wave Shield#define RESERVED_13 13 // Réservé pour Wave Shield#define PIR_SENSOR A 0 // Entrée PIR#define MOTION_LED A1 // LED :s'allume lorsqu'un mouvement est détecté (quel que soit l'état de pause/sommeil/réveil)#define PAUSED_LED A2 // LED :s'allume lorsque le système est en pause#define READY_LED A3 // LED :s'allume quand le monstre est dans l'état READY_TO_WAKE#define PAUSE_BUTTON A4 // Pause Switch Input#define DEBUG_BUTTON A5 // Debug Switch Input// Effects Timer Settings - in Seconds (EDIT THESE)#define WAKE_DELAY 30 // Durée minimale entre 'éveil' se produit en secondes#define WAKE_DELAY_DEBUG 10 // Override WAKE_DELAY lorsque le commutateur DEGUB est engagé#define SLEEP_SOUND_DELAY 1 // Nombre de secondes à attendre entre la tentative de tirer le prochain son « veille »#define WAKE_MIN 3 // Durée minimale de « éveil » en secondes#define WAKE_MAX 5 // Durée maximale d'éveil en secondes#define RED_LIGHT_EXTRA_TIME 1 // Permet aux feux rouges de fonctionner un peu plus longtemps que le videur du couvercle, si désiré#define SMOKE_EXTRA_TIME 2 // Permet à la fumée de s'exécuter un peu plus long que le videur du couvercle, si désiré // Effets Minuteries Paramètres - dans Millisecondes (NE PAS CEUX-CI EDIT) #define WAKE_DELAY_MILLIS WAKE_DELAY * 1000 # define WAKE_DELAY_DEBUG_MILLIS WAKE_DELAY_DEBUG * 1000 # définir 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 # définir SMOKE_EXTRA_TIME_MILLIS SMOKE_EXTRA_TIME * 1000MonsterSounds sons ; statique long non signé SinceLastSnore =0 ; statique long non signé wakeAllowedTimer =0 ; statique non signé long lidBounceTimer =0; statique non signé long lidBounceDuration =0; statique non signé long smokeTimer =0; statique non signé long smokeDurationed =0 ; statique redLightTimer =0;static unsigned long redLightDuration =0;enum States { STATE_INITIALIZE, // Uniquement lors de l'exécution de setup() et la première fois dans la boucle() STATE_PAUSED, // Désactive tous les sons et effets STATE_SLEEPING, // Aucun effet, sons endormis , ne permet pas de déclencher le réveil STATE_READY_TO_WAKE, // Non effets, sons endormis, permet de déclencher l'éveil STATE_AWAKE} ; // Déclenche des effets et des sons d'éveil de monstreStates state =STATE_INITIALIZE;void setup() { // initialise la communication série :Serial.begin(9600); // Configuration de toutes les broches de relais pinMode (LID_BOUNCER, OUTPUT); pinMode(RED_LEDS, SORTIE); pinMode(FOG_MACHINE, SORTIE); pinMode(PAUSED_LED, SORTIE); pinMode(MOTION_LED, SORTIE); pinMode(READY_LED, SORTIE); // Force tous les effets à OFF stopAllEffects(); pinMode(PIR_SENSOR, INPUT); pinMode(PAUSE_BUTTON, INPUT_PULLUP); pinMode(DEBUG_BUTTON, INPUT_PULLUP); sons.initialize(); // Sons de monstre sons.playSystemReady(); retard(1000); Serial.println(); Serial.print("*** Système prêt ***"); Serial.println(); }/* * REMARQUE :Tous les boutons utilisent des pullups, donc LOW signifie que le bouton est ENFONCÉ * Gardez à l'esprit que le pull-up signifie que la logique du commutateur est inversée. * Il devient HAUT lorsqu'il est ouvert et BAS lorsqu'il est enfoncé. * * Le capteur de mouvement PIR ne se comporte PAS de cette façon.*//* * Boucle de traitement principale * - Gère la machine à états du monstre */void loop() { boolean pauseSwitchClosed =digitalRead(PAUSE_BUTTON) ==LOW; boolean motionDetected =digitalRead(PIR_SENSOR) ==HIGH; digitalWrite(MOTION_LED, digitalRead(PIR_SENSOR)); switch (état) { case STATE_INITIALIZE:if (pauseSwitchClosed) { goToPause(); } else { goToSleep(); } Pause; case STATE_PAUSED : if (!pauseSwitchClosed) { goToSleep(); digitalWrite(PAUSE_LED, BAS); } else { digitalWrite(PAUSED_LED, HIGH); } Pause; case STATE_SLEEPING:if (pauseSwitchClosed) { goToPause(); } else if ( isAllowedToWake() ) { goToReadyToWake(); } else { processSleeping(); } Pause; case STATE_READY_TO_WAKE :if (pauseSwitchClosed) { goToPause(); digitalWrite(READY_LED, LOW); } else if (motionDetected) { goToAwake(); digitalWrite(READY_LED, LOW); } else { processSleeping(); } Pause; case STATE_AWAKE :if (pauseSwitchClosed){ ​​goToPause(); } else if ( processAwakeAnimation() ) { goToSleep(); } // processAwakeAnimation() renvoie true lorsque toutes les animations sont terminées break ; par défaut :Serial.println("ÉTAT INCONNU"); Pause; // Nous ne devrions jamais arriver ici } }/* * Transition vers l'état de pause */inline void goToPause() { Serial.println("PAUSED"); état =ÉTAT_PAUSED ; stopTousEffets(); sound.stopAll();}/* * Transition vers l'état de veille */inline void goToSleep() { Serial.println("GOING TO SLEEP"); état =ÉTAT_SLEEPING ; wakeAllowedTimer =millis();}/* * Transition vers l'état Ready To Awake * Ceci est un cas particulier de l'état de veille */inline void goToReadyToWake() { Serial.println("READY TO WAKE"); état =STATE_READY_TO_WAKE ; }/* * Transition vers l'état d'éveil * - Réveillez le monstre et traitez les effets et les sons */inline void goToAwake() { Serial.println("AWAKE"); état =STATE_AWAKE ; wakeMonster();}/* * traiter un cycle de l'activité SLEEP * - Exécuter Sleep Sounds * - Mettre à jour la minuterie de sommeil */inline void processSleeping() { if ((millis() - timeSinceLastSnore)> SLEEP_SOUND_DELAY_MILLIS) { sons.playSnore( ); timeSinceLastSnore =millis(); }}/* * Détermine si le monstre est autorisé à se réveiller à ce moment-là. * - Vérifiez le commutateur de débogage, s'il est fermé, nous utilisons une minuterie de réveil plus courte * - Le monstre doit dormir pendant une durée minimale prédéfinie avant de pouvoir être réveillé * - Illuminez la LED lorsqu'il est prêt à être réveillé */booléen en ligne isAllowedToWake ( ) { booléen isDebug =digitalRead(DEBUG_BUTTON) ==LOW; non signé long requiredDelay =WAKE_DELAY_MILLIS; if ( isDebug ) { requiredDelay =WAKE_DELAY_DEBUG_MILLIS; } boolean isAllowed =(millis() - wakeAllowedTimer )> requiredDelay; if (isAutorisé) { digitalWrite(READY_LED, HIGH); } return isAllowed;}/* * Wake Monster * Démarre les animations Awake * Joue les sons Awake * * Appelez ceci UNE FOIS pour démarrer l'état AWAKE. */void wakeMonster() { int activityDuration =random(WAKE_MIN_MILLIS, WAKE_MAX_MILLIS); // c'est combien de temps le monstre sera actif Serial.print(" wake duration:"); Serial.print(activitéDurée); Serial.println(" ms "); bounceLid(activitéDurée); flashRedLight(activityDuration + RED_LIGHT_EXTRA_TIME_MILLIS); activateSmoke(activityDuration + SMOKE_EXTRA_TIME_MILLIS); sound.playRoar();} /* * Gère la progression des animations AWAKE * Appelez ceci CHAQUE CYCLE pendant l'état AWAKE. * Renvoie TRUE lorsque toutes les animations sont terminées */boolean processAwakeAnimation(){ printTimersToLog(); booléen done1 =faux ; booléen done2 ​​=faux ; booléen done3 =faux ; if (millis() - lidBounceTimer> lidBounceDuration) { bounceLid(0); fait1 =vrai ; } if (millis() - redLightTimer> redLightDuration ) { flashRedLight(0); fait2 =vrai ; } if (millis() - smokeTimer> smokeDuration ) { activateSmoke(0); fait3 =vrai ; } return done1 &&done2 ​​&&done3;}/* * Gérer l'effet :faire rebondir le couvercle de la boîte * - la durée est le nombre de millisecondes pendant lesquelles l'effet doit s'exécuter * - la durée de 0 signifie que l'effet doit être arrêté */inline void bounceLid(unsigned longue durée){ if (durée <=0) { energizeRelay(LID_BOUNCER); lidBounceDuration =0; } else { // démarre le rebond du couvercle de_energizeRelay(LID_BOUNCER); lidBounceTimer =millis(); lidBounceDuration =durée ; }}/* * Gérer l'effet :Flash Red Lights * - la durée est le nombre de millisecondes pendant lesquelles l'effet doit s'exécuter * - la durée de 0 signifie que l'effet doit être arrêté */inline void flashRedLight(unsigned long duration){ if (duration <=0) { energizeRelay(RED_LEDS); redLightDuration =0 ; } else { // fait clignoter le voyant de_energizeRelay(RED_LEDS); redLightTimer =millis(); redLightDuration =durée ; } }/* * Start/Stop Effect :Activate Smoke * - la durée est le nombre de millisecondes pendant lesquelles l'effet doit s'exécuter * - la durée de 0 signifie que l'effet doit être arrêté */ inline void activateSmoke (unsigned long duration) { // ' appuyez sur le bouton de fumée // la durée doit être une durée fixe nécessaire à la machine pour répondre à l'action // définissez un délai d'attente pour s'arrêter après la durée if (duration <=0) { energizeRelay(FOG_MACHINE); smokeDuration =0 ; } else { // fait clignoter le voyant de_energizeRelay(FOG_MACHINE); smokeTimer =millis(); smokeDuration =durée ; } }/* * Arrêter tous les effets * - Cela désactive efficacement le monstre */inline void stopAllEffects(){ bounceLid(0); flashLumière Rouge(0) ; activateSmoke(0);}/* * Imprime les minuteurs d'Awake Animation dans le journal une fois par seconde */inline void printTimersToLog() { static unsigned long timeofLastTimerLog =0; if (millis() - timeofLastTimerLog>=1000) { Serial.print(" couvercle:"); Serial.print( (millis()-lidBounceTimer)> lidBounceDuration ? 0 :(lidBounceDuration -(millis()-lidBounceTimer) ) ); Serial.print(" lights:"); Serial.print( (millis()-redLightTimer)> redLightDuration ? 0 :(redLightDuration -(millis()-redLightTimer) ) ); Serial.print(" smoke:"); Serial.println( (millis()-smokeTimer)> smokeDuration ? 0 :(smokeDuration -(millis()-smokeTimer) ) ); timeofLastTimerLog =millis(); }}/* * Relais d'activation * Règle le terminal normalement ouvert (NO) sur OUVERT * Normalement fermé deviendra fermé */ inline void energizeRelay(int channel) { digitalWrite(channel, HIGH); }/* * Relais de mise hors tension * Règle la borne normalement ouverte (NO) sur FERMEE. * Normalement fermé deviendra OUVERT */ inline void de_energizeRelay(int channel) { digitalWrite(channel, LOW); }
MonsterSounds.hC/C++
En-tête Arduino pour la bibliothèque de sons de monstre
/* REMARQUE SUR LES BROCHES ARDUINO * Les broches 13, 12, 11 sont toujours utilisées par la carte SD (ce sont les seules broches qui ont une interface SPI haute vitesse). * Ensuite, il y a 5 autres broches utilisées pour parler au DAC et à la carte SD, mais elles peuvent être configurées pour se connecter à n'importe quelle broche arduino. * Cependant, par défaut, la librairie est configurée pour utiliser les broches 10 (pour la carte SD) et les broches 2, 3, 4 et 5 pour le DAC. * Pour modifier ces broches, il faut modifier la bibliothèque - les broches sont référencées par leurs noms de broches « matériel » (c'est-à-dire PORTD, etc.) et non par les broches arduino. * Cela signifie que les broches 6, 7, 8, 9 et les 6 broches analogiques (également appelées broches d'E/S numériques 14-20) sont 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[] ={roar0, roar1, roar2} ; 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 précédentRoarSound =-1; class MonsterSounds { privé :carte SdReader; // Cet objet contient les informations de la carte FatVolume vol; // Ceci contient les informations de la partition sur la carte FatReader root; // Ceci contient les informations du fichier FatReader du répertoire racine des volumes ; // Cet objet représente le fichier WAV pour une phrase WaveHC wave ; // Un seul objet wave -- un seul son est joué à la fois void playfile(char *name); public : void initialize(); void playSystemReady(); void playRoar(); void playSnore(); void stopAll();};
MonsterSounds.inoC/C++
Code Arduino pour la bibliothèque de sons de monstres/* REMARQUE SUR LES BROCHES ARDUINO * Les broches 13, 12, 11 sont toujours utilisées par la carte SD (ce sont les seules broches qui ont une interface SPI haute vitesse). * Ensuite, il y a 5 autres broches utilisées pour parler au DAC et à la carte SD, mais elles peuvent être configurées pour se connecter à n'importe quelle broche arduino. * Cependant, par défaut, la librairie est configurée pour utiliser les broches 10 (pour la carte SD) et les broches 2, 3, 4 et 5 pour le DAC. * Pour modifier ces broches, il faut modifier la bibliothèque - les broches sont référencées par leurs noms de broches « matériel » (c'est-à-dire PORTD, etc.) et non par les broches arduino. * Cela signifie que les broches 6, 7, 8, 9 et les 6 broches analogiques (également appelées broches d'E/S numériques 14-20) sont disponibles. * */ void MonsterSounds::initialize(){ Serial.println("Initialisation des sons..."); if(!card.init()) Serial.println(F("Card init. failed!")); if(!vol.init(card)) Serial.println(F("Pas de partition!")); if(!root.openRoot(vol)) Serial.println(F("Impossible d'ouvrir le répertoire")); Serial.println(F("Fichiers trouvés :")); racine.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); } précédentRoarSound =index; this->playfile(roarSounds[index]);}void MonsterSounds::playSnore(){ if (!wave.isplaying) // Ne pas interrompre un son existant avec un ronflement { int index =random(3); // 0, 1, 2 this->playfile(sleepSounds[index]); }}void MonsterSounds::stopAll(){ wave.stop(); // Arrête tout WAV en cours de lecture}// --------------------------------------- ----------------------------// playfile() // Ouvrir et lancer la lecture d'un fichier WAV// ------ -------------------------------------------------- -----------void MonsterSounds::playfile(char *name) { PgmPrint("Lecture du son :"); Serial.println(nom); if (wave.isplaying) {// joue déjà quelque chose, alors arrêtez-le ! vague.stop(); // l'arrêter } if (!file.open(root, name)) { PgmPrintln("Fichier non trouvé"); retourner; } if (!wave.create(file)) { PgmPrintln("Pas un WAV valide"); retourner; } // c'est le moment de jouer ! wave.play();}

Pièces et boîtiers personnalisés

monstersounds_7vLZD3NU4t.zip

Schémas


Processus de fabrication

  1. machine EEG
  2. Boîte à jus
  3. Distributeur automatique
  4. Changer de machine
  5. Machine à coudre
  6. Collants
  7. Fabriquer une machine à écrire pour les devoirs à la maison
  8. Giftduino - Le coffret cadeau Arduino parfait
  9. Machine à LÉVITATION ULTRASONIQUE utilisant ARDUINO