Spooky Scary Skeleton

A fun Halloween Robot

 9 October 2022   |     7 minute read   |   By Kevin McAleer   |   Share this article on


For every project I create, I often make a corresponding YouTube video. Sometimes, there might be more than one video for a single project. You can find these videos in this section.

Explore more through these this dedicated videos.

Spooky Scary Skeleton Robot

This is a rather bare bones robot for Halloween, but its loads of fun! It uses an Ultrasonic range finder to detect people in front of it to activate its scared stiff expression. The Servo moves a mechanism inside to raise the eye brows and lower the jaw.

Bill of Materials

Part Description Qty Cost
Raspberry Pi Pico The $4 microcontroller from Raspberry Pi 1 £4.00
Servo A low cost SG90 Servo 1 £3.00
Ultrasonic Range Finder HC-SR04 3.3v version 1 £2.00
M2 Bolts Securely attach the Pico W and Ultrasonic Rangefinder using M2 Bolts 8 £0.80
M3 Bolts and nuts Securely attach the top section to the bottom 3 £0.60
Female to Female Dupont cables For attaching the Pico to the servo and Range finder 4 £1.00
Male to Female Dupont cables For attaching the Pico to the servo and Range finder 3 £1.00

Prices and availability may vary.

MicroPython Code

Download or clone the code here: https://www.github.com/kevinmcaleer/bare_bones


Below is a simple MicroPython class for measuring distance with a range finder:

# Range finder
from machine import Pin
from time import sleep, sleep_us, ticks_us

class RangeFinder():
    def __init__(self,trigger_pin:int = 0, echo_pin:int = 1):
        self.trigger = Pin(trigger_pin, Pin.OUT)
        self.echo = Pin(echo_pin, Pin.IN)
    def distance(self):
        """ Returns the distance in cm """
        # set the signal on & off times to zero
        signalon = 0
        signaloff = 0
        # reset the trigger
        while self.echo.value() == 0:
            signaloff = ticks_us()
        while self.echo.value() == 1:
            signalon = ticks_us()
        elapsed_microseconds = signalon - signaloff
        self.duration = elapsed_microseconds
        self.distance_to_object = (elapsed_microseconds * 0.343) / 2
        return round(self.distance_to_object / 10 ,1) 

Bare Bones - a simple Skeleton program

Here is a simple program that detects the presence of a person and then triggers the scared stiff expression:

This project uses the Pimoroni MicroPython build


# Scared
# October 2022
# Kevin McAleer
from servo import Servo 
from range_finder import RangeFinder
from time import sleep


class BareBones():

    rangefinder = RangeFinder()
    def __init__(self):
        self.servo = Servo(16)
    def scared_face(self):
        """ Open the Jaw and raise the eyebrows """
        print('I\'m scared!')
    def not_scared_face(self):
        """ Close the Jaw and lower the eyebrows """
        print('I\'m not scared anymore')

    def is_scared(self):
        if self.rangefinder.distance() <= SCARED_DISTANCE:
            return True
            return False

# Main Program
skeleton = BareBones()

while True:
    if skeleton.is_scared():


Bottom section

The Base

The first part to start with is the bottom section.


The Servo

Screw in the servo using 2 M2 bolts. The servo spindle should be towards the middle of the robot.


The Cog

  1. Cut the servo horn with a pair of wire cutters so that it fits into the cog
  2. Push the servo Horn onto the cog
  3. Make sure the servo is at the minimum rotation position (turn it clockwise until it doesn’t turn any more)
  4. Push the cog onto the servo spindle.
  5. Ensure the cog can turn correctly and doesnt catch on any rough 3d printed parts


The Jaw

  1. Slide the jaw into place under the cog - the jaw should be in the closed position

The Eye Brows

The Eye brows

  1. Slide the Eyebrows into place under the cog - the eye brows should be in the closed position

The Gasket

The Gasket

  1. The gasket adds a little extra room for the cog without affecting the flat underneath of the top section
  2. It means we can print out other sizes if this doesn’t work correctly

Top Section

The Top section

  1. Push the captive M3 nuts into the nut-holes on the bottom section. Use plyers to gently push them into place
  2. Screw the 3 M3 bolts into place

The Range Finder

The Range Finder

  1. Screw the Range finder into place using the M2 bolts - they wont go all the way in, which is expected

The Skull

The Skull

  1. Glue the skull into place but applying superglue onto the raised box section - (adult supervison required!)
  2. Wait for the glue to set before moving onto the next step (30 minutes for fast setting glue).

The Pico

The Pico

  1. Flip the robot over and attach the Pico using 4 M2 bolts

Well done - you’ve assembled the robot, next to wire it up

Wiring up the Robot - plug and play

Wiring Diagram

Connect the servo

  1. Connect 3 male to femail Dupont cables from the servo to the 5v, GND and the signal line to GPIO15 pin on the Pico
  2. The middle wire is the 5v line
  3. The brown wire is the GND line
  4. The orange wire is the signal line

Connecting the HC-SR04 Range Finder

  1. Connect 4 male to male Dupont cables from the range finder to:
  • the VCC to the 3v on the Pico
  • the GND to a GND on the Pico (there are a few to choose from)
  • The Trigger to GPIO00 pin on the pico
  • The Echo to GPIO01 pin on the pico

The STL files


There are a few parts to download and print:

If you want the Pumpkin version here are the STL files you’ll need (the electronics are exactly the same).


If you enjoy these files, please consider buying me a coffee (it took a while to design these!)


View Code Repository on GitHub - https://www.github.com/kevinmcaleer/bare_bones