[[2009a]] *目次 [#i268889c] #contents *課題 [#o9dbc396] **課題2:黒い線に沿って動くロボット † [#xe0c86ff] 各チームで作成したコースを3周するロボットを製作せよ。交差点のうちの一つには500mlの空の紙パックをおき、次のような動作するプログラムを作成せよ。(他のメンバーと重ならないように一人一つのプログラムを作成する) 1,紙パックを迂回する、あるいは紙パックをもとの位置に戻したのちコースに戻って進む (交差点を通過後、紙パックが元の位置にあればよい) ~2,紙パックを次の交差点まで運んで行き、その交差点に紙パックを残してさらに黒い線に沿って進む ~3,最初の交差点では左折、次の交差点では右折、その次は左折、というように交差点一つごとに左折・右折を繰り替えして進む (紙パックはコース外に押し出してよい) ただし、 速さと正確さを追求すること コースを3周したら自動的に止まること 余力のあるチームはさらに以下の機能を追加せよ。 交差点で2台のロボットが遭遇した場合には後から交差点入ったロボットが、一時停止してもう一方のロボットが行き過ぎるのを待つこと 前方にあるもう一台のロボットに接触した場合には停止して距離が十分離れるのを待つこと 注意:コースラインの幅は15〜25mm*くらい*としてますが,あまり太くしない限り制限はしていません.ちなみに過去のロボコンコースレイアウトは25mm幅で制作してきました. ~~ロボティクス入門ゼミTop / 2009a / 練習問題 / 課題2より抜粋~ *ロボット [#xe0e2b26] **コンセプト [#fdc2eaa4] **製作過程 [#s9e87b96] **車体 [#kc26b6fa] #ref(front.png) ~前から見たらこんな感じです。シンプルなルックス! #ref(back.png) ~フロントにいろんな部品を付けたためフロントが重くなりすぎて前かがみになってしまったので、前後のバランスをよくするために、リアにバラストの役割でタイヤ2つをつけたのです!! **足回り [#yc6bd90c] **タッチセンサー [#j25473b7] #ref(touch.png) ~紙パックやほかの障害物に反応しやすいようにするために取り付け位置を試行錯誤しました。 #ref(light.png) **はさむor運ぶ!? [#ec16b4e4] *課題への取り組み [#m58c9ede] **コース紹介 [#i9a0b015] 当初、Hauntは鈴鹿サーキットをもとにコースレイアウトを行ったが、途中で挫折… ~Fe2+に任すもいまいちの出来にリナ様もご立腹。。悩んだ結果、コースが完成! ~なんと交差点は4つ!!!!! #ref(course1.png) **課題の選択 [#i565a5d5] 今回Hauntは課題2-2、Fe2+は課題2-1に取り組んだ。 **紙パックの対処方法 [#t686d42e] ***Haunt [#se850cab] ***Fe2+ [#h24f797a] 相手のロボットと交差点でぶつかったときは、少しまってから進むことでぶつかること回避できるようにした。牛乳パックはパートナーもこちらも動かさないため、迂回を定位置で認識するため、カウントの関数を使うことでプログラムをシンプルにできた。またタスクを1つにすることで、簡単なプログラムすることができた。 *プログラム [#qa7573b1] ***Hauntのプログラム [#cb187384] #define T 40//閾値を40に定義 #define a OUT_A #define c OUT_C #define s1 SENSOR_1 #define s2 SENSOR_2 #define s3 SENSOR_3 int flag = 0; int t = 0; #define fwd(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C); #define rev(t) OnRev(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C); #define w(t) Wait(t); task main() { SetSensor(SENSOR_2,SENSOR_TOUCH); //センサー2をセット start light;//ライトセンサーのプログラム開始 while(true){ if((s2 == 1)&&(FastTimer(0)<400)){ //もしセンサー2が反応してすぐ4秒以内にまたセンサー2が反応したら (牛乳パックと認識して) stop light; fwd(100); //牛乳パックを持って OnFwd(OUT_A); OnRev(OUT_C); Wait(160); rev(50); OnFwd(c); OnRev(a); w(100); //その場で回転して rev(20) //またもとの位置に戻して start light; ライントレースを開始する } else{ if(SENSOR_2 == 1){ //もしセンサー2が反応したら stop light; //光センサーのタスクを停止して ClearTimer(0); //タイマーを開始して Off(OUT_A+OUT_C);Wait(50); //少し後ろに進んで OnRev(OUT_A+OUT_C); Wait(100); //また少し前に進む Off(OUT_A+OUT_C);Wait(50); start light; //そして光センサーのタスクを開始する } } } } task light()//ライトセンサーのプログラム { OnFwd(OUT_A+OUT_C); SetSensor(s1,SENSOR_LIGHT);センサー1を光センサーにセット SetSensor(s3,SENSOR_LIGHT);センサー3を光センサーにセット ClearTimer(0);タイマー開始 while(flag < 9){ if(s1>T){ //もしセンサー1が if(s3>T){ //もしセンサー3が OnFwd(c); //ともに定義した閾値より高いとき OnFwd(a); 前進 } else{ if(s1>T){ //もしセンサー1だけが定義した閾値より高いとき OnFwd(a); //右に進む OnRev(c); Wait(5); Off(OUT_C+OUT_A); } } } else{ if(s3>T){ //もしセンサー3だけが定義した閾値より高いとき OnFwd(c); //左に進む OnRev(a); Wait(5); Off(a+c); } else{ //もしセンサー1と3が定義した閾値より両方低いとき、 flag++; //カウントを1プラスして Off(a+c); Wait(100); //1秒間止まる OnFwd(c); //そして交差点を通過する OnFwd(a); Wait(30); } } } } } ***Fe2+のプログラム [#j381207a] #define T 40//閾値を40に定義 #define a OUT_A #define c OUT_C #define s1 SENSOR_1 #define s2 SENSOR_2 #define s3 SENSOR_3 int t = 0; #define fwd(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C); #define rev(t) OnRev(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C); #define w(t) Wait(t); task main() { SetSensor(SENSOR_2,SENSOR_TOUCH);//センサー2のタッチセンサーにセット SetSensor(s1,SENSOR_LIGHT);// センサー1を光センサーにセット SetSensor(s3,SENSOR_LIGHT);//センサー3を光センサーにセット while(t<=20){//カウントが20になるまでこの動作を繰りかえす if((t==2)||(t==9)||(t==12)){//もしカウントガ2、9、12のとき Wait(100);//1秒待って OnFwd(a+c);//牛乳パックを迂回 Wait(100); OnFwd(a); OnRev(c); Wait(105); OnFwd(a+c); w(280); OnFwd(a); OnRev(c); w(105); OnFwd(a+c); w(300); OnFwd(a); OnRev(c); w(105); OnFwd(a+c); w(180); Off(a+c); t++;//カウントを1追加 } if((t==6)||(t==14)||(t==19)){カウントが6、14、19の時 Wait(100);//1秒待って OnFwd(a+c);//牛乳パックを迂回 Wait(50); OnFwd(a+c); Wait(50); OnFwd(c); OnRev(a); Wait(105); OnFwd(a+c); w(155); OnFwd(a); OnRev(c); w(105); OnFwd(a+c); w(300); OnFwd(a); OnRev(c); w(105); OnFwd(a+c); w(320); Off(a+c); t++;//カウントを1追加 } if(s1>T){//センサー1が定義した閾値より高く if(s3>T){//センサー3が定義した閾値より高いとき OnFwd(a+c);//前進する } else{ if(s1>T){//センサー1だけが定義した閾値より高いとき OnFwd(a);//右に曲がる OnRev(c); Wait(5); Off(OUT_C+OUT_A); } } } else{ if(s3>T){//センサー3だけ定義した閾値より高いとき OnFwd(c);//左に曲がる OnRev(a); Wait(5); Off(a+c); } else{//センサー1と3がともに定義した閾値より低いとき t++;//カウントを1追加して Off(a+c);//少し停止して Wait(50); OnFwd(a+c);//前進 Wait(30); } } } } *まとめ [#u54360ab] **Haunt [#g5bc9be4] **Fe2+ [#ne3037dd] --[[2009a/A7/課題2左/Haunt]] --[[2009a/A7/課題2左/nitetu]] *コメント [#dc0565bf] #comment コメントをお願いします。