沼津高専 電子制御工学科
MIRSATLM プログラム詳細仕様書
MIRSATLM-SOFT-0001
改訂記録
版数 作成日 作成者 承認 改訂内容
A01 2000.10.13 田口 大庭 初版
A02 2000.10.20 田口 大庭 ロータリーエンコーダ・PWMタスクとLCDドライバ部分を一部変更
A03 2001.1.6 田口 大庭 赤外線・タッチセンサドライバ部分を作成、LCDドライバ部分を修正
B01 2001.3.7 ソフト全員 遠山 全てを最終的な仕様に修正

目次

1 .はじめに

 本仕様書は、MIRSATLMソフトウェア設計書に規定された動作規定・状態遷移を実現する各RTタスクモジュール及びデバイスドライバのプログラムの動作を説明するものである。

2 .システム概要

 MIRSATLMソフトウェアはRT-Linux上で動作する各RTタスクモジュール及びデバイスドライバと上位プログラムで構成される。即時性が要求されるハードウェアはRTタスクモジュールで、それ以外のハードウェアはデバイスドライバで処理を行う。上位プログラムは、これらのRTタスクモジュール及びデバイスドライバを使用して得たセンサ情報等をもとに動作の決定を行う。

3 .各RTタスクモジュール及びデバイスドライバの基本仕様

    3-1 .超音波センサRTタスクモジュール 3-2 .PWM・ロータリーエンコーダRTタスクモジュール

    3-3 .赤外線・タッチセンサデバイスドライバ

    3-4 .LCDデバイスドライバ

4 .各RTタスクモジュール及びデバイスドライバの動作説明

    4-1 .超音波センサRTタスクモジュール
      本モジュールの動作の流れを示した図を以下に示す。


      Fig.1 超音波センサタスク制御フローチャート


      1. FIFO1にコマンドが書き込まれると、コマンドハンドラが起動する。コマンドハンドラは、FIFO1に書き込まれたコマンドを引き取り、超音波送信関数に引数として渡す。
      2. 超音波送信関数は、引数で与えられた番号の超音波センサに超音波送信の指示を出す。また、その時刻をシステムカウンタから記憶し、割込み許可の状態にする。
      3. 割込み信号が入ると、割込みハンドラが起動する。割込みハンドラはその時刻をシステムクロックより記憶する。その後、送信時の時刻データと先の受信時の時刻データから距離に換算する。換算式を以下に示す。

        距離 = (受信時の時間 − 送信時の時間) * (331.5 + 0.61T) / (1000000 * 2)

        ここでTは摂氏温度であり、本モジュールではこれを20℃としている。
        換算された距離データはFIFO2に書き込まれる。
      4. FIFO2に値が書き込まれると、この一連の動作は終了する。(上位プログラムで、FIFO2に値が入るまで待つような設定をする。)

    4-2 .PWM・ロータリーエンコーダRTタスクモジュール

      1. 上位プログラムから送られてくるFIFO5からSTARTの指令とタスクの実行周期をハンドラーで読み込む。
         ※用いる関数:rtf_get()

      2. STARTの指令をうけたら、左右のカウンタにリセットをかける。次にタスクが指定した周期ごとに実行されるようにする。
         ※用いる関数:pthread_make_periodic_np()

      3. RT-タスクが実行を指示されたら・・・・
        3-1. FIFO4よりPWMの速度データ(目標カウント値)を読み込み、そのデータの種類によってDUTY_MODE(duty比モード)、FDBK_MODE(フィードバック制御モード)のどちらかを実行する。
         ※用いる関数:rtf_get()
        3-2-1. DUTY_MODE(duty比モードの場合)
        I/Oポートの110H、112Hに読み込んだ速度データを出力する。
        3-2-2. FDBK_MODE(フィードバック制御モードの場合)
        目標カウント値とカウントタの積算値の偏差をとり、それを速度データとしてI/Oポートの110H、112Hに出力する。
        3-3. 左タイヤのカウント値を関数・inw()を用いて読み込み、その後左タイヤのカウンタにリセットをかける。
        3-4. 右タイヤのカウント値を関数・inw()を用いて読み込み、その後右タイヤのカウンタにリセットをかける。
        3-5. 読み込んだカウント値を符号付の整数に変換し、カウント値積算用変数に加算する。
        3-6. カウント値をFIFO3へと書き込んで、上位のプログラムへと送る。
         ※用いる関数:rtf_put()
        この3.の動作がサスペンドをかけられるまで繰り返される。

      4. FIFO5にSTOPの指令が書き込まれて来たらハンドラーは周期タスクを停止させる。
         ※用いる関数:pthread_suspend_np()

      5. ハンドラーによってRESTARTがかけられるまで待機。
         ※用いる関数:pthread_wakeup_np()

      本ソフトウェアの制御フロー図を下に示す。


      Fig.4 ハンドラの動作

      Fig.5 RT-タスクの動作

    4-3 .赤外線・タッチセンサデバイスドライバ


    ※タッチセンサ・赤外線センサデバイスドライバを扱う上での注意:

    Fig.5 赤外線・タッチセンサドライバ制御フローチャート

    4-4 .LCDデバイスドライバ

    ※LCDデバイスドライバを扱う上での注意:

