loading
Picture of Talking Arduino Halloween Skeleton
Welcome to another of my instructables!

So Halloween is upon us again and I really wanted to use the Arduino I had.  I went to the halloween store and found a skull with a hinged skull and that was the spark that began this project.  I knew that it would probably be easy to have a servo move using the arduino and have it move the skull jaw up and down.




 
Remove these adsRemove these ads by Signing Up

Step 1: Gather your materials

you'll need stuff.  Lots of stuff.  Well...not lots of stuff, but stuff from different places.  Here's a sort of breakdown of all the stuff I used and where I got it.

Arduino Duemilanove - $34.99
http://www.makershed.com/ProductDetails.asp?ProductCode=MKSP4

Ladyada Waveshield Kit - $21.95
http://www.makershed.com/ProductDetails.asp?ProductCode=MKAD11

2 Super Bright Red LED's - $1.79 for a 2 pack
http://www.radioshack.com/product/index.jsp?productId=3096133

PIR Sensor Module - $9.99
http://www.radioshack.com/product/index.jsp?productId=2906724

A small servo - around $13.00
Bought it at a RC hobby shop here in town

A skull - around $9

A black cloak halloween costume - around $10

various bones

Speakers

Wire

PVC and fittings - from lowes or home depot

hmmm.....seeing it all written out it seems like more money that I remember spending...haha.  Still though, to get animatronic halloween things premade you'd spend a bunch more that that.  That's what I'll keep telling myself to justify this.




Step 2: Build the sound shield

Picture of Build the sound shield
first thing you need to do is build your sound shield.  To save from repeating the wonderful step by step tutorial that lady ada made for her sound shield, I'll just put the link here to it.  One thing to note, I had the older version of this shield and didn't realize I was looking at the newer instructions until she was telling me to install pieces that I didn't have.  haha.  Make sure you are looking at the correct instructions before you start soldering.

V1.0 instructions
http://www.ladyada.net/make/waveshield/solder10.html

V1.1 instructions
http://www.ladyada.net/make/waveshield/solder.html

Step 3: Wire Up LED's

Picture of Wire Up LED's
So here's how the LED's were wired up.  They are being fed 5v from the Analog 4 spot on the arduino.  What's great about this is that the arduino feeds out 5v, the LED's each require 2.5v, so the two of them are perfect for each other.

Step 4: Wire Up Motion Sensor and Servo

Picture of Wire Up Motion Sensor and Servo
Here's how the motion sensor and servo are connected up.  these diagrams are done this way because I hooked all the wires in the skull up to a small project circuit board and then used CAT-5 Network Cable to run it down to the arduino.  The network cable allowed me to have more than enough wires to run everything I needed in one convenient package.

Step 5: All together now!

Picture of All together now!
Here's the whole set up for the wiring in the skull.  Looks fairly simple in diagram form I think...

Step 6: One other thing...

Picture of One other thing...
You need to get a voltage reading of what the power of the audio is.  What this allows is whenever the volume on the sound gets loud enough, it opens the mouth of the skull.  Then when the voltage drops, the servo closes the jaw.  Fairly simple.  We'll attach a wire from a resistor and plug that wire into one of the inputs on the arduino so we can read it in the code. 

Step 7: Put some Wav's on your card!

Grab yourself 4 wav files and format them as the lady ada tells you they need to be formatted.  If you want to use my code as is, you'll have to label them as follows on the card.  If you can figure out my code, you can just rename them to whatever you change the code to.  Anyways...use these names if you don't want to modify anything:


1.wav

2.wav

11.wav

13.wav

Step 8: Hook up the arduino

Hook up your arduino to the computer, copy and paste this code, and put it on your arduino.

If the code isn't visible below, I included a txt file of it so you can just download it that way.

-----------------------------------------------------------------------------------------------------------------------------------

#include
#include
#include "util.h"
#include "wave.h"

#define DEBOUNCE 100

#define swPin 14
#define eyeleds 18

AF_Wave card;
File f;
Wavefile wave;

int inputPin = 8;               // choose the input pin (for PIR sensor)
int servoPin = 16;              // choose the input pin (for Servo)
int pirState = LOW;             // we start, assuming no motion detected
int val = 0;                    // variable for reading the pin status for motion sensor
int minPulse     =  600;  // minimum servo position
int maxPulse     =  2200; // maximum servo position
int turnRate     =  1800;  // servo turn rate increment (larger value, faster rate)
int refreshTime  =  20;   // time (ms) between pulses (50Hz)
int mouthchange = 6;  //checks to see if mouth position needs to be changed
int randNumber;   //random number variable to allow the choosing of which wav will be played


