Arduinoベースのヌンチャク操作6自由度ロボットアームキット
部品と材料
| 6自由度ロボットアームキット ×1 |
| Wiiヌンチャクコントローラー ×1 |
| Arduino Mega 2560 ×1 |
| コントロールシールド ×1 |
アプリとオンラインサービス
- Arduino IDE
プロジェクトについて




ロボットアームは工場での塗装・溶接・搬送、宇宙探査、水中ROV、医療用途など幅広く活躍しています。今回は、安価なキットとArduino Mega、そしてWiiヌンチャクコントローラーを使って、ご家庭やオフィスで使える6自由度ロボットアームを構築します。繰り返し作業の自動化や、電子工作・機械工作の学習にも最適です。
ロボットアームキットがなくても、ArduinoプログラミングやWiiヌンチャクのインターフェース方法、電子・機械スキルの練習として活用できます。別のキットや自作アームをお持ちの方は、組み立てステップをスキップして電子・プログラミング部分から始めてください。
ステップ1:工具と材料

- はんだごて・はんだ線
- 熱収縮チューブ
- ドライバー
- 6軸メカニカルデスクトップロボットアームキット(SainSmart等):Arduino Mega 2560、コントロールシールド、NRF24L01+、MPU6050、サーボモーター(9kg×4、20kg×2)、ブラケット、ベアリング、グリッパー等が同梱
- 12V電源(2A以上推奨)
- Wiiヌンチャクコントローラー
- オスジャンパーワイヤー4本
※ヌンチャク用アダプター(ブレッドボード接続用)を使えばハンダ付け不要で元のコネクターを破損せずに済みます。
ステップ2〜8:ロボットアームの組み立て
ベース(ステップ2)→ サーボ#1(ステップ3)→ サーボ#2(ステップ4)→ サーボ#3(ステップ5)→ サーボ#4(ステップ6)→ サーボ#5(ステップ7)→ サーボ#6・グリッパー(ステップ8)の順で組み立てます。各ステップでM3ボルト・ナットを使用し、ベアリングで関節の安定性を確保します。アニメーションGIF(デスクトップ版で再生)で手順を確認できます。
ステップ9:ヌンチャクコントローラーの準備

ヌンチャクを選んだ理由:安価、入手容易、2ボタン・2軸ジョイスティック・3軸加速度センサー搭載、Arduinoライブラリ(Robert Eisele作)が利用可能。
コネクターが特殊なため、ケーブルを切断して4線(VCC、GND、SCL、SDA)を露出させ、テスターで配線色と機能を特定してオスジャンパーピンにハンダ付けしました(これでWii本体では使えなくなります)。配線色には標準がないため、実測で確認必須です。
ステップ10:回路配線

ヌンチャク接続(Arduino Mega / シールド上):
- SCL(ピン6) → Arduino Mega ピン21 (SCL)
- SDA(ピン1) → Arduino Mega ピン20 (SDA)
- VCC(ピン3) → 3.3V
- GND(ピン4) → GND
Arduino Unoの場合: SCL→A5、SDA→A4、VCC→3.3V、GND→GND
サーボ接続(コントロールシールド使用時):
- 端子11→サーボ#1、12→#2、13→#3、8→#4、9→#5、10→#6
シールド不使用時(Arduino直結):
- ピン11→#1、12→#2、13→#3、8→#4、9→#5、10→#6、GND共通、サーボ電源は外部6V(2A以上)
外部12V電源(2A以上)をシールドに接続。電源スイッチはOFFのまま、USBでPC接続してコードをアップロードしてから電源投入してください。
ステップ11:Arduino IDEのセットアップ
- 最新版Arduino IDEをインストール(公式サイト)
- Robert EiseleのNunchukライブラリをインストール(解説ページ、GitHub)。
スケッチ→ライブラリをインクルード→ライブラリを管理 から追加可能。
ライブラリ関数:nunchuk_buttonZ()、nunchuk_buttonC()、nunchuk_joystickX()、nunchuk_joystickY()、nunchuk_pitch()、nunchuk_roll()(角度はラジアンで返るため、コード内で度に変換)。
ステップ12:Arduinoコード