Fig.5 LCDデバイスドライバ制御フローチャート

5 .アプリケーションインターフェース

制御関数
動作説明
pwm_enco_start(int period)
実行周期period(単位はμsec)を引数として与える。この関数の中ではFIFO5へSTART指令と実行周期の書き込みを行う。この関数をまず始めに実行しないと、関数encoder_data()やpwm_data()を使用することはできない。
pwm_enco_stop(void)
RT-タスクを停止させる。この関数の中ではFIFO5へSTOP指令の書き込みを行っている。
pwm_enco_restart(void)
encorder_stop()により停止したタスクを再スタートさせる。この関数の中ではFIFO5へRESTART指令の書き込みを行っている。
encorder_data(int *l_distance, int *r_distance, int *l_speed, int *r_speed, int *br)
FIFO3からカウント値とフラグ(MIRSが停止したかどうかを調べるためのもの)の状態を読み込んで、左右のタイヤの移動距離と速度を求め、移動距離・速度とフラグの値を戻り値として返す。
タイヤの速度は、この関数でカウント値を読み込んだ際の最新のカウント値をRT-タスクの実行周期で割ることにより求める。
また、タイヤの移動距離と速度の単位はそれぞれ、[cm]、[cm/s]である。
pwm_both_data(int l_duty, int r_duty)
左右のモータのduty比(-100 〜 100)を引数として与える。
引数に正の値を入れるとタイヤは正転し、負の値を入れると逆転する。
pwm_left_data(int l_duty)
左モータのduty比を引数として与える。
pwm_right_data(int r_duty)
右モータのduty比を引数として与える。pwm_both_data()と同様、与えられた速度データを 8ビットのデータに置き換えた後FIFO4に書き込んでRT-タスクに送る。
pwm_circle_data(int angle)
MIRSをその場回転させる際の回転角を引数として与える。MIRSは指定された角度だけ回転した後停止する。
符号は+が時計回り、−が反時計回りである。
pwm_cm_data(int l_distance, int r_distance)
MIRSを直進させる距離[cm]を引数として与える。MIRSは指定された距離だけ直進した後停止する。
符号は+が前進、−が後進である。
制御関数
動作説明
fc=open("/dev/irs_ts",f_mode)
赤外線・タッチセンサデバイスファイルをopenし、I/Oポートアドレスのチェックと登録を行う。
read(int file, char buf,size_t count,loff_t offset)
赤外線センサ・タッチセンサ・パワーオン信号処理モジュールからデータを読み込む。
ioctl(int fc,int cmd,int &ctl_nr)
赤外線センサ・タッチセンサ・パワーオン信号を、選択したコマンドによってそれぞれ分けて読み込む。
close(fd)
I/Oポートアドレスを解放する。
制御関数
動作説明
fd=open("/dev/lcd",f_mode)
LCDデバイスファイルをopenし、I/Oポートアドレスのチェックと登録を行う。
LCDモジュールのディスプレイON等の最低限の初期設定を行う。
read(int file, char buffer,size_t count,loff_t offset)
LCDモジュール(I/Oポート)に書き込まれている文字データを読み込む。
write(int file, char buffer,int count,loff_t offset)
表示したい文字データをLCDモジュール(I/Oポート)に書き込む。
ioctl(int fd,int cmd,int &ctl_nr)
LCDモジュールの表示設定を行う。選択したコマンドによって表示クリアやカーソルなどを設定する。そしてLCDモジュール(I/Oポート)に書き込む。
close(fd)
I/Oポートアドレスを解放する。
I/Oポート
使用RTタスクモジュール・デバイスドライバ
内容
0100H
LCDデバイスドライバ
表示設定データの書き込み
0102H
LCDデバイスドライバ
文字データの書き込み/読み込み
0110H
PWM・ロータリーエンコーダRTタスクモジュール
方向・PWM信号の生成とラッチ確認(右)
0112H
PWM・ロータリーエンコーダRTタスクモジュール
方向・PWM信号の生成とラッチ確認(左)
0120H
PWM・ロータリーエンコーダRTタスクモジュール
ロータリーエンコーダカウントの動作制御
0122H
PWM・ロータリーエンコーダRTタスクモジュール
ロータリーエンコーダカウント値の読み込み
0130H
超音波センサRTタスクモジュール
センサ送信信号
0132H
超音波センサRTタスクモジュール
割り込み信号のマスク・アンマスク&リセット
0140H
赤外線・タッチセンサデバイスドライバ
赤外線・タッチセンサの状態
0142H
赤外線・タッチセンサデバイスドライバ
割り込み信号のマスク・アンマスク&リセット


関連文書