沼津高専 電子制御工学科
MIRS0103 プログラム説明書
MIRS0103-SOFT-2001
改訂記録
版数 作成日 作成者 承認 改訂内容
A01 2003.2.14 花島 中村
初版

MIRSプログラム説明書

 このMIRSプログラムは5つのライブラリ、7つのヘッダファイル、 15個の実行ファイルからなる。

 ライブラリファイルではFPGAに信号を送受信し、受け取ったデータを加工することによって FPGAと実行ファイルの橋渡しを行う。
それぞれの役割は関数説明書に記述してある。

 ヘッダファイルでは主に関数の宣言と構造体の宣言を行っている。
特にmirs.hでは各実行ファイルのデータの橋渡しをするmirs構造体を記述している。

 実行ファイルではMIRSの行動を分割して考え、各モードの目的を達成するための
プログラムを記述している。
このプログラムは何度も仕様を変更しているので、詳細設計書とは異なっている
可能性がある。各プログラムのソースを参考にし、注意すること。


ここから各ファイルについての説明を記述する。

mirs.h

 各モード、競技場の幅など全体に影響することを定義し、またMIRS構造体 等を宣言している。各行動プログラム間で直接呼出しができないために、 MIRS構造体を用いることによってデータを渡している。 グローバル変数をまとめた物とも言う。この部分も仕様変更によって 使っていない変数が存在する。


liblcd.h libpwm.h libts.h libuss.h libirs.h

 各ライブラリファイルの関数宣言を行っているだけ。


types.h

 ひっそりとvector2という構造体を宣言しているほかライブラリファイルで 使用するポート番号を定義している。


libuss.c

 超音波センサで対象との距離を測定するための関数群 initUSSでポートの使用許可を取得し、release_USSで ポートを開放する。具体的な機能は関数説明書参照。 get_USS_all関数は蛇足気味で実際には使用していない。


liblcd.c

 実際にはLCDを搭載しなかったので端末への出力とファイルへの 書きこみを同時に行う関数になっている。 搭載しなかった理由は難しい、面倒、なくてもいいじゃないか、etc


libpwm.c

 MIRSを動かす関数群と現在位置を返す関数が存在する。 現在位置を取得する方法は、直進時のみ光学マウスを用い、 他の時はロータリーエンコーダを用いた。オムニホイールが 使えなかったせいもあり、マウスはあまり役に立たなかった。


libts.c

 反応を自動的に返すのではなく、関数を呼び出すことによって 現在の状態を返す。MIRSを移動させる時には忘れずに呼び出して やらなければならない。


libirs.c

 赤外線を読み取り、ナンバーを割り出して返している。 最初の値はずれていることがよくあるので、何回か値を取って 比較する必要がある。


main.c

 関数の始めと終わりにライブラリの初期化と終了をさせる。 またliblcd.cで使用するファイルを作成しておく。 行動プログラムを遷移させる時にはこのプログラムを介している。


mode_approach.c

 target_posで指定された位置に移動するプログラム。 X軸を移動した後にY軸を移動する。途中で障害物に当たった時は 回避してプログラムを再開する予定だったが、座標の信頼性が低いため、 問答無用でpost_centerに遷移する仕様に変更された。 shift_post_data関数は指定された座標に到着してもポストがなかった場合、 ガセネタと判断し、データを抹消する。search_ap関数はmode_findの search関数と同一の関数。


mode_decide_movement.c

 次に移動すべき場所を知っていればtarget_posにその場所を代入し、 mode_approachに遷移する。そうでなければmode_findに遷移する。 知らずにスイッチを押してしまった時でも、その次以降のポストを 獲得できるよう最初の部分に改良が施されている。


mode_end.c

 ポストを全て獲得した時にそのポストの座標などを記録する。 しかし座標の情報は信頼が低く役に立たない上に、実際に呼び出されたことは 数度しかない。


mode_exam.c

 行動プログラムを個別にテストするための関数。時々使用した。


mode_find.c

 ポストを見つけるための関数。まっすぐ進み続け、競技場の端に来たら 90度右旋回する。旋回後競技場の端に沿って進むが、そのときに競技場から 出ないように角度の調整をする。それがADJUST_CORSEによって行われている。 但しこれは端から出ないようにしているだけで、端に沿って進むとは限らない。 どの位置からmode_findが始まるか判らないのでこのような仕様となっている。 移動中はTS,IRS,USSのチェックを行い、TSに反応があればmode_post_centerに、 IRSなら軸をずらし、USSならmode_judge_getを用いてポストの位置を調べ、 未知のポストならば目標座標をtarget_posに代入してmode_approachに遷移する。


mode_get.c

 ポストのスイッチを押して周回開始位置に戻る。 スイッチが押されたことを確認した後にmirs構造体のポスト情報を変更する。 なお、curve_PWMで座標体系を変えているため周回開始位置に戻る必要がある。 そのためにmode_revolveでmirs->revolve_angleに代入した周回開始位置を用いて 元の場所に戻る。


mode_init1.c

 MIRS構造体、ポスト情報を初期化する。その後mode_findに遷移し、 ポストの探索を開始する。


mode_init2.c

 前回終了時に記録したポスト情報をMIRS構造体に代入し、初期化を行う。 ただし、座標の信頼性が低いために使用されなかった。


mode_input.c

 とるべきポストの数を記録する。その後mode_waitに遷移。


mode_judge_get.c

 mirsの位置とUSSの値から発見したポストの座標を割り出す。 最初は動作モードの一つだったが、複数のモードから呼び出され、かつ 呼び出されたモードに戻る必要があったために、サブ関数の一つとなった。 割り出したポストの座標から、未知のポストかどうか、競技場の外からの 反応かどうかを調べ、未知のポストだったときはmirs->total_find_postを増やして 1を返し、それ以外の時は0を返す。


mode_judge_num.c

 赤外線から番号を読み取りその番号によって次のモードに遷移させる。 次に取得する番号の時はmode_getに遷移し、そうでない時は見つけたポストの番号を 保存した後にmode_decide_movementに遷移する。


mode_post_center.c

 ポストの中心を割り出す。端のTSに接触したときは中央のTSに接触したときの 3倍の角度で旋回する。2番と3番のTSが同時に接触したときはその時のMIRSの位置を ポストの座標に上書きし、mode_revolveに遷移する。


mode_revolve.c

 周回開始位置をmirs->revolve_angleに記録した後にポストを周回して赤外線を探す。 何周かしても見つからなかったときは、ポストナンバーを-1とする。ただし、既に 番号が書き込まれているときは上書きしない。これらは知らずにスイッチを押してしまったときの 対策の一つである。


mode_wait.c

 プログラムが開始されてから最初に移るモードであり、押された番号によって 各モードに遷移する。