MK2 Plusロボットアームコントローラーの自作
部品と材料
| 部品 | 数量 |
|---|---|
| Arduino UNO | 1 |
| CNCシールド(Arduino用) | 1 |
| A4988ステッピングモータードライバー | 3 |
| NEMA 17 ステッピングモーター | 3 |
| マイクロリミットスイッチ | 3 |
| 12V電源(十分な電流容量のもの) | 1 |
必要な工具
- 3Dプリンター(アームパーツ造形用、数日かかります)
使用ソフトウェア
- Arduino IDE
プロジェクト概要
Thingiverseで人気のEEZYBOT MK2アーム(ABB IRB460の1/7スケール)を、サーボ駆動からステッピングモーター駆動に改良した「MK2 Plus」を制御するコントローラーをArduino UNO + CNCシールドで自作しました。AccelStepperライブラリで滑らかな多軸同時制御を実現し、リミットスイッチによる自動原点復帰(ホーミング)機能を実装しています。

3Dプリントパーツ: MK2 Plus on Thingiverse(設計: ackyltle / daghizmoのリミックス)
原点復帰(ホーミング)の設計

ステッピングモーターには位置情報がないため、起動時に3つのリミットスイッチで原点を決定します。リンク機構の関係上、X/Y軸は連動して動くため、ホーミングは以下の手順で行います:
- X/Yモーターを逆方向に動かし、Yリミットスイッチが押されるまで移動
- 両モーターを同方向に動かし、Xリミットスイッチが押されるまで移動
- 両モーターを少し戻してスイッチを解放(離脱)
- Zモーターを回転させ、Zリミットスイッチで原点決定
初回はモーターの回転方向が逆だとアームが破損する恐れがあるため、電源スイッチに手を置いて即座に切れる状態でテストしてください。
配線

