Arduinoで四足歩行スパイダーロボットを作ろう – ステップバイステップチュートリアル
必要な部品と材料
| 部品名 | 数量 | 備考 |
|---|---|---|
| Arduino Nano R3 | 1 | メイン制御ボード |
| Bluetooth Low Energy (BLE) モジュール (汎用) | 1 | スマホアプリとの通信用 |
| Onion Corporation OLED Expansion | 1 | 表情表示用ディスプレイ |
| RGB 拡散型 共通カソード LED | 1 | ステータス表示用 |
| JLCPCB カスタム PCB | 1 | ロボット形状に設計された基板 |
| サーボモーター (MG90S または同等) | 12 | 脚1本につき3個 (コクサ、フェムル、チビア) |
| HC-06 Bluetooth モジュール | 1 | Android アプリ制御用 |
| 5mm RGB LED | 1 | 目の色変更用 |
| ピンヘッダー類 | 適量 | 基板実装用 |
| 3Dプリントパーツ (ボディ、脚パーツ) | 1式 | STLファイルから出力 |
プロジェクト概要
皆さん、こんにちは!このチュートリアルでは、「クローラーロボット」とも呼ばれる四足歩行スパイダーロボット (クアッドペッド) の製作をステップバイステップで解説します。
ロボティクス技術の急速な進化に伴い、より高度なロボット製作に挑戦したい方々のために、基礎的なラインフォロワーロボット (PICTO92) の製作から一歩進んだプロジェクトとして企画しました。市販のキットは高価ですが、自作すればコストを抑えつつ、仕組みを深く理解できます。
このプロジェクトはわずか7日間で完成させました。ハードウェア製作と組み立てに2日、プログラミングとAndroidアプリ開発に5日を費やしました。JLCPCB製のカスタムPCBを使用することで、配線がスッキリし、見た目もプロフェッショナルな仕上がりになります。
学べること
- プロジェクトの機能に応じた適切な部品選定
- 選定部品を接続する回路設計と配線
- 全パーツの組み立て手順
- ロボットのバランス調整 (スケーリング)
- Bluetooth経由でAndroidアプリからロボットを操作
Step 1: スパイダーロボットとは?
名前の通り、クモの動きを模倣したロボットですが、クモは8本脚であるのに対し、このロボットは4本脚で歩行します。そのため「四足歩行ロボット (クアッドペッド)」とも呼ばれます。
各脚の動きは相互に連携しており、ロボットの姿勢とバランスを制御します。脚式ロボットは車輪式よりも複雑な地形に対応でき、生物的な動きが可能ですが、構造が複雑で、サーボモーターやステッピングモーターを多用するためコストが高くなりがちです。
四足歩行の利点
自然界に四足動物が多いのは、4本脚が「受動的安定性」を提供するためです。つまり、積極的に姿勢を制御しなくても自立できます。ロボットでも同様で、より多脚のロボットより安価かつシンプルに、安定した歩行が実現できます。
Step 2: メインアクチュエーターはサーボモーター
サーボモーターは、角度や位置、速度、加速度を精密に制御できる回転/直線アクチュエーターです。モーター、位置検出センサー (ポテンショメータ等)、専用コントローラーで構成され、閉ループ制御システムで動作します。
制御信号は一般的に50Hzのパルス列 (PWM) で、パルス幅 (0.5ms〜2.5ms) により回転角度が決まります。1.5msで中立位置 (0°)、0.5msで最大左 (約-90°)、2.5msで最大右 (約+90°) となります。
Step 3: PCB製作 (JLCPCB製)
JLCPCBについて
JLCPCB (深圳嘉立創電子科技発展有限公司) は中国最大のPCB試作企業で、迅速な試作と小ロット量産を専門としています。10年以上の実績、20万以上の顧客、日量8,000件以上の注文処理能力を持ち、年間20万平方メートルの生産能力を誇ります。
本プロジェクトでのPCB製作
複数のPCBメーカーを比較検討し、コストと品質のバランスでJLCPCBを選択しました。Gerberファイルをアップロードし、板厚・色・枚数を指定するだけで、わずか2ドル、5日で完成品が届きます。
設計したスパイダー形状のPCBには、Arduino Nano搭載エリア、12個のサーボ接続コネクタ、OLEDディスプレイ、Bluetoothモジュール、RGB LEDの接続パターンが全て統合されており、シルク印刷のラベルでハンダ付け作業も迷いません。
- 回路図 (PDF) ダウンロード
- Gerberファイル ダウンロード (同一設計で発注可能)
Step 4: 部品リスト詳細
Arduino Nano 1台で12個のサーボモーターを制御し、OLEDディスプレイで表情表示、Bluetoothモジュールでスマホ操作を行います。
- JLCPCB製カスタムPCB
- サーボモーター ×12 (脚1本あたり3個) 購入リンク
- Arduino Nano 購入リンク
- HC-06 Bluetoothモジュール 購入リンク
- OLEDディスプレイ (SSD1306, I2C) 購入リンク
- 5mm RGB LED (共通カソード) 購入リンク
- ピンヘッダー類 購入リンク
- 3Dプリントパーツ (ボディ、脚パーツ ×4) – STLファイル ダウンロード
Step 5: ロボット組み立て
PCBへの部品実装が完了したら、機械的な組み立てに入ります。手順はシンプルです。
- 脚の組み立て (×4本): 各脚は「コクサ (股)」「フェムル (大腿)」「チビア (下腿)」の3パーツと、2個のサーボモーター、連結用アタッチメントで構成されます。まず第1サーボをソケットにネジ止めし、出力軸を180°回転させた状態でフェムルを取り付けます。次にフェムルとチビアを第1サーボの出力軸とアタッチメントで連結。最後に第2サーボでコクサパーツを保持します。
- ボディへの取り付け: 上部シャーシに残りのサーボを搭載し、各脚を対応するサーボに接続します。
- 底板の取り付け: 回路基板を収納する底部シャーシを取り付けて完成です。
Step 6: Android アプリ
専用アプリで以下の操作が可能です:
- Bluetooth接続
- 前進 / 後退 / 左旋回 / 右旋回
- カラーホイールからRGB LEDの色をリアルタイム変更
Step 7: Arduinoコードと動作テスト
組み立て完了後、まず「スケーリング (キャリブレーション) 用コード」を書き込み、全サーボを90°基準位置にセットします。この際、7VのDCバッテリーを接続してください。
次にメインプログラムを書き込みます。OLEDディスプレイには、コード内で定義した「コズモ風」の表情アニメーションが表示されます。
スマホからの指示に忠実に従って歩行・旋回することを確認できます。さらなる改良の余地もありますが、基本動作は安定しています。
ソースコード (メインプログラム抜粋)
/************************************************************************************************************************************************************************
* Author : BELKHIR Mohamed
* Profession : Electrical Engineer, MEGA DAS owner
* Date : 20/04/2017
* License : BSD 2-Clause License
***********************************************************************************************************************************************************************/
#include <Servo.h>
#include <FlexiTimer2.h>
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#define OLED_ADDR 0x3C
Adafruit_SSD1306 display(-1);
/* サーボ定義 */
Servo servo[4][3];
const int servo_pin[4][3] = { {11, 12, 13}, {2, 4, 7}, {14, 15, 16}, {8, 9, 10} };
/* ロボット寸法 (mm) */
const float length_a = 50;
const float length_b = 77.1;
const float length_c = 27.5;
const float length_side = 71;
const float z_absolute = -28;
/* 歩行パラメータ */
const float z_default = -50, z_up = -30, z_boot = z_absolute;
const float x_default = 62, x_offset = 0;
const float y_start = 0, y_step = 40;
const float y_default = x_default;
volatile float site_now[4][3];
volatile float site_expect[4][3];
float temp_speed[4][3];
float move_speed;
float speed_multiple = 1;
const float spot_turn_speed = 4;
const float leg_move_speed = 8;
const float body_move_speed = 3;
const float stand_seat_speed = 1;
volatile int rest_counter;
const float KEEP = 255;
const float pi = 3.1415926;
/* LEDピン */
const int lightR = 3, lightG = 5, lightB = 6;
int LedR = 0, LedG = 0, LedB = 0;
char SerialData;
String data = "";
void setup() {
Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);
display.clearDisplay();
display.display();
delay(10000);
// 初期姿勢設定
set_site(0, x_default - x_offset, y_start + y_step, z_boot);
set_site(1, x_default - x_offset, y_start + y_step, z_boot);
set_site(2, x_default + x_offset, y_start, z_boot);
set_site(3, x_default + x_offset, y_start, z_boot);
for (int i = 0; i < 4; i++)
for (int j = 0; j < 3; j++)
site_now[i][j] = site_expect[i][j];
FlexiTimer2::set(20, servo_service);
FlexiTimer2::start();
servo_attach();
stand();
// 起動時表情アニメーション
happy(); delay(random(500, 1000));
cierra(); delay(150);
enfado(); delay(random(1000, 3000));
cierra(); delay(150);
entorna(); delay(random(1000, 3000));
cierra(); delay(150);
enfado1(); delay(random(1000, 3000));
cierra(); delay(150);
triste(); delay(random(1000, 3000));
cierra(); delay(150);
abre(); delay(random(500, 3000));
cierra(); delay(150);
happy(); delay(random(500, 1000));
}
void loop() {
// シリアル受信処理 (Bluetooth経由)
while (Serial.available()) {
delay(10);
SerialData = Serial.read();
if (SerialData == 'b') LedR = Serial.parseInt();
else if (SerialData == 'g') LedG = Serial.parseInt();
else if (SerialData == 'r') LedB = Serial.parseInt();
else data += SerialData;
}
// コマンド処理
if (data == "f") { cierra(); delay(150); happy(); step_forward(1); }
if (data == "p") { cierra(); delay(150); triste(); step_back(1); }
if (data == "l") { cierra(); delay(150); enfado1(); turn_left(1); }
if (data == "m") { cierra(); delay(150); enfado(); turn_right(5); }
data = "";
analogWrite(lightR, LedR);
analogWrite(lightG, LedG);
analogWrite(lightB, LedB);
}
/* 以下、サーボ制御、逆運動学計算、歩行モーション、表情表示関数が続く... */
/* 主な関数: servo_attach, servo_detach, sit, stand, turn_left, turn_right,
step_forward, step_back, cartesian_to_polar, polar_to_servo,
abre, cierra, entorna, triste, happy, enfado, enfado1 等 */
カスタムパーツとエンクロージャ
3Dプリント用STLファイルは上記リンクからダウンロード可能です。ボディパーツ、脚パーツ (コクサ、フェムル、チビア、アタッチメント) が含まれます。
回路図
PCB設計データ (Gerber) と回路図 (PDF) はStep 3のリンクから入手できます。
製造プロセス
- Bluetooth 制御 Raspberry Pi ロボットに音声フィードバックを追加して構築
- JQR四足歩行自律ロボット:自律ナビゲーションと救助向けDIY脚式ロボット
- ArduinoとHC-SR04で作るサーボ駆動障害物回避ロボット
- Arduino UNOで作る完全自律ライントラッカーロボット ─ 入門に最適な自作キット
- Arduino Nanoで音声制御ロボットを自作
- スマートArduino四足歩行ロボットの製作:ステップバイステップガイド
- PiBot:Arduino駆動の精密ピアノ演奏ロボット
- LittleArm 2C: 3Dプリント製Arduinoロボットアーム – STEM教育向け耐久設計
- 自律型ホームアシスタントロボット「O'nine」の構築 – ROS、Alexa、ロボットアーム完全ガイド
- Arduino向けスマート屋内ナビゲーションロボットキット
- ロボット パーソナル アシスタントが日常の現実になるまで