Butter Robot

A little rover robot to keep an eye on my prints inspired by the butter passing robot in Rick and Morty.

Similar projects worth following
This robot uses a Raspberry pi Zero W as brain to control the L9110 motor driver and three servos. It is able to record/stream video with the RPi camera module and there is a USB device connected to capture and output audio. The case is completely 3D printed. The robot might also be a excellent case for something like the Google AIY project or Mycroft AI.


I wanted a videostream so I could keep an eye on my prints. I didn't want to print one of the standard RPi + camera cases for my printer so I decided to make it into a little rover robot. It's inspired by the butter passing robot in Rick and Morty because I liked the looks and personality of it.

Current setup

The brain of this robot is a RPi zero W the servos are directly connected to the GPIO and the DC motors are connected via a L9110 motor driver. To drive this robot I decided to use the Blynk app after I found out that they support a video stream because that is the most important function of this robot. It was surprisingly easy to use this app with the Python library they developed even while this library is still in alpha it worked great.

The video stream is set up using MJPG streamer after flipping the image because the camera is mounted upside down it worked flawlessly, however the video stream inside the Blynk app lags a bit this isn't the case in the browser.

To control the servos I use ServoBlaster because this retains the PWM output in the background. To use this inside a Python  script I decided to use the os module to run command line commands.

Improvements to make

  1. The powerbank that I used as battery for this robot isn't able to provide enough current as I experienced some brownouts while driving the robot. So I should replace the charging circuit with a better charging circuit, preferably one that supports charging and discharging at the same time.
  2. The servo I am using in the neck isn't strong enough and it probably already ripped some of the plastic teeth. I already expected this but this was the servo I had on hand, so this servo should be upgraded to a stronger servo with metal teeth.
  3. The wheels are made of PLA so they don't have enough friction to really drive around. I plan to upgrade this to rubber tracks when I have some flexible filament, this also makes it look more like a Butter passing robot from Rick and Morty.


Standard Tesselated Geometry - 264.93 kB - 08/02/2017 at 09:28


Portable Network Graphics (PNG) - 101.73 kB - 08/02/2017 at 09:28


Standard Tesselated Geometry - 185.92 kB - 08/02/2017 at 09:28


Standard Tesselated Geometry - 63.75 kB - 08/02/2017 at 09:28


Standard Tesselated Geometry - 605.84 kB - 08/02/2017 at 09:28


View all 16 files

  • 1 × Raspberry pi Zero W
  • 1 × RPI camera module
  • 1 × USB audio board
  • 1 × L9110 motor driver
  • 2 × DC geared motors

View all 10 components

  • Wiring pictures

    bram07/24/2017 at 08:22 0 comments

  • Python script

    bram07/24/2017 at 07:22 0 comments

    Blynk pin configuration

    The Python script is really simple and the only module you need to install is the Blynk library and ServoBlaster needs to be install in the same directory.

    Pin V0 and V1 control the movement of the left motor and pin V2 and V3 control the movement of the right motor. The slider on pin V4 controls the servo in the neck.

    The slider in the Blynk app should be setup so it writes on an interval while sliding and not just on release. I set it up to write every 100ms for a smooth movement.

    Installing ServoBlaster

    Python script

    import BlynkLib
    import RPi.GPIO as GPIO
    import os
    import time
    os.system("./servod --p1pins=12,16,18")
    GPIO.setup(20, GPIO.OUT)
    GPIO.setup(21, GPIO.OUT)
    GPIO.setup(19, GPIO.OUT)
    GPIO.setup(26, GPIO.OUT)
    GPIO.output(20, GPIO.LOW)
    GPIO.output(21, GPIO.LOW)
    GPIO.output(19, GPIO.LOW)
    GPIO.output(26, GPIO.LOW)
    BLYNK_AUTH = ''
    blynk = BlynkLib.Blynk(BLYNK_AUTH)
    def my_write_handler(value):
            if int(value) == 1:
                    GPIO.output(19, GPIO.HIGH)
                    GPIO.output(19, GPIO.LOW)
    def my_write_handler(value):
            if int(value) == 1:
                    GPIO.output(26, GPIO.HIGH)
                    GPIO.output(26, GPIO.LOW)
    def my_write_handler(value):
            if int(value) == 1:
                    GPIO.output(20, GPIO.HIGH)
                    GPIO.output(20, GPIO.LOW)
    def my_write_handler(value):
            if int(value) == 1:
                    GPIO.output(21, GPIO.HIGH)
                    GPIO.output(21, GPIO.LOW)
    def my_write_handler(value):
            os.system("echo 2=%d  > /dev/servoblaster" % (int(value)))

  • Power consumption

    bram07/22/2017 at 15:07 0 comments

    I've measured the power consumption to know if the boot problems I was having had anything to do with the power consumption.

    The problem I'm having happens only on power on so I started measuring the current on boot, the current starts at around 100 mA and has a peak at around 360 mA. This is far below the max output of the power bank at 1000 mA.

    For comparison I also measured the current draw when it is idle and powering motors. In the idle state the current stays around 330 mA. When the motors start there is little peak and then it goes to about 600 mA.

    If you compare the current draw you would expect that the boot wouldn't draw too much current. It could be that there is a really quick peak current that my multimeter is too slow to pick up and sends the electronics in some sort of reboot cycle, but that is just a guess.

  • Arms and power problems

    bram07/21/2017 at 20:08 0 comments

    The first arm is printed and attached and the second side/arm is currently being printed. The sides have mounts for the servos and the arms are directly connected to the servos.

    Power problems?

    When I connect everything up it won't power up this is probably because it draws too much current. I will be measuring the current it draws but for now I will just leave one servo disconnected. The battery pack that I use has a capacity 4400mAh and can deliver 1000 mA.

View all 4 project logs

Enjoy this project?



Luke wrote 08/02/2017 at 06:04 point

Is there a chance you'll be putting up the 3D printable files?

  Are you sure? yes | no

bram wrote 08/02/2017 at 09:30 point

Hi Luke, I've uploaded the .STL files. The electronic mounts inside the head are a bit off but it works fine.

  Are you sure? yes | no

Luke wrote 08/02/2017 at 15:54 point

Thanks bram!

  Are you sure? yes | no

Richard Hogben wrote 07/23/2017 at 03:14 point

What is it's purpose?

  Are you sure? yes | no

bram wrote 07/23/2017 at 11:16 point

I think it would have the same reaction when you would tell him that his purpose is to watch my printer print :)

  Are you sure? yes | no

Dan DWRobotics wrote 07/21/2017 at 23:22 point

Ha ha, I love this. "Yeah, welcome to the club pal. "

  Are you sure? yes | no

RoGeorge wrote 07/21/2017 at 05:00 point

I was expecting for a long time to see a "Pass the butter" robot here. It's one of my favorite between all the famous robots, ranked even higher then R2D2.


  Are you sure? yes | no

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates