Monster in a Box

6.2K7013

Intro: Monster in a Box

I love Halloween props and have seen and read about some great Monster in a Box builds this past year and decided that I should build my own. The idea is pretty simple: create the illusion that some type of container is holding a dangerous monster that is on the verge of escaping. The illusion can be created with any combination of motion, sound, light, smoke and, of course, surprise.


What's in the Box!?!?

You want a box that is large enough that it appears to be capable of holding something big and scary. It also adds to the illusion if the box appears to be old, well worn, and just maybe only strong enough to keep the monster at bay. At first I shopped around at thrift stores and online for something but never something that I liked, so I build my own. It was not very difficult. I used 15 6ft pine fence pickets from Home Depot to make a box that measured about 3ft x 2.5ft x 2.5ft. I cut all the board to length with a table saw and assembled the box using a pneumatic 18 gauge brad nailer. This appeared to work well, but later I realized that the brads were not strong enough to hold the box together due to all of the banging and bouncing it would be doing. To strengthen the box I later screwed it together with 1 inch dry wall screws (from the inside out so they would not show). Once built I aged the wood with a process that used black tea, vinegar and steel wool. I then decorated it with stencils and labels that I found online and/or created and printed.

STEP 1: ​Brainzzzzz!!!

The prop has 2 operational states "Sleeping" and "Awake". While sleeping the box is relatively calm and only makes snoring and light growling sounds. The monster is awoken when a trick-or-treater trips a motion sensor. When the monster is awoken the monster roars, breaths smoke, bounces the lid, and the inside of the box glows red.

I used an Arduino Uno along with a WaveShield and a Relay Module to orchestrate the behavior of this prop. The WaveShield is loaded with a small collection of sleeping and roaring sounds. A PIR motion sensor provided input to the Arduino to switch the box between "sleeping" and "awake" modes. During awake mode the Arduino activates relay channels to run the lid motor, red lights, the smoke generator. and play the sounds on the WaveShield. One other feature that I added was a Pause Button. This allowed me to temporarily silence the monster when younger kids come by.

STEP 2: ​It's Aliiiiiive!

A lid lifter is a device that will quickly raise and lower the lid to make it bang and bounce as if the monster is trying to escape. There are several ways this can be done the most popular appear to be pneumatic actuators and rotating cams. Although I think an electronically controlled pneumatic actuator would have allowed me to make the lid motions much more random, I decided to go with the a rotating cam as it seemed to be the simpler and least expensive option.

I bough a used automotive windshield wiper motor from a local scrap yard for $15. It was kinda funny. I walked in and asked for a motor. The guy behind the counter asked "for what make and model car" when I said "I dont care" his head tilted to the side a bit and he gave me a bit of side eye. After I explained what I was up to he wanted to build one :)

These motors, regardless of make/model, run on 12 volts, spin at a reasonable rate and have great torque: perfect! Note. When you get one make sure it has some of the old wire harness it will make it much easier for you to splice your wire to it. also make sure it has its crank arm and offset post. If the main motor post is the only physical connection you have to work with your cam will likely slip.

Mount the motor somewhere inside your box. I put mine on one of the side walls. Remember there will be a large rotating cam connected to it and it needs to be able to rotate free and clear of any and all items, especially wires, that you are going to put in the box. There are several good tutorials on YouTube on working with these motors.

I cut a 12 inch diameter cam from a piece of 1/2 ply wood. first I cut a perfect circle. I mounted it on the motor and used this to determine the required height of the motor in the box. I only wanted the lid to lift about 2 inches. After doing this fitting I used a jig saw to randomly cut 'teeth' into the cam trying my best to keep them at random width and depths.

Lastly I mounted a roller to the under side of the lid using 2 metal L brackets, a 1 inch nylon spacer and a carriage bolt. The roller is positioned just above the cam so that it rides along the teeth of the cam.

