Arduinoアリ型六脚ロボットの自作:ステップバイステップガイド
概要
このチュートリアルでは、アリを模した六脚ロボット(ヘキサポッド)の製作過程を詳しく解説します。6本の脚に加え、尾部(腹部)、頭部、触覚、大顎、そして機能的な「目」を備え、見た目も動きもアリそのものです。
制御には自作Androidアプリを使用。前進・後退、左右旋回の4方向ボタンに加え、頭部と尾部の動作、大顎での噛みつき・掴み・離し、攻撃モーションなど多彩なアクションを実行できます。

頭部には超音波センサー(HC-SR04)を「目」として搭載。手を近づけると攻撃態勢に入り、離れると解除、さらに近づくと実際に噛みついてきます。インタラクティブで楽しいロボットに仕上がっています。

3Dモデル設計
いつものように3Dモデリングソフトで設計から開始。各脚は3関節(3サーボ)構成で、計18個のMG996Rサーボを使用。尾部に1個、頭部はロールとチルトの2自由度で2個、大顎用に小型SG90サーボ1個。合計21個のサーボを搭載します。


全パーツは上下2枚のプレート間に組み込み、配線・Arduino・バッテリーを隠す曲面カバーを上部に装着。Thangsで3Dモデルを公開中(STLファイルダウンロード可能、ブラウザ上で閲覧も可)。

3Dプリント
Creality CR-10で全パーツを出力。最も難しかったのは一体造形のヘッドパーツで、サポートオーバーハング角60度とサポートブロッカーを駆使して造形しましたが、見事に成功しました。


機械組み立て
脚部から組み立て開始。M3ボルト・ナット・スプリングワッシャーでサーボを固定(ボルト長12mm以上、筆者は16mm使用)。全体で約200本のボルトが必要です。リンク接続には付属のラウンドホーンを使用(3mm穴を開けるか、M3ネジ付き金属ホーンを別途購入)。


サーボ上部の三角形サポートはカッターで除去し、プレートとフラットに接合。第3サーボ取り付け前に脚基部接続用M4ボルトを挿入しておきます。


同じ要領で6脚すべてを製作。上部プレートにラウンドホーンを固定し、サーボシャフトを中央位置に合わせてから脚を取り付けます(可動域最大化とキャリブレーション簡略化のため)。


尾部サーボ用ホーンもこの段階で固定。ロボットを裏返し、脚のM4ボルトを下部プレートに通してプレーンワッシャーとセルフロックナットで固定。ここが脚のピボット関節になるため、適度な締め付けで回転可能にしつつガタつきを抑えます。

ヘッド機構の組み立て
ヘッドのロール(横回転)用サーボをプレートに垂直に配置するため、小型プレート2枚でサーボを挟んで固定。U字ブラケットに2つのラウンドホーンを取り付け、ロールサーボの中央位置を確認してからブラケットを固定。


チルト(縦回転)用サーボブラケットにM4ボルトを挿入し、ヘッド固定用M3ボルト4本を予め取り付け。チルトサーボをブラケットに入れ、シャフトをラウンドホーンに嵌合(U字ブラケットがわずかにしなるので嵌めやすい)。M3ボルトで固定すればヘッド機構完成。ロール・チルト両方向に動作します。

ヘッドユニットの組み立て
ヘッド本体に大顎(SG90サーボ駆動)と超音波センサーを事前組み立て。M4ボルトで大顎を固定(目部分の小穴からドライバーアクセス可能)。SG90サーボを固定し、第2大顎にアームホーンを取り付けてギアを噛み合わせ、シャフトに固定。




超音波センサーは目穴にぴったり嵌まる設計で、瞬間接着剤で固定。触覚は3mm径ワイヤーを13cmにカット、少し曲げて形を整え、同様に接着。完成したヘッドをロール・チルト機構の4本ボルトで固定すれば、ロール・チルト・噛みつき全機能動作するヘッドユニットの完成です。


尾部パーツをブラケットにスライド装着、曲面カバーを上部プレートにかぶせれば機械的組み立て完了。青と白の配色が映える仕上がりです。

