[[2011a]] #contents 目次 *課題内容 [#wf02aa61] **ランタンに向かってテニスボールを転がす(または運ぶ)ロボットの作成 [#f8eb0f78] 1転がす(ライントレース)~ 2最短距離で運ぶ(自由走行)~ ロボットを作成せよ。ただし、1の場合はテニスボールの置いてある場所から直接転がし、 2の場合はその場所から最短距離で運ぶこと。ボールを探す際にはラインに沿っても沿わなくてもよい。 *メンバー [#kaa1df5d] -中島 -すがはら *今回のロボット [#o6433c71] **タッチセンサー [#peff3869] #ref(touch_sennsor2.JPG) **アーム [#hefc2ca6] #ref(arm.JPG) -左右の歯車の数を変えることで左右のアームがそれぞれ異なる回転をするようにした。 #ref(gia_zoom.JPG) -上から見た歯車部分。 #ref(gia_highview.JPG) **全体図 [#oa9dd39e] #ref(robotto.JPG) -↓ライントレースのセンサーが前に付かなかったため後ろにつけた。 #ref(rign_sennsor.JPG) *プログラム [#b9f2eb27] **すがはらのやつ [#q90c65a8] #define THRETHOLD 40 //ライントレースの閾値 40 #define SPIN 500 //一回転する時間 task main() { SetSensor(SENSOR_1,SENSOR_TOUCH); //センサー1をタッチセンサーに SetSensor(SENSOR_2,SENSOR_LIGHT); //センサー2を光センサーに(ランタンを探す) SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー3を光センサーに(ライントレース) int l_max=0; //l_maxを定義(初期値0) int t_max=0; //t_maxを定義(初期値0) while(true){ start follow_line; //follow_lineのタスク(ライントレース)を開始 until (SENSOR_1==1); //ボールがセンサーに当たったら stop follow_line; //follow_lineのタスクを一旦停止 OnFwd(OUT_B); //アームを閉じてボールを固定 Wait(10); ClearTimer(0); while(FastTimer(0)<=SPIN) { OnFwd(OUT_A); OnRev(OUT_C); //回転開始 if(SENSOR_2>l_max) //ランタンの位置(光の最大値)を探す {l_max=SENSOR_2; //最大値をl_maxと定義 t_max=FastTimer(0);} //ランタンを見つけた時間をt_maxと定義 } OnFwd(OUT_C); OnRev(OUT_A); Wait(SPIN-t_max); //ランタンの向きへ方向転換 Off(OUT_A+OUT_C); Wait(50); OnRev(OUT_B); Wait(20); //アームを開き、ボールを蹴り出す準備 Off(OUT_B); Wait(50); OnFwd(OUT_A+OUT_C); Wait(50); //キック!! Off(OUT_A+OUT_C); OnRev(OUT_A+OUT_C); Wait(50); //元の位置に戻る OnFwd(OUT_A); OnRev(OUT_C); Wait(SPIN-t_max); //元の向きに戻る } //while文の先頭に戻って再びライントレースを開始 } task follow_line() //follow_lineのタスク(ライントレース) { while(true){ if(SENSOR_3<THRETHOLD) //センサーがライン上(黒)のとき {OnFwd(OUT_A); Off(OUT_C);} //右に曲がる if(SENSOR_3>THRETHOLD) //センサーがライン外(白)のとき {OnFwd(OUT_C); Off(OUT_A);} //左に曲がる } } **中島のやつ [#ucba0017] *反省・感想 [#a2189b7b] *コメント [#hdddc3c7] #comment