I used the 12 volt rail of an ATX power supply to power the motor through the relay controlled by the Arduino. Yes, getting everything to line up does require a bit of trial and error. After re-positioning the roller once or twice... ok three times... everything lined up and the lid began bouncing as planned!

STEP 3: ​Breath of Fire : Smoke and Lights

I used a cheap 400 Watt smoke generator for smoke effects. Out of the box this was radio controlled. To control it with the Arduino I opened the receiver and soldered two lead lines to the trigger button pads. This provided me with lines that I connected to an Arduino controlled relay channel. It was a simple hack that I learn by watching a few YouTube videos. I also added an old vacuum cleaner hose to direct the smoke to come out as a stream from just under the lid. I liked the visual effect and it help reduce the vapor condensation on the electronics inside the box.

For lights I simple cut a light duty extension cord and wired it through a relay channel. The string of 100 red LED lights connected to this could then be switched on and off by the Arduino.

STEP 4: ​Use Your Outside Voice

The WaveShield has an 1/8 inch headphone jack as and output - as well as 2 i/o pins for a direct connection. I used an 1/8 inch patch chord to connect to a 30 Watt bass guitar amplifier that I borrowed from my practice room. Any number of amplified speakers would work - including PC speakers. But using something with solid low end is definitely a plus.

STEP 5: ​Chain It Up

I purchase some plastic chains from a Halloween store and 3D printed a pad lock. Wrapping these over the crate added to the depth and feel of the illusion.

I have included my 3D printable stl files. I simply printed 2 "faces" and glued in some 1 inch foam between them. Then drilled holes to fit the other parts. It is not the most elegant 3D print but with a little effort and a decent paint job it looks great.

STEP 6: ​Halloween!!!

Put the crate out in the yard and hide the motion sensor in a nearby bush. I used a long run of speaker wire to connect the sensor so that I could experiment with the positioning such that the monster would wake up when someone gets close (about 5 ft) to the crate.

As the evening grew darker I realized that all of the detail on the outside of the crate was becoming difficult to see. Eventually I illuminated it with a strobe floodlight and was very happy with the effect.

As trick-or-treaters walked up the driveway they notice the growling box: some with curiosity others were actually scared of it. As they approached and the monster roared to life they would up, and squeal some even applauded. It was a huge hit.

STEP 7: ​The Future

There are a few things that I may improve before next Halloween.

  • Add a R/C control so that I can pause or trigger the monster from a distance.
  • Add some type of feedback to the lid lifter so that the Arduino can 'know' when the lid is open or closed. Several times the lifter stopped at a high point in the cycle which made the 'guts' of the box visible until the next wake cycle.
  • Lastly, I may connect the external lighting/strobes to the Arduino to allow them to be controlled by the program and or the R/C fob.
  • Setup a GoPro to capture Trick or Treaters reactions to the box.

Also, I attached the plastic chains with zip ties that I stapled to the side of the box. This worked but it made it difficult to get into the box throughout the evening - either to show of it's inner workings or tinker on something that got stuck or came loose. For next season I will add something to allow me to quickly disconnect and reconnect the chain: eye bolts and carabiners maybe?

11 Comments

I really like your project and are currently trying to build my own monster in a box based on your instructions.

I was playing around with the code to test the setup and found that it wasn't possible to set the WAKE_DELAY > 32 seconds. If I did so, the variabel requiredDelay will be crazy high. If I set it to 1000 seconds it will result in a requiredDelay below the one calculated for 30 seconds! Something was in dead not working as expected. I thought it was because we reached a limit of the declared variabel when passing 32000. I found the error to be related to the declaration. If #define is replaced with const like below everything works as expected. (It might not be needed to declare them all as long).