回路図
22個のサーボ接続で複雑に見えますが、基本はシンプル。HC-05 Bluetoothモジュールでスマホ通信、コンデンサーと抵抗を少々。脳はArduino Mega(サーボライブラリで12個以上制御可能なのはMegaのみ)。

電源は3S LiPo(約12V)。全サーボ同時フル負荷で約10A流れる可能性があるためLiPoが適しています。サーボ動作電圧は4.8-7.2Vなので、DC-DCバックコンバーターで12V→5Vに降圧。筆者使用のコンバーターは8A対応ですが、10-15A品を推奨(実測最大約6A)。2S LiPo(7.4-8.4V)でも降圧は必要です。

必要な部品
- MG996Rサーボモーター ×21
- SG90マイクロサーボ ×1
- HC-05 Bluetoothモジュール
- Arduino Megaボード
- 3S LiPoバッテリー
- DC-DCバックコンバーター(10-15A推奨)
PCB設計(Arduino Megaシールド)
配線の煩雑さを解消するため、EasyEDAでArduino Megaシールドとして機能するカスタムPCBを設計。サーボ接続をまとめ、大型コンデンサー2個で電圧安定化。将来の無線制御用にNRF24L01接続も用意。デジタル/アナログピン、5V/GND、LED×2、バッテリー電圧監視用分圧回路(R1, R2で12V→5V以下)も搭載。

プロジェクトファイルからガーバー生成、JLCPCBで発注(青色PCBでArduinoボード色に合わせ)。品質良好で届きました。


PCB組み立て
ピンヘッダーをPCB裏面にはんだ付け(プレートで挟んでひっくり返すと楽)。サーボ接続用ピンヘッダーも同様に。抵抗、コンデンサー、ターミナルブロックを実装してシールド完成。Arduino Megaに装着。


バックコンバーター出力を5Vに調整(ポテンショメーターで)。電源スイッチを入力側に追加、バッテリー12VをPCBの12Vピン(電圧監視用)に接続。メイン電源入力は5Vであることに注意。

プレート間に電子部品を収納(バッテリー→テープ固定、Arduino+シールド、NRF24L01またはBluetooth、低電圧警告LED、全サーボ接続)。サーボ接続時はピン番号をメモ必須。曲面カバーを被せればハードウェア完成。
Arduinoコード解説
コードが長いため、セクションごとに解説し、最後に完全版を掲載。
サーボ制御に標準Servoライブラリ、Bluetooth通信にSoftwareSerialライブラリを使用。全サーボオブジェクトと必要変数を定義。
#include <Servo.h>
#include <SoftwareSerial.h>
#define trigPin 7
#define echoPin 6
#define ledB 10
SoftwareSerial Bluetooth(12, 9); // Arduino(RX, TX) - HC-05(TX, RX)
// サーボオブジェクト作成
Servo s24; Servo s23; Servo s22; // ... 全22個 ...
setup()でBluetooth初期化、超音波センサーピンモード、LED、全サーボのピン割り当て(600-2400μsパルス幅指定)。その後、write()で全サーボを初期位置に移動(ここでキャリブレーション実施:組み立て時のズレをソフトウェアで補正)。
// 初期位置設定(キャリブレーション)
// ヘッド
s15.write(72); s14.write(50); s13.write(90); // グリップ
s5.write(65); // 尾部
// 脚4
s10.write(65); s11.write(35); s12.write(40);
// 脚5
s7.write(80); s8.write(50); s9.write(25);
// 脚6
s1.write(90); s2.write(45); s3.write(60);
// 脚1
s18.write(60); s17.write(90); s16.write(100);
// 脚2
s21.write(50); s20.write(85); s19.write(75);
// 脚3
s24.write(50); s23.write(80); s22.write(80);
歩行アルゴリズム
順運動学/逆運動学を使わず、カウンターベースのシンプルな手法を採用(安価なMG996Rはトルク不足と位置決め精度の問題で高度な制御に不向きなため)。各脚ごとにカスタム関数を作成し、スイング相(脚を浮かせて移動)とスタンス相(接地して身体を押す)の2フェーズで構成。

