| 名称 |
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)
-
足回りの制御における最下層かつ最も重要な部分である。
-
PID制御: エンコーダから取得した実速度と、目標速度の偏差に対し、P(比例)、I(積分)、D(微分)の操作量を計算し、PWM値としてモータに出力する。
-
フィードバックループ: 制御周期 T_CTRL(10ms)ごとにエンコーダのパルスカウント差分から現在の速度[cm/s]を算出する。
-
左右独立制御: 左車輪・右車輪それぞれに対し、独立したゲイン設定と積分器を持ち、直進時の蛇行や旋回時のブレを補正する能力を持つ。
- 走行管理 (run_ctrl)
-
速度制御層の上位に位置し、台形の速度プロファイルや停止位置の管理を行う。
-
状態管理: STR(直進)、ROT(回転)、STP(停止)の3状態を持つ。
-
オドメトリ(距離計測): エンコーダの値を積算し、移動距離または回転角度を推定する。
-
動作シーケンス: 「目標距離に達するまで指定速度を維持し、到達したら速度指令を0にする」というロジックにより、正確な距離・角度の移動を実現する。
- システムモード管理 (system_mode_t)
-
ロボット全体の振る舞いを決定するステートマシンである。以下のモードを遷移する。
-
MODE_PATROL (巡回): 超音波センサで障害物を監視しながら直進する。障害物を検知すると停止し、回避行動または風船割りモードへ移行する判定を行う。
-
MODE_BALLOON (風船割り): ターゲットに対し位置合わせを行った後、Slave ArduinoへI2C通信で指令を送り、アーム動作を実行させる。
-
MODE_TEST: 開発用の単体テストを実行するモード。
- 通信インターフェース
-
外部機器との連携を行うためのモジュール群である。
-
対 Raspberry Pi (Serial): 専用のパケット構造(ヘッダ+データ)を持つプロトコルで通信を行う。画像処理の結果(風船の位置など)や、開始・停止コマンドを受信する。
-
対 Slave Arduino (I2C): MasterをI2Cマスタ、Slaveをアドレス8のスレーブとして接続する。Masterは移動完了後にトリガーを送信し、Slave側のアクチュエータ動作(Y軸展開、バルブ操作など)を開始させる。
- センサ処理
-
-
エンコーダ: 割り込み処理(Interrupt)を用いてパルスの立ち上がり・立ち下がりを計測し、4逓倍精度で回転量を検出する。
-
超音波センサ: パルスを発信してから反射波が戻るまでの時間を計測し、障害物までの距離[cm]に変換する。
2.2.4. masterデータフローの流れ
- 入力: 10msごとにエンコーダ値、超音波センサ値、RasPiからのシリアル指令を取得する。
- 判断: 現在のモード(巡回中か、風船発見か)に基づき、次の目標速度や目標距離を決定する(run_ctrl)。
- 計算: 目標速度を実現するためのモータ電圧(PWM値)をPID演算で算出する
- 出力: モータドライバへ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軸)
-
ガントリーの制御には、位置決め精度に優れるステッピングモータを使用している。
-
ライブラリ活用: AccelStepperライブラリを採用し、台形加減速制御(滑らかな発進・停止)を実現している。これにより、急停止による脱調(位置ズレ)や機構への衝撃を防止している。
-
座標管理: Masterの速度制御とは異なり、Slaveは「絶対位置(座標)」で管理される。パルス数をカウントし、原点からの距離として制御する。
-
原点復帰(Homing): システム起動時やテスト動作終了時に、リミットスイッチを利用したキャリブレーションを行う。スイッチが押されるまで低速で駆動し、物理的な基準点(ゼロ点)を確定させる。
- バルブ操作制御(DCモータ + PID)
-
バルブを開閉するDCモータの制御部である。DCモータは通常、速度制御や単なるON/OFFで使われるが、ここではエンコーダを併用することでサーボモータのような角度制御を実現している。
-
位置型PID制御: エンコーダから取得した現在の回転角(rad)と目標角度の偏差に基づき、PID演算を行ってPWM値を出力する。
-
高トルク・高精度: 市販のサーボモータではトルクや回転角が不足する場合でも、このカスタム制御により「指定した角度まで回して保持する」動作を強力に行うことが可能である。
- エンドエフェクタ制御(サーボ・電磁石)
-
-
サーボモータ: ストック機構に使用する。PWM信号のパルス幅を指定するだけで角度制御が可能であり、複雑な計算は不要である。
-
電磁石(ソレノイド): デジタル出力(HIGH/LOW)のみで制御される。吸着(ON)と解放(OFF)を切り替える単純な制御だが、シーケンス内でのタイミング制御(吸着してからの待ち時間など)を行っている。
- 通信インターフェース(I2C Slave)
-
Masterからの指令を受け取るための通信部である。
-
I2Cスレーブ動作: 自身のアドレス(0x08)を持ち、Masterからの送信を待機する。
-
コマンド解析: 受信したデータ(例: 1, 2, 3)に基づき、対象となる動作(位置Aでの作業、位置Bでの作業など)を振り分ける。
2.3.4. slaveデータフローとシーケンスの流れ
Slaveの動作は、基本的に以下のフローチャートに従う。
-
待機状態: loop関数内で、物理ボタンの入力監視とI2C受信イベントを待つ。
-
トリガー受信:
-
ボタン押下: テストモードとして execute_test_sequence を呼び出す。
-
I2C受信: 本番モードとして execute_sequence を呼び出す。
-
シーケンス実行:
-
X軸移動: 指定された色(A, B, C)へX軸を移動。
-
Y軸アプローチ: 逆止弁に向けてY軸を前進。
-
作業: 電磁石ON → バルブ開放(PID制御) → 待機 → 閉鎖 → 電磁石OFF。
-
退避: Y軸を後退させ、X軸を原点に戻す。
-
完了報告: 全工程が終了した後、待機状態に戻る(必要に応じてMasterへ完了信号を送る設計も可能)。
2.3. シャボン玉用プログラム
本プログラムは上記2つのプログラムと異なり、非常に単純なプログラム構成となっている。具体的には、リミットスイッチからの入力を受け取ると一定時間2つのモーターに固定値のPWMを出力している。
3. ソースコード
一連のソースコードはGitHubにアップロードされており、下記リンクから閲覧することができる。
https://github.com/mirs2501/Arduino/
MIRSデータベース