Zelda Guardian Robot

Build your own Guardian Robot, Terrako from Zelda Age of Calamity. This is a shoulder-mounted companion robot!

Magnetic Shoulder Robot

Our companion robot sits on your shoulder with a magnetic plate and metal backing hidden underneath.

Circuit Python Powered


This little robot is powered by Circuit Python! Connect with a USB cable to update the code and recharge the battery!

The ItsyBitsy NRF52480 controls the servo, LEDs and is powered with a rechargeable Lipo battery.

Terrako – Guardian of Time


A tiny Guardian who has traveled from the future to save Zelda. It was broken in the fight against the Calamity but has now been repair and reactivated thanks to the efforts of Link and the others.



Components are housed in the body with built in on and off switch and USB port.


3D Printed


The parts are 3D Printed with an easy to assemble snap fit parts.  

Magnets help attach the light weight body to a wearers shoulder!

Angled shot of Adafruit ItsyBitsy nRF52840 Express - Bluetooth LE.
What's smaller than a Feather but larger than a Trinket? It's an Adafruit ItsyBitsy nRF52840 Express featuring the Nordic nRF52840 Bluetooth LE...
In Stock
High Powered, High Torque Metal Gear Micro Servo
Add even more power to your robot with this metal-geared servo. The tiny little servo can rotate approximately 180 degrees (~90 in each direction), and works just like the...
Out of Stock
Magnetic Pin Back
These magnetic pin backs have two pieces: a metal bar with adhesive strip and a plastic piece with two strong rare-earth magnets. Affix the metal bar to your FLORA projects-- it's...
In Stock
Angled shot of a High-strength 'rare earth' magnet.
Yow! These things are super powerful. 1/2" diameter, 3/16" thick discs, south side is marked with a red line. Great for use with your SpokePOV Kit. If you have an aluminium...
In Stock
1.25mm Pitch 3-pin Cable Matching Pair
When 0.1" is too big, and JST PH's too chunky, these ultra-slim 1.25mm connectors are a reliable alternative. These are only 1.25mm pitch, but have a nice clicky...
In Stock
Lithium Ion Polymer Battery 3.7v 420mAh with JST 2-PH connector and short cable
Lithium-ion polymer (also known as 'lipo' or 'lipoly') batteries are thin, light, and powerful. The output ranges from 4.2V when completely charged to 3.7V. This...
In Stock
Front shot of JST-PH Battery Extension Cable.
By popular demand, we now have a handy extension cord for all of our JST-terminated battery packs (such as our LiIon/LiPoly and 3xAAA holders). One end has a JST-PH socket, and the...
In Stock
1 x M2.5x5mm Screw

Circuit Diagram

The diagram below provides a visual reference for wiring of the components. This diagram was created using the software package Fritzing.

Use Adafruit's Fritzing

parts library to create circuit diagrams for your projects. Download the library or just grab individual parts. Get the library and parts from GitHub - Adafruit Fritzing Parts.

Wired Connections

The ItsyBitsy nRF52840 is powered by 420mAh battery via the Lipo Backpack. This allows the USB port from the ItsyBitsy nRF52840 to charge the 420mAh battery. A slide switch is connected to the two switch pin on the Lipo Backpack. 

  • BAT from Lipo Backpack to BAT on ItsyBitsy nRF52840
  • Ground from Lipo Backpack to GND on ItsyBitsy nRF52840
  • 5V from Lipo Backpack to USB on ItsyBitsy nRF52840

Slide Switch

A 2-pin slide switch is wired to the switch pins on the Trinket/ItsyBitsy Lipo Backpack as shown in the diagram above.

NeoPixel Ring

The Eye is illuminated by a NeoPixel Ring.

  • 5V+ from NeoPixel Ring to Vhi on ItsyBitsy nRF52840
  • G from NeoPixel Strip to G on ItsyBitsy nRF52840
  • DIN from NeoPixel Strip to Pin #5 on ItsyBitsy nRF52840


  • Data (Yellow) from the Servo to A2 on ItsyBitsy nRF52840
  • 5V+ (Red) from NeoPixel Ring to Vhi on ItsyBitsy nRF52840
  • G (Brown) from NeoPixel Strip to G on ItsyBitsy nRF52840

Parts List

STL files for 3D printing are oriented to print "as-is" on FDM style machines. Parts are designed to 3D print without any support material. Original design source may be downloaded using the links below.

  • eggG-head.stl
  • eggG-body.stl
  • eggG-horn.stl
  • eggG-eye.stl
  • eggG-leg.stl
  • eggG-foot.stl

Slicing Parts


Supports are required. Slice with setting for PLA material. 