// Effects Timer Settings - in Seconds (EDIT THESE)
const long WAKE_DELAY = 30; // Minimum amount of time between 'awake' occurencs in Seconds
const long WAKE_DELAY_DEBUG = 10; // WAKE_DELAY override when DEGUB switch is engaged
const long SLEEP_SOUND_DELAY = 1; // Number of seconds to wait between attempting to fire the next 'sleep' sound
const long WAKE_MIN = 3; // Minimum amount of 'awake' time in Seconds
const long WAKE_MAX = 5; // Maximum amount of 'awake' time in Seconds
const long RED_LIGHT_EXTRA_TIME = 1; // Allows the red lights to run a bit longer than the lid bouncer, if desired
const long SMOKE_EXTRA_TIME = 2; // Allows the smoke to run a bit longer than the lid bouncer, if desired

// Effects Timers Settings - in Milliseconds (DO NOT EDIT THESE)
long WAKE_DELAY_MILLIS = WAKE_DELAY * 1000;
long WAKE_DELAY_DEBUG_MILLIS = WAKE_DELAY_DEBUG * 1000;
long SLEEP_SOUND_DELAY_MILLIS = SLEEP_SOUND_DELAY * 1000;
long WAKE_MIN_MILLIS = WAKE_MIN * 1000;
long WAKE_MAX_MILLIS = WAKE_MAX * 1000;
long RED_LIGHT_EXTRA_TIME_MILLIS = RED_LIGHT_EXTRA_TIME * 1000;
long SMOKE_EXTRA_TIME_MILLIS = SMOKE_EXTRA_TIME * 1000;
That is interesting. I am not a C expert but I did not think that #define implied type.
What you did is fine - it just causes those variables to take up program memory space where #define avoids this.

Looking at the code I do see that I forced the result of random() into an int on line 245
int activityDuration = random(WAKE_MIN_MILLIS, WAKE_MAX_MILLIS);
This probably should have been:
unsigned long activityDuration = random(WAKE_MIN_MILLIS, WAKE_MAX_MILLIS);

In Arduino int is a 16-bit (2-byte) value with a range of -32,768 to 32,767 which seems to be consistent with what you were seeing.

I dont have my environment setup right now. but I suggest that you consider replacing the #defines and trying this change to see if it helps
Hello again! I am so close to finishing my version of your project :-) I have your code compiled and uploaded to the Arduino. I soldered up the WaveShield last night, and it's working great. I have the relay attached to the Arduino and it too is working (I have some prior experience with these relays). However, the problem I'm having is that my "monster" seems to suddenly wake for no reason. In other words, my PIR sensor seems to wake the "monster" randomly, even when no one walks by. I bought a cheap pack of 5 PIR sensors, and I've tried 3 out of 5 with the same results. I've tried using the 3.3v from the Arduino to power the PIR as per your instructable, I've also tried powering the PIR from its own 5v, 9v, and 12v power supplies, and I'm still getting the same behavior. I am not good yet with the code for the Arduino sketch, and wanted to ask if maybe it's written into your sketch to wake the "monster" periodically"? Or, do you think I have bad PIR sensors, or perhaps something else going wrong? If you have any ideas, I'd really appreciate your help! Otherwise, this is a great project, and if I can just get the electronics working correctly all I'll have to do is build my box, which will be easy for me. Thank you again for your help!
Mine was doing this recently and it turned out that the PIR sensor was damaged and not working. While working on this I learned that if this sensor is not working properly or it is removed from the arduino (ie that input pin is constantly 'open') the code behaves as if the sensor is attached and triggered. Thus, the monster 'wakes up' every 30 seconds. ...and, no there is nothing in the code to randomly wake the monster, only the PIR sensor wakes it.

I also purchased one of those multipacks of PIR sensors from amazon (5 sensors from diymalls) and I found that some of them were bad right out of the box ( i will not buy from them again). if you have not already build yourself a test for your sensor all you need is an arduino, a few jumper wires, maybe a small breadboard and the sensor. then use it to test the PIR with a small dedicated test program. you can find these with a quick google search. have the program read the sensor and print a message to the console. This way you can confirm that the sensor works, that you have the wiring correct and that, if yours has them, that the sensor's settings work for you
many of the PIR sensors have 2 potentiometers and a movable jumper.

