タミヤ車体を用いた移動ロボット構成の検証(要素実証)

要素実証

概要

本検証では、タミヤ製のユニバーサルプレートを用いて移動ロボットの車体を構築し、Arduinoによるモーター制御および超音波距離センサーとの連携により、基本的な走行および障害物検知による停止動作が実現可能かを確認しました。

本記事は、移動ロボット構築における車体部分の要素実証として位置付けます。


背景・目的

移動ロボットの検証においては、センサーや制御ソフトウェアに注目が集まりがちですが、実際に動作する車体構成が成立することが前提となります。

本検証では以下を目的としました。

  • タミヤ製パーツを用いた車体が実用的に構成可能であるかの確認
  • Arduinoによるモーター制御の成立確認
  • 超音波センサーによる障害物検知と停止制御の実装

構成

今回のハードウェア構成

  • 車体:タミヤ ユニバーサルプレート
  • 駆動:DCモーター ×2(差動二輪構成)
  • ギアボックス:タミヤ ツインモーターギヤーボックス
  • 前輪キャスター:タミヤ ボールキャスター 
  • 後輪:タミヤ ナロータイヤ
  • モータードライバ:Grove TB6612FNG I2C
  • 制御:Arduino UNO R4 WiFi
  • シールド:Grove Base Shield V2
  • センサー:Grove 超音波距離センサー
  • 電源:
    • モーター用電源 充電タイプ 単4型3本 3.6V(※厳密にはモーターは適正電圧3Vまで)
    • 制御用電源(充電型 角型9V 分離構成・各スイッチ付き電池ボックス)
    • 9V電池用スナップ(Arduinoとの接続用)
  • 固定用:タミヤ 3mmプッシュリベットセット、(タミヤ製ではない)スペーサーセット
  • その他:タミヤ ユニバーサルアーム(超音波センサーの固定用で他の方法でも可能)

今回なこのような部品で構成で作ってみましたということです。


車体構成

本検証では、シンプルな3輪構成(左右駆動輪+補助輪(キャスター))を採用しました。

この構成により、以下の特徴を確認しています。

  • 差動制御による前進・後退・旋回が可能
  • 構造が単純で制御ロジックが簡潔
  • 実証用途として十分な安定性

タミヤ製パーツを使用するメリット

本検証では車体構成にタミヤ製パーツを使用しました。
これは単なる入手容易性だけでなく、実証用途として以下の利点があるためです。

入手性とコスト

タミヤ製パーツは比較的低価格であり、個人レベルでも容易に入手可能です。
また、模型店やオンラインショップなど複数の流通経路が存在するため、安定して調達できる点も特徴です。


継続性(長期的な再現性)

製品ラインナップが長期間にわたり継続して提供されているため、同一または互換性のあるパーツを再度入手しやすいという利点があります。

これにより、以下が可能となります。

  • 同一構成の再現
  • 保守・交換の容易化
  • 検証内容の継続的な更新

仕様の公開と汎用性

寸法や取り付け規格が明確であり、パーツ同士の互換性が高く設計されています。
このため、構成変更や拡張が容易であり、試作・検証用途に適しています。


構築の柔軟性

ユニバーサルプレートや各種ギアボックスにより、用途に応じた構成変更が可能です。

  • 2輪/3輪/4輪構成への対応
  • センサーや基板の配置変更
  • 重心バランスの調整

実証用途との適合性

以上の特徴から、タミヤ製パーツは以下の用途に適しています。

  • 初期試作(プロトタイピング)
  • 教育用途
  • 個人開発環境での検証
  • 再現性を重視した実証開発

本検証における位置づけ

本検証では、これらの特性を活かし、

個人環境において再現可能かつ継続的に検証可能な車体構成

を前提としてタミヤ製パーツを採用しました。


実装内容

モーター制御

Arduinoからモータードライバを介してDCモーターを制御し、以下の動作を実装しました。

  • 前進
  • 後退
  • 左右旋回
  • 停止

今回はGroveのライブラリを利用しています。


超音波センサー処理

距離測定においてはノイズの影響を低減するため、複数回測定した値の中央値を採用する方式としました。

  • サンプル数:11回
  • 有効値のみを採用
  • ソート後の中央値を使用

これにより、距離のばらつきを抑えた安定した測定を実現しています。


停止制御

測定した距離に基づき、以下の制御を実装しました。

  • 一定距離(約15cm)以上:前進
  • 一定距離未満:停止(ブレーキ)

これにより、障害物に接近した際の基本的な安全停止動作を確認しました。


テストプログラム(参考)

#include "Grove_Motor_Driver_TB6612FNG.h"
#include <Wire.h>

#define ULTRASONIC_PIN 5
#define SAMPLE_SIZE 11   // 奇数(中央値)

MotorDriver motor;

long measurements[SAMPLE_SIZE];

// -------------------- 初期化 --------------------
void setup() {
  Wire.begin();
  Serial.begin(115200);
  motor.init();
}

// -------------------- モーター制御 --------------------
void forward(int speed) {
  motor.dcMotorRun(MOTOR_CHA, speed);
  motor.dcMotorRun(MOTOR_CHB, speed);
}

void stopMotor() {
  motor.dcMotorStop(MOTOR_CHA);
  motor.dcMotorStop(MOTOR_CHB);
}

