[[2009a]]
#contents
*課題の内容 [#m8c32aec]
-紙パックを迂回する、あるいは紙パックをもとの位置に戻したのちコースに戻って進む。
-紙パックを次の交差点まで運んで行き、その交差点に紙パックを残してさらに黒い線に沿って進む
*ロボットの概要 [#a130776d]
-最初は今までの機体にセンサーを2つをつけた。
-がそれだと車体が大きすぎてカーブで脱線してしまう。
-それを改善するためにおもいきって車体をコンパクトに
#ref(./CA3C0084.jpg,100%,コンパクト)
-次にブロックを使って紙パックを運ぶための枠を作った。
-そこにタッチセンサーをつけて完成。
-完成形は角を二本はやしたクワガタをモチーフにした。
#ref(./CA3C0088.jpg,100%,完成)
*コースの紹介 [#n9bcd1bc]
-このコースを3周し、交差点の一カ所には空の紙パックをおく。
#ref(./CA3C0087.jpg,100%,コース)
*プログラムの説明 [#yc752683]
-燠紊鬪(パックを避ける)
#define BORDER 40 //光センサーの白黒を見分ける境値
task main ()
{
SetSensor ( SENSOR_1, SENSOR_LIGHT ); //各センサーの設定
SetSensor ( SENSOR_2, SENSOR_TOUCH );
SetSensor ( SENSOR_3, SENSOR_LIGHT );
while ( flag < 6 ){ //3周(牛乳パックを6回迂回したら停止)
if ( SENSOR_2 == 1 ){ //タッチセンサーが作動したとき
OnRev(OUT_A+OUT_C);
Wait(100);
Off(OUT_A+OUT_C);
OnFwd(OUT_A);
OnRev(OUT_C);
Wait(90);
Off(OUT_A+OUT_C);
OnFwd(OUT_A+OUT_C);
Wait(120);
Off(OUT_A+OUT_C);
OnFwd(OUT_C);
OnRev(OUT_A);
Wait(90);
Off(OUT_A+OUT_C);
OnFwd(OUT_A+OUT_C);
Wait(300);
Off(OUT_A+OUT_C);
OnFwd(OUT_C);
OnRev(OUT_A);
Wait(90);
Off(OUT_A+OUT_C);
OnFwd(OUT_A+OUT_C);
Wait(120);
Off(OUT_A+OUT_C);
OnFwd(OUT_A);
OnRev(OUT_C);
Wait(90);
Off(OUT_A+OUT_C);
Off(OUT_A);
Wait(80); //牛乳パックを迂回して走行
flag++; //カウントを1増やす
}
else{
if ( SENSOR_1 > BORDER ){
if ( SENSOR_3> BORDER ){
OnFwd(OUT_A+OUT_C); //光センサーがどちらも白を完治しているときは前進
}
else {
OnFwd(OUT_A);
OnRev(OUT_C); //右の光センサーが黒を完治したときは時計回りに回る
}
}
else {
if ( SENSOR_3> BORDER ){
OnFwd(OUT_C);
OnRev(OUT_A); //左の光センサーが黒を完治したときは反時計回りに回る
}
else {
OnFwd(OUT_A+OUT_C);
}
}
}
}
}
}
-ニシヤマ(パックを運ぶ)
#define BORDER 40 //光センサーの白黒を見分ける境値
sub yokeru() { OnRev(OUT_A+OUT_C);Wait(100);Off(OUT_A+OUT_C);OnFwd(OUT_A); //少し後ろに下がりパックを置く
OnRev(OUT_C);Wait(90);Off(OUT_A+OUT_C);OnFwd(OUT_A+OUT_C); //90度回転する
Wait(120);Off(OUT_A+OUT_C);OnFwd(OUT_C);OnRev(OUT_A);
Wait(90);Off(OUT_A+OUT_C);OnFwd(OUT_A+OUT_C); //直進
Wait(300);Off(OUT_A+OUT_C);OnFwd(OUT_C); //もう1回90度回転
OnRev(OUT_A);Wait(90);Off(OUT_A+OUT_C);OnFwd(OUT_A+OUT_C); //直進
Wait(120); Off(OUT_A+OUT_C);OnFwd(OUT_A);OnRev(OUT_C); //もう1回90度回転
Wait(90);Off(OUT_A+OUT_C);OnRev(OUT_C);OnRev(OUT_A);Wait(90);}//直進してもう1回90度回転してラインに乗る : パックの周りをコの字に迂回する
task main()
{
SetSensor(SENSOR_1,SENSOR_LIGHT);
SetSensor(SENSOR_2,SENSOR_TOUCH);
SetSensor(SENSOR_3,SENSOR_LIGHT);
int flag=0;
while(flag<12){ //3周(センサーが両方黒になったらカウントを1加える)
if(SENSOR_1>BORDER) // ライントレース
{
if(SENSOR_3>BORDER){OnFwd(OUT_A+OUT_C);}
else {OnFwd(OUT_A);OnRev(OUT_C);}
}
else
{
if (SENSOR_3>BORDER){OnFwd(OUT_C);OnRev(OUT_A);}
else{OnFwd(OUT_A+OUT_C);flag++;} //カウントを1加える
} //
if(SENSOR_2==1) //センサーが反応したとき
{ //ライントレース
OnFwd(OUT_A+OUT_C);Wait(90);flag++; //カウントを1加える
until((SENSOR_1<BORDER)&&(SENSOR_3<BORDER)){
if(SENSOR_1>BORDER){
if(SENSOR_3>BORDER){OnFwd(OUT_A+OUT_C);}
else {OnFwd(OUT_A);OnRev(OUT_C);}
} //
else{
if (SENSOR_3>BORDER){OnFwd(OUT_C);OnRev(OUT_A);}//パックを置く
}
}
yokeru() //パックを避ける動作
flag++; // カウントを1加える
}
}
Off(OUT_A+OUT_C);}
*感想 [#sea9fc4d]
-ロボットで工夫したところ
--アームをうまく使いパックを運べるようにしました。
-これからに向けて
--課題1と同じくパートナーとの予定が合わず作業が遅れてしまいできたのがぎりぎりになってしまった。本番のロボコンではチームで協力し合い計画的に作業を行えたらいいと思う。
- 全体的に、シンプルでわかりやすいです。ニシヤマさんのプログラムについて、タッチセンサーが反応したとき、どのような動作を行っていて、その後どうなったらパックを置くのか、少し解りづらいので、説明を追加していただきたいです。 -- [[こさか]] &new{2009-07-23 (木) 22:32:21};
- ちゃんと3周したら止まるようになっています。よけた後、黒いコースに戻るにはuntil等を使ってほうが確実かもしれません -- [[FI]] &new{2009-07-27 (月) 03:47:17};
#comment
コメントよろしくお願いします。
- なんだか不思議な位置にコメント欄が…画像の「コンパクト」が、bmp画像だと私の環境で表示できません…ぜひjpgかpngあたりに変換してください。 -- [[こさか]] &new{2009-07-02 (木) 22:48:07};
- プログラムの貼り付けが不思議なことになっている点を修正してください。内容的には、説明もできています。さらに、ifでセンサーの反応を判別しているところを、センサーが白か黒か(もしくは触っていないか触っているか)について、「無反応なら0を、反応なら1を返す関数」にしてみると、もっとスリム化できるかもしれません。 -- [[こさか]] &new{2009-07-02 (木) 22:49:55};
- 大枠はできています。ただ、いくつか問題があります。3周しても止まらないこと、ページがうまく整理されていないこと、ロボットの説明が少ないことなどです -- [[FI]] &new{2009-07-03 (金) 05:46:23};