1)方向の管理
方向は絶対方向と相対方向の二つで管理している。
1−1)絶対方向
絶対方向とは、迷路の上方を北と設定し、現在マウスが東西南北のどちらの方向を向いているかを管理、記憶する。
絶対方向は、8ビットの変数 dir に以下のように記憶する。北 0x00 西 0x03 東 0x01 南 0x021−2)相対方向
相対方向とは、マウスの前方を直進と設定し、マウスが前後左右のどちらの方向に進む(旋回する)かを管理、記憶する。
相対方向は、8ビットの変数 rot_dir に以下のように記憶する。直進 0x00 左旋回 0x03 右旋回 0x01 後進(反転) 0x02
2)迷路地図の管理
迷路地図は、絶対方向の壁の有無と、座標の未通過、既通過を記憶した、8ビットの配列変数をもちいて管理している。
2−1)dataの耕造
8ビットの変数のビットごとに、絶対方向の壁の有無と、座標の未通過、既通過を以下のように記憶する。西 南 東 北 7 6 5 4 − 3 2 1 0 1 0 0 1 西側と北側に壁が有る 1 現在の座標は通過済み 0 現在の座標は未通過2−2)迷路地図の構造
迷路地図は、迷路の構造から、256個の8ビットデータを格納する1次元の配列変数をもちいて管理、記憶する。
地図はスタート地点を 0x00とし、南北方向は配列変数の添え字の上位4ビット、東西方向は下位4ビットを使い、配列変数 wall_map[] に以下のように記憶する。北 0xf0 0xf1 0xf2 0xf3 ・ ・ 0xfe 0xff 0xe0 ・ ・ ・ 0x20 0x10 0x00 0x01 0x02 0x03 ・ ・ 0x0e 0x0f 西 東
3)相対方向(旋回方向)から絶対方向を求める
マウスの旋回方向(相対方向)と現在の絶対方向から、旋回が終わった後の絶対方向を求める方法は、計算で求める方法とデータテーブルを使う方法と二つ考えられる。
現在の絶対方向は南(0x02)、旋回方向(相対方向)は左(0x03)と仮定し、二つの方法で旋回後の絶対方向を求める。
3−1)計算で求める0x02+ 0x03= 0x05 :南を向いているマウスが、左に旋回する 0x05 AND 0x03= 0x01 :マウスは東(0x01)を向く 実際は dir= ( (dir+ rot_dir) & 0x03 ) ; と コーディングする3−2)データテーブルを使って求める
以下のように、2次元の配列変数 direction_rot[絶対方向 dir][相対方向 dir_rot]を用意する。char direction_rot[4][4]= { {0x00,0x01,0x02,0x03}, {0x01,0x02,0x03,0x00}, {0x02,0x03,0x00,0x01}, /* 南向 & 左旋回 direction_rot[0x02][0x03] */ {0x03,0x00,0x01,0x02}} ; /* direction_rot[0x02][0x03] is 0x01 マウスは東を向く */ 実際は dir= direction_rot[0x02][0x03] ; または dir= direction_rot[dir][dir_rot] ; と コーディングする
4)走行コースの地図
マウスの走行コースは、route_map という、1次元の配列変数に記憶させる。
route_map[] には [直進区画数][旋回方向][直進区画数][旋回方向][直進区画数] ・・・・・
・・・・・[直進区画数][旋回方向][直進区画数][0xff(走行終了のflag)] という配列で
データを格納する。直進区画数と旋回方向のデータ構造は、以下のとうり。 4−1)直進区画数のデータ構造 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 1 斜め走行 bit3 --> bit0 直進区画数 bit7は、直進走行のデータというflag bit6がsetされていれば、斜め走行区間 bit3 --> bit0 は、(直進区画数− 1)が格納される 従って、データが 0xc2 ならば 斜め・3区画直進となる 4−2)旋回方向のデータ構造 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 1 旋回方向 bit3 --> bit0 旋回角 bit5は、旋回方向のデータというflag bit4がsetされていれば、左旋回 ゼロならば右旋回 bit3 --> bit0 は、旋回数 旋回角は、45度旋回×旋回数が旋回角と表現する 従って、bit3 --> bit0 には、旋回数のデータが入る データが 0x32 ならば 左・90度旋回となる
5)定数の設定
定数の設定は、変数の型と条件判断のためのフラグ、アナログセンサのチャンネルを設定した standardDef.h と、走行距離や制御定と壁データの初期値などを設定した constant.h の、二つに分割してある。
調整が必要な制御定数は、一つのファイルにまとめた方が使い易いというだけのこと。
5−1)standardDef.h
standardDef.h には、変数の型と条件判断のためのフラグ、アナログセンサのチャンネルが設定してある。/* 標準的な定数data & インターフェイス・制御系のマクロを記入した header file */ /* file name standardDef.h */ /* lase edit '99/09/10 k.notoya */ /*==================================================================================================*/ /* 変数の型とサイズ */ /*==================================================================================================*/ #define SCHAR signed char /* signed 8 bit data */ #define UCHAR unsigned char /* unsigned 8 bit data */ #define SSHORT signed short int /* signed 16 bit data */ #define USHORT unsigned short int /* unsigned 16 bit data */ #define SINT signed int /* signed 32 bit data */ #define UINT unsigned int /* unsigned 32 bit data */ #define SLONG signed long int /* signed 64 bit data */ #define ULONG unsigned long int /* unsigned 64 bit data */ /*==================================================================================================*/ /* 全モジュール共通 フラグ & 方向 & ポートadress */ /*==================================================================================================*/ /* 稼動 or 停止 */ #define WAKE 0xf0 /* 稼動 */ #define SLEEP 0x00 /* 停止 */ /* 励磁mode 2相励磁 or 1-2相励磁 */ #define OneTwo 0xff /* 1-2相励磁 */ #define TwoTwo 0x00 /* 2相励磁 */ /* 進行方向 前進 or 後進 or 斜め走行 running_direction に記憶 */ #define FORWARD 0x00 /* mouseは前進している */ #define BACKWARD 0xff /* 後退している */ /* #define ASLANT 0x0f */ /* 斜め走行中 */ /* 到着した or まだ着いていない */ #define Arrive 0x00 /* 到着した */ #define NotArrive 0xff /* まだ着いていない */ /* 探査mode(mouseの走行mode) mode に記憶 */ #define GoalMode 0x00 /* 現在の座標 --> goal */ #define StartMode 0x0f /* 現在の座標 --> start地点 */ #define StartGoal 0xf0 /* start地点 --> goal */ #define AxisAxisx 0xff /* 現在の座標 --> 未探査の座標 */ /* 探査が終わった or 継続中 search_flag に記憶 */ /*#define CONTINUE 0x00 */ /* 探査は継続中 */ /*#define GoalMode 0x00 */ /* 現在の座標 --> goal mode で 探査中 */ /*#define StartMode 0x0f */ /* 現在の座標 --> goal を1回探査した */ #define EndSearch 0xff /* 探査が終わった */ /* 成功 or 失敗 */ #define SUCCESS 0xf0 /* 成功 */ #define FAILURE 0x00 /* 失敗 */ /* 可能 or 不可能 */ #define Possible 0x00 /* 可能 */ #define Impossible 0xff /* 不可能 */ #define LastTurn 0x0f /* 次の旋回が最後の旋回 */ #define LastAdvance 0xf0 /* 前進を続ける */ /* 存在する or 存在しない */ #define NotExist 0x00 /* 存在しない */ #define Exist 0xff /* 存在する */ #define LOST 0x0f /* lostした */ /* 未探査の座標が見つかった or 無かった */ #define FOUND 0x00 /* 未探査の座標が見つかった */ #define NotFound 0xff /* 未探査の座標は 無かった */ /* 絶対方向 dir に記憶 */ #define NORTH 0x00 #define EAST 0x01 #define SOUTH 0x02 #define WEST 0x03 /* 旋回方向 turn_direction に記憶 */ #define STRAIGHT 0x00 /* mouseは直進する */ #define SPIN_RIGHT 0x01 /* 信地旋回で右回転する */ #define REVERS_SPIN 0x02 #define SPIN_LEFT 0x08 #define PIVO_RIGHT 0xf1 /* pivot_turnで右に旋回する */ #define PIVO_LEFT 0xf2 #define SLA_RIGHT 0xf4 /* slalomで右に旋回する */ #define SLA_LEFT 0xf8 /* 旋回時に、仮想車輪を加速する or Not を 判断する (turn_direction & SLALOM) */ /*#define SLALOM 0xf0 *//* 旋回は slalom or Not (turn_direction & SLALOM) */ /* 姿勢制御の方向 */ #define RIGHT 0x01 /* 前回は、右に姿勢を制御した */ #define LEFT 0x08 /* 走行状態 走行終了時 or 走行状態 running_condition に記憶 */ /* 【注意】旋回時に、仮想車輪を加速する or Not を 判断基準を */ /* ( (turn_direction & SLALOM) != 0xf0 ) の値で決定している */ /* 従って #define SLALOM 0xf0 は、変更禁止 */ #define CONTINUE 0x00 /* mouseは走行していた */ #define SLALOM 0xf0 /* slalom をした */ #define ASLANT 0x0f /* 斜め走行をしている */ #define HALT 0xff /* 停止していた */ /* 走行状態 探査走行 or 高速走行 && 斜め走行 or 定常走行 running_mode に記憶 */ #define SEARCH 0x00 /* mouseは探査走行中 */ #define ATTACK_SPN1 0x01 /* time attack 信地旋回 */ #define ATTACK_SLA1 0x02 /* time attack slalom 定常走行 speed_0 */ #define ATTACK_SLA2 0x03 /* time attack slalom 定常走行 speed_1 */ #define ATTACK_ASL1 0x10 /* time attack slalom 斜め走行 speed_0 */ #define ATTACK_ASL2 0x11 /* time attack slalom 斜め走行 speed_2 */ /* 走行状態 加速中 or 定常走行中 or 減速中 accele_condition に記憶 */ #define ACCELE 0x00 /* mouseは 加速中 */ #define GENERAL 0x03 /* 定常走行中 */ #define REDUCE 0x0C /* 2倍のレートで減速中 */ #define SINGLE 0x0f /* 1倍のレートで減速中 信地旋回 & slalomの入り口 */ #define DOUBLE 0x0C /* 2倍のレートで減速中 */ /* 走行状態 最高速度まで加速した or Not speed_level に記憶 */ #define STOPPING 0xff /* mouseは 停止中 */ #define MINIMUN 0x03 /* 最低速度で走行中 */ #define MIDDLE 0x0c /* 2速で走行中 */ #define FARST 0x0f /* 3速で走行中 */ #define MAXIMUM 0x30 /* 最高速度で走行中 */ /* センサのチャンネル */ /* 壁情報を地図に書き込むため、センサの選択は絶対方向で指示する */ /* 発光時間は、constant.h で 設定 */ /* 【注意】 距離センサは発光制御をしなけれなならないので、AN_0(A/D.C channel_0)を右・前壁に設定し */ /* 反時計廻りに発光素子と受光素子をポートに接続すること */ /* left_side rihgt_side */ #define RIGHT_FRONT 0x00 /* / ̄ ̄\ */ #define RIGHT_SIDE 0x01 /* left_front | ↑ | right_front */ #define LEFT_SIDE 0x02 /* | | */ #define LEFT_FRONT 0x03 /* | | */ /* \ / */ /*  ̄ ̄ */ #define FRONT_STEER 0x04 /* front steering AN_4 */ #define GYRO 0x05 /* gyro dada read AN_5 */ /* D/A.C & 予備 */ /* #define RESERVE1 0x06 */ /* 予備 1*/ /* #define RESERVE2 0x07 */ /* 予備 2*/5−2)constant.h
constant.h には、走行距離や制御定と壁データの初期値などの、調整が必要な制御定数が設定してある。/* mouseの走行速度 speed_select に代入する加速テーブルadressの offset(初速) */ #define speed_0 0 /* 探査時の速度 offset zero */ #define speed_1 (15+ 10+ 5) /* 探査時の速度 offset 15 */ #define speed_2 (30+ 20+ 15) /* 探査時の速度 offset 30 */ #define speed_3 (45+ 30+ 20) /* 探査時の速度 offset 45 */ #define speed_4 (55+ 40+ 25) /* 探査時の速度 offset 55 */ /* 直進走行の区画数 */ /* 最大速度 6区画以上直進 3区画加速 --> 1+ x 区画定常走行 --> 2区画減速 最大速度走行 基本概念 加速パルス数は、減速できるパルス数によって決定され、減速は加速の2倍の減速レートで減速する。 従って、減速走行の距離を、加速する距離の1/2以上を確保すれば減速する距離が不足することは無い。 */ #define general_enter_secsion 5 /* 定常走行 最大速度に入るまでの走行区画数 */ #define general_accele_secsion 3 /* 定常走行 最大速度までの加速区画数 */ #define general_reduce_secsion 2 /* 定常走行 最大速度からの減速区画数 */ #define aslant_enter_secsion 5 /* 斜め走行 最大速度に入るまでの走行区画数 */ #define aslant_accele_secsion 3 /* 斜め走行 最大速度までの加速区画数 */ #define aslant_reduce_secsion 2 /* 斜め走行 最大速度からの減速区画数 */ /* 斜め走行対応 slalom data */ /* 45deg 斜め走行対応 slalom */ /*#define SLA_45DEG 295 /* 45deg slaom 仮想車輪 pulse数 */ #define SLA_45DEG 280 /* 295- 15 45deg slaom 仮想車輪 pulse数 */ /* 90deg 斜め走行対応 slalom */ /* #define SLA_90DEG 345 /* 345 90deg slaom 仮想車輪 pulse数 */ #define SLA_90DEG (296- 3) /* 345- 49 90deg slaom 仮想車輪 pulse数 */ /* 90deg V_turn(半径 80mm) data */ /*#define SLA_90V80DEG 306 /* 90deg V_turn(半径 80mm) 仮想車輪 pulse数 */ #define SLA_90V80DEG 249 /* 306- 57 90deg V_turn(半径 80mm) 仮想車輪 pulse数 */ /* 90deg V_turn(半径 70mm) data */ /*#define SLA_90V70DEG 268 /* 90deg V_turn(半径 70mm) 仮想車輪 pulse数 */ #define SLA_90V70DEG (201- 7) /* 256- 67 90deg V_turn(半径 70mm) 仮想車輪 pulse数 */ /* 135deg 斜め走行対応 slalom */ /*#define SLA_135DEG 454 /* 135deg slaom 仮想車輪 pulse数 */ /*#define SLA_135DEG 389 /* 454- 65 135deg slaom 仮想車輪 pulse数 */ #define SLA_135DEG (374- 15) /* 454- 65- 15 135deg slaom 仮想車輪 pulse数 */ /* 180deg 斜め走行対応 slalom */ #define SLA_180DEG 592 /* 180deg slaom 仮想車輪 pulse数 */ /* 旋回に進入するときの減速パルス数 */ #define REDUCE45 0 ; /* 45 deg 旋回に進入するときの減速パルス数 */ #define REDUCE9070 50 ; /* 90 deg_R70 旋回に進入するときの減速パルス数 */ #define REDUCE9080 30 ; /* 90 deg_R80 旋回に進入するときの減速パルス数 */ #define REDUCE9090 15 ; /* 90 deg_R90 旋回に進入するときの減速パルス数 */ #define REDUCE135 75 ; /* 135 deg_R70 旋回に進入するときの減速パルス数 */ #define REDUCE180 15 ; /* slalom V_turn時に、直進する距離 */ #define STRAIGHT10 24 /* 10mm直進する距離(パルス数) 10mm/0.41 is 24.39 パルス */ #define STRAIGHT20 49 /* 20mm直進する距離(パルス数) 20mm/0.41 is 48.78 パルス */ /* slalom時に、横壁を確認する位置(残りの走行距離) */ #define LOOK45 20 #define LOOK90 30 #define LOOK135 40 /* 斜め走行時に、減算する走行距離 */ #define SUBD45 156 /* SUBD45 is 63.97mm/0.41mm 156.02 パルス */ /* #define SUBD90 65 /* SUBD90 is 26.50mm/0.41mm 64.63 パルス */ #define SUBD90 5 /* SUBD90 is 26.50mm/0.41mm 64.63 パルス */ #define SUBD135 27 /* SUBD135 is 10.97mm/0.41mm 26,75 パルス */ /* 斜め走行時に、姿勢制御を停止する距離 */ #define REVISION_SLEEP 100 /* 0.41mm* 100 is 41mm */ /* 仮設定する壁data No_1 公式迷路 */ #ifdef KoushikiMeiro #define Right_Front_MAX 515 /* 右・前壁data */ #define Right_Front_MID 285 #define Right_Front_MIN 196 /* org data is 196 */ #define Right_Side_MAX 483 /* 右・横壁data */ #define Right_Side_MID 410 #define Right_Side_MIN 214 #define Left_Side_MAX 376 /* 左・横壁data */ #define Left_Side_MID 428 #define Left_Side_MIN 206 #define Left_Front_MAX 533 /* 左・前壁data */ #define Left_Front_MID 364 #define Left_Front_MIN 251 /* org data is 176 */ #endif /* 仮設定する壁data No_2 自作迷路 2005/02/14 */ #ifdef JisakuMeiro #define Right_Front_MAX 604 /* 右・前壁data */ #define Right_Front_MID 204 #define Right_Front_MIN 139 #define Right_Side_MAX 475 /* 右・横壁data */ #define Right_Side_MID 391 #define Right_Side_MIN 172 #define Left_Side_MAX 467 /* 左・横壁data */ #define Left_Side_MID 267 #define Left_Side_MIN 137 #define Left_Front_MAX 655 /* 左・前壁data */ #define Left_Front_MID 243 #define Left_Front_MIN 162 #endif /* 仮設定する壁data No_2 自作迷路 2002/12/12 */ #ifdef JisakuMeiroOLD #define Right_Front_MAX 496 /* 右・前壁data */ #define Right_Front_MID 189 #define Right_Front_MIN 134 /* org data is 111 */ #define Right_Side_MAX 475 /* 右・横壁data */ #define Right_Side_MID 391 #define Right_Side_MIN 172 #define Left_Side_MAX 467 /* 左・横壁data */ #define Left_Side_MID 267 #define Left_Side_MIN 137 #define Left_Front_MAX 517 /* 左・前壁data */ #define Left_Front_MID 211 #define Left_Front_MIN 145 /* org data is 120 */ #endif
6)広域変数
かつて、Cのプログラムは広域変数をなるべく使わずに、各ルーチンの関係がなるべく疎になるように組むのがベターだと教えていただいた。で、いろいろ頑張ったが、あたしには無理だった。
広域変数使いまくり、ルーチンの関係は新婚さんみたいにベッタベッタ。私が使うんだからえぇ〜だろさ。
以下が設定した広域変数とヘッダーファイル。注意点は、スタートアップルーチン内でアセンブラで組んだ配列変数は、ヘッダーファイルで外部変数の宣言をしてあるところ。
6−1)広域変数
#include "d:\standardDef.h" /* 標準的な定数data & インターフェイス・制御系のマクロ */ #include "d:\constant.h" /* mouseの走行に必要な標準的な定数data */ /* 迷路解析 */ UCHAR axis,axis_x ; UCHAR dir,dir_x,rot_dir ; UCHAR goal_axis,goal_dir ; UCHAR route_map_adress ; /* route_map adress */ UCHAR mode ; /* 探査mode */ UCHAR search_flag ; /* 未探索の座標が無区なった、探査終了 then search_flag is 0xff */ UCHAR deside_flag ; /* 迷路解析と走行mode */ UCHAR possible_continue ; /* if 0x00 then 1歩で未探査の座標に行ける */ UCHAR running_condition ; /* マウスは連続走行をしていた or Not */ UCHAR running_mode ; /* 走行modeと走行速度を記憶 */ /* 探査走行 or 高速走行 && 斜め走行 or 定常走行 */ UCHAR first_RevolutionAbsDir ; /* 最初に旋回する絶対方向 */ UCHAR final_goal_axis ; /* goalの4区画の最後のgoalの座標を記憶 */ UCHAR final_absolute_direction ; /* 最後の絶対方向を記憶 */ UCHAR map_renewal ; /* 壁データを迷路地図に記入する or Not */ SSHORT weight ; /* 旋回の重み 16ビット処理 */ SSHORT WDT_counter ; /* WDT(ウオッチドックタイマ)経過時間count 65.536msec* WDT_counter */ UCHAR axis_mem ; /* 未探査の座標の記憶 */ UCHAR axis_cnt ; /* 仮想マウスが溯り始める座標を記憶 */ SSHORT step_mem ; /* 歩数 一時記憶 16ビット */ /* mapに記入するため、壁の有無を記憶するフラグ */ UCHAR volatile front_wall, side_wall ; /* 壁data設定のため、壁の有無を記憶 */ /* 以下は探査走行中の制御に必要な広域変数 */ /* volatile SCHAR emergency ; /* 緊急停止flag dip_switchの入力待ちに戻る */ UCHAR volatile wall_condition ; /* 壁合わせのための基本data */ UCHAR revision_flag ; /* 姿勢制御を する or Not */ UCHAR turn_direction ; /* 旋回方向 記憶 */ /* 未使用 UCHAR running_direction ; */ /* 進行方向 前進 or 後進 or 斜め走行 */ SSHORT mark_distance ; /* 目標走行距離 */ SSHORT error_pulse ; /* 走行距離の誤差 or start位置の調整 */ volatile SSHORT position_now,distance_compare ; /* 設定距離を走行する */ /* time attack 中の制御に必要な広域変数 */ SCHAR speed_level ; /* 最高速度まで加速した or Not */ UCHAR step_high ; /* 高速走行 直進区画数 記憶 */ UCHAR dir_high, dir_high_old ; /* 高速走行 旋回方向 記憶 */ /* 加速・減速 & 姿勢制御 共通 */ UCHAR dir_high, dir_high_old ; /* 高速走行 旋回方向 記憶 */ UCHAR current_flows ; /* motor の電流値(A/D.Cに書きこむ値)を記憶 */ SSHORT subtract_pulse ; /* 走行速度に合わせて 早めに slalomeに進入するパルス数 */ UCHAR accele_condition ; /* 加速中 or 定常走行中 or 減速中 */ SSHORT accele_pulse,reduce_pulse ; /* 加速 & 減速 pulse数 */ SSHORT difference_accele_pulse ; /* 加速パルス数の不足分を記憶 */ SSHORT distance_reduce,reduce_pulse_mem ; /* 減速パルス数 */ UCHAR revision_direction,old_revision_direction ; /* 姿勢制御の方向 */ volatile SSHORT revisLM,revisRM ; /* revision price 制御値 */ volatile SSHORT propoFL,propoFR ; /* proportion price 比例値 */ /* volatile SSHORT diffeFL,diffeFR ; */ /* differential price 微分値 */ volatile SSHORT integFL,integFR ; /* integral price 積分値 */ /* SSHORT deflecation_integral ; */ /* 偏差の積分値 */ /* stepping motor の 加速・減速 */ UCHAR current ; /* motor の電流値(A/D.Cに書きこむ値) */ SSHORT accele_adress ; /* 仮想車輪の現在の 速度data adress を記憶 */ SSHORT speed_select ; /* 走行速度を変更するための、速度data table の offset */ SSHORT reduce_limit, reduce_limit_mem ; /* 最低速度(slalom進入速度) 記憶 */ SSHORT left_motor_adress,right_motor_adress ; /* 励磁data adress 記憶 */ SCHAR Left_Reiji, Right_Reiji ; /* 励磁data 記憶 */ /* アナログ・センサ */ volatile SCHAR sens_number ; /* データを読み込むA/D.Cの番号を記憶 */ volatile SSHORT analog[4] ; /* アナログ・センサの値を記憶 */ volatile SSHORT analog_old[4] ; /* アナログ・センサの値を記憶 */ /* センサのdataと比較する値を記憶 */ SSHORT left_side_max, left_side_mid, left_side_min ; SSHORT left_front_max, left_front_mid, left_front_min ; SSHORT right_front_max, right_front_mid, right_front_min ; SSHORT right_side_max, right_side_mid, right_side_min ; /*==================================================================================================*/ /* 迷路地図 */ /*==================================================================================================*/ UCHAR cris_map[5] ; /* 5区画後方を走る仮想マウスの座標map */ UCHAR wall_map[256] ; /* 壁data_map wall_map (y+x) */ USHORT step_map[256] ; /* 歩数 map 16 bit data */ UCHAR route_map[256] ; /* route_mapは、1次元のmap */ UCHAR axis_map[256] ; UCHAR axis_new_map[256] ; UCHAR direc_map[256] ;
6−1)広域変数のヘッダーファイル#include "d:\standardDef.h" /* 標準的な定数data & インターフェイス・制御系のマクロ */ #include "d:\constant.h" /* mouseの走行に必要な標準的な定数data */ /* 迷路解析 */ extern UCHAR axis,axis_x ; extern UCHAR dir,dir_x,rot_dir ; extern UCHAR goal_axis,goal_dir ; extern UCHAR route_map_adress ; /* route_map adress */ extern UCHAR mode ; /* 探査mode */ extern UCHAR search_flag ; /* 未探索の座標が無区なった、探査終了 then search_flag is 0xff */ extern UCHAR deside_flag ; /* 迷路解析と走行mode */ extern UCHAR possible_continue ; /* if 0x00 then 1歩で未探査の座標に行ける */ extern UCHAR running_condition ; /* マウスは連続走行をしていた or Not */ extern UCHAR running_mode ; /* 走行modeと走行速度を記憶 */ /* 探査走行 or 高速走行 && 斜め走行 or 定常走行 */ extern UCHAR first_RevolutionAbsDir ; /* 最初に旋回する絶対方向 */ extern UCHAR final_goal_axis ; /* goalの4区画の最後のgoalの座標を記憶 */ extern UCHAR final_absolute_direction ; /* 最後の絶対方向を記憶 */ extern UCHAR map_renewal ; /* 壁データを迷路地図に記入する or Not */ extern SSHORT weight ; /* 旋回の重み 16ビット処理 */ extern SSHORT WDT_counter ; /* WDT(ウオッチドックタイマ)経過時間count 65.536msec* WDT_counter */ extern UCHAR axis_mem ; /* 未探査の座標の記憶 */ extern UCHAR axis_cnt ; /* 仮想マウスが溯り始める座標を記憶 */ extern SSHORT step_mem ; /* 歩数 一時記憶 16ビット */ /* mapに記入するため、壁の有無を記憶するフラグ */ extern volatile UCHAR front_wall, side_wall ; /* 壁data設定のため、壁の有無を記憶 */ /* 走行中の制御 */ /* extern volatile SCHAR emergency ; /* 緊急停止flag dip_switchの入力待ちに戻る */ extern volatile UCHAR wall_condition ; /* 壁合わせのための基本data */ extern UCHAR revision_flag ; /* 姿勢制御を する or Not */ extern UCHAR turn_direction ; /* 旋回方向 記憶 */ /* 未使用 extern UCHAR running_direction ; */ /* 進行方向 前進 or 後進 or 斜め走行 */ extern SSHORT mark_distance ; /* 目標走行距離 */ extern SSHORT error_pulse ; /* 走行距離の誤差 or start位置の調整 */ extern volatile SSHORT position_now,distance_compare ; /* 設定距離を走行する */ /* time attack 中の制御に必要な広域変数 */ extern SCHAR speed_level ; /* 最高速度まで加速した or Not */ extern UCHAR step_high ; /* 高速走行 直進区画数 記憶 */ extern UCHAR dir_high, dir_high_old ; /* 高速走行 旋回方向 記憶 */ /* 加速・減速 & 姿勢制御 共通 */ extern SSHORT subtract_pulse ; /* 走行速度に合わせて 早めに slalomeに進入するパルス数 */ extern UCHAR current_flows ; /* motor の電流値(A/D.Cに書きこむ値)を記憶 */ extern UCHAR accele_condition ; /* 加速中 or 定常走行中 or 減速中 */ extern SSHORT accele_pulse,reduce_pulse ; /* 加速 & 減速 pulse数 */ extern SSHORT difference_accele_pulse ; /* 加速パルス数の不足分を記憶 */ extern SSHORT distance_reduce,reduce_pulse_mem ; /* 減速パルス数 */ extern UCHAR revision_direction,old_revision_direction ; /* 姿勢制御の方向 */ extern volatile SSHORT revisLM,revisRM ; /* revision price 制御値 */ extern volatile SSHORT propoFL,propoFR ; /* proportion price 比例値 */ /* extern volatile SSHORT diffeFL,diffeFR ; */ /* differential price 微分値 */ extern volatile SSHORT integFL,integFR ; /* integral price 積分値 */ /* extern SSHORT deflecation_integral ; */ /* 偏差の積分値 */ /* stepping motor の 加速・減速 */ extern UCHAR current ; /* motor の電流値(A/D.Cに書きこむ値) */ extern SSHORT accele_adress ; /* 仮想車輪の現在の 速度data adress を記憶 */ extern SSHORT speed_select ; /* 走行速度を変更するための、速度data table の offset */ extern SSHORT reduce_limit, reduce_limit_mem ; /* 最低速度(slalom進入速度) 記憶 */ extern SSHORT left_motor_adress,right_motor_adress ; /* 励磁data adress 記憶 */ extern SCHAR Left_Reiji, Right_Reiji ; /* 励磁data 記憶 */ /* アナログ・センサ */ extern volatile SCHAR sens_number ; /* データを読み込むA/D.Cの番号を記憶 */ extern volatile SSHORT analog[4] ; /* アナログ・センサの値を記憶 */ extern volatile SSHORT analog_old[4] ; /* アナログ・センサの値を記憶 */ /* センサのdataと比較する値を記憶 */ extern SSHORT left_side_max, left_side_mid, left_side_min ; extern SSHORT left_front_max, left_front_mid, left_front_min ; extern SSHORT right_front_max, right_front_mid, right_front_min ; extern SSHORT right_side_max, right_side_mid, right_side_min ; /*==================================================================================================*/ /* 迷路地図 */ /*==================================================================================================*/ extern UCHAR cris_map[5] ; /* 5区画後方を走る仮想マウスの座標map */ extern UCHAR wall_map[256] ; /* 壁data_map wall_map (y+x) */ extern USHORT step_map[256] ; /* 歩数 map 16 bit data */ extern UCHAR route_map[256] ; /* route_mapは、1次元のmap */ extern UCHAR axis_map[256] ; extern UCHAR axis_new_map[256] ; extern UCHAR direc_map[256] ; /*==================================================================================================*/ /* 壁データのローテーションとLEDのdata */ /*==================================================================================================*/ /* 方向データのローテーション 相対方向を絶対方向に直す */ /* direction_rot[絶対方向 dir][相対方向 dir_new] ; */ extern const UCHAR direction_rot[4][4] ; /* 相対方向を絶対方向に直す */ /* wall_set_rot[絶対方向] 絶対方向に対応する壁dataを読み込む */ extern const UCHAR wall_set_rot[4] ; /* 絶対方向に対応する壁dataを読み込む */ extern const UCHAR wall_res_rot[4] ; /* LEDの点燈データ */ extern const UCHAR led_data1[15] ; extern const UCHAR led_data2[5][5] ; extern const UCHAR led_Left[35] ; extern const UCHAR led_Center[10] ; extern const UCHAR led_Right[35] ; /* 励磁data(2相励磁) */ extern const UCHAR reiji_R[8] ; extern const UCHAR reiji_L[8] ; /* 励磁data(1−2相励磁) */ extern const UCHAR reiji_R12[8] ; extern const UCHAR reiji_L12[8] ; /* 加速data(時定数) */ extern const USHORT accele121[2150] ; extern const USHORT r901out[350] ;