CNCシールドの端子表示に従って接続:
- Yリミット側のモーター → Y軸端子
- Xリミット側のモーター → X軸端子
- ベース回転モーター → Z軸端子
- リミットスイッチ → 各軸のENDSTOP端子(極性不問)
- A4988ドライバーの向きに注意(逆挿し厳禁)
ソースコード解説
ピン定義とAccelStepperオブジェクト生成
#define XSTEP 2
#define YSTEP 3
#define ZSTEP 4
#define XDIR 5
#define YDIR 6
#define ZDIR 7
#define ENABLE 8
#define XLIMIT 9
#define YLIMIT 10
#define ZLIMIT 11
#define XMOTORACC 250
#define XMOTORMAXSPEED 1000
#define YMOTORACC 250
#define YMOTORMAXSPEED 1000
#include <AccelStepper.h>
AccelStepper XMOTOR(1, XSTEP, XDIR);
AccelStepper YMOTOR(1, YSTEP, YDIR);
AccelStepper ZMOTOR(1, ZSTEP, ZDIR);
ピン初期化
void pinsetup() {
pinMode(ENABLE, OUTPUT); digitalWrite(ENABLE, LOW);
pinMode(XLIMIT, INPUT_PULLUP);
pinMode(YLIMIT, INPUT_PULLUP);
pinMode(ZLIMIT, INPUT_PULLUP);
}
ホーミングルーチン(抜粋・簡略化)
void autohome() { xyhome(); zhome(); }
void xyhome() {
// 低速・低加速で正確なホーミング
XMOTOR.setMaxSpeed(500); XMOTOR.setAcceleration(50);
YMOTOR.setMaxSpeed(500); YMOTOR.setAcceleration(50);
int initial_xhome = -1, initial_yhome = -1;
// Step 1: Yリミットまで逆方向移動
while (digitalRead(YLIMIT)) {
XMOTOR.moveTo(initial_xhome); YMOTOR.moveTo(initial_yhome);
initial_xhome--; initial_yhome--;
XMOTOR.run(); YMOTOR.run(); delay(5);
}
XMOTOR.setCurrentPosition(0); YMOTOR.setCurrentPosition(0);
// Step 2: Xリミットまで同方向移動
initial_xhome = -1; initial_yhome = 1;
while (digitalRead(XLIMIT)) {
XMOTOR.moveTo(initial_xhome); YMOTOR.moveTo(initial_yhome);
initial_xhome--; initial_yhome++;
XMOTOR.run(); YMOTOR.run(); delay(5);
}
YMOTOR.setCurrentPosition(0);
// Step 3: スイッチ離脱
YMOTOR.setMaxSpeed(250); YMOTOR.setAcceleration(10);
initial_yhome = 1;
while (!digitalRead(YLIMIT)) {
YMOTOR.moveTo(initial_yhome); YMOTOR.run(); initial_yhome++; delay(5);
}
YMOTOR.setCurrentPosition(0);
YMOTOR.setMaxSpeed(YMOTORMAXSPEED); YMOTOR.setAcceleration(YMOTORACC);
XMOTOR.setMaxSpeed(250); XMOTOR.setAcceleration(10);
initial_xhome = 1;
while (!digitalRead(XLIMIT)) {
XMOTOR.moveTo(initial_xhome); XMOTOR.run(); initial_xhome++; delay(5);
}
XMOTOR.setCurrentPosition(0);
XMOTOR.setMaxSpeed(XMOTORMAXSPEED); XMOTOR.setAcceleration(XMOTORACC);
}
void zhome() {
ZMOTOR.setMaxSpeed(100); ZMOTOR.setAcceleration(100);
int initial_zhome = -1;
while (digitalRead(ZLIMIT)) {
ZMOTOR.moveTo(initial_zhome); initial_zhome--; ZMOTOR.run(); delay(5);
}
ZMOTOR.setCurrentPosition(0);
ZMOTOR.setMaxSpeed(50); ZMOTOR.setAcceleration(50);
initial_zhome = 1;
while (!digitalRead(ZLIMIT)) {
ZMOTOR.moveTo(initial_zhome); ZMOTOR.run(); initial_zhome++; delay(5);
}
ZMOTOR.setCurrentPosition(0);
ZMOTOR.setMaxSpeed(1000); ZMOTOR.setAcceleration(1000);
}
セットアップとメインループ例
void setup() {
Serial.begin(9600);
pinsetup();
autohome();
Serial.println("HOMING OK");
}
void loop() {
// デモ: 簡単な動作パターン
XMOTOR.runToNewPosition(100); delay(1000);
YMOTOR.runToNewPosition(50); delay(1000);
YMOTOR.runToNewPosition(-50); delay(1000);
YMOTOR.runToNewPosition(0); delay(1000);
XMOTOR.runToNewPosition(0); delay(1000);
}
発展の可能性
- シリアルコマンド制御: 区切り文字付き文字列(例:
5,6,7*)で各軸ステップ数を指示 - G-code/GRBL対応: PCからG-code送信でCNCライクな制御
- 逆運動学実装: 3D空間座標(X,Y,Z)を指定し、Arduino側で各関節角度を計算
- スタンドアロン動作: SDカードから動作パターンを読み込み、PCなしで繰り返し作業
リソース
- GitHub: MK2 Robot Arm Controller
- 3Dモデル: MK2 Plus on Thingiverse
結論
GRBLを使わずArduino単体でステッピングモーター駆動アームを制御する方法を示しました。ホーミングルーチンさえ正しく動けば、AccelStepperのおかげで驚くほど滑らかに動作します。自作ロボットアームの制御基盤として、アイデア次第で様々な応用が可能です。Thingiverseの設計者たちに感謝!
製造プロセス
- MeArmロボットアーム V1.0 – Arduino/Raspberry Piで作るロボットアーム
- Ethernet制御ロボットアーム - WIZ750SRとAndroidアプリでリモート操作
- LittleArm 2C: 3Dプリント製Arduinoロボットアーム – STEM教育向け耐久設計
- DIY ハンドジェスチャー制御 Arduino ロボットアーム - ステップバイステップ構築ガイド
- Arduinoロボットアーム「LittleArm」をAndroidアプリでBluetooth制御
- MeArmロボット用精密ジョイスティックコントローラー - 座標の記録・再生機能付き
- Realtime Robotics、統合簡素化と導入加速を実現する先進コントローラを発表
- KUKA KMR iiwa:インダストリー4.0対応の移動型協働ロボットアーム
- デュアルアームSCARAロボット:高度な組立・生産ソリューションを実現する次世代ロボット
- Yama Seiki GA-2000CR:ロボットアームとパレットシステム搭載のコンパクト旋削センター
- Infineon、Arm Cortex-M0統合のIMC300モーターコントローラー発表——柔軟性を強化