In this post, I will cover some projects I have worked on over the last few months and some projects I have planned for the future.

Bipedal Robot

I am currently busy building a bipedal robot based on this Instructables post by K.Biagini. I used his design as a foundation and added additional components and functionality (such as arms and a Piezo for sound).

I had to modify his 3D models to achieve what I wanted. Here are links to download my modified 3d Models:
– Body Extension (to fit in the extra components) – Link
– Modified Head – Link
– Arms – Link

Here is a list of all the electronic components used:
– 1x Arduino Nano
– 6x micro servos
– 2 x push buttons
– 1x mini toggle switch
– 1x 9v Battery
– 1x ultrasonic sensor (HC-SR04)
– 1x RGB LED
– 1x Piezo

These components are connected as follows:

Pinout configuration of Arduino Nano:

Pin NumberConnected Hardware
2Ultrasonic Sensor Echo Pin
3RGB LED Red Pin
4Push Button 1
5RGB LED Green Pin
6RGB LED Blue Pin
7Push Button 2
8Servo Signal Pin (Right Hip)
9Servo Signal Pin (Right Ankle)
10Servo Signal Pin (Left Hip)
12Servo Signal Pin (Left Ankle)
13Ultrasonic Sensor Trigger Pin
14 (A0)Servo Signal Pin (Left Arm)
15 (A1)Servo Signal Pin (Right Arm)

This is still an in-progress project and is not done, Especially from a coding perspective on the Arduino, but once I have completed this project, I will create a post containing the complete source code.

Rotary Control

I needed a rotary control for another project discussed below, so I decided to build one as per this Post on the Prusa Printers blog. It is based on an Arduino Pro Micro and uses Rotary Encoder Module.

I modified the code available on the Prusa blog to mimic keyboard WASD inputs. Turning the dial left and right will input A and D, respectively. Pressing in the dial control push button will switch to up and down inputs, thus turning the dial left and right will input W and S.
Here is the modified code (Based on Prusa Printers blog post code):

#include <ClickEncoder.h>
#include <TimerOne.h>
#include <HID-Project.h>

#define ENCODER_CLK A0 
#define ENCODER_DT A1
#define ENCODER_SW A2

