目次
#contents
* 課題の説明 [#kb717e6d]
&ref(2014a/Member/fuji/Mission1/pic4.png);
図の様なコースを作成し、ライン上をゴールからスタートまでロボットにトレイスさせ、スタートに向けてピンポン玉をシュートさせる。
詳しい説明は[[2014a/Mission1]]を参照してください。
* メンバー [#j0ee8e63]
藤岡芳弥 秋山和哉
* ロボット本体 [#g0b2bc6e]
**全体 [#zd267549]
&ref(2014a/Member/fuji/Mission1/pic1.jpg);
NPCを、横向きにおくことによってロボットの前側を有効活用できた。またNQCが左右によっていないためロボットが安定している。
** ライトセンサー [#jf97ef47]
&ref(2014a/Member/fuji/Mission1/pic3.jpg);
ロボットの前方にドリブルの機構を設置するので、邪魔にならないようにセンサーをできるだけ後ろに持ってくる必要があった。だから、通常は写真�,里茲Δ壁�品を使ってセンサーを固定するが
部品を組み合わせて写真�△里茲Δ淵灰鵐僖�トなセンサーを固定する機構をつくり、センサーを後ろに持っていくことに成功した。
写真��
&ref(2014a/Member/fuji/Mission1/pic6.jpg);
写真��
&ref(2014a/Member/fuji/Mission1/pic7.jpg);
** ドリブルの機構 [#qa948bf2]
&ref(2014a/Member/fuji/Mission1/pic2.jpg);
ドリブル、シュートをさせるためにモーターを一つ追加した。
タイヤでボールを巻き込みドリブルをして、タイヤを逆回転させることでシュートする。
また、ハの字のアームをつけることによってライン上にあるピンポン玉を確実にタイヤのところまで誘導することに成功した。
* プログラム [#w9871f04]
**注 [#y3b02d5b]
�々�線の左側にある白線と黒線の境目をトレースする。
�∨寨茲覆蕋海通椶任△觚鮑硬世蓮�特別に交差点と判断しなくてもコースから外れることなく通常道理通過できたので(通常は交差点の場合は黒と認識される回数が多く左に曲がってしまうが、3つ目の交差点の付近ではコース自体も左に曲がっている為)交差点にカウントせず、ゴール地点からスタートしてから一番初めにであう交差点を1つめの交差点、円に差し掛かるときの交差点を2つめの交差点、スタート地点の交差点を3つ目の交差点とします。
��左のタイヤを回すモーターがA、右のタイヤを回すモーターがB、ボールを巻き込むためにロボットの前方に取り付けられたタイヤを回すモーターがCです
**定義 [#qa9d0677]
#define HIPOWER //ハイパワーを4と設定
#define LOWPOWER //ローパワーを2と設定
#define set_power_H SetPower(OUT_AC,HIPOWER);//set power HをモーターACをハイパワーに設定することとする。
#define set_power_L SetPower(OUT_AC,LOWPOWER); //set power LをモーターACローパワーに設定することとする。
#define GF set_power_H; OnFwd(OUT_AC);//GFをハイパワーで前進することとする。
#define GB set_power H; OnRev(OUT_AC);//GBをハイパワーで後退することとする。
#define TLE set_power_L; OnFwd(OUT_C); OnRev(OUT_A);//TLEを左回りにその場でハイパワーで旋回することとする。
#define TL set_power_L; OnFwd(OUT_C); Off(OUT_A);//TLを左のタイヤを軸に左回りにローパワーで旋回することとする。
#define TR set_power_L; OnFwd(OUT_A); Off(OUT_C);//TRを右のタイヤを軸に右回りにローパワーで旋回することとする。
#define TRE set_power_L; OnFwd(OUT_A); OnRev(OUT_C);//TREを右回りにその場でハイパワーで旋回することとする。
#define Doriburu set_power_L; OnFwd(OUT_B);//ボールと出会ったときにボールを巻き込んでドリブルするために、ボールを巻き込む方向にタイヤを回転させる。
#define TRB set_power_H; OnRev(OUT_C); Off(OUT_A);
#define Shoot OnRev(OUT_B);(ボールを巻き込む為に回していたタイヤを逆回転させてシュートする)
#define black (SENSOR_2 < 39)//光センサーの値が39以下ならばロボットが黒線上にいると判断して、その状態をblackと定義する。
#define nearblack (SENSOR_2 < 43)//光センサーの値が43以下ならば黒線と白線の間(黒線より)にいる判断して、その状態ををnearblackと定義する。
#define blackwhite (SENSOR_2 < 47)//センサーがちょうど黒線と白線の間にある状態をblackwhiteとする。
#define nearwhite (SENSOR_2 < 50)|//センサーが黒線と白線の間(白線より)にある状態をnearblackとする。
**メインタスク [#a66c9131]
task main()
{
SetSensor(SENSOR_2,SENSOR_LIGHT);
int n=0;//何回連続で黒を判断したか数えるための変数nを定義
int y=0;//何回交差点を判断したか数えるための変数yを定義
ClearTimer(0);
Doriburu;//ボールをドリブルするために、ボールを巻き込む方向にタイヤを回転させる。
while(true){
***交差点に差し掛かっていないとき実行するプログラム [#u791c2a7]
while((n<3)||(((FastTimer(0)<600)||(300>FastTimer(1)&&FastTimer(1)>200))||(50<FastTimer(2)&&FastTimer(2)<1000))){
交差点に差し掛かった時は連続で黒と判断する回数、つまりnの値が普通の道をライントレースしている時よりも多くなる。nが3を超えたら交差点に差し掛かったと判断して、交差点に差し掛かったと判断された時用のプログラムを実行する
またスタートから600秒以内、1つ目の交差点から300秒以内200秒以上、2つめの交差点から300秒以内、200秒以下ならばnが3を超えても交差点に差し掛かったと判断しない。(交差点でないところでnが3を超えてしまい、交差点であると間違えて判断しないようにするため。)
if black {
TLE; //blackと判断したら左に極地旋回する//
n++;
} else if nearblack{
TL; //nearblackと判断したら左に信地旋回する//
n=0; //nの値をリセット//
}else if blackwhite{ //blackwhiteと判断したら直進//
GF;
n=0;
}else if nearwhite{ //nearwhiteと判断したら右に信地旋回//
TR;
n=0;
}else{ //black,blackwhite,nearwhiteでなければ、センサーが白線上にあるということなので右に極地旋回する。
TRE;
n=0;
}
Wait(1);
}
y++; //交差点に差し掛かったった数を数える//
***nが3を超えて交差点に差し掛かったと判断された時に実行するプログラム [#i8f7583b]
if(y==1){
TR;Wait(30); //2度目の交差点に差し掛かったら0.3秒右旋回//
n=0;
ClearTimer(1); //タイマー1をセットして、次の交差点まで時間を図る//
}if (y==2) { //2度目の交差点に差し掛かったら0.6秒右旋回//
TR;Wait(60);
n=0;
ClearTimer(2); //タイマー1をセットして、次の交差点まで時間を図る//
}if (y==3) {
TRB;Wait(60); //3度目の交差点,つまりゴール前に差し掛かったらストップしてシュート//
Off(OUT_AC)
}
}
}
*工夫したポイント [#e9e71a36]
ドリブルをするモーターのの回転数が多いとボールの回転によってロボットの進む速度が遅くなるので、ドリブルするモーターの回転を遅くした。
*感想 [#xf63ac13]
一つでも誤字があったらエラーが出てしまい大変だった。エラーがどこにあるのかなかなか見つからなかった。ミスしないように注意してプログラミングをすることが大切だと思った。