void brake() {
  motor.dcMotorBrake(MOTOR_CHA);
  motor.dcMotorBrake(MOTOR_CHB);
}

// -------------------- 超音波 --------------------
long getDistance() {
  pinMode(ULTRASONIC_PIN, OUTPUT);
  digitalWrite(ULTRASONIC_PIN, LOW);
  delayMicroseconds(2);

  digitalWrite(ULTRASONIC_PIN, HIGH);
  delayMicroseconds(5);
  digitalWrite(ULTRASONIC_PIN, LOW);

  pinMode(ULTRASONIC_PIN, INPUT);
  long duration = pulseIn(ULTRASONIC_PIN, HIGH, 30000);

  if (duration == 0) return -1;

  return duration / 29 / 2; // cm
}

// ソート
void sortArray(long arr[], int size) {
  for (int i = 0; i < size - 1; i++) {
    for (int j = i + 1; j < size; j++) {
      if (arr[i] > arr[j]) {
        long tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
      }
    }
  }
}

// 中央値取得
long getMedianDistance() {
  int count = 0;

  while (count < SAMPLE_SIZE) {
    long d = getDistance();

    if (d > 0) {
      measurements[count] = d;
      count++;
    }

    delay(10);
  }

  sortArray(measurements, SAMPLE_SIZE);

  return measurements[SAMPLE_SIZE / 2];
}

// -------------------- メインループ --------------------
void loop() {
  long distance = getMedianDistance();

  Serial.print("Distance: ");
  Serial.print(distance);
  Serial.println(" cm");

  if (distance > 15) {
    forward(120);   // 前進
  } else {
    brake();        // 即停止(ここがポイント)
  }

  delay(50); // 少しだけ余裕
}

検証結果

本検証により、以下を確認しました。

  • タミヤ製パーツを用いた車体が実用的に構築可能であること
  • Arduinoによるモーター制御が安定して動作すること
  • 超音波センサーによる距離検知が安定して取得可能であること
  • 一定距離での停止制御が正常に動作すること

以下のように動作しました。15cmを超えて近づいたら止まるというプログラムですが、実際に停止するのは14cmぐらいです。あと、直進性も要調整ですかね。


技術的ポイント

本検証における主なポイントは以下の通りです。

  • 電源をモーター系と制御系で分離し、ノイズの影響を低減
  • シンプルな3輪構成による制御の簡略化
  • 中央値フィルタによるセンサー値の安定化
  • センサー値とモーター制御の連動による基本的な自律動作の実現

位置づけ(要素実証)

本検証は、移動ロボットにおける以下の要素を対象としたものです。

  • 車体構造
  • 駆動機構
  • センサー連携
  • 基本制御

これらが単体および組み合わせで成立することを確認しました。


今後の展開

本車体をベースとして、次の段階として以下を予定しています。

  • ROS2環境からの速度指令(cmd_vel)による遠隔制御
  • WiFi経由での通信による統合制御
  • 障害物回避などの発展的な制御

これにより、要素実証から統合実証へ展開します。

まとめ

本検証により、タミヤ製パーツを用いた移動ロボット車体が実用的に構成可能であり、モーター制御およびセンサー連動による基本的な動作が実現できることを確認しました。

これにより、汎用パーツを用いた移動ロボットの基本構成が、個人環境でも十分に構築可能であることを確認しました。


補足(構成および実装に関する所感)

本検証では、精度や性能はひとまず評価対象外とし、
実際に動作する車体が構成できるかという点に主眼を置いています。

その前提のもと、個人的にも扱いに慣れているタミヤ製パーツを中心に構成しました。


制御基板の搭載について

今回はArduinoを使用しましたが、同様にRaspberry Piもユニバーサルプレート上に搭載可能です。

また、Arduino UNO R4 WiFi を使用しているため、
今後はWiFiを利用した遠隔操作への展開も可能です。


ユニバーサルプレートについて

ユニバーサルプレートは加工性が高く、取り回しが容易です。

  • 比較的簡単に切断可能
  • 部品配置の自由度が高い

試作段階において扱いやすいパーツです。


ギアボックスについて

ギアボックスは初回の組み立てにやや手間がかかる場合がありますが、
一度構成してしまえば安定した駆動が得られます。


配線について

配線については、Groveシステムを利用することで簡略化できます。

  • コネクタ接続によりミスが減る
  • 実装時間の短縮

試作および検証用途に適した構成です。


表示機能について

Arduino UNO R4 WiFiにはドットマトリクスLEDが搭載されていますが、
本構成では物理的に視認しにくい配置となっています。

必要に応じて、外部LCD等を接続することで代替可能です。


固定方法について

パーツの固定には以下が有効です。

  • タミヤ製プッシュリベット
  • スペーサーセット

特にスペーサーは、以下の用途で有効です。

  • ユニバーサルプレートの多層化
  • センサーの位置調整
  • 基板の高さ確保

工具について

組み立て時にはナットドライバーがあると作業効率が向上します。


他構成の検討について

今回はタミヤ製パーツを使用しましたが、
市販のロボットカーキットやセット製品も選択肢として有効です。

用途や目的に応じて適切な構成を選択することが重要です。