- 追加された行はこの色です。
- 削除された行はこの色です。
[[戻る>2013b/Member]]
#contents
*課題 [#f8d8effa]
自作したコース(下図)に沿って一周するロボットを作成せよ。
-次のステップでプログラムを作成すること。
--交差点をきちんと認識し、正しく判断して通過できるようにする。
--確実に一周できるようにする。スタート地点から出発して元にもどるようにする。
--空き缶を交差点から10cm以上離した線上に起き、それを一旦どけて再び元の位置にもどすように改良する。
--1個の空き缶でうまくいったら、2個の空き缶でやってみる。
~(下図は、授業で示された松本先生画のコース図)&br;
#ref(zu.jpg)&br;
筆者は反時計回りを担当した。
*ロボット [#r5a0698c]
-ドライブベースを小型化した。
-光センサーをより駆動部に近づけた。
-車輪を2つに減らした。
~→小回りがきくようになった。&br;
-支えとして、車輪ではなく底の丸いパーツを使用した。
~→可動部を減らし、故障しうる箇所を減らした。&br;&br;(ドライブベースの写真)
#ref(image_1.jpeg)
#ref(image_2.jpeg)
(ロボットの写真)
#ref(image.jpeg)
*プログラム [#s5e6edef]
**コード [#y86f0d4c]
/*マクロ・定数*/
#define THRESHOLD 45 //ライントレースの閾値
#define set_H SetPower(OUT_AC,7); //直進用速度
#define set_L SetPower(OUT_AC,1); //カーブ用速度
#define turn_l1 set_L;OnFwd(OUT_C);OnRev(OUT_A); //反時計回り旋回
#define turn_l0 set_L;OnFwd(OUT_C);Off(OUT_A); //反時計回り移動
#define turn_r0 set_L;OnFwd(OUT_A);Off(OUT_C); //時計回り移動
#define turn_r1 set_L;OnFwd(OUT_A);OnRev(OUT_C); //時計回り旋回
#define go_fwd set_H;OnFwd(OUT_AC); //前進
#define go_rev set_H;OnRev(OUT_AC); //後退
#define STEP 1 //ライントレースの各動作時間
#define C1 1000 //最初の交差点に近づくまでの時間
#define LAST_C 3000 //最後の交差点に近づくまでの時間
#define TURN_T 74 //90°回転するための所要時間
#define CAN_T 61 //缶の大きさ分だけ進むのに必要な時間
#define Clock FastTimer(0)-AFT+BEF //缶を動かすのに使った時間を除いた時刻
#define NCROSS 5 //交差点を判断するための閾値
#define MOR 100 //交差点を検知したあと、次の交差点を検知し始めるまでの猶予
/*グローバル変数*/
int nline=0; //交差点横断用のカウンタ
int BEF=0; //缶を動かす前の時刻を記録する変数
int AFT=0; //缶を動かした後の時刻を記録する変数
int RCH=0; //反転カウンタ
/*インライン関数*/
void line(){ //ライントレース
if(SENSOR_2<THRESHOLD-7){turn_l1;} //黒い部分を感知したら反時計回り旋回
else if(SENSOR_2<THRESHOLD-5){turn_l0;} //黒寄りの境界を感知したら反時計回り移動
else if(SENSOR_2<THRESHOLD+3){go_fwd;} //境界を探知したら直進
else if(SENSOR_2<THRESHOLD+5){turn_r0;} //白寄りの境界を感知したら時計回り移動
else{turn_r1;} //白い部分を感知したら時計回り旋回
Wait(STEP); //決定した動作を一定時間行う
}
void line_r(){ //方向を反転したライントレース
if(SENSOR_2<THRESHOLD-7){turn_r1;}
else if(SENSOR_2<THRESHOLD-5){turn_r0;}
else if(SENSOR_2<THRESHOLD+3){go_fwd;}
else if(SENSOR_2<THRESHOLD+5){turn_l0;}
else{turn_l1;}
Wait(STEP);
}
void line_c(){ //ライントレース(交差点探索用)
if(SENSOR_2<THRESHOLD-7){turn_l1;nline++;} //黒い場所を検知したらカウンタに 1 加える
else{ //その他の場合はカウンタを 0 に戻す
if(SENSOR_2<THRESHOLD-5){turn_l0;}
else if(SENSOR_2<THRESHOLD+3){go_fwd;}
else if(SENSOR_2<THRESHOLD+5){turn_r0;}
else{turn_r1;}
nline=0;
}
Wait(STEP);
}
/*サブルーチン*/
sub cross(){ //交差点横断サブルーチン
Off(OUT_AC);PlaySound(2);Wait(10); //交差点を渡り始めることを知らせる
turn_r1;Wait(TURN_T/2); //方向修正
go_fwd;Wait(40); //交差点を渡る
if(Clock<LAST_C){turn_r1;until(SENSOR_2<THRESHOLD+5);} //ライン上に戻す
else{turn_l1;until(SENSOR_2<THRESHOLD+5);RCH++;} //最後の交差点は逆回転でライン上に戻す
nline=0; //カウンタをリセット
ClearTimer(1); //一定時間は交差点を検知しないようにする。
}
sub canturn(){ //缶移動サブルーチン
BEF=FastTimer(0); //実行前の時刻を記録
Off(OUT_AC);PlaySound(5);Wait(10); //缶を動かし始めることを知らせる
go_fwd;Wait(CAN_T); //缶と一緒にドライブ長だけ進む
turn_l1;Wait(2*TURN_T); //缶と一緒に180°反時計回り旋回
go_rev;Wait(CAN_T);turn_r1;Wait(2*TURN_T); //缶を置いてライントレースの位置へ戻る
AFT=FastTimer(0)+CAN_T; //実行後の時刻+αを記録
}
/*メインタスク*/
task main(){
SetSensor(SENSOR_1,SENSOR_TOUCH);
SetSensor(SENSOR_2,SENSOR_LIGHT);
ClearTimer(0); //走行時間タイマー
ClearTimer(1); //交差点用タイマー
go_fwd;until(SENSOR_2>=THRESHOLD+4);PlaySound(2);Off(OUT_AC); //スタート直後の交差点を超えるまで前進
turn_r1;until(SENSOR_2<=THRESHOLD-5);PlaySound(2);Off(OUT_AC); //黒いところを感知するまで時計回り旋回
while(true){
while(Clock<C1||FastTimer(1)<MOR){
if(SENSOR_1==0){line();} //ライントレース
else{canturn();} //缶を検知したら移動させる
}
while(Clock>=C1&&RCH==0&&FastTimer(1)>=MOR){
if(SENSOR_1==0){
if(nline>=NCROSS){cross();} //黒い部分を一定以上連続で検知したら交差点を渡る
else{line_c();} //交差点を探しながらライントレース
}
else{canturn();} //缶を検知したら移動させる
}
while(RCH>=1){ //反転カウンタに値が入ったら
if(SENSOR_1==0){line_r();} //ライントレース
else{canturn();} //缶を検知したら移動させる
}
}
}
**プログラムの詳細(編集中) [#mbb5ecf3]
***ポイントA [#ja4d8cb7]
1.まず白い部分を検知するまで前進する。
2.その後黒い部分を検知するまで時計回り旋回を行う。
1.まず白い部分を検知するまで前進する。~
2.その後黒い部分を検知するまで時計回り旋回を行う。~
この部分を通常のライントレースで通過しようとすると、最初にロボットを置いた場所によっては時計回りコースへ進入してしまうので、このような方法をとった。
***ポイントBまでの間 [#r0146767]
1. 開始後10秒経過するまでは通常のライントレースを行う
2.10秒経過したら、黒い部分を連続で検知した回数の記録(交差点探索)を始める。
3.記録した回数が5回になったら、交差点横断サブルーチンを実行する。
4.交差点横断後1秒以内は通常のライントレースを行い、その後交差点探索を再開する。
1. 開始後10秒経過するまでは通常のライントレースを行う。~
2.10秒経過したら、黒い部分を連続で検知した回数の記録(交差点探索)を始める。~
3.記録した回数が5回になったら、交差点横断サブルーチンを実行する。~
4.交差点横断後1秒以内は通常のライントレースを行い、その後交差点探索を再開する。~
開始後10秒以内・交差点横断後1秒以内に交差点探索を行わず通常のライントレースを行うのは、交差点でない部分を誤って交差点と認識してコースから外れてしまうのを防ぐためである。
開始後10秒以内・交差点横断後1秒以内に交差点探索を行わず通常のライントレースを行うのは、交差点でない部分を誤って交差点と認識してコースから外れてしまうのを防ぐためである。~
なお、交差点横断サブルーチンの内容は次項に譲る。
***交差点横断サブルーチン [#x794f54d]
1.停止して、音を発して交差点横断を始めることを知らせる。
2.ロボットがコースに対しておよそ平行になるように、約45°時計回り旋回をする。
1.停止して、音を発して交差点横断を始めることを知らせる。~
2.ロボットがコースに対しておよそ平行になるように、45°だけ時計回り旋回をする。~
3.0.4秒直進する。~
4.~
*反省点 [#s5f73126]
-プログラム制作の所要時間を甘く見積もりすぎた結果、プログラムが完成しなかった。
--缶を移動するプログラムが出来なかった。