コードはこちらからダウンロード。アップロード完後、USBを抜いて外部電源をON。起動時にアームが初期位置へ高速移動するため、周囲の安全を確保してください。サーボの取り付け角度に合わせて初期角度(angle1〜angle6)を調整してください。
コード構成:
- ライブラリインクルード(
nunchuk.h、Wire.h、Servo.h) - ピン定義、初期角度、速度、可動範囲(
angle#min/max)の設定 setup():サーボアタッチ・初期位置設定、シリアル/I2C通信開始、ヌンチャク初期化loop():ヌンチャク読み取り→ジョイスティックXでサーボ#1左右、ジョイスティックYでサーボ#3上下、C/Zボタン押下時のみ加速度センサーでグリッパー回転(サーボ#4、#5)、C+Z同時押しでグリッパー開閉(サーボ#6)- シリアルモニターに各サーボ角度を表示(デバッグ用)
// ライブラリ
#include <nunchuk.h>
#include <Wire.h>
#include <Servo.h>
// ピン定義
#define SERV1 8
#define SERV2 9
#define SERV3 10
#define SERV4 11
#define SERV5 12
#define SERV6 13
Servo s1, s2, s3, s4, s5, s6;
// 初期角度(組み立て時の角度に合わせて調整)
int angle1 = 90, angle2 = 30, angle3 = 0, angle4 = 90, angle5 = 90, angle6 = 45;
int servo1_speed = 3, servo2_speed = 3, servo3_speed = 3, servo4_speed = 1, servo5_speed = 1;
// 可動範囲制限
int angle1min = 0, angle1max = 180;
int angle2min = 0, angle2max = 180;
int angle3min = 0, angle3max = 180;
int angle4min = 0, angle4max = 180;
int angle5min = 0, angle5max = 180;
int angle6min = 0, angle6max = 180;
boolean display_angles = true;
void setup() {
s1.attach(SERV1); s1.write(angle1);
s2.attach(SERV2); s2.write(angle2);
s3.attach(SERV3); s3.write(angle3);
s4.attach(SERV4); s4.write(angle4);
s5.attach(SERV5); s5.write(angle5);
s6.attach(SERV6); s6.write(angle6);
Serial.begin(9600);
Wire.begin();
nunchuk_init();
}
void loop() {
if (nunchuk_read()) {
int x = nunchuk_joystickX();
int y = nunchuk_joystickY();
boolean z = nunchuk_buttonZ();
boolean c = nunchuk_buttonC();
float pitch = nunchuk_pitch();
float roll = nunchuk_roll();
// ジョイスティックX:サーボ#1 左右
if (x > 90) { angle1 -= servo1_speed; display_angles = true; if (angle1 < angle1min) angle1 = angle1min; }
if (x < -90) { angle1 += servo1_speed; display_angles = true; if (angle1 > angle1max) angle1 = angle1max; }
s1.write(angle1);
// ジョイスティックY:サーボ#3 上下(サーボ#2は固定)
// ... 類似のロジック ...
// 加速度センサー:Cボタンのみでグリッパー回転(roll→サーボ#5)、Zボタンのみでピッチ(pitch→サーボ#4)
// 速度は目標角度との誤差に比例
if (c && !z) {
roll = roll * 57.0 + 90.0; // 度変換
servo5_speed = abs(angle5 - roll)/10 + 1;
if (roll > angle5) { angle5 += servo5_speed; display_angles = true; }
if (roll < angle5) { angle5 -= servo5_speed; display_angles = true; }
s5.write(angle5);
}
// グリッパー開閉:C+Z同時押しで閉じる、離すと開く
if (z && c) { s6.write(90); display_angles = true; }
else { s6.write(45); }
}
// シリアル出力ブロック省略
}
ステップ13:使い方

電源投入後、ヌンチャクで5種類の動作(左右回転、上下移動、グリッパー回転、グリッパー上下、開閉)を直感的に制御可能。ボタンとジョイスティックの組み合わせで動作をカスタマイズできます。
コード
GitHubリポジトリ(ライブラリとサンプルコード)
製造プロセス
- Arduino & Raspberry Pi でインターネット制御ビデオストリーミングロボットを構築
- スマート貯金箱を作ろう:Arduino Nanoでコインアクセプターを制御
- IoTで遠隔操作する自作ロボットアーム:Arduino MKR1000とSimulink、ThingSpeak活用
- 古いラジコンカーをXboxコントローラーで操作可能に - ArduinoとUSBホストシールドで実現
- ArduinoでBluetooth経由でLEDを制御 – シンプルDIYガイド
- Arduino駆動3Dプリントロボットアームの製作:ステップバイステップガイド
- Arduino Nanoで音声制御ロボットを自作
- Ethernet制御ロボットアーム - WIZ750SRとAndroidアプリでリモート操作
- 音声で家電を操作:GoogleアシスタントとBluetoothでArduino家電制御
- スマートなArduino制御ロボットアームの製作:簡単DIYチュートリアル
- DIY ハンドジェスチャー制御 Arduino ロボットアーム - ステップバイステップ構築ガイド