ClickEncoder *encoder; // variable representing the rotary encoder
int16_t last, value; // variables for current and last rotation value
bool upDown = false;
void timerIsr() {

void setup() {
  Serial.begin(9600); // Opens the serial connection
  encoder = new ClickEncoder(ENCODER_DT, ENCODER_CLK, ENCODER_SW); 

  Timer1.initialize(1000); // Initializes the timer
  last = -1;

void loop() {  
  value += encoder->getValue();

  if (value != last) { 
    if (upDown)
    if(last<value) // Detecting the direction of rotation
      if(last<value) // Detecting the direction of rotation
    last = value; 
    Serial.print("Encoder Value: "); 

  // This next part handles the rotary encoder BUTTON
  ClickEncoder::Button b = encoder->getButton(); 
  if (b != ClickEncoder::Open) {
    switch (b) {
      case ClickEncoder::Clicked: 
        upDown = !upDown;
      case ClickEncoder::DoubleClicked: 


I use the rotary control with a Raspberry Pi to control a camera pan-tilt mechanism. Here is a video showing it in action:

I will cover the purpose of the camera as well as the configuration and coding related to the pan-tilt mechanism later in this post.

Raspberry Pi Projects

Raspberry Pi and TensorFlow lite

TensorFlow is a deep learning library developed by Google that allows for the easy creation and implementation of Machine Learning models. There are many articles available online on how to do this, so I will not focus on how to do this.

At a high level, I created a basic object identification model created on my windows PC and then converted the model to a TensorFlow lite model that can be run on a Raspberry pi 4. When the TensorFlow lite model is run on the Raspberry Pi, a video feed is shown of the attached Raspberry Pi camera, with green blocks around items that the model has identified with a text label of what the model believes the object is, as well as a numerical percentage which indicates the level of confidence the model has in the object identification.

I have attached a 3inch LCD screen (in a 3D printed housing) to the Raspberry Pi to show the video feed and object identification in real-time.

The Raspberry Pi Camera is mounted on a pan-tilt bracket which is controlled via two micro servos. As mentioned earlier, the pan-tilt mechanism is controlled via the dial control discussed earlier. The pan-tilt mechanism servos are driven by an Arduino Uno R3 connected to the Raspberry Pi 4 via USB. I initially connected servos straight to Raspberry Pi GPIO pins. However, this resulted in servo jitter. After numerous modifications and attempted fixes, I was not happy with the results, so I decided to use an Arduino Uno R3 to drive the servos instead and connect it to the Raspberry Pi Via USB. I have always found hardware interfacing significantly easier with Arduino and also the result more consistent.

Here is a diagram of how the servos are connected to the Arduino Uno R3:

Below is the Arduino source code I wrote to control the servos. Instructions are sent to the Arduino through serial communication via USB, and the servos are adjusted accordingly.

#include <Servo.h>
#define SERVO1_PIN A2
#define SERVO2_PIN A3

Servo servo1;
Servo servo2;
String direction;
String key;
int servo1Pos = 0;
int servo2Pos = 0;

void setup()
  servo1Pos = 90;
  servo2Pos = 90;


String readSerialPort()
  String msg = "";
  if (Serial.available()) {
    msg = Serial.read();
  return msg;

void loop()
  direction = "";
  direction = readSerialPort();
  //Serial.print("direction : " + direction);
  key = "";

  if (direction != "")
    key = direction;


    if (key == "97")
      if (servo2Pos > 30)
        servo2Pos -= 10;

    else if (key == "115")
      if (servo1Pos < 180)
        servo1Pos += 10;

    else if (key == "119")
      if (servo1Pos > 30)
        servo1Pos -= 10;

    else if (key == "100")
      if (servo2Pos < 150)
        servo2Pos += 10;



On the Raspberry Pi, the following Python script is used to transfer the rotary control input via serial communication to the Arduino:

# Import libraries
import serial
import time
import keyboard
import pygame

screen = pygame.display.set_mode((1, 1))

with serial.Serial("/dev/ttyACM0", 9600, timeout=1) as arduino:
if arduino.isOpen():
    done = False
while not done:
    for event in pygame.event.get():
    if event.type == pygame.QUIT:
    done = True
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_s:

if event.key == pygame.K_w:

if event.key == pygame.K_a:

if event.key == pygame.K_d:

print ("Goodbye")

The next thing I want to implement on this project is face tracking using TensorFlow lite with automated camera movement.

Raspberry Pi Zero W Mini PC

I built a tiny PC using a Raspberry Pi Zero W combined with a RII RT-MWK01 V3 wireless mini keyboard and a 5 inch LCD display for Raspberry Pi with a 3D printed screen stand.

It is possible to run Quake 1 on the Raspberry Pi Zero following the instructions in this GitHub, and it runs great.

Raspberry Pi Mini Server Rack

I have 3D printed a mini server rack and configured a four Raspberry Pi Cluster consisting of three raspberry Pi 3s and one Raspberry Pi 2. They are all networked via a basic five-port switch.

I am currently busy with a few different projects using the Pi cluster and will have some posts in the future going into some more details on these projects.

I developed a little Python application to monitor my different Raspberry Pis and show which ones are online (shown in green) and offline (shown in red).

The application pings each endpoint every 5 seconds, and it is also possible to click on an individual endpoint to ping it immediately. The list of endpoints is read from a CSV file, and it is easy to add additional endpoints. The UI is automatically updated on program startup with the endpoints listed in the CSV file.

Here is the Python source code of the application:

import PySimpleGUI as sg
import csv
import time
import os
from apscheduler.schedulers.background import BackgroundScheduler

def ping(address):
    response = os.system("ping -n 1 " + address)
    return response

def update_element(server):
    global window
    global layout
    response = ping(server.address)
    if response == 0:
        server.status = 1
        window.Element(server.name).Update(button_color=('white', 'green'))
        server.status = 0
        window.Element(server.name).Update(button_color=('white', 'red'))

def update_window():
    global serverList
    for server in serverlist:

class server:
    def __init__(self, name, address, status):
        self.name = name
        self.address = address
        self.status = status

serverlist = []

with open('servers.csv') as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=',')
    line_count = 0
    for row in csv_reader:
        if line_count == 0:
            line_count += 1
            serverlist.append(server(row[0], row[1], 0))
            line_count += 1

layout = [
    [sg.Text("Server List:")],

for server in serverlist:
    layout.append([sg.Button('%s' % server.name, 
                    button_color=('white', 'orange'), 
                    key='%s' % server.name)])

window = sg.Window(title="KillerRobotics Server Monitor", 
                    layout=layout, margins=(100, 30))
scheduler = BackgroundScheduler()

scheduler.add_job(update_window, 'interval', seconds=5, id='server_check_job')

while True:
    event, values = window.read()
    if event == sg.WIN_CLOSED:
    elif event in [server.name for server in serverlist]:
        update_element([server for server in 
                         serverlist if server.name == event][0])

Raspberry Pi Pico

I ordered a few Raspberry Pi Picos on its release, and thus far, I am very impressed with this small and inexpensive microcontroller.

The Raspberry Pi Pico sells for $4 (USD) and has the following specifications:
– RP2040 microcontroller chip designed by Raspberry Pi
– Dual-core Arm Cortex-M0+ processor, flexible clock running up to 133 MHz
– 264KB on-chip SRAM
– 2MB on-board QSPI Flash
– 26 multifunction GPIO pins, including 3 analogue inputs
– 2 × UART, 2 × SPI controllers, 2 × I2C controllers, 16 × PWM channels
– 1 × USB 1.1 controller and PHY, with host and device support
– 8 × Programmable I/O (PIO) state machines for custom peripheral support
– Low-power sleep and dormant modes
– Accurate on-chip clock
– Temperature sensor
– Accelerated integer and floating-point libraries on-chip

It is a versatile little microcontroller that nicely fills the gap between Arduino and similar microcontrollers and the more traditional Raspberry Pis or similar single board computers.
I have only scratched the surface of using the Pico on some really basic projects, but I have quite a few ideas of using it on some more interesting projects in the future.

3D Printing

I ran into some problems with my 3D printer (Wanhao i3 Mini) over the last few months. The First problem was that half of the printed LCD display died, which was an annoyance, but the printer was still usable. The next issue, which was significantly more severe, was that the printer was unable to heat up the hot end.

My first course of action was to replace both the heating cartridge and the thermistor to ensure that neither of those components were to blame, and unfortunately, they were not. After some diagnostics with a multimeter on the printer’s motherboard, I determined that no power was passing through to the heating cartridge connectors on the motherboard.

I ordered a replacement motherboard and installed it, and the 3D printer is working as good as new again. When I have some more time, I will try and diagnose the exact problem on the old motherboard and repair it.
Here are photos of the old motherboard I removed from the printer:

Below are some photos of a few things I have 3D printed the last few months:



When a 3D print completes printing, it seldom looks like a refined and finished item, from support material that needs to be removed to rough edges that need to be smoothed, quite a bit of work is required to make a 3D print look acceptable.

Here is a quick guide of how I finish my 3D prints to look less like 3D printed items and more like professionally produced commercial products.

Let us first look at the tools I use in the finishing process:


Wire Cutting Pliers and Long Nose Pliers – These are useful when removing support material from 3D prints.


Wire Brushes – Perfect for a first pass cleanup on newly printed items to remove any stringing and excess material.


Needle Files – Useful for smoothing rough spots on prints, especially in small confined areas.


Craft Knives – To remove any stubborn unwanted material from 3D prints.


Model Sanding Block – For standing confined areas of 3D prints.


Heated 3D Print Finishing Tool – Perfect for removing stringing and extra material from 3D prints.


Sand Paper – Used for general smoothing of 3D prints. It is best to wet sand 3D prints as it prevents the print from melting and getting ruined by the heat created from sanding friction.


Wood Filler – Used to fill any unwanted gaps and holes in 3D prints.


Spray Paint Primer – This is used to prime 3D prints for painting. Priming also hides small imperfections on 3D prints. Use a primer that is plastic friendly.


Model Paint and Brushes – I like Tamiya model paint and brushes, but any model paint supplies should work great.

Now let us look at the finishing process.

Step 1: Select a model and 3D print it.

It is very important to note that the better your 3D printer is maintained and configured, the better the end results will be. Here is an example of the same model 3D printed and finished. The first was printed before I replaced my hot end and did some basic maintenance on my 3D printer (the nozzle was worn, and the heater cartridge started giving issues, I also tightened the belts). The second was printed after I completed the replacement and maintenance.


The print lines in the first print are clearly visible, even after sanding, while the second model has a smooth finish even with minimal sanding.

Step 2: Remove support material, initial sanding, and filler.

Using wire brushes to do a quick pass over the 3D print to remove any excess material, then sand model using wet sanding method (using sandpaper and water). When sanding the 3D print, start standing with coarse-grit sandpaper (60 grit) and work down to a finer grit (220 grit). Finally, fill any gaps using wood filler.

Step 3: Final Sanding.

When the wood filler has dried, go over the print one final time with very fine grit sandpaper (400 grit).

Step 4: Priming the 3D print

When spraying the 3D print with primer, it is important to hold the spray can at least 30cm away from the 3D print and do long even passes over the model, starting and ending each pass to the side of the 3D print and not directly on the print as it will result in droplets forming.

Step 5: Painting the 3D print


After the primer has completely dried, it is time to paint the model as desired. Using a wethering technique like black-washing brings out the detail of 3d prints amazingly. Black-washing is done by mixing black (or dark color) paint with some paint thinners, then painting all over the model, putting particular focus on getting the paint into all the nooks and crannies on the print. Then finally wiping away most of the paint with some paper towel. This gives the model a weathered realistic look.

Step 6: Done!

And finally, display your newly created item with pride.



I had to travel for work to New York City for a week at the end of February (returning early March), and upon returning, I became ill with the flu (I was tested for CODID-19, and luckily tests came back negative). Nevertheless, I was placed on doctor mandated self-isolation. On the 26th March at 23:59, the government of South Africa put the country on lockdown, meaning that you can only leave your house to buy food, get medication, or seek urgent medical assistance. The Army was deployed to assist the police in enforcing the lockdown, and leaving your home for any other reason than the ones mentioned above can result in you being arrested.

This does mean that I have been at home, except a handful of exceptions, for over a month now, and have kept myself busy with a variety of things, such as playing video games, watching some movies, doing a few Python courses and 3d printing a few things.
From a gaming perspective, I have been playing the following games:

Legend of Zelda Link’s Awakening (on the Nintendo Switch)


I thoroughly enjoyed Link’s Awakening, and it is an amazing remake of the Gameboy classic. The game has buckets of charm and is very enjoyable. It is not a challenging game, except for the last boss that can be a bit tricky. I highly recommend Link’s Awakening, and I enjoyed every second from beginning to end, and it took me about 15 hours to complete.

Animal Crossing New Horizons (on the Nintendo Switch)


I have been absolutely obsessed with Animal Crossing New Horizons, and I must have logged over 40 hours of gameplay to date, and I am still far from done with this game. It is the perfect game while stuck at home, and it is a fantastically fun and feel-good game.

Afterparty (on the Nintendo Switch)


A delightful adventure by Night School Studio, the creators of Oxenfree. I enjoyed this game, and I love the art style. The game is about 6 hours long, and I am now busy with my second play through doing alternative paths from my first playthrough. Afterparty is a must for anyone who loves adventure games.

Doom 64 (on the Nintendo Switch)


Doom64 is a tremendous classic fps, and it plays fantastically in Switch Handheld mode. Initially released in 1997 on the Nintendo 64, it has now been re-released on modern platforms. All the enemies and weapons received a redesign from the original Doom games, and I love how enemies look in Doom 64. Doom 64 is a must-play for any Doom fan.

Mario Kart 8 Deluxe (on the Nintendo Switch)


I am busy playing through Mario Kart 8 again, I have finished the game on the WiiU previously, but I am casually playing through it again between Animal Crossing sessions. Mario Kart 8 Deluxe on the Switch is the definitive version of Mario Kart 8, with all the DLC included and with enhanced graphics (and a fixed battle mode), it is the best Mario Kart game to date.

Doom Eternal (on PC)


Doom Eternal is a beautiful game, and it definitely amps up the difficulty from Doom 2016. All the enemies received a redesign from Doom 2016, with the new designs being more closely inspired by the original Doom games (Doom and Doom II). I love the redesigns of the enemies, and thus far, I am enjoying the game. The game has more strategy compared to Doom 2016, with some enemies having specific weak points that can be exploited, and certain kills (glory kill, chainsaw and flamethrower) providing specific pickups (either health, ammo or armor). The game truly looks amazing and performs great, and I am having no issues running the game at 144fps on Ultra Nightmare settings at 1440p on my 9900k and RTX2080. A definite must-play for FPS fans.

I have also watched a fair number of movies, including:

Not for Resale: A Video Game Store Documentary


I enjoyed this documentary about Video Game stores and physical media, and I will be posting a full review soon.

Indie Game the Movie


An entertaining and informative look at the indie game industry, a must-watch for anyone interested in the process of creating video games. I will also be posting a full review of Indie Game the Movie soon.

I have also kept myself busy 3D printing a few things, mostly using the CCTree PLA Wood filament. I have had a few requests from colleagues and friends for Baby Groot and Pikachu models, so I printed out a few of each to give away.





The CCTREE Carbon Fibre PLA filament is a 1.75mm PLA filament infused with Carbon Fibre, resulting in a filament that can produce prints that are much stronger than standard PLA. This filament is thus ideal for high-wear and load-bearing prints.

This higher durability does come at two significant tradeoffs. Firstly CCTREE Carbon Fibre filament costs approximately double what CCTREE standard PLA filament costs. Secondly and probably the largest problem with this filament is that it experiences significant bowing as it cools compared to standard PLA filament.

This bowing can result in prints separating from the print bed, which occurred more than once during my testing, and below is a picture of the consequences of one of these bed adhesion failures.


I found that the Carbon Fibre filament worked best when printing smaller items as the bowing occurred much less on a small surface area.

Here is a picture of some items I printed using the Carbon Fibre filament to upgrade my Wanhao Duplicator i3 Mini.


On the left in the image is a filament guide that prevents the filament from grazing against the printer body and ensures smooth filament movement. On the right are bed stabilizers that prevent unwanted bed movements that result from slight shifts in the bed leveling springs.

I also printed a tool caddy using the Carbon Fibre filament, and this was the largest item I printed successfully using the filament. Here are some photos of the tool caddy.

As can be seen in the Wanhao logo on the tool caddy a good level of detail is possible using the CTREE Carbon Fibre filament. Also note that all prints required minimal cleanup, with little to no stringing occurring.

Here are a few pictures of the upgrades installed.

The CCTREE Carbon Fibre PLA filament is a very useful filament for printing functional parts that require a level of robustness not offered by PLA, but it does require more care and tweaking to print successfully. It is an excellent filament, just not one for beginners.

On a side note, I recently installed a silicon sock on my printer’s hot end. This is a simple and inexpensive upgrade that offer numerous benefits such as helping to keep the hot end temperature constant and keeping the hot end clean. It also a safety measure and prevents burns from accidentally touching the hot end. It is definitely a worthwhile upgrade considering the minimal investment required.





CCTREE Metalfied filaments are PLA based filaments blended with high-sheen particles in various metallic colors that result in 3d prints that have a polished metal finish.  It is important to note that this is not a metal-infused filament, such as Bronzefil, which contains the actual metal in question, but rather a PLA filament with a metallic appearance, resulting in a filament that is much easier to print compared to the metal-infused filaments.

The Metalfied filament we will be looking at is the Copper variation.


I have previously reviewed the normal PLA and Wood CCTree filaments and found them to be of exceptional quality at a very reasonable price, and with the Metalfied Copper filament once again I was not disappointed. The filament prints exactly like normal PLA filaments, and a great level of detail is possible as shown in the photos below:

For reference here are the Cura settings utilized for the prints above:


As can be seen in the photos of the 3d prints a shiny metallic finish is achieved that looks remarkably similar to polished copper. The filament is an absolute breeze to print with and the end results are beautiful.


I would highly recommend this filament to anyone who is looking for a metallic finish and is not quite ready or willing to undertake the more difficult task of printing with a metal-infused filament.





The CCTree PLA filament we will be looking at today is the 1.75mm diameter variety, but it is also available in 3mm. The filament is available in a wide variety of colors, around 25 colors, and is sold in 1kg spools.

The experience with this filament has been great, producing very good quality prints with a great level of detail and only minimal 3D printed object cleanup required after printing.

 During printing the filament has minimal stringing, if any at all, and I have never had a print fail because of a filament issue using CCTREE PLA filament.

CCTREE PLA filament is a very easy filament to print with and offers great value being one of the less expensive filaments available. I would highly recommend this filament for novices and experienced 3D print enthusiasts alike.

CCTREE Wood Filament


CCTREE Wood filament is a 1.75mm diameter filament consisting of a mixture of PLA plastic and wood fibers that produces prints with a slightly rough wood-like finish, similar to Medium Density Fiberboard (MDF), that can be sanded and stained in a similar way to wood.


This filament is slightly more challenging to print with and is more prone to stringing (due to the wood fibers) and larger flat surfaces are prone to slight bowing as the print cools down.

It is still however possible to produce prints with a great level of detail, it just requires an extra bit of cleanup and finishing.


During printing, this filament gives off a subtle wood-like odor.

The CCTREE Wood filament is more expensive than their PLA filament, costing approximately double the price.

This filament is great for prints that benefit from a more natural wood-like finish (for example a baby Groot) and the end result looks fantastic. This is a great filament but is probably not the best choice for a 3D printing newbie to get started with.


CCTree filaments offer great quality and value for money, the filaments are available in a wide variety of colors and options and they come highly recommended.



Over the last few years various 3D printers have entered the market at significantly lower price points than ever seen before, making 3D printing more accessible to a much larger group of people. One of the companies producing these lower cost 3D printers is Wanhao and I have been using one of their printers, the Wanhao Duplicator i3 Mini, over the last two months.

The Duplicator i3 Mini is a compact PLA optimized 3D printer, weighing just 7kg, with a print volume of 120mmx135mmx100mm. The i3 Mini is extremely easy to get up and running and setup, it comes completely assembled and all the user needs to do to start printing is plug it in and manually level its print bed which takes a few minutes following the included instructions.

The printer ships with an included 1GB SD card with various printable models preloaded on it, so the user can simply insert the SD card and print as soon as the printer is setup. Below are a few photos of one of these models, a little dragon.

The little dragon was printed using CCTree 1.75mm PLA filament.

I use Cura for 3D print slicing, which is the process of converting 3D models into 3D printable formats. Configuring your slicing application correctly for your 3D printer is extremely important and getting this wrong will result in failed prints. Configuring your slicing application involves setting values inside the slicing application that relates to the characteristics of your 3D Printer, for example print volume, nozzle size, filament diameter, print speed and so on. The values for these settings can be found in the printers’ documentation or by simply googling the printer in question and the splicing application that needs to be configured.

Here are some lessons I have learnt so far in 3D printing which might help anyone new to the process:

– Make sure filament diameter is configured correctly, getting this wrong will result in prints failing rather spectacularly.

– Infill is important, but far less is required than most people think, reducing the infill percentage of a print not only reduces the amount of filament used, but also drastically reduces print times.

– When orientating a model for printing in a splicing application, experiment with different orientations and support configurations, sometimes much better results can be achieved with a few minor changes.

– 3D printing is a slow process and takes much longer than most people think.

– Don’t be scared of getting things wrong and having prints fail, it is inevitable and great learnings can be gained from failures.

I will be posting more in the future about my experiences and learnings in 3D printing, but for now I will leave you with a few photos of something else I printed, a USB\SD card holder, which came out great.