Building a 5-Axis Robot Arm Part 1 (CatchRobo 2025, Component Selection, and Prototyping)

Info

This article is translated from Japanese to English.

https://404background.com/robot/5-axis-arm-1

Introduction

Every year around September, there is a robot competition called the "CatchRobo Battle Contest," where robots compete to carry snacks. I participated in this contest for three years as part of a university club. This year, while supporting my juniors, I decided to participate as an individual because I wanted to build my own robot arm.

▼Details about the CatchRobo Battle Contest can be found here:

https://catchrobo.net

The robot arms I previously purchased on Amazon were heavy and small, so I wanted something larger and easier to customize. I handled both the hardware and software development personally. I plan to introduce the production process over several articles.

▼Previous articles:

Node-REDを使ってみる その4(MQTT通信、ロボットアーム)

はじめに  今回は以前Amazonで購入したロボットアームを、Node-REDでMQTT通信を利用して制御できるようにしてみました。  これまではボタンで制御していたのですが、ネ…

Attaching a Camera to a Robotic Arm and Checking the Video Feed (YOLO)

Info This article is translated from Japanese to English. Introduction A while back, I tried attaching a camera to the robotic arm I purchased on Amazon and se…

Design Policy

When designing the robot arm, I first considered the number of axes. I referred to videos of commercially available 4-axis and 5-axis robot arms.

▼In 4-axis models, they seemed to use a parallel link mechanism to keep the end effector horizontal.

▼In 5-axis models, the arm can carry items in orientations other than just horizontal.

▼The "OpenManipulator" I used in past articles is 4-axis + an end effector.

ROS1を使ってみる その3(Open Manipulatorの操作、Node-RED)

はじめに  今回はOpen ManipulatorのROS Serviceでの制御を確認し、Node-REDのノードでも操作してみました。  ROS Serviceを扱うのははじめてです。データ形式がややこ…

In my research, I have worked with 6-axis and 4-axis arms. However, I decided to go with a 5-axis design because 6 degrees of freedom felt unnecessary and would make control more difficult.

The "work" (the items to be carried) for this competition are "Puchi Assort" snack boxes, weighing about 10g per box. Even stacking three would only be about 30g.

▼The boxes look like this:

明治チョコレート
¥2,657 (2026/01/31 23:19時点 | Amazon調べ)

From past experience, if the end effector is heavy, it causes vibrations, requires heavier support structures, and necessitates higher motor output, which complicates everything. Assuming a maximum load of 50g is sufficient, I focused on making the end effector as lightweight as possible.

I calculated the torque required for a reach of about 1 meter, which should reach most of the boxes on the field. Most hobby-grade robot arms only have a reach of 30cm to 40cm, so this is significantly larger.

All the motors used are servo motors. Since buying new ones is expensive, I used what I had lying around at home.

▼Here are my initial design notes:

Although my background is originally in mechanical engineering, university classes rarely provide opportunities to perform these calculations and select actual power components, so my estimates were somewhat rough. Once I had a general image, I selected the servo motors based on torque and weight.

Component Selection

For the end effector area, I chose to use multiple SG92R servos to save weight. They have slightly more torque than the commonly used SG90, but the price is nearly the same, so I always use the SG92R.

▼The product page for the SG92R is here.

https://akizukidenshi.com/catalog/g/g108914/

TOWER PRO
¥1,206 (2026/03/12 23:12時点 | Amazon調べ)

For parts requiring more torque, I used six 20kg-rated servo motors I had left over.
▼These are commonly seen in robot competitions.

▼This site provided dimensions and other specs:

I ended up using these two types of servos. Initially, I used a 360° continuous rotation servo for the base, but I switched to a 270° version because continuous rotation risked tangling and breaking the cables.

▼This servo also worked; I used it only during the prototyping phase.

▼Details are written on this page:

Although I didn't use them this time, I also had GWS 2BBMG servos at home. My impression of them is that they are small but surprisingly powerful.
▼This is the servo:

https://akizukidenshi.com/catalog/g/g101968

▼I used them in a robot I built for a previous hackathon:

スマホを運ぶロボット関連

ここではTechSeeker Hackathon 2023にて製作した、スマホを運ぶロボットに関する情報を集めています。 外観 実際の動作 関連記事 ▼Protopediaのページ

I also tried using the servos that came with the robot arm I bought on Amazon, but I replaced them because the torque was insufficient.
▼Those were MG995R servos.

Creating the Prototype

Once the design and servo selection were mostly settled, I began prototyping and iterating. Since my 3D printer's maximum build size is about 20cm, I designed the long sections to be assembled using interlocking joints.

▼I am using the Prusa MK4 3D printer.

Trying Out the Prusa MK4 (3D Printer)

Info This article is translated from Japanese to English. Introduction I finally bought my long-awaited 3D printer! The Prusa MK4!I had heard about Prusa from …

▼The Prusa MK 4 seems to be out of stock, but the MK4S appears to be available.

 The material used is PLA.

▼I often use this filament.

First, I tested whether the end effector could hold the work using a XIAO ESP32C3.
▼I designed an end effector like this:

