名称 MIRS2501 ソフトウェア開発完了報告書
番号 MIRS2501-SOFT-0001

版数 最終更新日 作成 承認 改訂記事
A01 2025.1.26 細江哲舟 初版



1. ドキュメント概要

本ドキュメントはMIRS2501 BABLOONのソフトウェア開発完了報告書である。

2. 作成したプログラムについて

2.1. 機能概要

BABLOONの動作プログラムはmaster、slave、シャボン玉用プログラムの3つに分かれている。それぞれの役割と機能を以下に示す。

master
走行用モーターの制御や主要な動作のシーケンス・各モードに関わる状態遷移を管理する。
slave
masterと通信を行い、ヘリウム供給モジュール・ストックモジュールのシーケンス制御を行う。
シャボン玉用プログラム
ストック回収ボックスからの入力により、シャボン玉吹き出しモジュールの動作を行う。

2.2. master

2.2.1 master概要

masterプログラムを構成するソフトウェアモジュールを次の表1に示す。

表1 Arduino UNO masterモジュール一覧

ファイル名 説明
mirs2501_master.ino メインプログラムsetup(), loop() を含み、スタンバイ・巡回・風船モードなどのステートマシン(状態遷移)管理を行う中枢ファイル。
define.h 設定定義ファイル。ピン番号の割り当て、制御パラメータ、定数、構造体の定義を集約している。
io.ino 基本入出力制御。操作ボタン、内蔵LED、バッテリー電圧監視などの基本I/O操作を担当。
motor.ino 走行モーター出力。左右のDCモーターへPWMと回転方向信号を出力するドライバ制御関数群。
encorder.ino エンコーダ読み取り。左右のロータリーエンコーダのパルスをカウントする割り込み処理。
vel_ctrl.ino 速度制御 (PID)。エンコーダ値から速度を計算し、目標速度になるようPID制御を行う。
run_ctrl.ino 走行制御 (位置・軌道)。「8m進む」「180度回る」といった目標距離・角度に対する指令値を生成し、直進補正を行う。
sonar.ino 超音波センサ制御。HC-SR04を用いて障害物までの距離(cm)を計測する関数。
master_i2c.ino I2C通信 (送信)。Slave機に対してコマンドや、状態確認リクエストを送る処理。
raspi.ino シリアル通信。PCやRaspberry PiとのUART通信処理。デバッグメッセージの送信やコマンド受信に使用。
test.ino デバッグ・テスト。PIDゲイン調整用のステップ応答データ取得や、単体動作テスト用の関数群。
slave.ino 外部指令受信。PC/RasPiからの直接指令で動くためのモジュール(今回は自律動作メインのため補助的な役割)。

本システムにおいて、Masterは「足回りの自律移動制御」と「システム全体の指揮」を担う中核ユニットである。上位機(Raspberry Pi)からの指令受領、下位機(Slave Arduino)への動作指示、および自身の移動制御(直進・旋回)を、10ms周期のリアルタイムループ内で実行する。

2.2.2. masterシステムアーキテクチャ概要

プログラムは階層構造を採用しており、上位の判断ロジックが下位の駆動ロジックを呼び出す設計となっている。

メインループ層 (loop)
システムの状態遷移(モード管理)を行う。
走行制御層 (run_ctrl)
〇〇cm進め」「〇〇度回れ」といった目標軌道を生成する。
速度制御層 (vel_ctrl)
左右モータの回転速度をPID制御により維持する。
ハードウェア抽象化層 (io, motor, sensor)
ピン操作やセンサ値をプログラム上で扱う物理量に変換する。

2.2.3. master詳細機能解説

速度制御 (vel_ctrl)
足回りの制御における最下層かつ最も重要な部分である。
走行管理 (run_ctrl)
速度制御層の上位に位置し、台形の速度プロファイルや停止位置の管理を行う。
システムモード管理 (system_mode_t)
ロボット全体の振る舞いを決定するステートマシンである。以下のモードを遷移する。
通信インターフェース
外部機器との連携を行うためのモジュール群である。
センサ処理

2.2.4. masterデータフローの流れ

  1. 入力: 10msごとにエンコーダ値、超音波センサ値、RasPiからのシリアル指令を取得する。
  2. 判断: 現在のモード(巡回中か、風船発見か)に基づき、次の目標速度や目標距離を決定する(run_ctrl)。
  3. 計算: 目標速度を実現するためのモータ電圧(PWM値)をPID演算で算出する
  4. 出力: モータドライバへPWM信号を出力し、必要に応じてSlaveへI2Cコマンドを送信する。

