Introduction: Witch Skeleton (Arduino)

I made this Witch Skeleton for Halloween. That's the 2nd version of it (the first one was good but always as prototype = no fixed battery, arduino nano not solder on wires,...etc.).
Finally, here is the last version.

That's the purpose of this project: do it yourself and buy less. So 90% is coming from things that I've found on my garage.

Everything is link to an Arduino nano.

  • Skull: The movment of mandibul done with a servo motor.
  • Arms and body: The movment of arms done with a motor on the cauldron.
  • Cauldron: The lights done with led rubon
  • Fog: The fog done with a simple fog machine with hack remote.
  • Sound: done with MP3 module

The Arduino program is on the last step


  • Arduino nano
  • Wiper Motor
  • Micro Servo SG90 TowerPro
  • Electrical relay
  • Wires
  • Cheap Plastic skull
  • black Tissues
  • Wood
  • PVC tube
  • loud speaker
  • MP3 Grove V2.0 module with SD Card
  • Chicken wire
  • plastic box
  • cardboard
  • black and red paint

Step 1: Skull: Preparation

Prepare the plastic skull to have lighting eyes and moving mandibles

  1. Take a simple plastic skull (buy from a discount shop)
    1. You can paint it with some black line if too white.
  2. Make a hole underneath to pass the different threads.
  3. Make 1 hole in each eye (the size of a led)
    1. add 1 red led and solder it to a resistor (do not forget the resistors to avoid grilling the led !)
    2. solder a wire that will have a sufficient length to exit the skull

    3. Add 1 blue led just behind teeth

  4. Screw a stick of wood between the two mandibles of the jaw
    1. attach a wire to this stick
    2. attach the wire to the Micro Servo SG90 Towerpro.
  5. Attach the skull to a piece of wood and also the Micro Servo SG90 Towerpro.

Step 2: Arms and Body: Preparation

Arms and body is done with PVC tube. it needs some test to find the best move. Feel free to test different position to find yours own moves.

The best way is to NOT leave arms on the same position. If you want to give LIFE on you skeleton, change the position of shoulder for example: it's simple...but magic !

Don't forget to fixed on body an empty plastic box to store arduino, MP3 module, etc...

Step 3: Cauldron: Preparation

For the cauldron,

  • use an old plastic vase.
  • Attach with adhesive tape some carboard around it to give cauldron dimension
  • Add chicken wire or adhesive tape around it
  • Put some "papier mâché" around it
  • Paint it black (...............not with some rolling stones....ok, bad joke.)
  • Add under cauldron some polyurethane foam and paint it on black with some red
  • Attach a led rubon under polyuethane foam

For the movment of arms

  • Add a wipe motor on the cauldron

For the fog

  • Do an hole on the back of cauldron to add a PVC which will be link to fog machine.
  • To hack the remote fog machine, attach two wire in it (see picture) and attach them to one relay.

Step 4: Sound: Preparation

Add music on your grove MP3 v2.0 module with SD card

  • You could use Audacity (portable) tool to manage your music:
  • link loudspeaker on MP3 module.
  • It's really important to put add only one music on your SD card. or be sure that the first registered song on your SD Card is the good one. See this link for explanation (in french so google is your friend).

Step 5: Arduino : Preparation

Here is the arduino code.
You will find very good training on internet. Use my code, modify it, test it. Feel free !

// Programme Crâne Halloween avec chaudron:

// Détecteur de mouvements à infrarouge HCSR 501 : CapteurIRPin sur PIN2

// 2 LED ROUGE Yeux + 1 LED BLEU Bouche --> A brancher sur le même PIN

// 1 SERVO MOTEUR SG90 mouvement bouche

// 1 relais LAMPE + 1 relais Fumée + 1 relais moteurEssuieGlace

// 1 MP3 sur PIN4

// Inversion le HIGH et le LOW pour les relais pour qu'ils soient éteints au démarrage

const int CapteurIRPin = 2; // capteur infrarouge PIR