The pots affect sensitivity and detection range. the Jumper affects how/when the sensor triggers: single trigger vs. multiple trigger (you want multiple trigger). Also note that some of these PIRs just have 3 solder pads rather than jumpers and some have no way to change/select trigger behavior

Lastly, something to be aware of. I discovered that my PIR sensor was not working properly while prepping for a party. Not having the time to fix it i decided to just let it wake up every 30 seconds during the party (and turned down the volume a bit). Do this I learned that my wiring could not take the load of those constant wake cycles and they burned out (no fire or anything, but the box stopped opening) after about 15 minutes. I was using 20 gauge stranded at the time.

I am in the process of rewiring with 16ga and I am experimenting with adding a 15amp mini circuit breaker to that motor circuit to try to prevent this in the future. I am not 100% sure about the breaker as I am not currently aware of the amp draw when the motor starts up

Thank you for your prompt reply, that does explain A LOT! I am thinking it's the PIR sensor. Out of frustration, I had actually tried to run the sketch and circuit without the PIR attached, and it did seem to trip about every 30 seconds. That's when I thought maybe it was written into the code that way. I too bought the 5 pack of PIR sensors from DIYMall, and I am thinking they are the problem. I still have 2 of 5 new ones to try, I will order some different ones to have on hand, and look into a simple test circuit to make sure they are working correctly. I should have mentioned, I did try adjusting the pots on the PIR's board, but that hasn't seemed to do much for me.

Thank you for the tip on the wiring too! Could I just ask, what part failed, the wires going from the relay out to the fog machine, motor, and lights? For this, I am using cannibalized power cords from old computers, the cord that goes from the wall outlet to the PSU. Do you think that's safe? And I would think the wires connecting the Arduino to the relay and everything else would be fine with just the very light gauge "jumper" wire included in the standard Arduino beginner starter kits. Do you agree?

Thank you again for your time, you've been very, very helpful!

EDIT: If you ordered (from Amazon) a replacement PIR that did work well, could you let me know which one you ordered please? And, maybe you could confirm what pins the pause button is connected to? Maybe that's my problem. Thank you!
The wires that failed where those in the WiperMotor-Relay-PSU circuit. There is probably a large amp spike as the motor starts up. I would think that the wires you are planning to use from the computer cord will work fine. They should be rated for 15amps at 110v. I would use similar wires for the other 2 (fog & lights) relay circuits. I cannibalized an old household extension cord for these. Everything from the Arduino is just 5 volts so 22 gauge jumpers work just fine.

One note on those jumpers though: since you are just pushing single pins into the arduino and they dont have much grip they can shake loose over time - keep an eye out for that if you box starts misbehaving. This year used some protoboard and created a connection shield to fit above the wav shield with latching headers and made custom fitted cables for all my 5v connections to keep things from coming loose this year.
Hi! Thank you for the great Instructable! I am trying to follow your guide, I have all my parts, but I can't get the sketch to upload. I am getting a error that says, "redefinition of 'const char roar0 []'" I am new to Arduino, but trying to get this to work for this Halloween. Any help would be very much appreciated. Thank you!
Did you copy and paste code into the arduio ide? Sounds like you pasted the Roar method into the file twice
Thank you so much for your help! I did finally get the code to compile and upload, I *believe* my problem was not having all the files (libraries, sounds, etc.) in the same parent directory. However, now I'm not sure if the circuit is working correctly, I'm not sure my IR motion senor is doing anything, though randomly (it seems) relay channel 1 and 2 will switch (but not three). I'm going to double check my wiring and connections this morning, I'm really hoping to be able to get this monster going for Halloween! Thank you again for your help and great project!

That's so cool! I'm sure the kids got a huge kick out of it!

Many different reactions. Most loved it - but a few (mostly younger) kids would not go anywhere near it. I got a few really good scares with it too. I set the sensor so that it would trigger as they got about 1/2 way up the driveway. A few kids (and adults) instinctively ran (bolted) back to the safety of the sidewalk when they triggered it *Evil Grin*