コ ー ボ 自律動作ロボット「kobo 仕様書...1 1.目的...
TRANSCRIPT
自律動作ロボット「KOBOコ ー ボ
」
仕様書
4 班 K・E (班長) H・O Y・W
承認 審査 審査 作成
V1.00:2004年 4 月15日
目次 1.目的 ............................................................................................................................................................... 1 2.ユースケース................................................................................................................................................. 1
2-1.システム全体のユースケース ............................................................................................................ 1 2-2.KOBO 制御ソフトウェアのユースケース......................................................................................... 2
3.オブジェクト図 ............................................................................................................................................. 3 4.ステートチャート図...................................................................................................................................... 4 5.使用ポート .................................................................................................................................................... 5 6.define 定義名一覧 ........................................................................................................................................ 5 7.関数仕様一覧................................................................................................................................................. 7 8.改定履歴...................................................................................................................................................... 32
1
1.目的
マイコンによるハードウェア制御の学習のために簡単な自律動作するロボットの作成を行う。
センサ・モータ・LED とそれらの制御用電子回路をマイコン(AKI-H8)に接続して、マイコンによって制御
する。マイコンのソフトウェアは研修で勉強した C 言語を用いて、研修の理解を深める。 2.ユースケース 2-1.システム全体のユースケース
図1. システム全体のユースケース図 ユースケース名 : 仕掛人が楽しむために被害者を戸惑わせる 事前条件 : 無し メインフロー : 追いかけたり、逃げたり、怒ったり、寂しがったりして被害者を戸惑わせる 事後条件 : 無し
仕掛人 被害者
自律動作するロボット
仕掛人が楽しむために 被害者を戸惑わせる
2
2-2.KOBO 制御ソフトウェアのユースケース
図2. KOBO 制御ソフトウェアのユースケース ユースケース名 : 光センサを見て、白ランプを制御 事前条件 : 光センサの状態を取得出来る メインフロー : 光センサの状態を取得する 取得した光センサの状態を判断する 白ランプの状態の変更指令を出す 事後条件 : 白ランプの状態が指令通りになっている ユースケース名 : 全センサを見て行動する 事前条件 : Ir センサと光センサの状態を取得出来る メインフロー : Ir センサと光センサの状態を取得する 取得した Ir センサと光センサの状態を判断する 感情表示部へ状態の変更指令を出す モータへ状態の変更指令を出す 事後条件 : 感情表示部の状態が指令通りになっている モータの状態が指令通りになっている
全センサを見て行動する
光センサを見て、 白ランプを制御
Irセンサ
モータ
感情表現器
白ランプ
光センサ
KOBO 制御ソフトウェア
3
3.オブジェクト図
図3. オブジェクト図
Ir センサ
光センサ モータ
感情表示器
白ランプ マイコン
2
2
スピーカ
フルカラーLED
4
4.ステートチャート図
図4. ステートチャート図
「未検出」とは Ir センサの反応が閾値 A を下回ったことを示す。 「検出」とは Ir センサの反応が閾値 A を超えたことを示す。 「接近」とは Ir センサの反応が閾値 B(閾値 A より大きい)を超えたことを示す。 「人を見つけた」とは Ir センサの状態が「検出」または「接近」になったことを示す。 「人を見失った」とは Ir センサの状態が「未検出」になったことを示す。
実行中
人探し中
回転中
寂しがり中
一分間人を発見 できなかった
追尾/逃走中
逃げ中
追いかけ中
明るい
暗い
暗い 明るい
人を見失った
人を見つけた
ランプ点灯中 ランプ消灯中
暗い 明るい 明るい
暗い
5
5.使用ポート 表 5.1 使用ポート一覧
部位 各部の名称 使用ポート
LED 基板 感情 LED(出力) PortA-2,4,6
〃 白 LED(出力) Port4-3
メイン基盤 白 LED(出力) DA-1
〃 光センサ(入力) AN-1
〃 Irセンサ(入力) AN-0
〃 スピーカ(出力) DA-0
〃 モータ(出力) Port6-3,4,5,6
6.define定義名一覧 表 6.1 状態名を表す Define 定義名一覧
状態名
Define 定義名 説明
D_AKARUSA 明るさによって白ランプを制御
D_KAITEN_START 回転中の初期状態
D_KAITEN_MAIN 回転中のメイン処理
D_OIKAKE_START 追いかけ中の初期状態
D_OIKAKE_MAIN 追いかけ中のメイン処理
D_NIGE_START 逃げ中の初期状態
D_NIGE_MAIN 逃げ中のメイン処理
D_IKARI_START 怒り中の初期状態
D_IKARI_MAIN 怒り中のメイン処理
D_SAMISHI_START 寂しがり中の初期状態
D_SAMISHI_MAIN 寂しがり中のメイン処理
D_BUNKI 各状態への分岐
表 6.2 モータの状態を表す Define 定義名一覧
モータの状態
Define 定義名 説明
D_MOT_FRONT 前方向に回転
D_MOT_BACK 後ろ方向に回転
D_MOT_STOP 停止
6
表 6.3 LED の種類を表す Define 定義名一覧
LED の種類
Define 定義名 説明
D_LED_WHITE 白色 LED
D_LED_RED 赤色 LED※1
D_LED_BLUE 青色 LED ※ 1:仕様変更により実際には緑色 LED を表す。
表 6.4 タイマー関連の Define 定義名一覧
タイマー関連
Define 定義名 説明
D_TIMER_FREQ タイマーの周期[Hz]※1※2
D_TIMER_CNT タイマーの 1 周期分のカウント値 ※1:ハードウェア上の制約の為 36 以上にすること。 ※2:ソフトウェアの構造上の制約の為、800 以下にすること。
7
7.関数仕様一覧
関数名 :mainLoop 分類: 定義:
機能概要 :KOBO の状態遷移を管理するメインの無限ループ
戻り値 :
引 数 名 型 内 容
引
数
一
覧 関 数 名 内 容
呼
出
関
数
一
覧 下表参照
処理内容 メインの状態と明るさ制御の状態をそれぞれ main_state、led_state という変数とする。 main_state と led_state の初期値はそれぞれ D_KAITEN_START、D_AKARUSA とする。 以下の内容を無限ループで実行し続ける。
タイマーのカウント値(秒) を checkTimer()で取得し、LCD の座標 y=9,x=1 に PrintLCD 関数で”タイマ:%3d”という形式で出力する。 main_state の値を LCD の座標 y=0,x=1 に PrintLCD 関数で”St:%2d”という形式で出力する。 main_state の値に対応する関数を呼び出し、戻り値を新たな main_state とする。(対応は下表参照)ただし、対応する関数が存在しない場合は"main state"を引数として fail()を呼び出す。 _chkTmr()を呼び出す。 led_state の値に対応する関数を呼び出し、戻り値を新たな led_state とする。(対応は下表参照)ただし、対応する関数が存在しない場合は"led state"を引数として fail()を呼び出す。
状態名 関数 状態名 関数
D_KAITEN_START s_kaiten_start() D_IKARI_START s_ikari_start()
D_KAITEN_MAIN s_kaiten_main() D_IKARI_MAIN s_ikari_main()
D_OIKAKE_START s_oikake_start() D_SAMISHI_START s_samishi_start()
D_OIKAKE_MAIN s_oikake_main() D_SAMISHI_MAIN s_samishi_main()
D_NIGE_START s_nige_start() D_BUNKI s_bunki()
D_NIGE_MAIN s_nige_main() D_AKARUSA s_akarusa()
8
関数名 :fail() 分類: 定義:
機能概要 :メッセージを LCD に表示して動作を停止する
戻り値 :無し
引 数 名 型 内 容 pszStr const char* 表示する文字列
引
数
一
覧 関 数 名 内 容 mainLoop
呼
出
関
数
一 覧
処理内容 PrintLCD( "¥fFail¥n%s", pszStr ); 無限ループする。
9
関数名 :s_akarusa() 分類: 定義:
機能概要 :光センサの状態に応じて白ランプの状態を変更する
戻り値 :次に移行する状態
引 数 名 型 内 容
引
数
一
覧 関 数 名 内 容 mainLoop
呼
出
関
数
一 覧
処理内容 senseLight()の戻り値が偽なら setLED( D_LED_WHITE , 0 )(白ランプ点灯)、 真なら setLED( D_LED_WHITE , 1 )(白ランプ消灯)する。 D_AKARUSA を返す。
10
関数名 :s_oikake_start 分類: 定義:
機能概要 :感情ランプを全て消灯し、前進する
戻り値 :次に移行する状態
引 数 名 型 内 容
引
数
一
覧 関 数 名 内 容 mainLoop
呼
出
関
数
一
覧
処理内容 全感情ランプを消灯する。 左右のモータ共に前進する。 D_OIKAKE_MAIN を返す。
11
関数名 :s_oikake_main 分類: 定義:
機能概要 : Ir センサと光センサの状態を元に判断し、状態を変化させる
戻り値 :次に移行する状態
引 数 名 型 内 容
引
数
一
覧 関 数 名 内 容 mainLoop
呼
出
関
数
一
覧
処理内容 senseIr()の戻り値に応じて以下の処理を行う。 0(未検出)の場合 D_KAITEN_START を返す。 1(検出)の場合 senseLight()の戻り値が真なら D_NIGE_START を、偽なら D_OIKAKE_MAIN を返す。 2(接近)の場合 D_IKARI_START を返す。
12
関数名 :s_nige_start 分類: 定義:
機能概要 :感情ランプを全て消灯し、後退する
戻り値 :次に移行する状態
引 数 名 型 内 容
引
数
一
覧
関 数 名 内 容 mainLoop
呼
出
関
数
一
覧
処理内容 全感情ランプを消灯する。 左右のモータ共に後退する。 D_NIGE_MAIN を返す。
13
関数名 :s_nige_main 分類: 定義:
機能概要 :Ir センサと光センサの状態を元に判断し、状態を変化させる
戻り値 :次に移行する状態
引 数 名 型 内 容
引
数
一
覧
関 数 名 内 容 mainLoop
呼
出
関
数
一
覧
処理内容 senseIr()の戻り値に応じて以下の処理を行う。 0(未検出)の場合 D_KAITEN_START を返す。 1(検出)の場合 senseLight()の戻り値が真なら D_NIGE_MAIN を、偽なら D_OIKAKE_START を返す。 2(接近)の場合 D_IKARI_START を返す。
14
関数名 :s_ikari_start 分類: 定義:
機能概要 :感情ランプを全て消灯し、停止する
戻り値 :次に移行する状態
引 数 名 型 内 容
引
数
一
覧
関 数 名 内 容 mainLoop
呼
出
関
数
一
覧
処理内容 全感情ランプを消灯する。 左右のモータ共に停止する。 赤 LED を点灯する。 音番号 1 の音を一回再生する。 D_IKARI_MAIN を返す。
15
関数名 :s_ikari_main 分類: 定義:
機能概要 :Ir センサと光センサの状態を元に判断し、状態を変化させる
戻り値 :次に移行する状態
引 数 名 型 内 容
引
数
一
覧
関 数 名 内 容 mainLoop
呼
出
関
数
一
覧
処理内容 senseIr()の戻り値に応じて以下の処理を行う。 0(未検出)の場合 D_KAITEN_START を返す。 1(検出)の場合 senseLight()の戻り値が真なら D_NIGE_START を、偽なら D_OIKAKE_START を返す。 2(接近)の場合
D_IKARI_MAIN を返す。
16
関数名 :s_samishi_start 分類: 定義:
機能概要 :感情ランプを全て消灯し、停止する
戻り値 :次に移行する状態
引 数 名 型 内 容
引
数
一
覧
関 数 名 内 容 MainLoop
呼
出
関
数
一
覧
処理内容 全感情ランプを消灯する。 左右のモータ共に停止する。 青 LED を点灯する。 音番号 0 の音を一回再生する。 D_SAMISHI_MAIN を返す。
17
関数名 :s_samishi_main 分類: 定義:
機能概要 :Ir センサと光センサの状態を元に判断し、状態を変化させる
戻り値 :次に移行する状態
引 数 名 型 内 容
引
数
一
覧
関 数 名 内 容 mainLoop
呼
出
関
数
一
覧
処理内容 senseIr()の戻り値に応じて以下の処理を行う。 0(未検出)の場合 D_SAMISHI_MAIN を返す。 1(検出)の場合 senseLight()の戻り値が真なら D_NIGE_START を、偽なら D_OIKAKE_START を返す。 2(接近)の場合 D_IKARI_START を返す。
18
関数名 :s_bunki 分類: 定義:
機能概要 :Ir センサと光センサの状態を元に判断し、状態を変化させる
戻り値 :次に移行する状態
引 数 名 型 内 容
引
数
一
覧
関 数 名 内 容 mainLoop
呼
出
関
数
一
覧
処理内容 senseIr()の戻り値に応じて以下の処理を行う。 1(検出)の場合 senseLight()の戻り値が真なら D_NIGE_START を、偽なら D_OIKAKE_START を返す。 2(接近)の場合
D_IKARI_START を返す。 それ以外の場合 D_KAITEN_START を返す。
19
関数名 :s_kaiten_start 分類: 定義:
機能概要 :感情ランプを全て消灯し、回転する
戻り値 :次に移行する状態
引 数 名 型 内 容
引
数
一
覧
関 数 名 内 容 mainLoop
呼
出
関
数
一
覧
処理内容 全感情ランプを消灯する。 左のモータを前進、右のモータを後退する。(その場で右回転する) タイマーのカウントを開始する。
D_KAITEN_MAIN を返す。
20
関数名 :s_kaiten_main 分類: 定義:
機能概要 :Ir センサと光センサの状態を元に判断し、状態を変化させる
戻り値 :次に移行する状態
引 数 名 型 内 容
引
数
一
覧
関 数 名 内 容 mainLoop
呼
出
関
数
一
覧
処理内容 senseIr()の戻り値に応じて以下の処理を行う。 偽(未検出)以外の場合 タイマーを停止させ、D_BUNKI を返す。 真(未検出)の場合 タイマーをチェックして、60 秒以内なら D_KAITEN_MAIN を返す。 60 秒を超えていれば、タイマーを停止させ、D_SAMISHI_START を返す。
21
関数名 :initApi 分類: 定義:
機能概要 :各部分の状態を初期化する
戻り値 :
引 数 名 型 内 容
引
数
一
覧
関 数 名 内 容 main()
呼
出
関
数
一
覧
処理内容 感情 LED の初期化
PA.DDR に 0xff を代入し、PortA を全て出力にする。 PA.DR.BYTE に 0x00 を代入し、PortA の全ての LED を消す。
白 LED1の初期化 P4.DDR に 0xff を代入し、Port4 を全て出力にする。 P4.DR.BYTE に 0x00 を代入し、Port4 の全ての LED を消す。
モータの初期化 P6.DDR に 0xff を代入し、Port6 を全て出力にする。 P6.DR.BYTE に 0x00 を代入し、全てのモータを停止させる。
スピーカ&白 LED2の初期化 DA.DR0、DA.DR1 に 0x00 を代入し、DA-0,1 を初期化する。 DA.CR.BYTE に 0xff を代入し、DA-0,1 の D/A 変換を許可する。
Ir センサ&光センサの初期化 AD.CSR.BYTE に 0x31 を代入し、以下のように設定する。
A/D 変換を開始する。 A/D 変換器をスキャンモードにする。
スキャンするチャンネルを AN-0,1 に設定する。 タイマーの初期化 ITU4.TCR.BYTE に 0x23 を代入し、GRA コンペアで TCNT をクリア、立ち上がりエッジでカウン
トするようにし、内部クロックφ/8 でカウントするようにする。 ITU4.TIOR.BYTE に 0x00 を代入し、GRA・BRB コンペアによる出力を禁止禁止する。 ITU4.GRA に D_TIMER_CNT を代入し、カウント周期を設定する。
22
関数名 :setMotor 分類: 定義:
機能概要 :モータ制御の状態を変更する
戻り値 :
引 数 名 型 内 容 Ich int モータの番号(0:右 1:左) iState int モータの状態
(FRONT:前回転 BACK:後回転 STOP:停止)
引
数
一
覧
関 数 名 内 容 s_oikake_start() s_nige_start() s_samishi_start() s_kaiten_start()
呼
出
関
数
一
覧
s_ikari_start()
処理内容 _chkTmr()を呼び出す。 Port6 の、iCh が 0 ならビット 3~4、1 ならビット 5~6 に以下の表の示す値を出力する。 Port6 のビット 3~6 の値を LCD の座標 y=7,x=1 に printLCD 関数で”%1x”という形式で出力する。 iSTate 出力値 D_MOT_FRONT 2 D_MOT_BACK 1 D_MOT_STOP 3
23
関数名 :playSound 分類: 定義:
機能概要 :音を出す
戻り値 :
引 数 名 型 内 容 INum int
引
数
一
覧
関 数 名 内 容 s_samishi_start() 感情ランプを全て消灯し、停止する関数 s_ikari_start() 感情ランプを全て消灯し、停止する関数
呼
出
関
数
一
覧
_chkTmr を呼び出す。 iNum の値が 0 なら低い音を 1 なら高い音を短時間(~1 秒程度)スピーカで出力する。 ※タイマーの 1 周期回りきる前に必ず_chkTmr()を呼び出されるようにすること。
24
関数名 :playDone 分類: 定義:
機能概要 :音の停止を確認する
戻り値 :int( 1 )
引 数 名 型 内 容
引
数
一
覧
関 数 名 内 容 s_samishi_start() 感情ランプを全て消灯し、停止する関数 s_ikari_start() 感情ランプを全て消灯し、停止する関数
呼
出
関
数
一
覧
_chkTmr()を呼び出す。 1 を返す。 ※この関数は将来 playSound()の実装が変更され、メイン処理と平行して音声再生処理が実行されるよ
うになった場合への対処です。
25
関数名 :setLED 分類: 定義:
機能概要 :LED を制御する
戻り値 :
引 数 名 型 内 容 iCh int LED の色(表 6.3 参照) iState int LED の状態(真:点灯 偽:消灯)
引
数
一
覧
関 数 名 内 容 s_akarusa() 光センサの状態に応じて白ランプの状態を変更
する関数 s_samishi_start() 感情ランプを全て消灯し、停止する関数 s_ikari_start() 感情ランプを全て消灯し、停止する関数
呼
出
関
数
一
覧
_chkTmr()を呼び出す。 iCh の LED を iState で示された状態にする。
26
関数名 :emoLEDoff 分類: 定義:
機能概要 :LED を消灯する
戻り値 :
引 数 名 型 内 容
引
数
一
覧
関 数 名 内 容 s_oikake_start() 感情ランプを全て消灯し、前進する関数 s_nige_start() 感情ランプを全て消灯し、後退する関数 s_ikari_start() 感情ランプを全て消灯し、停止する関数
呼
出
関
数
一
覧
_chkTmr()を呼び出す。 感情 LED(白色を除く全ての LED)を全て消灯する。
27
関数名 :startTimer 分類: 定義:
機能概要 :
戻り値 :
引 数 名 型 内 容
引
数
一
覧
関 数 名 内 容 s_kaiten_start() 感情ランプを全て消灯し、回転する関数
呼
出
関
数
一
覧
タイマーのカウンタを 0 にして、カウントを開始する。 タイマーはメインの処理と平行して動作する。 _chkTmr()を呼び出す。 ※タイマーの実装に関する詳細は後の章で解説する。
28
関数名 :checkTimer 分類: 定義:
機能概要 :
戻り値 :カウント開始からの時間[秒]
引 数 名 型 内 容
引
数
一
覧
関 数 名 内 容
呼
出
関
数
一
覧
タイマーの現在のカウント値[秒]を返す。 ※タイマーの実装に関する詳細は後の章で解説する。
29
関数名 :stopTimer 分類: 定義:
機能概要 :
戻り値 :
引 数 名 型 内 容
引
数
一
覧
関 数 名 内 容
呼
出
関
数
一
覧
タイマーの動作を停止する。 ※タイマーの実装に関する詳細は後の章で解説する。
30
関数名 :_chkTmr 分類: 定義:
機能概要 :タイマーのカウント処理
戻り値 :
引 数 名 型 内 容
引
数
一
覧
関 数 名 内 容
呼
出
関
数
一
覧
H8 内蔵のタイマーの状態を見てカウント値を更新する ※タイマーの実装に関する詳細は後の章で解説する。
31
関数名 :main 分類: 定義:
機能概要 :メイン関数
戻り値 :0
引 数 名 型 内 容
引
数
一
覧
関 数 名 内 容
呼
出
関
数
一
覧
API を初期化する。 LCD を初期化する。 Ir センサの初期設定を行う。 mainLoop()に処理を移す。 fail()を”return to main”を引数にして呼び出す。 0 を返す。
32
8.改定履歴
版数 改定内容 承認 審査 作成
V1.0 初版発行 鎌倉