工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

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を使用することで、配線がスッキリし、見た目もプロフェッショナルな仕上がりになります。

学べること

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の接続パターンが全て統合されており、シルク印刷のラベルでハンダ付け作業も迷いません。

Step 4: 部品リスト詳細

Arduino Nano 1台で12個のサーボモーターを制御し、OLEDディスプレイで表情表示、Bluetoothモジュールでスマホ操作を行います。

Step 5: ロボット組み立て

PCBへの部品実装が完了したら、機械的な組み立てに入ります。手順はシンプルです。

  1. 脚の組み立て (×4本): 各脚は「コクサ (股)」「フェムル (大腿)」「チビア (下腿)」の3パーツと、2個のサーボモーター、連結用アタッチメントで構成されます。まず第1サーボをソケットにネジ止めし、出力軸を180°回転させた状態でフェムルを取り付けます。次にフェムルとチビアを第1サーボの出力軸とアタッチメントで連結。最後に第2サーボでコクサパーツを保持します。
  2. ボディへの取り付け: 上部シャーシに残りのサーボを搭載し、各脚を対応するサーボに接続します。
  3. 底板の取り付け: 回路基板を収納する底部シャーシを取り付けて完成です。

Step 6: Android アプリ

専用アプリで以下の操作が可能です:

Androidアプリ 無料ダウンロード

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のリンクから入手できます。

製造プロセス

  1. Bluetooth 制御 Raspberry Pi ロボットに音声フィードバックを追加して構築
  2. JQR四足歩行自律ロボット:自律ナビゲーションと救助向けDIY脚式ロボット
  3. ArduinoとHC-SR04で作るサーボ駆動障害物回避ロボット
  4. Arduino UNOで作る完全自律ライントラッカーロボット ─ 入門に最適な自作キット
  5. Arduino Nanoで音声制御ロボットを自作
  6. スマートArduino四足歩行ロボットの製作:ステップバイステップガイド
  7. PiBot:Arduino駆動の精密ピアノ演奏ロボット
  8. LittleArm 2C: 3Dプリント製Arduinoロボットアーム – STEM教育向け耐久設計
  9. 自律型ホームアシスタントロボット「O'nine」の構築 – ROS、Alexa、ロボットアーム完全ガイド
  10. Arduino向けスマート屋内ナビゲーションロボットキット
  11. ロボット パーソナル アシスタントが日常の現実になるまで