/** The Arduino will calculate these values for you **/
int centerServo;         // center servo position
int pulseWidth;          // servo pulse width
long lastPulse   = 0;    // recorded time (ms) of the last pulse

void setup() {
  // set up serial port
  Serial.begin(9600);
 
  pinMode(inputPin, INPUT);     // declare sensor as input for PIR
  pinMode(eyeleds, OUTPUT);     // declare sensor as output for eyes


  // set up servo pin
  pinMode(servoPin, OUTPUT);  // Set servo pin 18 (analog 4) as an output pin
  centerServo = maxPulse - ((maxPulse - minPulse)/2);
  pulseWidth = centerServo;   // Give the servo a starting point (or it floats)


  // set up waveshield pins
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
 
  // open memory card
  if (!card.init_card()) {
    putstring_nl("Card init failed!"); return;
  }
  if (!card.open_partition()) {
    putstring_nl("No partition!"); return;
  }
  if (!card.open_filesys()) {
    putstring_nl("Couldn't open filesys"); return;
  }
  if (!card.open_rootdir()) {
    putstring_nl("Couldn't open dir"); return;
  }
}

void loop()
{
 
  val = digitalRead(inputPin);

  if (val == HIGH)
  {          
    if (pirState == LOW)
    {
      // we have just turned on
     Serial.println("Motion!");
     //Turn eyes on
     digitalWrite(eyeleds, HIGH);
     // Play a sound: 
     randNumber = 0;
     randNumber = random(3);
if (randNumber >= 1)
{
     randNumber = random(3);
     randNumber = randNumber + 1;
     Serial.println(randNumber);
         if (randNumber == 1)
         {
           playcomplete("11.WAV");
         }
       
        else if (randNumber == 2)
        {
            playcomplete("2.WAV");
        }
       
        else if (randNumber == 3)
        {
            playcomplete("13.WAV");
        }
        else if (randNumber == 4)
        {
            playcomplete("1.WAV");
        }
}
 


      pirState = HIGH;
 
    }
  }
 
  else
  {
    if (pirState == HIGH)
    {
      digitalWrite(eyeleds, LOW);
      // we have just turned off
      Serial.println("Motion ended!");
      // We only want to print on the output change, not state
      pirState = LOW;

     }
  }


}



void playcomplete(char *name)
{
  char i;
  uint8_t volume;
  int v2;


  playfile(name);
 
  while (wave.isplaying)
  {
      volume = 0;
      for (i=0; i<8; i++)
      {
        v2 = analogRead(1);
        delay(5);
      }

   if (v2 > 440)
        {
           pulseWidth = 1800;
           mouthchange = 1;
        }
           else
        {
           pulseWidth = 800;
           mouthchange = 1;
        }

  
  digitalWrite(servoPin, HIGH);   // start the pulse
  delayMicroseconds(pulseWidth);  // pulse width
  digitalWrite(servoPin, LOW);    // stop the pulse

  }
 
  card.close_file(f);
  digitalWrite(eyeleds, LOW);
  // we have just turned off 
}


void playfile(char *name)
{
  // stop any file already playing
  if (wave.isplaying)
  {
    wave.stop();
    card.close_file(f);
  }

  f = card.open_file(name);
  if (f && wave.create(f))
  {
    wave.play();
  }
}










Step 9: Test it!

I'm sure there's some other little things I've left out.  I'll continue to add to this as I remember.  This project took me over a month and grew larger and larger as I bought more things to add to it.  If it doesn't work, and you've followed all my instructions, dig deeper!  This isn't an end all, be all instructable!  Part of the fun in these projects is making it your own.  This project came about from me combining lots of other arduino projects I've seen around the web and that really is the best way to learn new things!  Have fun!  Experiment!
Machine2 months ago

Very spooky! Love it.

Fission Chips9 months ago

Spooky! Nice work.

makerx39 months ago

I've met the creator of arduino and he signed my shirt

DocThomas1 year ago
getting to be that time again. planning Halloween stuff for this year.

how hard would it be to combine the mouth movement of this project with LED backpacks like here?
http://learn.adafruit.com/animating-multiple-led-backpacks