The parts were sliced using CURA using the slice settings below.

  • PLA filament 220c extruder
  • 0.2 layer height
  • 10% gyroid infill
  • 60mm/s print speed
  • 60c heated bed



  • Support Extrusion Width: .2
  • Support Density: 4%
  • Support Z Height: .21
  • Interface: On
  • Support Roof: On
  • Support Pattern: Zig Zag
  • Support Roof Pattern: Zig Zag


Build Plate Adhesion 


  • Type: Brim
  • Line Count: 6
  • Brim on inside + outside

CircuitPython is a derivative of MicroPython designed to simplify experimentation and education on low-cost microcontrollers. It makes it easier than ever to get prototyping by requiring no upfront desktop software downloads. Simply copy and edit files on the CIRCUITPY drive to iterate.

Set up CircuitPython Quick Start!

Follow this quick step-by-step for super-fast Python power :)

Further Information

For more detailed info on installing CircuitPython, check out Installing CircuitPython.

Click the link above and download the latest UF2 file.

Download and save it to your desktop (or wherever is handy).

Plug your Itsy nRF52840 into your computer using a known-good USB cable.

A lot of people end up using charge-only USB cables and it is very frustrating! So make sure you have a USB cable you know is good for data sync.

In the image, the Reset button is indicated by the magenta arrow, and the BTLE status LED is indicated by the green arrow.

Double-click the Reset button on your board (magenta arrow), and you will see the BTLE LED (green arrow) will pulse quickly then slowly blue. If the DotStar LED turns red, check the USB cable, try another USB port, etc.

If double-clicking doesn't work the first time, try again. Sometimes it can take a few tries to get the rhythm right!

You will see a new disk drive appear called ITSY840BOOT.

Drag the adafruit_circuitpython_etc.uf2 file to ITSY840BOOT.

The LED will flash. Then, the ITSY840BOOT drive will disappear and a new disk drive called CIRCUITPY will appear.

That's it, you're done! :)

Setup the ItsyBitsy nRF52840 with CircuitPython


We'll need to get our board setup so we can run the CircuitPython code. Let's walk through these steps to get the latest version of CircuitPython onto your board. 

The Mu Python Editor

Mu is a simple Python editor that works with Adafruit CircuitPython hardware. It's written in Python and works on Windows, MacOS, Linux and Raspberry Pi. The serial console is built right in, so you get immediate feedback from your board's serial output! While you can use any text editor with your code, Mu makes it super simple. Instructions for Mu are available here.

Installing or upgrading CircuitPython

You should ensure you have CircuitPython 4.0 or greater on your board. Plug your board in with a known good data + power cable (not the cheesy USB cable that comes with USB power packs, they are power only). You should see a new flash drive pop up.

If the drive is CIRCUITPY, then open the boot_out.txt file to ensure the version number is 4.0 or greater. 

Adafruit CircuitPython 5.0.0-beta.3 on 2020-01-08; Adafruit ItsyBitsy nRF52840 Express with nRF52840

If you do not have CircuitPython on your board, you can add it or upgrade via this page on the ItsyBitsy guide.

Download the Adafruit CircuitPython Library Bundle

In order to run the code, we'll need to download a few libraries. Libraries contain code to help interface with hardware a lot easier for us.

Use the ItsyBitsy nRF52840 page on Installing Libraries to get the library that matches the major version of CircuitPython you are using noted above, i.e. 4.x for the versions starting with 4, 5.x for the versions starting with 5, etc.

To run the code for this project, we need the three libraries in the Required Libraries list below. Unzip the library bundle and search for the libraries. Drag and drop the files into a folder named lib on the CIRCUITPY drive (which appears when your board is plugged into your computer via a known good USB cable) if the directory is not already on the ItsyBitsy nRF52840).

Required Libraries 

  • neopixel.mpy
  • adafruit_servokit.mpy
  • adafruit_pca9685.mpy

Once we have all the files we need, a directory listing will look similar to above as far as files and directories.

Double Check

See the directory listing above and double check that you have all the files listed to make this project function. If any are missing or in an incorrect directory, move them so they're in the right places.

# SPDX-FileCopyrightText: 2021 Noe Ruiz for Adafruit Industries
# SPDX-License-Identifier: MIT

Guardian Egg Shoulder Robot with servo and NeoPixel ring

# pylint: disable=import-error
import time
import random
import board
import pwmio
import neopixel
from adafruit_motor import servo
from adafruit_led_animation.animation.comet import Comet
from adafruit_led_animation.animation.SparklePulse import SparklePulse
from adafruit_led_animation.sequence import AnimationSequence
from adafruit_led_animation.color import RED, BLUE

PIXEL_PIN = board.D5
SERVO_PIN = board.A2
ORDER = neopixel.GRB

# Initialize servo
PWM = pwmio.PWMOut(SERVO_PIN, frequency=50)
SERVO = servo.Servo(PWM)