//PIN 3 utilisé par le MP3

const int Relais1_FumeeChaudron = 4; // relais 1 pour envoyer la fumée

const int Relais2_LumiereChaudron = 5; // relais 2 pour allumer la lumière du chaudron

const int Relais3_MoteurChaudron = 6; // Relais 3 pour allumer le moteur du balai

//PIN 9 utilisé pour la bouche

const int LedYeuxBouche=11; // mettre les LED bouche et yeux sur ce PIN

int AttenteServoBouche; // variable de temps

// *************pour le MP3********************



SoftwareSerial mp3(10, 3); // PIN 3 (aucune idée pourquoi il faut le "10" avant le "9")

// *************pour le servomoteur********************


Servo ServoBouche; // crée l’objet pour contrôler le servomoteur

void setup()


Serial.begin(9600); //Affichage série

ServoBouche.attach(9); // utilise la broche 9 pour le contrôle du servomoteur

ServoBouche.write(10); // positionne le servomoteur au Debut du cycle

pinMode(CapteurIRPin, INPUT); // Détecteur PIR comme étant une entrée

pinMode(LedYeuxBouche, OUTPUT); // LED comme étant une sortie

pinMode (Relais1_FumeeChaudron, OUTPUT); // Définir la broche "relai" comme étant une sortie

pinMode (Relais2_LumiereChaudron, OUTPUT); // Définir la broche "relai" comme étant une sortie

pinMode (Relais3_MoteurChaudron, OUTPUT); // Définir la broche "relai" comme étant une sortie

digitalWrite(Relais1_FumeeChaudron, LOW); // Définit la lumiere à LOW to turn Relay OFF

digitalWrite(Relais2_LumiereChaudron, LOW); // Définit le Pin à LOW to turn Relay OFF

digitalWrite(Relais3_MoteurChaudron, LOW); // Définit la FumeePin à LOW to turn Relay OFF


void loop()


//*******************Si mouvement détecté**********

while (digitalRead(CapteurIRPin) == HIGH)


lanceMP3(); // lance la musique via la fonction lanceMP3() plus bas

digitalWrite(Relais1_FumeeChaudron, HIGH); // Allume la fumée

digitalWrite(Relais2_LumiereChaudron, HIGH); // Allume la lumière du chaudron

digitalWrite(Relais3_MoteurChaudron, HIGH); // Allume le moteur du chaudron

delay(10000); // permet d'attendre jusqu'à ce que la voix démarre

for (int i=0; i <50; i++){ // mouvement bouche pendant 50 fois

AttenteServoBouche = random(100, 500); // choisi un nombre entre 100 et 500ms pour cette variable


digitalWrite(LedYeuxBouche,LOW); // on allume les 3 LEDS


Serial.println("ouverture bouche 10 degre");


digitalWrite(LedYeuxBouche,HIGH); // on éteint les 3 LEDS


Serial.println("ouverture bouche 60 degre");


digitalWrite(Relais1_FumeeChaudron, LOW); // Eteint la fumée



//*******************Si mouvement PLUS détecté**********

digitalWrite(Relais1_FumeeChaudron, LOW); // Eteint la fumée (juste pour sécuriser car déjà éteint au dessus).

digitalWrite(Relais2_LumiereChaudron, LOW); // Eteint la lumière du chaudron

digitalWrite(Relais3_MoteurChaudron, LOW); // Eteint le moteur du chaudron

PlayPause(); // Faire pause sur la musique






// *********************** FONCTION MP3 ****************************

void lanceMP3()



SelectPlayerDevice(0x02); // choisir la carte SD.

SetVolume(0x20); // définir le volume (entre 0x00 et 0x30)

SpecifyMusicPlay(1); // lancer la chanson à l'index 1


// ***************************************************************

Step 6: Prototype: Testing !

Test a lot all position with arms, skull, body to find your own Witch attitude.

Halloween Contest 2019

Participated in the
Halloween Contest 2019