2.2.5. 状態遷移について

MODE_STANDBY (待機モード)
起動直後の状態である。押しボタンやRaspberry Piからの開始コマンドを受信するまで待機し、指令が入ると巡回またはテストモードへ移行する。
MODE_PATROL (巡回モード)
予め設定された速度(PATROL_SPEED)で直進や旋回を繰り返す。走行中に超音波センサ(PIN_US_TRIG, PIN_US_ECHO)が設定距離(OBSTACLE_DIST)以内に障害物(人物)を検知すると、直ちに停止指令を出し、MODE_STOP_WAITへ遷移する。
MODE_STOP_WAIT (一時停止状態)
一定時間経過後、ルート復帰や別モードへ移行する。動作上は巡回モードの一部だが、プログラム上では独立したモードを用いている。
MODE_BALLOON(風船作成モード)
押されたボタンに応じて指定された色の風船を膨らませる一連のシーケンスを実行する。
MODE_TEST
動作テストや発表会用デモを行うためのモード。通常は起動しないが、mirs2501_master.inoのコメントアウトを操作することにより起動時からこのモードを動作させることができる。

2.3 slave

2.3.1 slave概要

slaveプログラムを構成するソフトウェアモジュールを次の表2に示す。

表2 Arduino UNO slaveモジュール一覧

ファイル名 説明
mirs2501_slave.ino メインプログラム。I2Cコマンドを受信する。
define.h設定定義ファイル。ピン番号の割り当て、制御パラメータ、定数、構造体の定義を集約している。
actuator.ino バルブ制御。バルブ開閉用のDCモーター(エンコーダ付き)を制御するモジュール。ピン変化割り込み(PCINT)を使用。
AngleController.h 角度制御クラス (Header)。バルブ開閉用モーターの角度PID制御を行うためのC++クラス定義。actuator.ino から利用される。
sequences.inoシーケンス実行。ステッピングモーター・サーボ・電磁石を連携させた一連のシーケンス動作(風船処理)を実行する。

本システムにおいて、Slaveは「作業機構(アクチュエータ)の統合制御」を担う実行ユニットである。Masterが移動(足回り)を担当するのに対し、SlaveはX/Y軸スライダ、バルブ開閉機構、電磁石、ガントリー用のステッピングモーターといった多様なメカトロニクス機器を操作し、風船を膨らませるなど、上部機構の動作を行う。

2.3.2. slaveシステムアーキテクチャ概要

Slaveのプログラムは、外部からのトリガー(I2C通信または物理ボタン)を待ち受け、トリガー検知後に定義済みの「動作シーケンス」を順次実行するイベント駆動型の設計となっている。

シーケンス層 (execute_sequence)
指定の色の風船へ移動→吸着→バルブ開閉…」といった一連の作業手順を管理する。
位置制御層 (AccelStepper, actuator_move)
位置制御を行うアクチュエータを目標座標へ正確に誘導する。
ハードウェア抽象化層 (digitalWrite, Servo)
物理的なデバイス操作を行う。

2.3.3. slave詳細機能解説

ステッピングモータ制御(X軸・Y軸)
ガントリーの制御には、位置決め精度に優れるステッピングモータを使用している。
バルブ操作制御(DCモータ + PID)
バルブを開閉するDCモータの制御部である。DCモータは通常、速度制御や単なるON/OFFで使われるが、ここではエンコーダを併用することでサーボモータのような角度制御を実現している。
エンドエフェクタ制御(サーボ・電磁石)
通信インターフェース(I2C Slave)
Masterからの指令を受け取るための通信部である。

2.3.4. slaveデータフローとシーケンスの流れ

Slaveの動作は、基本的に以下のフローチャートに従う。

  1. 待機状態: loop関数内で、物理ボタンの入力監視とI2C受信イベントを待つ。
  2. トリガー受信:
  3. シーケンス実行:
  4. 完了報告: 全工程が終了した後、待機状態に戻る(必要に応じてMasterへ完了信号を送る設計も可能)。

2.3. シャボン玉用プログラム

本プログラムは上記2つのプログラムと異なり、非常に単純なプログラム構成となっている。具体的には、リミットスイッチからの入力を受け取ると一定時間2つのモーターに固定値のPWMを出力している。

3. ソースコード

一連のソースコードはGitHubにアップロードされており、下記リンクから閲覧することができる。

https://github.com/mirs2501/Arduino/



MIRSデータベース