名称 MIRS1502 ソフトウェア詳細設計書
番号 MIRS1502-SOFT-0001
版数 最終更新日 作成 承認 改訂記事
A01 2015.12.11 飯田俊也、奥一貴、金指真之介、平田和奏 初版

目次

  1. はじめに
  2. モジュール構成の詳細
  3. 主要な動作ブロックのフローチャート
  4. プログラム構成
  5. テスト項目
  6. コーディングルール

  1. はじめに

    本ドキュメントはソフトウェア詳細設計書である。

  2. モジュール構成の詳細

    基本設計で示した全体のモジュール構成をFig.1、Fig.2に示す。
    Fig.1
    Fig.1 モジュール構成図(CPU)

    Fig.2
    Fig.2 モジュール構成図(Arduino)

    モジュール構成(CPU)をTable1に示す。

    Table1 モジュール仕様(CPU)
    モジュール名 説明(役割、動作概要、変更内容など) 関数名 引数 戻り値
    Device デバイスドライバの有効化 int device_motor_open()
    int device_motor_close()
    int device_motor_get()
    無し エラーが発生した場合は-1を、問題がなければ0を返す。
    Pilot 全体の制御を行うモジュール int main(void) 無し エラーが発生した場合は-1を、問題がなければ0を返す。
    Mirsak_patrol 怪盗追跡を行うモジュール。
    競技会用にプログラムを開発する
    void mirsak_patrol() 無し 無し
    Omni_ctrl 壁との距離を一定に保ちながら直進制御を行うモジュール void omni_ctrl(int uss_stop, int uss_ctrl)
    int uss_stop
    int uss_ctrl
    無し
    Motor モータを制御するモジュール。モータの数が2個から4個に増えたため、それに対応する。 void motor_drive(int u_rf, int u_rb, int u_lf, int u_lb) int u_rf
    int u_rb
    int u_lf
    int u_lb
    無し
    Number ボードの数字認識を行うモジュール 標準のプログラム参照 標準のプログラム参照 標準のプログラム参照
    DeviceDriver Arduinoとの通信を司るデバイスドライバー int device_ioポート名前_open()
    int device_ioポート名前_close()
    無し エラーが発生した場合は-1を、問題がなければ0を返す。
    Serial_ctrl デバイスドライバーを制御するモジュール int serial_create() 無し 赤外線…強度:int ir_strength(0~100),
         方向:int ir_angle(-179~180)
    超音波…int uss_distance[8] 単位はcm
    タッチセンサ…int touch_io[個数未定]
    電子コンパス…int compass_angle(-179 ~ 180)
    カメラ回転…int cam_angle
    re_route 巡回ルートに復帰する際の動作を決めるモジュール void re_route() 無し 無し

    モジュール構成(Arduino)をTable2に示す。

    Table2 モジュール仕様(Aruduino)
    モジュール名 説明(役割、動作概要、変更内容など) 関数名 引数 戻り値 起動条件
    Main 各センサから送られた値から距離や角度を計算するモジュール void main() 無し 無し 常時実行
    Rot_camera カメラの回転の制御を行うモジュール void rotate_camera(uint16_t angle) angle…角度 無し 呼ばれたとき
    Touch タッチセンサの信号処理を行うモジュール void touch() 無し 無し 定時割り込み(1秒で30回)
    Ultrasonic 超音波センサの信号処理を行うモジュール void Ultrasonic() 無し 無し 定時割り込み(1秒で30回)
    Infrared 赤外線センサの信号処理を行うモジュール void Infrarad() 無し 無し A/D変換の終了による割り込み
    Compass 電子コンパスの信号処理を行うモジュール void Compass() 無し 無し 定時割り込み(1秒で30回)
    I2C_ctrl I2Cの通信制御 int8_t I2C_ctrl(uint8_t addr,uint8_t mode,uint8_t data[],uint8_t elem) addr…アドレス
    mode…送信か受信か
    data…送受信データ
    elem…データ数
    エラーが発生した場合は-1を
    問題がなければ0を返す。
    呼ばれたとき
    Serial CPUとの通信を制御するモジュール void serial_ctrl() 無し 無し 定時割り込み(1秒で30回)

  3. 主要な動作ブロックのフローチャート

    タッチセンサ、カメラ回転が無い場合のMirsak_patrolのフローチャートをFig.3に示す。
    角度は-179°から180°までを考え、0°の方向を向いたとき、左側を正、右側を負とする。
    スタート時、進行方向を180°とする。

    Fig.3
    fig.3 フローチャート

  4. スレッド構成

     起動時は以下の2つのスレッドを動作させる。
     pilot:メインスレッド。deviceとserial_ctrlを呼び出したのち、全体の動作シーケンスを管理するmirsak_patrolを呼び出す。
     Serial_ctrl:Arduinoとの通信を司るスレッド。データを送信し、また受信データの更新を行う。

    Fig.4
    fig.4 スレッド構成

  5. テスト項目

    テスト項目と判定基準を以下に示す。

    1. オムニホイールによる走行制御の動作をチェックする
      4個のモータが正常に回転することをpwmモジュール、motorモジュールで確認する。
      進行方向に対して右の壁との距離を一定に保ちながら直進することををomni_ctrlモジュールで確認する。

    2. CPUとArduinoが通信できているかどうか確認する
      通信ができているArduinoを接続し、Serialモジュールおよびデバイスドライバが正常に実行されていることを確認する。
      試合時間より長い、10分程度連続で実行し、不具合がないか確認する。

    3. タッチセンサモジュール、超音波モジュール、赤外線モジュールが正常に動作しているか確認する
      各センサを接続し、入力された信号をシリアルモニタを使って確認する。

    4. 電子コンパスと通信できているか確認する。
      電子コンパスを接続し、入力された信号をシリアルモニタを使って確認する。
      I2Cが正常に通信できているかオシロスコープを使用して信号の波形を確認する。

    5. カメラ回転モジュールが正常に実行されているか確認する。
      サーボモータを接続し、シリアルモニタを使って角度を送信し、指定した角度になっていることを確認する。
      また、回転信号が正常かどうかオシロスコープを確認する。

    6. 現場急行できるかを確認する。
      プログラムを実装し、実際に練習用フィールドにて現場急行が完了することを確認する。

    7. 巡回ルートを回れるかを確認する。
      プログラムを実装し、巡回ルートを回れることを確認する。

    8. 巡回ルートに復帰することができるかを確認する。
      プログラムを実装し、巡回ルートを回っている最中に赤外線ボールを使うなどして巡回ルートから外れさせる。
      その後、巡回ルートに復帰できることを確認する。


  6. コーディングルール

    1. プログラムの更新・統合手順
      プログラムは、Bitbucketを使用し管理する。
      普段はdevelopブランチで開発を行う。機能が完成したら、ソフト班全員に確認をとりmasterブランチに変更する。

    2. ファイル分割基準
      保守性と複数人開発の観点からソースファイルは1機能あたり1つを原則とする。
      ただし、同時に行う処理や簡単な機能は複数を1つのソースファイルにまとめてもよい。
      また、1つの機能を複数人で開発する場合、ソースファイルを分割してもかまわない。

    3. 関数名・変数名付け方
      組込みソフトウェア開発向けコーディング作法ガイドを参考に以下のように定める。
       ・グローバルなものには、どのモジュールに属するのか分かるように、共通の接頭辞を付ける。
       ・グローバル変数や関数の名前は、短すぎる名前を付けない。英語で意味を持つような名前にする。
       ・ローカル変数には短い名前をつける。
       ・関数名は、能動的な動詞を基本にし、特に問題がなければそのあとに名詞を付ける。
       ・複数の単語で構成される名前の単語の区切りは、下線で区切る。

      組込みソフトウェア開発向けコーディング作法ガイド