I'd love to have the mouth move and also have the creepy moving LED eyes in RED.
Since you'd be using Adafruit products for both the sound playback and the LED eyes, why not ask on their forum?
evil_ol_man2 years ago
Nice Instructable, and the project looks good. But....For less money than what you spent for the 2 Arduno boards and the aggrivation of putting them together you could have bought a Scary Terry Audio servo driver board From Cowalicious for $42.95 which is pretty much plug and play....Your Arduino kit comes to about $56.94. Just Curious as to why you did it that way.
gegy13 years ago
Hey!
Very nice instructable! I am searching a while, could please tell me somebody where to buy a skull like the one in the instructable. Best will be when i can buy it in germany or austria.
Thanks!
Raythe54 gegy13 years ago
Have you tried: http://www.skeleton-factory.com/ ?
Raythe543 years ago
Has anyone converted this for use with the WaveHC library, by any chance? I'm a total newbie to Arduino and stumbling through it at the moment.
tinker2343 years ago
is there a way to make the servo quiet it seems a litlle loud
balak954 years ago
i get 9 error #include expects filename

sorry my key boards broke so some keys dont work, but yeah i compile this and get that error message is there anything i have to add, i need this by halloween.
Make sure you include Ladyada's AF_Wave library from her site for the Wave Shield
Also missing in the code here, there are 2 Include statements that are blank right at the top of the code. "Instructables doesnt like the "<>" symbols posted in the code and it dropped the information after the #include statement. I typed out the names of the symbols here before and after the information that is required.

The first one should be #include (less than symbol) AF_Wave.h (greater than symbol)
The second one should be "#include (less than symbol)avr/pgmspace.h
(greater than symbol)
It took me a bit to figure out (i'm new to arduino and not a programmer) looking at other examples of code lead me to change those two include statements
I loaded the code last night (without a servo hooked up yet) and the wav portion works no problem.

Cheers
Great Instructable. Anxious to re-task Mr. Skull!  When I try to verify the code on my Arduino, I get an error (looking for a particular filename). Any Ideas?
samseide (author)  larsen e whipsnade5 years ago
could be a library you are missing.  Take that error that you are getting and type it into google.  Whenever I had an error happen like that I was missing an arduino library I just had to download and throw into a folder.  Good luck!  Hope this helps!
depotdevoid5 years ago
I love it, this is totally awesome!  Someone else mentioned the waveshield recently, and after seeing what you've done with it, I'm totally considering buying one. 

I'm pretty new at all this arduino stuff, and I'd like to see the code you used.  Can you post it?

Thanks!
samseide (author)  depotdevoid5 years ago
see my reply to bill2009.  I don't know why it isn't showing up for some people, but it's there in step 8!  I'll attach it as a text file in that step too I guess!  I'll also message you a copy of it.
bill20095 years ago
for some rason I can't see the code.  Is it posted directly somewhere?
samseide (author)  bill20095 years ago
it's posted in step 8 and is visible on my laptop here in firefox.  I had the same problem you were having when I tried to pull it up at my work.   I don't know why that is.  I'll send you a message with the code in it.
mbrameld5 years ago
Might also be cool to use the voltage from the wav shield to set how wide the mouth opens. Open the mouth wider as the sound gets louder. I'd have to try it out, but in my head at least it seems like this would make the mouth movement a little more natural.
samseide (author)  mbrameld5 years ago
I totally get what you're saying.  It may look better.  Try it and let me know!  haha.
Lasrin5 years ago
A trim pot might have been better, taken off the other lead of the resistor.  This way you could adjust the sensitivity to the audio.
samseide (author)  Lasrin5 years ago
you can still adjust the sensitivity using the code by just telling it at what audio level the mouth should open.  So you could do it as a hardware or a software solution.
cool5 years ago
HAHA:  "Hey kids, come here, let me tickle your funny bone."
Tomboys5 years ago
This is really cool.  Wish I saw it sooner.
samseide (author)  Tomboys5 years ago
get an early jump on next year!  haha
samseide (author) 5 years ago
video has now been embedded!  Take a look!
Awesome, but needs video!
samseide (author)  fungus amungus5 years ago
a great friend of mine, and a great youtuber, is putting up a video documenting the build as well as showing it running.  Should be done sometime after 8pm CST 10-29-09.  Check back then as I'll put a link to it in the first step!
You can even embed the video. Just click the "Video" button in the editor.