The claws rotate to grip the object as if pinching it against a wall.
▼I've introduced servo control with the XIAO ESP32C3 in this article:

Trying Out XIAO ESP32C3 Part 2 (analogWrite Function and Servo Motors)

Info This article is translated from Japanese to English. Introduction In this post, I experimented with the analogWrite function and servo motor control using…

I used the following code for testing:

const int servoPins[3] = {D0, D1, D2}; // D0, D1, D2
int angles[3] = {90, 90, 90};       // 初期角度
unsigned long lastPulseTime = 0;
const int period = 20; // ms

void setup() {
  Serial.begin(115200);
  for (int i = 0; i < 3; i++) {
    pinMode(servoPins[i], OUTPUT);
    digitalWrite(servoPins[i], LOW);
  }
  Serial.println("SG90制御開始:形式 = ピン番号 角度(例:1 120)");
}

void loop() {
  // 20msごとに全サーボにパルス出力
  if (millis() - lastPulseTime >= period) {
    lastPulseTime = millis();

    for (int i = 0; i < 3; i++) {
      int pulseWidth = angleToPulse(angles[i]);
      digitalWrite(servoPins[i], HIGH);
      delayMicroseconds(pulseWidth);
      digitalWrite(servoPins[i], LOW);
    }
  }

  // シリアル入力処理(角度更新)
  if (Serial.available()) {
    String input = Serial.readStringUntil('\n');
    input.trim();
    int spaceIndex = input.indexOf(' ');
    if (spaceIndex > 0) {
      int pin = input.substring(0, spaceIndex).toInt();
      int angle = input.substring(spaceIndex + 1).toInt();

      if (pin >= 0 && pin < 3 && angle >= 0 && angle <= 180) {
        angles[pin] = angle;
        Serial.print("D");
        Serial.print(pin);
        Serial.print(" → ");
        Serial.print(angle);
        Serial.println("度に設定");
      } else {
        Serial.println("形式: 0〜2 角度(0〜180)");
      }
    } else {
      Serial.println("形式エラー:例 1 90");
    }
  }
}

// 角度をパルス幅に変換(SG90対応)
int angleToPulse(int angle) {
  return map(angle, 0, 180, 500, 2400);
}

The angles can be specified via the Serial Monitor.
▼It gripped the object without any issues.

I thought I might need to attach rubber for grip, but it held fine as is. Once I confirmed it could grip the work, I proceeded with the arm design.

▼The initial design looked like this. I hadn't designed the base mounting part yet.

I made it possible to extend the arm by interlocking 20cm parts using cross-shaped pegs and holes. Thanks to my Prusa MK4, if you design the dimensions precisely, they fit perfectly. Adding a chamfer to the pegs made assembly easier.

▼Since it is about 1m long, it can reach most of the work pieces.

▼It easily reaches the final destination for placing the work.

▼As you'll see in the video later, the actual assembled unit looks like this:

One thing that's hard to see in CAD is that the wiring gets long and needs to be bundled. Using zip ties worked well for this.

About the Circuit Board

I had a board I made previously when I bought the Amazon robot arm. I built upon that board for this project.
▼I introduced it in this article:

Shopping: Trying Out a Robotic Arm (5-axis and Gripper)

Info This article is translated from Japanese to English. Introduction In this post, I tried out a robotic arm I bought on Amazon. My original goal was to get …

▼This is the purchased item:

The microcontroller used is an ESP32.
▼I prepared 12 buttons to control the 6 servo motors.

▼It worked like this:

In previous robot competitions, I always operated via communication between an ESP32 and a PS4 controller. Since I was just switching the input from buttons to a controller, the program was easy to implement.

▼Details on connecting an ESP32 and a PS4 controller can be found here:

ESP32を使って、PS4コントローラとBluetooth接続する

はじめに  今回はESP32を使って、PS4のコントローラとのBluetooth接続をしました。ロボコンで使っているところを見たことがあります。最近はSwitchのコントローラで操作…

ESP32を使って、PS4コントローラとBluetooth接続する:ライブラリ修正編 その1

はじめに  以前の記事で、ESP32とPS4コントローラのBluetooth接続をしました。コンパイルエラーが多発して結構苦労しました。  ライブラリに問題があって、そのままだと…

Testing the Movement

I fixed the arm to a desk and moved it using the buttons on the board.
▼My impression was that if the movement is fast, the swaying is quite significant. The torque seemed fine.

▼The end effector's movement is also good.

I found that if the wiring was too short, it would snag, so I had to make it longer. The QI connectors on servo motors tend to come loose easily, so I remade them, including the connectors.

Finally

Although I had done the torque calculations, I wasn't sure if it would actually move, so I was surprised that it worked so well. I thought servo motors would be weaker. Thanks to the 3D printer, I was able to repeat prototyping and verification at high speed. Up to this point, it took about a month while working in parallel on projects for the Expo.

I continued to make further improvements after this. I will introduce those in a separate article.

Leave a Reply

Your email address will not be published. Required fields are marked *