メインループ内のカウンターで各サーボの目標角度を段階的に更新。例えば脚1の前進動作:
void moveLeg1() {
// スイング相: 脚を浮かせて前方へ
if (i1L1 <= 10) { s18.write(60 - i1L1*2); s17.write(90 - i1L1*3); i1L1++; } // 脚を上げる
if (i2L1 <= 30) { s16.write(100 - i2L1); i2L1++; } // 回転
if (i2L1 > 20 && i3L1 <= 10) { s18.write(40 + i3L1*2); s17.write(60 + i3L1*3); i3L1++; } // 接地
// スタンス相: 接地したまま後方へ回転して身体を押す
if (i2L1 >= 30) { s16.write(70 + i4L1); i4L1++; l1status = HIGH; }
// カウンターリセット
if (i4L1 >= 30) { i1L1=0; i2L1=0; i3L1=0; i4L1=0; i5L1=0; }
}
全脚同様の関数を用意し、後退・左右旋回用の逆方向関数も作成。メインループで遅延時間を調整して速度制御。
前進時は脚1,3,5をスイング相、脚2,4,6をスタンス相にオフセットして実行(トライポッド歩容)。
if (m == 2) { // 前進コマンド
moveLeg1(); moveLeg3(); moveLeg5();
if (l1status == HIGH) { moveLeg2(); moveLeg4(); moveLeg6(); }
}
Bluetoothコマンド受信
自作Androidアプリ(MIT App Inventor製)から数値コマンドを受信。
if (Bluetooth.available() > 0) {
dataIn = Bluetooth.read();
// dataInに応じて各動作関数を呼び出し
}
Androidアプリ
MIT App Inventorで作成。ボタンは画像ベース、スライダーで速度調整、上部にBluetooth接続ボタン。


ボタン押下で対応する数値を送信(前進=2、停止=0など)。再押下で停止コマンド送信とボタン画像復帰。App InventorプロジェクトファイルとAPKをダウンロード可能。
バッテリー電圧監視と超音波センサー処理
// バッテリー電圧監視(A3ピン、分圧比2.9)
int sensorValue = analogRead(A3);
float voltage = sensorValue * (5.00 / 1023.00) * 2.9;
if (voltage < 11) digitalWrite(ledB, HIGH); else digitalWrite(ledB, LOW);
// 超音波センサーで攻撃判定
if (getDistance() > 40) att = 0;
if (getDistance() <= 40) { att = 1; dataIn = 99; }
40cm以内で攻撃準備、30cm以内で攻撃実行、離れると攻撃解除のステートマシンで制御。
完全なコード
課題として、使用したサーボの性能不足(トルク不足、位置決め精度悪)が最大の問題でした。より良いサーボを使えば大幅に改善可能です。楽しんでいただけたら幸いです。質問はコメント欄へ。Arduinoプロジェクトコレクションもぜひ。
製造プロセス
- Bluetooth 制御 Raspberry Pi ロボットに音声フィードバックを追加して構築
- ArduinoとHC-SR04で作るサーボ駆動障害物回避ロボット
- Arduino UNOで作る完全自律ライントラッカーロボット ─ 入門に最適な自作キット
- ArduinoとAndroidでRoomba Create 2をリモコン操作 ─ Bluetooth経由のステップバイステップガイド
- Arduino Nanoで音声制御ロボットを自作
- PiBot:Arduino駆動の精密ピアノ演奏ロボット
- LittleArm 2C: 3Dプリント製Arduinoロボットアーム – STEM教育向け耐久設計
- 自律型ホームアシスタントロボット「O'nine」の構築 – ROS、Alexa、ロボットアーム完全ガイド
- Arduinoロボットアーム「LittleArm」をAndroidアプリでBluetooth制御
- Arduino向けスマート屋内ナビゲーションロボットキット
- WiDC: Wi-Fi FPVロボット – ライブ映像付きリモートコントロール