# Initialize NeoPixels and animations
PIXELS = neopixel.NeoPixel(PIXEL_PIN, NUM_PIXELS, auto_write=False,
LARSON = Comet(PIXELS, bounce=True, speed=0.6/NUM_PIXELS,
               color=(RED[0] * BRIGHTNESS,  # This is a little faster than
                      RED[1] * BRIGHTNESS,  # using the NeoPixel brightness
                      RED[2] * BRIGHTNESS)) # setting.
SPARKLE = SparklePulse(PIXELS, period=2, speed=0.15,
                       max_intensity=BRIGHTNESS, color=BLUE)
ANIMATIONS = AnimationSequence(LARSON, SPARKLE, advance_interval=7,

MOVING = False                # Initial state = paused
START_TIME = time.monotonic() # Initial time
DURATION = 1.0                # Hold initial position for 1 sec

while True: # Loop forever...

    # Move turret -- randomly looks around and pauses
    NOW = time.monotonic()
    ELAPSED = NOW - START_TIME # Seconds since start of motion or pause
    if ELAPSED >= DURATION:    # End motion/pause?
        MOVING = not MOVING    # Toggle between those two states
        START_TIME = NOW       # and record the new starting time
        ELAPSED = 0.0
        if MOVING:             # Switching from paused to moving
            while abs(POSITION - NEXT_POSITION) < 10:  # Min +/- 10 degrees
                NEXT_POSITION = random.uniform(0, 180) # Try, try again
            DURATION = 0.2 + 0.6 * abs(POSITION - NEXT_POSITION) / 180
        else:                  # Switching from moving to paused
            SERVO.angle = NEXT_POSITION         # Move to end of sweep
            DURATION = random.uniform(0.5, 2.5) # Pause time
    if MOVING:
        FRACTION = ELAPSED / DURATION                        # Linear 0 to 1
        FRACTION = (3 * FRACTION ** 2) - (2 * FRACTION ** 3) # Ease in/out

    ANIMATIONS.animate() # Cycle through NeoPixel animations

Cut On / Off Trace


Use Flash cutters the remove the trace with the white box around it. This will enable the the slide switch to turn the circuit on and off.

Slide Switch


Solder wires to the middle pin and one of the other two pins of the slide switch.

Solder Lipo Backpack


Measure, cut and solder wires that will connect the Lipo backpack to the ItsyBitsy board.

ItsyBitsy Connectors


Follow the circuit diagram to add male connectors to the ItsyBitsy pins. Use heat shrink to insulate the shared ground and power connections. 

Solder Backpack to ItsyBitsy


Solder the wire on the Lipo Backpack to the ItsyBitsy board.

Mount boards


Align the USB port to the cutout with the metal shield facing up as shown. Press fit the ItsyBitsy board, at and angle, between the three walls on the "eggG-in-shell" part. 


Fasten Lipo Backpack


Use an M3x6mm long screw to secure the Lipo Backpack to the standoff on the wall, next to the slide switch mount.

Press fit slide switch


The slide switch fits between the walls. Gently pull the metal tabs on the side to increase the tolerance.

Shorten Servo cables


Measure, cut and replace the cable on the Servo with female molex connectors. Measure short to keep the wiring tidy. 

Servo cables


Align and pass the the servo cables through the cutout. The Servo press fits between the walls.

Use the included screw to secure the servo to the standoff on the wall.

Lipo Battery Extension cable


Shorten a JST extension cable so the battery can reach the Lipo Backpack.

Connect the JST cable


Pass the JST cable to reach the Lipoback pack. Use tweezers to help connect the cable.

NeoPixel Ring

Measure and solder a female connector to the NeoPixel ring. 


Mount NeoPixel Ring


Pass wires through the cutout. Angle the NeoPixel Ring over the Servo so one side fits under Servo tabs. The opposite side of the NeoPixel Ring fits over the top of the Servo tab.

Connect Servo and NeoPixel Ring to ItsyBitsy


Arrange the wires along the walls to keep the connections tidy.

Servo Horn


Use the included Servo horn screw to attach the "eggG-horn" part to the shaft on the Servo.

Leg Assembly


Press fit the ball joints into each segment. Connect 6 segments together and attach to the three sections on the "eggG-lid" part.


Connect Lid


Fit two of the snap fit sections over the "egg-G-lid" part and press down over the third to connect the two parts.

Diffuser Eye

Press fit the diffuser part at an angle. 


Attach Head


Align the Horn spokes between the peg inside the head part.



Metallic multi surface Acrylic Paint form craft smart is used to complete the look.

The closest matching color is Espresso. 

Allow the part to dry for about half a day before adding an additional coat of paint.

Magnetic Pin Back


The Magnetic Pin Back includes a metal bar backing with adhesive strip. Affix the metal bar to your costume. Then attach Terrako!

This guide was first published on Apr 07, 2021. It was last updated on Apr 07, 2021.