2017a/Member/Kenty/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2017a/Member]]
#contents
* 課題内容 [#mb855a0c]
今回の課題は、光センサを使用して図のコースを指定の経路...
~ 詳しい内容は[[2017a/Mission2]]を参照してほしい。
#ref(./課題2 コース.jpg,80%,コースの図)
** 走行コース [#cf89eeb5]
「E地点直進コース」と「E地点右折コース」の内、「E地...
~ E→P→Q→R→T→T→H→G→S→P→Q→F→E→A
* ロボット本体 [#p0da3634]
ロボット本体はできるだけシンプルかつコンパクトな形状を...
#ref(./ロボット全体.jpg,8%,ロボット全体の写真)
ロボット本体を組み立てるのに当たって、できるだけ小回り...
また、はじめはセンサーとタイヤとの距離を少し遠く配置し...
#ref(./タイヤ・センサ距離.jpg,80%,タイヤとセンサの距離の...
* プログラム [#d31854c8]
** 定数・マクロ・グローバル変数 定義 [#z84376a1]
/*---------- 定数・マクロ 定義 -----------*/
/* 閾値設定 */
#define LINE_BLACK 38 //黒
#define THRESHOLD_LOW 40 //閾値最小(黒より)
#define THRESHOLD_HIGH 47 //閾値最大(白より)
#define LINE_WHITE 49 //白
/* 動作 */
#define FOWORD OnFwd(OUT_AC); //直進
#define BACK OnRev(OUT_AC); //後退
#define STOP Off(OUT_AC); //停止
#define TURN_LEFT OnFwd(OUT_C); OnRev(OUT_A); //左旋回
#define TURN_RIGHT OnFwd(OUT_A); OnRev(OUT_C); //右旋回
#define CURVE_LEFT OnFwd(OUT_C); Off(OUT_A); //左折
#define CURVE_RIGHT OnFwd(OUT_A); Off(OUT_C); //右折
/* 交差点判定用の時間 */
#define TIME_MAX_N 26 //T→G間以外での交差点判定までの...
#define TIME_MAX_TG 33 //T→G間での交差点判定までの時間
/*----------- グローバル変数 定義 ----------*/
int timer = 0; //黒反応時間
int time_max = 0; //交差点判定用
『動作』のマクロについてはプログラムのコメント文で説明...
また、"TIME_MAX_N"と"TIME_MAX_TG"、"timer"、"timer_max"...
*** 閾値設定 [#v1fd56d9]
ライントレースをする際に、黒線と白線が境界できっちり分...
#ref(./閾値説明図.jpg,30%,閾値説明図)
** サブルーチン [#ye8c85a8]
サブルーチンは、ラインをトレースするためのものを"Follow...
/*---------- ラインの右側を走行 ----------*/
sub Follow_Line_R()
{
while(timer < time_max){
if(SENSOR_2 > LINE_WHITE){
TURN_LEFT;
ClearTimer(0);
}
else if(SENSOR_2 > THRESHOLD_HIGH){
CURVE_LEFT;
ClearTimer(0);
}
else if(SENSOR_2 > THRESHOLD_LOW){
FOWORD;
ClearTimer(0);
}
else if(SENSOR_2 > LINE_BLACK){
CURVE_RIGHT;
ClearTimer(0);
}
else{
TURN_RIGHT;
}
timer = FastTimer(0);
}
timer = 0;
}
/*---------- ライン左側を走行 ----------*/
sub Follow_Line_L()
{
while(timer < time_max){
if(SENSOR_2 > LINE_WHITE){
TURN_RIGHT;
ClearTimer(0);
}
else if(SENSOR_2 > THRESHOLD_HIGH){
CURVE_RIGHT;
ClearTimer(0);
}
else if(SENSOR_2 > THRESHOLD_LOW){
FOWORD;
ClearTimer(0);
}
else if(SENSOR_2 > LINE_BLACK){
CURVE_LEFT;
ClearTimer(0);
}
else{
TURN_LEFT;
}
timer = FastTimer(0);
}
timer = 0;
}
*** ラインのトレース [#xbdf63fa]
定数・マクロのところで説明したように、閾値によって黒と...
#ref(./動作説明図.jpg,30%,動作説明図)
*** 交差点判断 [#aeb20d7e]
交差点に差し掛かるとき、光センサは長い間黒を認識してい...
** メインタスク [#w913d29c]
メインタスクは、大きく分けて光センサとモーターのパワー...
/*---------- メインタスク ----------*/
task main()
{
/* 光センサ・モータパワー 設定 */
SetSensor(SENSOR_2 , SENSOR_LIGHT);
SetPower(OUT_AC , 3);
/* 動作部分 */
// A地点→E地点 ----------------------------------------
time_max = TIME_MAX_N;
Follow_Line_R();
// E地点 到達
// SOUND_UP & 右折
PlaySound(SOUND_UP);
TURN_RIGHT;
until(SENSOR_2 > THRESHOLD_HIGH);
// E地点→P地点 ----------------------------------------
Follow_Line_R();
// P地点 到達 (一時停止)
// SOUND_DOWN & 左折
PlaySound(SOUND_DOWN);
STOP;
Wait(100);
TURN_LEFT;
until(SENSOR_2 > THRESHOLD_HIGH);
// P地点→Q地点 ----------------------------------------
Follow_Line_L();
// Q地点 到達
// SOUND_DOWN & 直進(効率化のため右折による横断)
PlaySound(SOUND_UP);
CURVE_RIGHT;
until(SENSOR_2 > THRESHOLD_HIGH);
// Q地点→R地点 ----------------------------------------
Follow_Line_L();
// R地点 到達
// SOUND_UP & 左折
PlaySound(SOUND_UP);
TURN_LEFT;
until(SENSOR_2 > THRESHOLD_HIGH);
// R地点→T地点 ----------------------------------------
Follow_Line_L();
// T地点 到達(一時停止)
// SOUND_DOWN & 直進
PlaySound(SOUND_DOWN);
STOP;
Wait(100);
FOWORD;
until(SENSOR_2 > THRESHOLD_HIGH);
// T地点→T地点 ----------------------------------------
time_max = TIME_MAX_TG;
Follow_Line_L();
// T地点 到達(一時停止)
// SOUND_DOWN & 直進(ライン右側へ移動)
PlaySound(SOUND_DOWN);
STOP;
Wait(100);
CURVE_RIGHT;
until(SENSOR_2 > THRESHOLD_HIGH);
until(SENSOR_2 < THRESHOLD_LOW);
until(SENSOR_2 > THRESHOLD_HIGH);
// T地点→H地点 ----------------------------------------
Follow_Line_R();
// H地点 到達
// SOUND_UP & 右折
PlaySound(SOUND_UP);
CURVE_RIGHT;
until(SENSOR_2 > THRESHOLD_HIGH);
// H地点→地点G ----------------------------------------
Follow_Line_R();
// G地点 到達
// SOUND_UP & 直進
PlaySound(SOUND_UP);
FOWORD;
until(SENSOR_2 > THRESHOLD_HIGH);
// G地点→S地点 ----------------------------------------
time_max = TIME_MAX_N;
Follow_Line_L();
// S地点 到達(一時停止)
// SOUND_DOWN & 左折
PlaySound(SOUND_DOWN);
STOP;
Wait(100);
TURN_LEFT;
until(SENSOR_2 > THRESHOLD_HIGH);
// S地点→P地点 ----------------------------------------
Follow_Line_L();
// P地点 到達
// SOUN_UP & 直進(効率化のために右折による横断)
PlaySound(SOUND_UP);
CURVE_RIGHT;
until(SENSOR_2 > THRESHOLD_HIGH);
// P地点→Q地点 ----------------------------------------
Follow_Line_L();
// Q地点 到達
// SOUND_UP & 左折(ライン右側へ移動)
PlaySound(SOUND_UP);
CURVE_RIGHT;
until(SENSOR_2 > THRESHOLD_HIGH);
// Q地点→F地点 ----------------------------------------
Follow_Line_R();
// F地点 到達
// SOUND_UP & 左折(直進によってライン横断)
PlaySound(SOUND_UP);
FOWORD;
until(SENSOR_2 > THRESHOLD_HIGH);
// F地点→E地点 ----------------------------------------
Follow_Line_L();
// E地点 到達
//(直進による横断)
FOWORD;
until(SENSOR_2 > THRESHOLD_HIGH);
// E地点→A地点 ----------------------------------------
Follow_Line_L();
// A地点 到達
// ライン横断後、A地点内で停止
PlaySound(SOUND_DOWN);
CURVE_RIGHT;
until(SENSOR_2 > THRESHOLD_HIGH);
FOWORD;
Wait(70);
STOP;
//ゴール
}
*** 動作部分 [#y4f56eef]
基本的には、次の動作の繰り返しで走行している。
~ ("time_max"の設定)~
?ラインの右もしくは左を走行~
?交差点到達時に音を鳴らし、指定がある場合には一時停止~
?交差点を横断~
~ 『"time_max"の設定』に関しては、T地点からG地点まで範囲...
* まとめ [#x28c86bc]
今回の課題は閾値の値と交差点判断のための時間の両方の設...
また、交差点を横断するときに、できるだけ複雑な動きは避...
終了行:
[[2017a/Member]]
#contents
* 課題内容 [#mb855a0c]
今回の課題は、光センサを使用して図のコースを指定の経路...
~ 詳しい内容は[[2017a/Mission2]]を参照してほしい。
#ref(./課題2 コース.jpg,80%,コースの図)
** 走行コース [#cf89eeb5]
「E地点直進コース」と「E地点右折コース」の内、「E地...
~ E→P→Q→R→T→T→H→G→S→P→Q→F→E→A
* ロボット本体 [#p0da3634]
ロボット本体はできるだけシンプルかつコンパクトな形状を...
#ref(./ロボット全体.jpg,8%,ロボット全体の写真)
ロボット本体を組み立てるのに当たって、できるだけ小回り...
また、はじめはセンサーとタイヤとの距離を少し遠く配置し...
#ref(./タイヤ・センサ距離.jpg,80%,タイヤとセンサの距離の...
* プログラム [#d31854c8]
** 定数・マクロ・グローバル変数 定義 [#z84376a1]
/*---------- 定数・マクロ 定義 -----------*/
/* 閾値設定 */
#define LINE_BLACK 38 //黒
#define THRESHOLD_LOW 40 //閾値最小(黒より)
#define THRESHOLD_HIGH 47 //閾値最大(白より)
#define LINE_WHITE 49 //白
/* 動作 */
#define FOWORD OnFwd(OUT_AC); //直進
#define BACK OnRev(OUT_AC); //後退
#define STOP Off(OUT_AC); //停止
#define TURN_LEFT OnFwd(OUT_C); OnRev(OUT_A); //左旋回
#define TURN_RIGHT OnFwd(OUT_A); OnRev(OUT_C); //右旋回
#define CURVE_LEFT OnFwd(OUT_C); Off(OUT_A); //左折
#define CURVE_RIGHT OnFwd(OUT_A); Off(OUT_C); //右折
/* 交差点判定用の時間 */
#define TIME_MAX_N 26 //T→G間以外での交差点判定までの...
#define TIME_MAX_TG 33 //T→G間での交差点判定までの時間
/*----------- グローバル変数 定義 ----------*/
int timer = 0; //黒反応時間
int time_max = 0; //交差点判定用
『動作』のマクロについてはプログラムのコメント文で説明...
また、"TIME_MAX_N"と"TIME_MAX_TG"、"timer"、"timer_max"...
*** 閾値設定 [#v1fd56d9]
ライントレースをする際に、黒線と白線が境界できっちり分...
#ref(./閾値説明図.jpg,30%,閾値説明図)
** サブルーチン [#ye8c85a8]
サブルーチンは、ラインをトレースするためのものを"Follow...
/*---------- ラインの右側を走行 ----------*/
sub Follow_Line_R()
{
while(timer < time_max){
if(SENSOR_2 > LINE_WHITE){
TURN_LEFT;
ClearTimer(0);
}
else if(SENSOR_2 > THRESHOLD_HIGH){
CURVE_LEFT;
ClearTimer(0);
}
else if(SENSOR_2 > THRESHOLD_LOW){
FOWORD;
ClearTimer(0);
}
else if(SENSOR_2 > LINE_BLACK){
CURVE_RIGHT;
ClearTimer(0);
}
else{
TURN_RIGHT;
}
timer = FastTimer(0);
}
timer = 0;
}
/*---------- ライン左側を走行 ----------*/
sub Follow_Line_L()
{
while(timer < time_max){
if(SENSOR_2 > LINE_WHITE){
TURN_RIGHT;
ClearTimer(0);
}
else if(SENSOR_2 > THRESHOLD_HIGH){
CURVE_RIGHT;
ClearTimer(0);
}
else if(SENSOR_2 > THRESHOLD_LOW){
FOWORD;
ClearTimer(0);
}
else if(SENSOR_2 > LINE_BLACK){
CURVE_LEFT;
ClearTimer(0);
}
else{
TURN_LEFT;
}
timer = FastTimer(0);
}
timer = 0;
}
*** ラインのトレース [#xbdf63fa]
定数・マクロのところで説明したように、閾値によって黒と...
#ref(./動作説明図.jpg,30%,動作説明図)
*** 交差点判断 [#aeb20d7e]
交差点に差し掛かるとき、光センサは長い間黒を認識してい...
** メインタスク [#w913d29c]
メインタスクは、大きく分けて光センサとモーターのパワー...
/*---------- メインタスク ----------*/
task main()
{
/* 光センサ・モータパワー 設定 */
SetSensor(SENSOR_2 , SENSOR_LIGHT);
SetPower(OUT_AC , 3);
/* 動作部分 */
// A地点→E地点 ----------------------------------------
time_max = TIME_MAX_N;
Follow_Line_R();
// E地点 到達
// SOUND_UP & 右折
PlaySound(SOUND_UP);
TURN_RIGHT;
until(SENSOR_2 > THRESHOLD_HIGH);
// E地点→P地点 ----------------------------------------
Follow_Line_R();
// P地点 到達 (一時停止)
// SOUND_DOWN & 左折
PlaySound(SOUND_DOWN);
STOP;
Wait(100);
TURN_LEFT;
until(SENSOR_2 > THRESHOLD_HIGH);
// P地点→Q地点 ----------------------------------------
Follow_Line_L();
// Q地点 到達
// SOUND_DOWN & 直進(効率化のため右折による横断)
PlaySound(SOUND_UP);
CURVE_RIGHT;
until(SENSOR_2 > THRESHOLD_HIGH);
// Q地点→R地点 ----------------------------------------
Follow_Line_L();
// R地点 到達
// SOUND_UP & 左折
PlaySound(SOUND_UP);
TURN_LEFT;
until(SENSOR_2 > THRESHOLD_HIGH);
// R地点→T地点 ----------------------------------------
Follow_Line_L();
// T地点 到達(一時停止)
// SOUND_DOWN & 直進
PlaySound(SOUND_DOWN);
STOP;
Wait(100);
FOWORD;
until(SENSOR_2 > THRESHOLD_HIGH);
// T地点→T地点 ----------------------------------------
time_max = TIME_MAX_TG;
Follow_Line_L();
// T地点 到達(一時停止)
// SOUND_DOWN & 直進(ライン右側へ移動)
PlaySound(SOUND_DOWN);
STOP;
Wait(100);
CURVE_RIGHT;
until(SENSOR_2 > THRESHOLD_HIGH);
until(SENSOR_2 < THRESHOLD_LOW);
until(SENSOR_2 > THRESHOLD_HIGH);
// T地点→H地点 ----------------------------------------
Follow_Line_R();
// H地点 到達
// SOUND_UP & 右折
PlaySound(SOUND_UP);
CURVE_RIGHT;
until(SENSOR_2 > THRESHOLD_HIGH);
// H地点→地点G ----------------------------------------
Follow_Line_R();
// G地点 到達
// SOUND_UP & 直進
PlaySound(SOUND_UP);
FOWORD;
until(SENSOR_2 > THRESHOLD_HIGH);
// G地点→S地点 ----------------------------------------
time_max = TIME_MAX_N;
Follow_Line_L();
// S地点 到達(一時停止)
// SOUND_DOWN & 左折
PlaySound(SOUND_DOWN);
STOP;
Wait(100);
TURN_LEFT;
until(SENSOR_2 > THRESHOLD_HIGH);
// S地点→P地点 ----------------------------------------
Follow_Line_L();
// P地点 到達
// SOUN_UP & 直進(効率化のために右折による横断)
PlaySound(SOUND_UP);
CURVE_RIGHT;
until(SENSOR_2 > THRESHOLD_HIGH);
// P地点→Q地点 ----------------------------------------
Follow_Line_L();
// Q地点 到達
// SOUND_UP & 左折(ライン右側へ移動)
PlaySound(SOUND_UP);
CURVE_RIGHT;
until(SENSOR_2 > THRESHOLD_HIGH);
// Q地点→F地点 ----------------------------------------
Follow_Line_R();
// F地点 到達
// SOUND_UP & 左折(直進によってライン横断)
PlaySound(SOUND_UP);
FOWORD;
until(SENSOR_2 > THRESHOLD_HIGH);
// F地点→E地点 ----------------------------------------
Follow_Line_L();
// E地点 到達
//(直進による横断)
FOWORD;
until(SENSOR_2 > THRESHOLD_HIGH);
// E地点→A地点 ----------------------------------------
Follow_Line_L();
// A地点 到達
// ライン横断後、A地点内で停止
PlaySound(SOUND_DOWN);
CURVE_RIGHT;
until(SENSOR_2 > THRESHOLD_HIGH);
FOWORD;
Wait(70);
STOP;
//ゴール
}
*** 動作部分 [#y4f56eef]
基本的には、次の動作の繰り返しで走行している。
~ ("time_max"の設定)~
?ラインの右もしくは左を走行~
?交差点到達時に音を鳴らし、指定がある場合には一時停止~
?交差点を横断~
~ 『"time_max"の設定』に関しては、T地点からG地点まで範囲...
* まとめ [#x28c86bc]
今回の課題は閾値の値と交差点判断のための時間の両方の設...
また、交差点を横断するときに、できるだけ複雑な動きは避...
ページ名: